sonic-visualiser-2.3~repack1.orig/0000755000175000017500000000000012264464201015724 5ustar miramirasonic-visualiser-2.3~repack1.orig/templates/0000755000175000017500000000000012264464201017722 5ustar miramirasonic-visualiser-2.3~repack1.orig/templates/Scrolling Waveforms.svt0000644000175000017500000000615612252354725024364 0ustar miramira sonic-visualiser-2.3~repack1.orig/templates/Waveform and Melodic Range Spectrogram.svt0000644000175000017500000000340112252354725027616 0ustar miramira sonic-visualiser-2.3~repack1.orig/templates/default.svt0000644000175000017500000000134112252354725022111 0ustar miramira sonic-visualiser-2.3~repack1.orig/templates/Spectrograms.svt0000644000175000017500000000537312252354725023147 0ustar miramira sonic-visualiser-2.3~repack1.orig/.hgignore0000644000175000017500000000041012252354725017530 0ustar miramirasyntax: glob Makefile */Makefile o/* */o/* */tmp_obj/* */tmp_moc/* doc/html/ *.o *.so *.so.* *.a *.wav *~ *.orig *.rej re:^autom4te\.cache/ re:^qrc_sonic-visualiser\.cpp$ re:^sonic-visualiser$ re:^aclocal\.m4$ re:^config\.log$ re:^config\.pri$ re:^config\.status$ sonic-visualiser-2.3~repack1.orig/.hgsubstate0000644000175000017500000000037612252354725020112 0ustar miramira236814e07bd07473958c1ff89103124536a0c3c8 dataquay 3c5adc4a864fa75e5b1e67c260b77541aaa4f1f6 sv-dependency-builds c837368b1faf2cd3727242099eefec0a18deb91f svapp 786ee8d1f30e4920f361419a75eafa079ec0160d svcore b81f21f2c4c3d1cb115e278a098ac4869fb7377f svgui sonic-visualiser-2.3~repack1.orig/INSTALL.txt0000644000175000017500000000347112252354725017606 0ustar miramira To compile from source ---------------------- To build on a Unix-like system, run $ ./configure && make The following additional libraries are required or optional when building the SV core libraries: REQUIRED Qt v4.4 or newer http://qt.nokia.com/ REQUIRED Vamp Plugin SDK v2.x http://www.vamp-plugins.org/ REQUIRED Rubber Band Library http://www.breakfastquay.com/rubberband/ REQUIRED libsndfile http://www.mega-nerd.com/libsndfile/ REQUIRED libsamplerate http://www.mega-nerd.com/SRC/ REQUIRED FFTW3 http://www.fftw.org/ REQUIRED bzip2 library http://www.bzip.org/ REQUIRED Redland RDF libraries http://librdf.org/ Optional MAD mp3 decoder http://www.underbit.com/products/mad/ Optional Oggz and fishsound http://xiph.org/oggz/ Optional liblo OSC library http://www.plugin.org.uk/liblo/ The Redland RDF libraries include the Raptor RDF parser library, Rasqal RDF query library, and librdf, the Redland RDF datastore (which depends on both of those). The SV libraries require all of these. If you are going to build the rest of the SV libraries, you will also need one or more of: Optional JACK http://www.jackaudio.org/ Optional PortAudio v19 http://www.portaudio.com/ Optional PulseAudio http://www.pulseaudio.org/ Although JACK, PortAudio, and PulseAudio are individually optional, you will need to have one or the other of them in order to get any audio playback. Usually JACK is preferred on Linux, with PulseAudio as a backup, and PortAudio is used elsewhere. On Linux, you will need the ALSA libraries (used for MIDI). If you happen to be using a Debian-based Linux, you probably want to apt-get install the following packages: libqt4-dev libsndfile1-dev libsamplerate0-dev fftw3-dev libbz2-dev libjack-dev libmad0-dev liboggz1-dev libfishsound1-dev libasound2-dev liblo0-dev liblrdf0-dev librdf0-dev . sonic-visualiser-2.3~repack1.orig/samples/0000755000175000017500000000000012264464201017370 5ustar miramirasonic-visualiser-2.3~repack1.orig/samples/bass.wav0000644000175000017500000005506412252354725021057 0ustar miramiraRIFF,ZWAVEfmt DdataZ ""''--44<<DDMMXXccpp~~  ))GGii77iiYY66<<rr\\__w w   Q Q m m --kkYYUUQQ\\oo55||!!e"e"##1%1%&&(())++,,(.(.//\1\13344P6P68899v;v;4=4=>>@@zBzBJDJD F FGGIIvKvKFMFMOOPPRRqTqT8V8VWWYYu[u[*]*]^^``2b2bccieieffhh j jkkllUnUnooppIrIrssttuuvvwwxxyyzzi{i{ | |||m}m}}}s~s~~~99^^  ~~5~5~}}}}t|t|{{zzzz0y0y6x6x/w/wvvttssrr,q,qooknknllukukiiNhNhffeeOcOcaa__^^5\5\TZTZ~X~XVVTTRRPPNNLLJJHHGG E ECCAA"?"?4=4=?;?;P9P9q7q7553311//,.,.c,c,**((6'6'%%##Q"Q" 55KK}}))__--))BBdd < < * * [[LLWW||cc{{;;``55  {{ggUUFF99--$$  ''ee''JJRRj j C(C(11;;DFDFPPZZ/d/dllssByBy;};}ww~~{{wwqqKkKkcc[[2S2SJJAA9911(*(*J#J#  @@''NN"" ;;99}}~~44kk||DDބۄZZԢТ..eeţ;;%%ۨۨММ,,ƐƐŽŽ;;77ㆻ88""oo99 %%KKĀĀssځځJJłłGGуу^^,,ȆȆnn^^SS==ڍڍ||77ʐʐ]]dd__ܓܓII))BB55yy44ffӘӘ 11;;>>>>4411ݘݘzzJJ䗫kk//떠VVffWW77˒˒dd77ŏŏWW׎׎ccss22EEчч^^{{ ::ӄӄrrVV]]ˁˁOO߀߀ccGG-- 11KKgg߀߀OOցց uuЂЂ--uuss[[ rr00qqPP;;**""..BB^^zzǛǛ//jj99ޥޥ--KKzzQQdzdz88 }}mmaaDDȹɹ00˘̘pp<<ҢӢYY֮׮SSڞ۞""aaߖ;;UUjj||vvbbQQ00zz;;VV66UU^^MM%%??))oo!!UU::UUnn %%//::GGVVgg{{..XX++kkKKbb::++77ee  ` `   v v OO6633TT{{ff  k k !!<#<#$$(&(&''5)5)**[,[,--//:1:12244C6C67799v;v;4=4=>>@@BBJDJDFFGGIIiKiK4M4MNNPPRR7T7TUUWWlYlY[[\\o^o^ ` `aa=c=cddRfRfggGiGijjllpmpmnn p pHqHq|r|rssttuuvvwwxxyyazaz%{%{{{||}}}}"~"~~~~~CC??~~~~"~"~}}}}||{{!{!{azazyyxxwwvvuuttssrrRqRq"p"pnnmm2l2ljjiichch g geedd6c6caa~`~`$_$_]]I\I\ZZoYoYWW{V{VUUSSQQPPNNtMtMKKcJcJHHIGIGEE7D7DBB!A!A??>><<;;998866 5 5332200>X9X933..))_%_%!!MM  E E U U ,,GG;;dd>>%% ``**EEiiUUAAqqooCCccoo--xxZZܕڕEEՂӂӾѾ00pp̪ʪ88~~!!yyӾӾ::BB寐==QQ''ޣޣ٢٢ءء٠٠AAggٚٚ TTLL ~~[[ܓܓYYْْdd푇YYPPmm&&捬ss==׌׌YY22ӋӋnn[[PPEEAA;;;;;;??AAIIPP[[nnyyȋȋދދ@@``ӌӌ//\\44mm11uuOOEEJJuuܓܓCCyyooss 22VV򜑝))ўўssààvv''٢٢BBååJJۨۨSS uu22魪``""ﰭuu==ִִkkAA ฼cc<<ξξggKK--żƼƜǜDžȅhhHH00ΣϣόЌppPP66ոָ֙יxxVV..۷ܷ܍ݍff44nn;;EEww11HH@@""YY&&..))hh66XX ]]FFUU99kkDDii00EEYYkk|| ##**22;;EEQQ]]ll{{;;^^11ccQQ**xx&&GG      B B ' ' ::}}LLzzqq{{ !!$#$#J$J$}%}%&&''*)*)l*l*++,,D.D.//00G2G23355\6\677(9(9::;;i=i=>>D@D@AA*C*CDD F FGGHHkJkJKKKMKMNN5P5PQQ S SvTvTUUDWDWXX Z Zo[o[\\+^+^__``bbccccddee#g#gUhUhiijjkkll n noo)p)p)q)q&r&rssttttuuvvnwnw/x/xxxyyIzIzzz{{||||}}}}}}S~S~~~~~<<wwSS~~{~{~~~}}F}F}||I|I|{{){){zzyy8y8yyxyxww6w6wvvuuuu`t`ttttt}t}t(u(u v vww@x@xwywyzz{{||}}~~^^-~-~}}{{zzxxuusspp7n7n?k?khhdd|a|a]]hZhZVV!S!SoOoOKKHH]D]D@@(=(=99363622//j,j,Z)Z)p&p&## \\ffQQccII w w 7 7   //dd  yyxx55bbKK88)) kkRR66QQ {{==ss''66))jj44ZZyy!!&&##ssddVVEE7700$$ !!##--66FFcc߀߀ߨި<>nn֣֣EEzz״״00nnثث00ttټټCCڏڏ!!llۼۼ UUܣܣCCݘݘEEޗޗAAߜߜMMSS hh##88ZZvv44SSvv22SSoo++AAQQ``ccffaaVV<<ii11kkJJPPDDrr$$MMxx99__ ))IIgg ##;;RRhh}},,::HHTTaakkvv ""'',,2288??GGOOXXbbllww11HHbb||;;__55ee<<xx77zzTTFFNN q q ? ?     z z r r yy;;ooQQPPff``))^^8 8 !!!!""##$$r%r%W&W&G'G';(;(%)%)**++,,----..//00 2 23344"5"5,6,68787I8I8X9X9l:l:;;<<==>>??@@BB#C#C?D?DVEVErFrFGGHHIIJJKKMM1N1NJOJOlPlP~Q~QRRSSTTUUVVXXYY%Z%Z8[8[@\@\\\]]]]\\\\,[,[ZZXXbWbWUU T T1R1R5P5PNNKKII}G}GEEBBV@V@==;;9966C4C411//?-?-**((&&$$t"t"z z 22~~  __&&   GG//5555wwDDxxddRRBB55**!! wwkk^^QQBB44$$zzddMM66ccGG)) qqQQ//ddAAiiEE iiDDeeAAiiFF!!wwWW33ttVV88qqXX>>## jjZZCC11 ttii^^TTIIAA88//))!!  !!''//44>>GGOOXXbboozz))99II^^nn))>>VVll00IIaa||66QQpp11NNkk44QQpp99TTqq55QQmm &&AA\\uu !!99OOgg}}--??UUii{{ ..>>NN]]llzz''11;;DDMMVV__ggoovv~~ !!$$''**..2266::>>BBGGLLRRWW]]ccjjqqxx..==LL\\mm~~  77OOee  ))GGgg;;cc22\\NN""[[  GG  H H   \ \ > > ' ' z z   v v ""77UURR((  zz??vvvvBB]]  iiMM 5 5 % %   " " 2 2 QQ[[ZZ  ww22ss;;ssGGppSS88||ppeeZZQQHH@@9922,,''"" }}xxrrmmggbb\\WWQQKKEE??9933--&&  {{uuoohhbb\\UUOOIICC<<6611++%%  ##''++004499==BBFFKKOOTTYY^^bbggllqquuzz ##''++//4488<<@@DDHHLLPPTTXX\\``ddggkknnrrvvyy}} !!$$&&))++..114477;;>>AAEEIIMMRRVV[[``eejjoouu{{%%11==HHUUbbpp~~  11CCUUii}}{{mm]]OO==--ttbbQQAA11!!zzrrjjbb[[TTNNHHCC==884400++(($$!!   !!""##%%&&''(())**++,,----..............----,,,,++**))))((''&&%%$$##""!!  sonic-visualiser-2.3~repack1.orig/samples/stick.wav0000644000175000017500000006232412252354725021241 0ustar miramiraRIFFdWAVEfmt DXdatadf5!r  1 C1sv 3' rb 㳬)j-R9zI91j r!!@=Z 1r!9İ9#z13f )!z+ 5m[%MS-5!GMSG377+9Ij1]W}_G a;}_m[*>@@CCFF=I=IKKxNxNPPbSbSUUXXYZYZ\\^^``bb|d|dHfHfhhii9k9kllnnooooppqqrrssttuuPvPvvvwwwwTxTxxxxxxxxxxxxxxx)x)xww?w?wvvvv>u>ujtjt{s{szrzrgqgq:p:pnnmmIlIljj@i@iggee0d0dYbYbv`v`^^~\~\]Z]Z4X4XUUSSgQgQOOLL#J#JGGDDKBKB??<<$:$:[7[74411..++((%%""d d @ @ ZZII33 ##FFhhЍ͍CCŨ¨ ppff44⮧ooMM551155MMrrHH//UUȐȐ~~yyΊΊffˈˈGGևևvv++̆̆φφ--xxՇՇIIψψff ȊȊqq````rrɑɑ ccȕȕ??ØØXXuuEE&& ;;ff33޺޺JJÿÿCCMMɈ̈%%фԄ22ٳܳoo:: XX33{{NN(( ll115 5 ""%%:(:(**v-v-00225577::l>(A(ApCpCEEGGJJDLDL]N]NfPfPaRaRZTZTCVCVXXYY[[D]D]^^`` b bccddVfVfgghh#j#jFkFkZlZlbmbmVnVn>o>oppppqqGrGrrrlslsssNtNttttt)u)uRuRululuvuvuququXuXu2u2uttttatatssssrrnrnrqqqqWpWpoonnmmllkkjjtitiChChggeeSdSdbbyaya__j^j^\\&[&[yYyYWWUU T T@R@RQPQPcNcNeLeLXJXJLHLH1F1FDDAA??==I;I;8866^4^422//>->-**_(_(%%k#k# eeQQ<< WW33uuGG## ޚܭ٭EEԌҌ))͈ˈFF ĭ­}}XX??11,,00==SSuuѬѬUUjjڢڢ__##̛̛FFӕӕĔĔÓÓԒԒJJ֎֎00 hh䊶||##ll‹‹''11ԎԎ>>ّّǗǗUUHH;;ששzz++߮߮ooEEллννɿɿ33SS΂ЂвҲ NNًۋTT11,,||))**yyss   ff;;{{++_ _ ""$$&& ) ))+)+E-E-\/\/n1n1{3{3557799t;t;b=b=J?J?,A,ACCDDFFmHmH J JKKwMwMOOPP9R9RSS=U=UVVXXYYZZ4\4\|]|]^^__&a&aCbCb[c[cmdmdueuekfkfYgYgAhAhiiiijjokokllllbmbmmmvnvnnnaoaoooppnpnpppppqq>?? A AwBwBCCIEIEFFHH]I]IJJKK?M?MzNzNOOPPRR?S?SfTfTUUVVWWXXYYZZ[[\\]]f^f^B_B_````aawbwb5c5cccddL><<;;!:!:88I7I755d4d422t1t1//x.x.,,n+n+))](](&&?%?%##"" UU@@VV! ! 99CCaauu))VVRR!!nnNNGG::EEKKii͓̓++\\ǣţHH§XXννOOڸڸ[[88̯̯ƩƩѨѨAAkkˢˢAA˟˟jjUUǚǚ@@@@ʘʘVV뗃$$ʖʖvv**ߕߕ[[%%””yyZZEE55))$$##))33DD[[wwVV֕֕llwwؗؗAA$$%%AA؜؜vveeȠȠ;;ţţ]]00ƨƨ~~ttmmee````cciiqqͷͷ ++NNxxοοCC€ÀýĽ;;}}SS̟͟==Ўю::ԐՐGGإ٥ee..ߓcc88``66 yy\\BB))qqNN//  v v GG||AA  qq&&5 5 !!""$$r%r%&&((N)N)**++--`.`.//0022N3N344556688;9;9`:`:;;<<==>>??AABB-C-C7D7D?E?EFFFFEGEGBHBH8I8I/J/J$K$KLLLLMMNNOOPP\Q\Q6R6RSSSSTTeUeU(V(VVVWWOXOXYYYYTZTZZZ[[;\;\\\e]e]]]^^____``````hahaaa=b=bbbcc\c\cccddTdTddddd%e%eaeaeeeeeee'f'fLfLfmfmfffffffffffffffffffffffffffnfnfMfMf(f(feeeeeefefe,e,edddd`d`dddccqcqcccbbYbYbaaaa a a``:`:`__C_C_^^<^<^]]+]+]\\\\n[n[ZZ1Z1ZYYXX?X?XWWVV.V.VrUrUTTSS9S9SoRoRQQPP P P7O7O`N`NMMLLKKJJJJ1I1IIHIH^G^GrFrF|E|EDDCCBBAA@@??>>==<>FFMMQQXX\\iiss{{ !!|"|"w#w#r$r$h%h%`&`&V'V'I(I(>)>).*.* + +,,,,--..//0011r2r2T3T3646455556677w8w8H9H9::::;;<<[=[=&>&>>>??@@DADABBBBCC>D>DDDEEZFZF G GGGmHmHIIIIhJhJ K KKKLLLLLLMM#N#NNNLOLOOOlPlPPPQQRRRRSSSSTTTTUUUUUUlVlVVVHWHWWWXXXXXXAYAYYYYYTZTZZZZZL[L[[[[[1\1\u\u\\\\\:]:]t]t]]]]]^^C^C^q^q^^^^^^^ _ _0_0_M_M_i_i_____________________________________~_~_e_e_I_I_,_,_ _ _^^^^^^l^l^?^?^^^]]]]o]o]4]4]\\\\u\u\2\2\[[[[U[U[[[ZZhZhZZZYYaYaYYYXXDXDXWW~W~WWWVV?V?VUU`U`UTTyTyTTTSS S SRRRRQQQQPPOOqOqONNWNWNMM2M2MLLLLrKrKJJ?J?JIIIIcHcHGGGGpFpFEEEEtDtDCCCCbBbBAA@@B@B@??>>>>_=_=<<;;$;$;b:b:998888N7N7665544%4%4Z3Z322110000A/A/n.n.--,,++++B*B*f)f)((''&&%%%%?$?$\#\#|"|"!! &&AAVVoo..??SSll     //CCZZkk~~''99MMeevv))FF]]vv33NNkk11RR{{ߤޤGGnnښٚ$$TTքՄպԺSSҋы22nnΨͨ##ee˫ʫ..ttȿǿ YYơš;;ČÌ00‚22??__ûû&&YYƸƸ55jj]]ٳٳSSββNNϱϱTT۰۰ddww GG߬߬yyFF窇..өө||''ҨҨ22委HHtt22򥴥ww==ΤΤii:: ߣߣeeAAĢĢ}}jjWWGG:://%%((22>>KK\\nnˢˢ((IIoo ;;kkΤΤ==ww..pp99ɧɧbbUUZZnnɫɫ**VV((ggկկFF//  ##<<̹̹XXvv 00½½YY󾌿##[[›??!!ssǽǽffɿɿhhss&&͋΋>>ϨШ[[ҀӀ55ԥեbbדؓRR ډۉLL ݌ތRR[[ff**EE cc--JJww@@ll44\\))WWIIrr77 T T   i i //{{==IIHHEEyy22bb  !!:":"""##W$W$ % %%%j&j&''''q(q())))y*y*%+%+++v,v,----k.k.////X0X00011:2:222t3t34444L5L555667777C8C888m9m999::;;;;9<9<<_>>>j?j???p@p@@@rArAAAoBoBBBfCfCCCXDXDDDDEDEEE.F.FFFGGGGGGZHZHHH0I0IIIIIeJeJJJ,K,KKKKKHLHLLLLLYMYMMMNNYNYNNNNNJOJOOOOO6P6PPPPPQQWQWQQQQQ#R#RcRcRRRRRSSUSUSSSSSSS3T3TdTdTTTTTTT"U"ULULUwUwUUUUUUU V V/V/VOVOVmVmVVVVVVVVVVVWWWW+W+W;W;WJWJWVWVWdWdWoWoWxWxW~W~WWWWWWWWWWWWWWWWW|W|WsWsWjWjW^W^WPWPWDWDW5W5W#W#WWWVVVVVVVVVVVVcVcVCVCV#V#VVVUUUUUUmUmUDUDUUUTTTTTTbTbT1T1TSSSSSSZSZS"S"SRRRRmRmR2R2RQQQQnQnQ,Q,QPPPPWPWP P POOwOwO(O(ONNNN7N7NMMMM=M=MLLLL6L6LKKKK#K#KJJjJjJJJIIEIEIHHHHHHGGJGJGFFtFtFFFEE/E/EDDODODCClClCBBBBBBAAAA@@.@.@??5?5?>><><>==:=:=<<:<:<;;.;.;::&:&:999988887766m6m655Y5Y544>4>433332211j1j100A0A0////..--W-W-,,&,&,++**W*W*))))((''D'D'&&&&i%i%$$)$)$##""B"B"!! U U   jj$$||,,::DDEENNKKHH L L ? ? : : 44''{{%%yyiieeeeiiaa\\ aaiiww++((44HHbb!!;;QQtt==ߡޡkk::ܡۡ ssFFٲز؈׈ccAAկԯ ԏӏtt\\DDлϻ00ϧΧ##Π̗͗̏͠ˏ ˋʋ ʉɉ ɊȊ ȏǏǘƘƣţ++ųij<≯̸22ͭͭ((ΤΤ""ϞϞММѝѝҠҠ ӡӡ$$ԥԥ((ծծ00ֵֵ==EEWWffzz܎܎ݡݡ..޸޸AA[[uu##AAbb11RRww22ZZ<>[[ss99OO__uu$$22==BBE E L!L!!!N"N"""L#L###H$H$$$G%G%%%A&A&&&:':'''-(-((($)$)))****++z+z+++a,a,,,L-L---4.4...//////i0i000F1F111 2 22222b3b333949444 5 5r5r555=6=666 7 7n7n77738388888T9T999::m:m:::$;$;;;;;2<2<<<<<9=9=====6>6>>>>>.?.?????@@n@n@@@AARARAAAAA2B2B{B{BBB C CPCPCCCCCDDaDaDDDDD$E$EcEcEEEEEFFWFWFFFFFGG>G>GtGtGGGGGHHGHGH{H{HHHHH I I:I:IiIiIIIIIIIJJ?J?JhJhJJJJJJJKK&K&KHKHKjKjKKKKKKKKKLL#L#L?L?LYLYLrLrLLLLLLLLLLLLLMMMM-M-M>>>K>K>====Z=Z===<>  o o N N ( (   o o GGeeAAXX++cc33  rrDDyyDDpp99ff00XX  z z 8!8!!!!!R"R"""##p#p###,$,$$$$$A%A%%%%%R&R&&&''\'\''' ( (a(a((())l)l)))**q*q***++k+k+++,,b,b,,,--T-T-----F.F.....6/6/////00c0c00000?1?1111122^2^2222283833333 4 4P4P4444455\5\5555566]6]6666677\7\7777788N8N88888885959l9l99999::F:F:~:~:::::;;Q;Q;;;;;;;<>.>.>X>X>>>>>>>>>??;?;?_?_?????????@@)@)@H@H@h@h@@@@@@@@@@@AA*A*ABABA\A\AtAtAAAAAAAAAAAAA B BBB0B0B@B@BQBQBbBbBqBqBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCC C C C CCCCCCCCCCCCCCCCCCC C C C CCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBuBuBfBfBVBVBEBEB4B4B$B$BBBAAAAAAAAAAAA}A}AeAeALALA4A4AAA@@@@@@@@@@v@v@V@V@9@9@@@????????w?w?U?U?1?1? ? ?>>>>>>x>x>Q>Q>(>(>>>======^=^=4=4===<<<<<>yyQQ((__44ll>>tt D D x x   G G z z   H H ||HH{{GGxxEEwwBBttJJMMPPQQ!!VV&&[[..ff99rrII!!]]77uuRR22ttWW==%%llWWFF88--{{##uuoonnrrww$$ڀڀ--يي<<؜؜KK׮׮``xx++ՔՔHHԴԴhh ӍӍFFҸҸoo))ўўZZЌЌIIςςBB΁΁AA͆͆HH ̔̔YY˩˩pp88ʏʏZZ""ɹɹɃɃPPȸȸȄȄTT""ǔǔee88ưưƃƃZZ--ŰŰňňaa::ġġ~~[[99óóÓÓssTT55¤¤ˆˆnnUU;;!!rr^^JJ88%%xxnnee^^WWNNHHBB??::6633//..--++++++--..005588<>^^{{ÜÜýý!!BBeeĈĈĭĭDDkkŒŒŻŻ 66``ƊƊƷƷ ;;hhǕǕ!!SSȂȂȴȴJJ}}ɯɯMMʂʂʺʺ&&__˖˖AAyy̵̵))ee͢͢YYΖΖTTϒϒTTЖЖ]]ѠѠ''jjүү;;ӁӁ UUԚԚ&&mmննGG֐֐$$oo׼׼SSؠؠ::نن##rr__ۮۮOOܡܡDDݖݖ::ތތ33߅߅//,,,,..2277AALLVV eett**==PPdd{{33KKcc~~99RRoo**FFbb ==YYuu33OO ii%%AA[[vv//JJ``vv/ / E E W W   i i   y y //>>JJTT\\  cciikkkkiidd  ^^NN??..}}jjSS== k k !!L!L!!!!!*"*"t"t"""##L#L#####$$$$i$i$$$$$;%;%%%%% & &L&L&&&&&''X'X'''''((](]((((())[)[)))))**R*R*****++A+A+}+}+++++),),d,d,,,,, - -B-B-{-{-----..P.P.......//R/R///////00F0F0x0x00000110101]1]1111111 2 28282a2a222222233*3*3T3T3{3{3333333442424V4V4y4y44444444455?5?5^5^5}5}555555555 6 6'6'6C6C6^6^6w6w6666666666677772727E7E7Z7Z7n7n777777777777777778888"8"80808<8<8G8G8S8S8^8^8h8h8s8s8{8{888888888888888888888888888888888888888888888888888888888888888{8{8q8q8f8f8]8]8S8S8F8F8;8;8-8-88888887777777777777777p7p7]7]7H7H7474777 7 76666666666~6~6c6c6I6I61616665555555555h5h5I5I5*5*5 5 544444444f4f4C4C44433333333i3i3C3C33322222222U2U2+2+222111111U1U1(1(1000000t0t0D0D000//////U/U/"/"/......Y.Y.$.$.------R-R---,,,,z,z,A,A, , ,++++_+_+%+%+****w*w*<*<***))))K)K)))((((U(U(((''''X'X'''&&&&V&V&&&%%%%M%M% % %$$$$?$?$####r#r#,#,#""""Z"Z"""!!!!>!>! e e   @@bb66PPkk44II[[  kkzz))55??IIOOUU[[^^__   a a a a _ _ _ _   ] ]   YYXX[[[[XXUUQQLLGGDD@@;;77551100..////113388<>QQee~~00KKff;;^^::aaFFtt11ߦߦbbޙޙUUݎݎLL ܊܊JJ ییMMڕڕWW٢٢ff++ضض||BB טט``''ֺֺփփLLխխxxDDԫԫyyGGӴӴӂӂUU$$ҚҚkk??ѺѺююcc::ооЕЕllDDϫϫυυaa==ΰΰΎΎmmMM--ʹʹ͕͕yy\\@@""̷̷̞̞̃̃kkTT==$$ ˸˸ˢˢˏˏ||iiXXEE55##ʽʽʯʯʣʣʘʘʌʌʁʁxxmmee^^UULLFF@@9944..))%%""  ##&&**0066;;AAGGNNWW__ffoo{{ʃʃʎʎʛʛʥʥʲʲ%%77GG[[kk~~˒˒ˤˤ˹˹$$==TTjj̸̸̝̝̄̄!!>>ZZvv͔͔ͲͲ ,,LLll΍΍ίί::^^ρρϥϥ==aaЉЉвв**UU~~ѧѧ((VVҁҁҮҮ 88ddӔӔ""SSԂԂԵԵJJ}}հհKKրրֵֵ UU׌׌22iiءءLLمم55ooڪڪ""^^ۛۛSS܏܏ JJ݊݊ HHއއDD߄߄GGQQ``..rrBB^^33|| SS//ww SS11}}^^??""ooRR88 nn VV@@))yyddQQ<<))yyhhUUDD11!!qq__MM;;''wwddQQ??**wwccNN77mm  T T 8 8   g g L L - - w w  WW55~~[[33{{  RR))ooAAXX%%ii44xx??EEIIEE??||22llSS99qq  R R .!.!c!c!!!!!"":":"m"m"""""##<#<#n#n#####$$6$6$f$f$$$$$$$&%&%U%U%%%%%%% & &:&:&e&e&&&&&&&''?'?'i'i'''''''((6(6(^(^((((((((())C)C)h)h)))))))))**<*<*_*_*********++++>+>+]+]+{+{+++++++++ , ,%,%,?,?,Z,Z,t,t,,,,,,,,,,,----2-2-G-G-^-^-t-t--------------- . ...*.*.<.<.I.I.Z.Z.h.h.v.v.........................// / ///////"/"/'/'/,/,/1/1/5/5/9/9//>/?/?/A/A/A/A/B/B/B/B/A/A/@/@/?/?/?/?/>ggGGoo&&NNuu++SS  yy00WW88__??ggHHqq))TT ~~88ccIIyy22bbOO ;;xx66pp..hh%%aa!!]]\\]]aa##jj--uu88HH^^$$vv>>\\%%GGqq<<jj66kk88ߤߤssBB޴޴ރރUU&&ݝݝooBBܿܿܓܓgg>>ۿۿۖۖllDDڥڥWW22 ٝٝyyUU22اا؅؅ddDD##ץץ׆׆hhKK..־־֡֡ֆֆkkSS99 տտզզՐՐzzccMM::$$԰԰ԞԞԋԋ{{jj[[KK<<,,ӹӹӭӭӢӢӚӚӏӏӆӆ~~vvmmff``ZZTTMMHHBB@@;;884422..--++**))******++,,..225588<>aa  7 7 X X z z !!>!>!^!^!}!}!!!!!!!!!""2"2"M"M"j"j""""""""""" # #&#&#?#?#Z#Z#s#s#############$$+$+$@$@$W$W$k$k$$$$$$$$$$$$$$$%%%%&%&%7%7%G%G%X%X%g%g%w%w%%%%%%%%%%%%%%%%%%%%%&&&&&&$&$&,&,&5&5&?&?&F&F&N&N&W&W&^&^&d&d&k&k&r&r&w&w&|&|&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&{&v&v&p&p&h&h&c&c&]&]&U&U&M&M&D&D&=&=&5&5&+&+&"&"&&&&&&&%%%%%%%%%%%%%%%%%%%%w%w%g%g%Y%Y%H%H%9%9%(%(%%%%%$$$$$$$$$$$$$$p$p$\$\$F$F$3$3$$$$$##########~#~#d#d#L#L#5#5#####""""""""|"|"`"`"C"C"("(" " "!!!!!!!!y!y!Z!Z!>YY!!xx??^^&&HHkk33ZZ$$NNyyDDss@@ qq?? uuBB~~LLZZ**mm>>WW++vvKKqqEEssKK""XX11 ppJJ$$mmHH%%wwUU44qqQQ22}}``BB'' ߸߸ߝߝ߁߁ggLL55޹޹ޡޡމމss\\DD//ݲݲݞݞ݉݉wwccPP@@-- ܻܻܪܪܜܜ܍܍ppccVVII>>22%%ۼۼ۴۴۫۫ۥۥ۟۟ۙۙےےۍۍۇۇہہ~~{{vvrrnnlliiggeeddccbbbbbbbbccddeeggiikknnppttyy}}ۀۀۄۄۊۊێێەەۛۛۡۡۧۧۮۮ۷۷ۿۿ((55@@KKXXeess܁܁܎܎ܞܞܫܫܻܻ ,,>>OOaatt݆݆ݛݛݭݭ((??TTjjށށޘޘޯޯ&&@@YYssߌߌߦߦ..HHee22PPoo --MMnn77[[}} 00RRww 22VV~~@@gg11ZZ**RR~~((SS//[[<>EEOOXX``iiqqyy}}ttmmdd^^TTLLBB;;00%%}}nn__OO@@11!!ss``NN;;&&iiRR==$$}}ccKK22yy]]BB%%  yy[[>>eeFF&&ccBB  uuSS//  ~~ZZ55}}XX22  rrMM%%__::ooHHxxOO&&}}TT(( } } Q Q ' ' w w M M o o D D   d d 6 6   U U ' ' ooAA[[,,ssDD[[,,rrBBWW''kk;;  }}OOcc33yyII^^//ssCC[[++rrDD]]..yyJJhh::aa66 ^^22ZZ00ZZ00^^33 ff;;qqII!![[33ssNN&&mmFF##ooKK&&zzVV44mmLL,, nnOO//||__AA%%}}aaFF--ww^^EE..ss^^GG22{{ffTTAA11 vvggWWJJ<<..!!zzppee\\RRKKAA::22++""  ''0077>>FFPPWWaakktt~~$$11??NN\\llzz 00AARRddww((<>gg//XX""KKttAAll99bb 22\\,,UU''QQ{{!!KKuuFFpp@@jj 77aa//YY''OOyyCCmm66__&&NNss::``##JJoo..TTyy  4 4 Y Y ~ ~   5 5 Y Y } } / / R R u u " " E E g g   0 0 Q Q q q 55UUtt..MMjj66RRnn--HH``||00KKbb{{  ##;;QQii--AAUUjj~~))<<NN^^oo--;;JJUUccpp  &&00::AAKKRRZZaajjqqxx~~uuoohh__XXOOHH??66..$$~~qqccUUJJ<<..uuddSSBB11yyddRR>>))llUU??))ooXX??&&vv]]CC**ooSS99ttWW::mmOO11 y y \ \ = =     _ _ ? ?   } } ] ] < <   t t U U 5 5   o o O O - - ``>>nnKK''vvSS//  {{XX44[[77]]99]]99]]88\\77^^99^^::__;;cc??iiEE!!qqMM**}}YY66iiFF%%||ZZ99ssRR11qqQQ11vvVV77ccFF(( yy[[??!!zz__CC((ooTT::!! rrZZAA((ppWWAA,,mmWWCC//qq``NN<<++wwhhZZLL==//!!||qqdd[[PPDD;;11'' {{uuqqmmhhddaa^^[[XXUUSSQQOOMMLLKKHHFFFFEEEEFFEEFFFFGGGGJJJJLLNNPPQQSSVVXX\\__bbeejjnnqquu{{##--55AAKKTT``kktt""//==KKZZhhvv$$33DDUUggxx 11CCVVkk""77MMaaxx((AAWWoo,,FF^^ww&&@@YYss++GGaa|| ;;XXss99VVrr!!>>[[yy**IIgg::YYyy00PPnn ))IIhh$$DDdd!!AAaa??__??__==^^~~<<\\||77WWvv22QQqq  ++IIii!!??]]{{00OOll;;WWtt""??[[ww;;WWss**DD__ww  * * E E ^ ^ w w % % = = V V m m   * * A A X X o o 7 7 M M a a w w     / / B B W W h h } } %%77GGXXii||..==LLZZhhww  %%11>>JJUU``llvv  ((//88??EEMMSSZZ__eekkppvv||}}xxqqmmff``[[TTOOFF@@::11**""  rrii^^RRHH<<00##  ||nn__QQDD55&&yyhhXXHH77&& t t b b O O = = ( (     y y f f Q Q > > ( (   l l W W @ @ , ,   x x b b L L 5 5     y y d d J J 2 2     ppXX??''ww``GG//hhOO66ggLL22ww__CC((mmQQ55ww]]AA%%  ffJJ//ooTT88{{__DD(( jjOO33uu[[??%% kkOO55}}bbII--yy``FF--}}ddJJ11nnUU==%%iiQQ::##ooYYBB,,kkWWAA,,xxccPP<<))oo\\JJ99''oo^^OO??//~~ppaaSSFF99++xxnnbbXXNNBB99//$$ zzrrnnffaa\\UUPPJJDD@@;;5511--(($$!!   ##'',,114488>>CCGGMMSSXX__ddkkqqww~~!!**44>>IIQQ[[ggqq{{))44AAPP[[iiww,,< > A A F F J J O O R R W W Y Y ^ ^ ` ` e e f f i i m m o o r r t t w w x x | | } }     ~ ~ | | z z x x u u r r p p n n l l g g f f b b _ _ ] ] W W U U P P M M H H D D ? ? < < 7 7 2 2 - - ( ( $ $             } } u u m m d d \ \ R R J J @ @ 7 7 / / & &       x x m m b b W W L L ? ? 5 5 ' '       x x l l _ _ Q Q E E 7 7 ( (   ~~ooaaRRDD44%%xxjjXXHH77''pp__NN<<++{{kkWWFF33""||kkXXFF33  wweeQQ??++kkYYEE11  oo[[HH44    qq^^JJ66##vvbbNN;;''yyffSS??,,mmYYGG33!! yyggSSAA// zziiUUDD22!!rraaQQ@@.. yyhhXXHH88(( }}nn``QQAA22$$zznnaaSSGG99..!!vvjj``SSHH<<11&&wwllbbYYPPGG>>44,,## ~~xxqqjjdd__YYRRLLHHBB>>8822..))##  ##((..1188<>GGOOXXbbkkss{{$$++2288??FFKKSSXX__ddkkoovv{{    !!""$$%%&&''''(())))********,,,,********))))((''''''&&%%$$!!      ||wwrrnnggbb\\WWPPKKCC>>8833++$$  ||ttlldd\\SSKKCC::22((wwoodd[[PPGG;;22''||ssgg\\RRFF;;//##  uuii]]QQEE99--!!  uuii[[OOCC55))wwjj]]PPCC66))ttggZZMM@@33&& rreeXXKK>>11$$ ~~rreeXXKK>>22%% wwkk__QQEE99--!! {{ooeeYYMMAA55))yynneeYYNNEE9900%% yyqqhh]]UULLBB9911(( yyqqiiaaYYQQJJBB<<55--%% }}yyttnniiee``ZZUUQQMMFFBB==995511--))%%!!  !!%%))--1166::>>BBFFLLQQUUYY^^ddhhmmqqvv||  %%,,2299AAHHMMUU]]ddjjrryy ""**22::DDLLUU]]eemmvv ((11::DDMMVVaaiirr}} ))33==GGQQ[[eeooyy##--77AAMMWWaakkuu##--88BBLLWWaakkuu !!++55@@JJTT^^hhrr||  **33==GGPPZZccmmvv  %%..77@@HHQQZZcclltt||  ##++11;;AAIIQQYYaaiiqqww}}  ##++1177==CCIIOOUU[[aaggmmssww}}    $$''++//3377::<<??CCGGJJLLOOSSWWXX[[__``ddgghhkkooppssvvwwzz{{~~~~{{xxwwttssppnnkkhhggcc``__\\ZZWWSSOONNKKGGCCBB>>;;773300,,((&&##  }}yyuuooiiee__YYUUOOIICC==7733--''!!  yyssmmgg__YYQQKKEE==77//))!!  ||uunngg__WWPPIIAA9922**##  {{sskkcc\\TTLLDD<<44,,%% ||ttlldd]]UUMMEE>>66..&&xxqqiibbZZSSKKDD<<55..&& }}wwooiiaa[[UUMMGGAA9933--%% {{uuookkee__YYUUOOIICC==9933//))## }}zzuurrnnjjhhdd``]]YYUURRPPLLIIEEBB>><<99552200--))((%%!!   ""%%&&))--00225588::==AADDFFIIMMPPRRUUYY]]``ddeeiimmqqttvvzz~~ !!%%++//3399==AAGGKKQQUUYY__cciimmssww}} !!''--1177==CCIIMMSSYY__cciioouu{{ $$))//55;;@@FFLLRRWW]]cciinnttzz ""''--2288==CCHHNNSSYY^^ddiinnttyy  %%))..3388==AAFFKKPPUUYY^^ccggllppuuyy}}  !!%%((,,//336699==@@CCGGJJMMPPTTWWYY]]``ccffhhllnnrrttwwzz{{~~{{zzwwttrroommjjhheebb__\\ZZWWTTQQOOLLIIFFDD@@==;;775511//++))%%""    ~~||xxttqqmmiieeaa^^ZZVVRRNNJJGGCC??;;7733//,,(($$  ~~zzvvrrnnjjffbb^^ZZVVSSOOKKGGCC??;;7733//++''$$  ~~zzwwsspplliieebb^^[[WWTTQQMMJJGGCC@@==::663300--))&&##  }}{{yywwuussqqoommkkiiggeeccaa__]][[YYWWWWUUSSQQOOMMKKIIGGGGEECCAAAA??==;;;;9999775533331111//----++))))''''%%####!!!! !!!!!!####%%''''''))))++++----//1133333355777799;;;;==????AAAACCEEGGGGIIKKMMMMOOQQSSUUUUWWYY[[[[]]__aacceeggggiikkmmooqqsssswwwwyy{{}} !!##&&((++--00225577::<>@@CCEEGGIIKKNNPPRRTTVVYY[[]]__aacceeggjjkknnpprrttvvxxzz||~~sonic-visualiser-2.3~repack1.orig/samples/click.wav0000644000175000017500000000020412252354725021176 0ustar miramiraRIFF|WAVEfmt DXdataXreat(ebyӠCra S%r +S:a+p> ---7ݠA?rͰ06sonic-visualiser-2.3~repack1.orig/samples/piano.wav0000644000175000017500000024002412252354725021225 0ustar miramiraRIFF @WAVEfmt DXdata?(T(?pAB96Y*DlnJ/luYQb,@_>0;~"U8#<3h-xb Z  l sQ , D[@ ,qUVupl >L$Z(+.159T>ACjC@V:2*#}6(+3 }c&=DҍЛ}͕+PߝrҪ!Xq5Lٰ֒!շv{dߕFku j~A'  tc605l; Y '0_3.b$B t =8 `"F rNc/ &-25789<<@WH R7\diVjg`WMC:2. -,,(+r'!8 \  jP!@%zhMCH˿m ɾ1q‚4D˛LՄjFȾ~гޅYmdЌ؆j{BגqCm EN+22,"R8 m+I rO )-/10*"> - CB FhR;b.ip `I >"F/=SLTYbg7gb\zWzTSPSQMUG>~4V*X!Fo W! HgKra`%f}Ҡƀh+ӲӵCWV }Թ?И4h܎PVZhЄɊs͖V&9ֽ.75JBr&+J,("D"L)z--)#DSNU y V%pS"IJ  u #c/9AHKNSY9`f1looolf^ U"K B:632=21.+(%$"!ps w }% :ivOنo΀:ݴ8Ή Vˑ~ˑ|ykڶeCѽ˂nx˻'ܸ,c S/ 1 +62n4 =i} B|'RPkVf <%0J>DLZX`*e}f fda]V OGA<84.(# !#G')($c   -j  JA6S |&5k@Шʷį=Лۍ6i.gv& U w 5G1LTo 7  7 #+4?UKWcmunyzxtOmc&X9MEABFJKuHA6u+ Y wI pwNPAbeٚ?ۋSYaxv*͆ȳ/P5 LReެ*AУm*Ȫqn{6N~#vRf Z5(b zNVBP= !c!r 8C S - s &&4LFXgzs5yxs~k,c\YUYZ8\@\%ZUOVH?6M.'$#% ) +*m'N!T 7 8)!. 7>m8 ɽJǝʰ̌ˑ»M& r<Ώvٓӝݻ6xn½Zˤ#XDxQM:}F p]mwRl? @#BU% ,LnFÿ.Ɲ%\`MZxФvC֊-xϜΖṕŜ7K"=]N *_ZveXRBq bD4 %|n   D   8$+600+# Tp C '3MEPLRY$^acdd{dc1b6`][Y.WTRQPPOeLHEO;0'M"!$*17e%= 922+ #J Q2"t@ާܫ٬t+/",4&Ќ҇>A͔ W*ûƾ_λU`Ѣ"9؀ ݩY 2 )YSvO33 Og]"C6,#-6=CHNTT[ adeda^[)ZZ[^ac,bO]vULB:33.*(),'16;>@?o<6/("*>Xk]}MVܝդ΍fҿB޻ں4hŒ'ϝwMwǞັ kT`= ZłYկKZkT$I,W#P4uC(. < o#+k=R#0.SSRSUpX[O]_Zbehjid\ SI@]:w6\433E57,;>>>@@=@?=6<9@56/( vH <DU \kI p O˾~=CkƯbSݩ^=iМ0FzuM"U Ŭɸj^[2}؞ջjIbWSj0[ & V!&R@i9 A^_v=wNWm9XKH])'069s::\;I=@mEKRY_ceda\.WOY=>DpJ _ ; o dܤݡ|4 EW_|!#&h+1Q9mA3IPUpZ]G` a`2]XSLNeI'EQA}=964546:`?BC3C@=951.P,T*($ Gp -}v_ "9m,ϩ̗̮ͫG(:OcŻv§ȧp@ݾhbֹoпЉ&C7RG B  UP*w+ AL!Vp~U- Qm 37$>&s.6A?FMSX{\e_2aa`]XQ J_B< 86+78:;<= I . (]YwՔԖӬюMʉm`v5WצS#7N8rnmyR۔ܶۙ7n}:̷βШڴ>5 .S>V{Ut^ f8 8 {uj+:   $0'%I.i8BKSYJ\J]?\OYTO IC@>=c<1;M9743=3-4(68;=>;>p;60*#&GG;2 AQDc3[ѕxſ!ƱI(׭&$ e@Þ@O IoTޮ׎ӋϑʾΉtl Y$P'*a  a+##Z! -6Mr)QE6?D\&j2=ELPRRQONNNMKH(D>:3632u1124Y8<@BpB>I8{0 )g#S  S"s#?#A!}o ;}}\?͋ɶƊc̘ՇڕS6у\]XȀJŢǠ6BՄݲShܴPΞ5q]}buS!J.$=T z,K!5%&a&$ o <NR8-(rty|H }#,5+>7EJ,NPRTVVUSXNG@X930@1p4c9>BDDbB>j:<62/Q-+Z+<++?*u(%r"Hr  :*4p9,،ӌ̐ˊѴhu~iGgV)# WxeÒNχ֔s.vH?b: o #$"b nD+,=IWOg!(1;EMRNU'UnRMZG@: 633.5k79f;<<t<;<>?@A@t?=&<:9v9r9f99-875O4f2/+.'"Q%!_"C!qZ _\wܭ <Е*)4ܗݘܛϺ &r?\Ns!Ӱwrە׫ԭ@ϬewOYXQ1m5\uSZ!"x t *!N W[+Q;Z(D3:?bA:A,@!?>>>>->z=@AHA?=;87y72894;<=_>> y"&),-0 46899999|:B;5?@aA&A?<7Q2,l(&%'T+q/379;<<;94;.e&_y i)jx Ծϵ,*B{hxްԊt1x/H=)ߤ J/@Y; x i*-)#!%%$m"z0h ]"08K! +c!C&"*2-//^/.b.u/26t:>A"CB@e=8!4/",j)'d&&&(+/38;>?O?<70(C yJpH**[ҙ9#޾zȧ׃ۺp C=j6;20ŝ4 T\ܙGqm!?5{yt @Ox " %  #&(2*)'r#tsIb}lcyq "#`$$(&(* .1595==@KB$CB#A>;72.+?(s&%X&([,17>BE.FCP?19V2+(%{] "DdbsS,L0v,2;Iͫ3}2׊פfrfcͿL5a)Y9bL_ J/+uLM | opT#'Z+-!.,)d#9R O_Op;DjZ 8LA0a"'%(,048;>AC2EDBa>8{2,'z$N#2$&++O05:>@A@?Y EkVj 4} + sL !9%*/6b>C>D=;%951E,% .nz}بfWȯ Bȟʴ* >f{$`ƒ꺌HATm.cڣyq`N?`6SZPNxTA[~g i #m%&@'`'&$!t{ Ib29eT  P;r%, 4?:>AzBNA>:T61_-)'&')+Z-.0{247:=x@BCRC@;5.'!S\b X F w7NyF/UȨbpޫ8?8Ӥ*ȀCо*ÉL.مށM@߭]\y"`R3d 6 qqe!%?([)('$   \mUUnY "*1 7:=h==<97'410.- ,A*|(F'&'q(4+9/4/9=AChDCA#?;S72-(o$ 'K8`]M Pn&sإ&("CW rq2ɨMK&HܐݔݓH#ڕV۪ݰzjweRGDX}Q 1 "$g%%%# #kt.RBVC;N^6D#!)g-1468$:X:?96f3/+)K'i&P&&x(+.276< @B'D DB?C;???3>O;x7O3c/ ,`)n'D&%P&)''8(h';%!v#A:cR܉4ڹASٝ-#TƖ8FʩDQԎԀ=i2ԵבPCCC8m`g !U%&b&$C"TXk| iEcQGKFiu%}+/21/i,(%#"t""#$%'(w*,/25P97<>>?>:=:74J0,*(j(F)*+m,V,w+)'$ b:D.\>l@%27؞ѯ͚&ȫ`BoҌ ӝ'ҒэQ ֚G z4VI$  = n.\}> k  Xmn&'mLm>,CI E\!%T()L*>*)('&z%$?$$##e${%'*A/ 48c<?[@d@2?<:7|4{210Y/.m.p..d//T0'01/4-*{%T(E7\d0n@H(ް\6Д͛q(ʯ`@ռxӪ1kωҏӼԓ< ݳߘspV 'ex\TLS %90A$bwA vn^hY' Rx | J#%E'u()('&#! >!t$#(.,G0647:<===;:87420z/..j/0(2E33a3;2A0O-/)#$&zg4\p9Ds~)˳8Q;φ9x)%M΂xϖ!g&SRj/m9Y ع%!&j&: : W2 9R "$%%$" _ "%(,058$;<[=$=4<:86421r111j23457'82863.:)"*;W89*ac$UPa Q1ӷѶ,ϝZ9o ѳ"ӓ҆Нtnͽαpמڞ+0I5ئI#a<Cm}z 'n 4Pa$`ER1 (7$lm7>v +J!B"B"!  > $(,04l79D;"?>b<83-G'M }da ,LNbN7Goׅ`ԡѹЪUVtӢRԬPНʚ!ƳfДեٷAY:ޜ۴ة:i֧V(  30:A1 QqCfi  (r3Y 13x"%p) -031678}7*642K1/.1.p./2Q6z:^>VABB"A>6:51>-("$X (d Y|Xqv۫!Qчѫc$g<տ@уoǂK?\Љw.xJPٔգбf#3.zH - fph}dw '@jP|- /^rFeaL j$(,035D6E530-*y))+.1478:<>O@4A@>q;7 2,'"Di  *8Dhܫ ּԱԘ-bTp>}C˚I`F>QV #XOޡ!Aۃ*&*vNJ&8 > )Y u ;8} )^cbq *  |!^i Z : ?`N"&!*H,u---,+*)[)4)g))*,/I259=?@A@>X;73/+'# Us i 4I2Fco9ݬܜMۮL@١ {ַ|цΊ cMȆdڂte֒/% ڮܰ8a_>Y > !"?" B] ,`9o  p  6 " cB"%(+d,,,0,.+*(V(a(G)+-14m8;>}@AAA@>=:7g4,0m+&""gZ)V 1 mDE&}~ݶAޥ޷!޹ܔcҼЧΤj~q˜Φ&ې-^,ݾږئMz_Շj{ݫBzFT Wm%"#8"~` ;Gej6V(1CH ,[ `$'((-(&<%2$#$%'K*,2/14p68r;=?cAA*A?;73/+(%D#'!N!E ' t,ߵ߈@߾݋܌ׄm͋ʔȵ0WAѥOߟL\EQԁ֛Cڳk$AMBAe@>;29!755530j.+(N&#! <0 j)rflUIp0"Fu m ʧ c9ϡэ#ިk<߻ݧܲ۫|=-חָ֧Uم߈lA'y3e * `!!XZX Ai! V~(wVf| -gYG\:6 lx"W&I*@.1 579;=l>4?)?'>N<97~53520.,*(&6%z#I!m3Wk /yX?4OD]v ߥ`ʤzՠjE߄z*}8Hr׫׌u ެޤdQަވ98H?4)z \kxum 6u9 **Y2ZV7x1tu =e_6VX"%)-Q0835d8:f<====;V:8K7:6]5}4c31"0. ,2*(^'&$&! -3k@P+dߢ) Փ~δ1xσөh^ߣޭoFVھْTڄۓ3%-@^VmL>X "T  *.szJsM['=<d6$!8#%),0347 999 9 87m6555c55544K433(20`.+&!I: e MgsM6pտ֗aؙټ ܅ݟ2,ߣw1j:܊[G1$;=s9_ ,j$z< H cAB}4Ad 23S c /M!8UUF #{'*`-/13n56766454344456<777n75641U-')$ jjb1 x`7rcFئ֭ՍA-|]+(۪ ި޳އޑlk تy eU\J 9PUVvj- u`4U7j!$(i+.q13:55540433*4~5]7d9;<;:865{320.*%@ $3 HV;7 NeCܒհԼԴx؉1}ڐڗڷmo=~ݣݵ\26gٷ#Ԇ ҚӼվrܲt nY*zj # !3 -Qn$hYC/`B 3 Q p K]U\!%A)+,7-F--;.q/023 556Q666Z778i999851,%T5RZ9M  @:*S+Gsيقlgِ٬ڄHܲ܏ex{Qݕ߼Do)[aރk ؞y?П)\5Q" [+$@  -Wso.g4C&VI=" 6 8 8 E~S x  !c#=%'_**-q/000..N./r25Q9*<==<96}360-)v&"#E {.pݚ{J"j^޳N@VP2 H)=6BAOj#ЁM=Գؐw7 ~ Z]uH  o y W{n2WMZ-L36Q \U6e"c&())(''(`)+E.71 4~6e89d:: :9753'1f.++'"+y3^ L[y(]Dߛ=IG b SۿbATހߥ\DwVߑ98OIcδw۳2}G}6n  P H =  : $ n !~zahETR-U|y? ~> D#/b!_""(#]##$I&S(*,.0l24579 :k:9z852.*''$!4' T -;]aplZYޤ-:٭ڃ(ܟ ݍ7ߏDFTюϝTj%qdL 3 Xu[UQ78BJ7]\# ; P"7 v2-!u":###L$%B(+/368y9976Q5]432"1.+'#gqly > n DV3_:)2-ۊ*ܝ۶ںW۞xެkBYx?zӋR3ͺεۓclbkj / ' h  t~@ 9 qa -> IBem4`o= 5. #0& )o+i-(/02{4!6c78:8775331-R*&#h!~p'v %:5H7G!s9qTܼMK!iզ[ϵ΂>Ep֥5٪U&BA :^K h r MG ,5_TI Y#wE,] N svg!"$&F), /1M4%6R7776531%/,@*5(&%$!$#k! l ? s:khzc<_u܄K۟ڽ٦T-!zHsYݥ. ט jѐo}߼VMUvp ; `i i I 9 9 at %[r&#2x   4 7b6; "%')r,/]2|45;654320 /.E-,_,+*)&K$A!GKsY & v3/H'$@0uݼ\ qpN\4HؑՋWJωѴ'6=_G] yO D (Q !{yae0"8) Y [N/R] s {#Yv"&p*d-/0111b0//0011T10.+)'&&{$" ]l' I  uTQ .MwݩriwWتUdUOpPea~WٻՈ- դ֥9II"Au a [ + h oW4b,m*W$~2rL*<lk iIWl;T0#&([)/**+,.}/01-2 21%100 11?0t.+'#q, ( I 2iQ 89ލێyا!Y..?w1ݥ)ڠjIU X2eڏܡެwWq4PH T lNn rW(H_y;u Z]suEV5   %P" %W' )*****:+*,-;025w6|652k/F,)w'%$#@" vLfu VGx.YC״ו2GܓXq)n/z g>٘ۤr;GhM)5 Y  L BOEp[R[-^SWVf 8 /[   8 "5#1##%##g%'}*-035T65:41/{-9,+&,,,+u)%!!U.$O <0+)'T aX ڶh>RܪN2&YkקUђ#w>ݭA3Ap! < ` u " Kv3XC2Z-cwz`bm+,[6/z ;Xoj#'+.010/ /.g/z012G320-e*'($!<nU O7#dh4*yNݺ۽Ld4ݤi$Ԃզճ\H_A| gUa/L8; oe^^pp`!"uc91k z b|xVn#"%.(+-z/0U1111111J1_0.,*'%X">}6m+ > Rs)V*RyI Gx=GM$EQި܎!O+Mڔ1֦Ӓ}Ш6ֹق9vkPV:ET0F\-Lfb~{?WfogAP r >#% ()y+,w.0w12S3t33I2N160.-+h)&$a!6YY ;xEj'M݈ j!}9ߢ^*S;ڌ"@lTљ%ԠՃ׺8},: | y fle;\}_  T +h\HQ9q (f[ }  A6 u# &(*,.3/00l1 22221#0.+)T&#T!)-N g K Ksr<<-_x+0_Zs )8/[A؝a`cP9Yn`ڝcY^$6;Ds 3  syE  RGp[Lv+ ; k { D$a. "$&(*,m./01-2230321.N+'u$!  MOi  ) 9:<al^ ߩwMi"#ՖЫw[րo7QZK{c[N\4;d9,`Q5^C3H0 [O3?-M  v > g? "#G%&N(t*2-S0]356X641#/,*M)y('f'&%g$" cDHq D!m&_u (q.ߘQ(Q^݁grԮӥԒ=N֏;2x٭޵]#BY7[c}X}r4 ~ gi(  x Y L]L!%(i,P/x12v333P2^1[0g/.-+-P,(+)'&Q$""\! lO 0 (Z[R q[0$4} 9G`݊ޙ/oa:۫$Υ͘ͳФsZ[sD8xWw0|(X68;rj7J1rg7 h T~sY##')f+,-./0^111p1Z0.,*)(((5))(V&#.!{jy] <ELs'Q(xM| 6c,">3 q2|7$ | >  E VB "%(y+./0210/.-7-,-f---,+\*('%$#"!|6HN a -DlkXw2)F* :Xlk^cӴє9иѼӬՅ+٧ܬ`,6uyZX] %sC3hQCv( / g =7I!$')[+,o,,,-./f00/.&-+**G+),,R-, + (# u\# *o)  TmvvwW"׈^TTp}Ԡ؃ڜ'sܹKh+bf6LpKMEf4/2yD91[&80m a z2 5"%$z& )+-./v.-+#*s))*,1/>122.1N.A*% V{: rQk!$ZGD?)UoyއIXӃ*ըPֽ\*1܀ HywQ%qF@C/f.\9[JnuB.oWBkctf  H"d+s #N'*+,U+)(&&(p*-03_554^2/~,)&$;"$ R" o , 0.';$WMP(HEܥچٻ2uֲ֪֋U?ڷڽq*clx:bE8kgxe)mj x)9sVr `*I "##"f"F""#$&(+{.61d34431L/,"*(&Y%b$]#"r eZW[ V`}$I3ߒghi/z=?8qXjKӃOBtZ#}K2vETfrZD  t>eB$cBS/> e]x Bpo`'"r%(+h.<0m12@22^1U0.V-+)@(&z%6$"{!"KsCzi" 8xe:g8YJ% L1܉ڈHټ܃TVܦڋg֡ԑ` lGowj2Un1@{>;> @)wFzok;d# WBu<9'n 4 u ?#>&A),x.X01Y22'2X1/0.F-+]*)'&% $="- _$ERTN Rlcd o83Fa4y߈݉pK=ߤޥyN8'ק/ҏD{ך5~*we3w3H8R:v4 w+@neO\o$V== 7Slp"%(+-U/*0y0m000/x/.T.b-,\*V(+&$-" ~%4g-  B!y=CJYVM)K`vL߷߉C7ݱ۠!׃:syѾքEbotIx&PQtr  KtxK}an{ n>PA T  "'08"%`')+h-.P0O111z1e0.,*(&Z%G$#j#M##I" JWz ,-Ps>V߽lI(p Ԅӛԅ ի՜69Ybo18M BN'lra$+~?*[ # 8    h  Q !~$'*.0132P1/-P,$+c*)])('&f%;$9#j"!5! SScz' 1D >=x[>a|ph}P@ߍbtֿԞҢAԗ:wA^R !%VU'TO[ NL|?!3z=>h HfwS*jc"1{ l O . 6"%}(*c,m----\-,,,o+*)/(&%$B$s$%%(&%R$!_ W`/dLFQODGM$T8yR#Y\uI)ۿ@ ,\+"BE*@ YP.i."ST2h`:PWVGa'3N !!#%')a+$-.$/.-,4*(S'&&0'' (('k'&>&%~$" *$  +[=r~v58A Gin)BduIфyo9*eCLAN?qr%]8k*2~7%V~[7Sm,AE42 n Hqg16"l%')i**W*)d)(^('M'&>&%%%%D&&'((('&q#w 0*!3-/L~FXxCsvpܲMwCיK xHqY]=6K1}Zq[US"Y 3"#L%c&;''%( (}'~&=%$#"0#5$%]'(***(&"_Q% Z  S"QvIMm) >noܵ9 ڹY7:.;z.XkV!i=Sy&(My%dhaaV?V6,6!7PzY E :h5"E$%%%$#! / a A!"$&( ***)'$!r/), sY  , .e-yDedhpM'`IVl=es@ܰܰܰޝso7X`W1F7=i+9G V@$SxlnW\z9KG77@ wg `%  z!K!E i|!#$+& '}''Y'&,&*%#!0gB  k / s p Vn$'JT)sar+) /ޟsޤ*4^/0lycqE+CDvlAKHHUzn):P;;1e?R<2Ij )4gGkdcE |!"#h$$]%%%%%#!!  1j%A@  |7 _TDUw\V.1޼b[}JA#sG@g+H!Wxss`5-^]baoI^^ M9L;mu=S 4oJ9F !"$&&&3&$.# )0t3)yh7` RiC { "VP } oNPl(~}3 Pi!Xu~\OLK<dsyz r M C9BYV C "c$M%f%$j#!1D6N(qu  \Y]#T[{~d6d?D{Z01mh -N6X4_7WUr 2wp7g(Cpt+bO!=W <I8Lq% !###"X!\uND) k  ({D `9%H:TMZXshDj-\GmI$a[L%; `P({nBOp $5\[ G x  jm1= "?"!# w}sCa3 <)L |./#' ${o1Sp#?|_[SzqEe6ZR253[&{Cp.d2M;0Nz_Bn)q'(h@>-a Bmc%)?D)W S %DLf MF{q(Tkh\G_PycMh>$IL7 km\X<-@/i f 4bT\lDOD   eGFllYj=g*)-[Bi4 epA_KPc0zK<8SH!*J Co A1 WR~Lw2EYa9W]6YlG"xkiJ^$I 0F^h[n`~v-d&r#M _J[./RWht+DGP D> !GT +xx@#fdu+= t;65 )HIs:xl7}8H" A lxThM[Vh ).r5m{unt~<i=#C[ gQz{!{vi$rR|pn#Gk63,G6gTS1tToH`sE8`f bUs:=8*+vd  ,;(=N h| ( J)kNn[G6)- #hfXK3&knXhkEv!0o>ShNuoWb)8k5FVH]w0z ?Pkq7T"7-}Ze& BzUz?$J a!GS: ! }9m &G} ;4y+J`py~e|,q(BGFow!U)LOV^ W :%W5{n hB%NOs)SL2KKF jwIt a   n L( HTJl>v4CSb 8dD[2/f%&fhCawt${?cu'IXtTVE<gG^ kpj#VgSS'pxTSxG X kO5Q  a e < l ! e:w% N# y U q{, Cw4 7tn|4{5[b;&}s >_Y|ruE BGXp'tZie?/; 5T:zIL]_%ug6"[T &  y k u H| Y bk "fB  R]C} \ ; vDjoi|mRj|W,O@G6r`0n<5, qGmrb} -PFJPo3b-BAZ O\"%{+0 0 > a  y<q%Q YN_I ? s vTT0 g 9sc4|=l aO)4u.Nsw{VHqhdjoL34 RMqMs<\P32{3cP'jZ8PoNy7~$H 4{ebN G T 8LM M z -s&7O0" . =   3=,~:zM@C5.f,2Ueg<:@  Jfb(G@3zU?fT%K L?dCBB pG@e@<lBaY\m/p^N$ Rx^XU'U"4}7h_\7! x q Q B =![Aa   ;%Z^f?,`afKwjm17s_$+6**{o t[{oZ5<!`a L H7@f>,];5nNgC=+Vfe7 = 6 ! F O KK]n/ ^ c : \bA;fPi.*?0>K#ch`&{Y2<['f0%H Y^8]%3d4k*zlatFdD^R^>-` (  p xh9@ps^#N8tw >\VOmP+ $T}Q_C&m$uVl+!b aEuh/$F.zQ) c N ac[A;DaS] ~  .x{I9F-S9]% "s[ ,ZveZX9sfV.zS TnI`d?2^_I%E{G.O*D~" exc4(/t8N2jU)#{PyF:+QU R:cWE7/GeC+)}}o@Rp$?Q d}?@.PA"o_]$?.WP*U(CZj8TK~e%P9MR5n{3@(hR\Q]/Fr?&?)H?"ymFU{h.B^jC_;!Z^:on:2is]N  E)QH{a7'8<:2Y8;Xa@-YFsu0z dn #CR>._[ Iap?N9 rO2K-{H[30VB%+B^F&^f=xF8Oh*wK D-vXy ; Rl2 tN?"5{<V}E]&:m4).ZZ'R{GMzKs6Q< y^54Kz@nFK^_.cm.53+\+et8P5_.FcwBDU4KM;3QCqy`v10Q ,%^z_;>K]-gT/r FI/ Cpy<|pzW$ -a6QRZ 2|{ 5'O  o BpxOank (;0Gq/%Q,? yU1 8lk[EA4yTZ[U :PB G5My5k4ZkjW/x evgahUNQb/U$;Z$5x_@6MUsn?Tn!EsUOiVf +a/ ;Gg}DhE/99bL| d_2E&f4cav3;\@9zqLm%4G/N<pgkq>=vKVf<2/|wK<\o$T^A] l`  &  }z4 #TuI6fxtjjl@TKd@|L*L U 3]#n\g}z;${<"CB iG~}K {UNkEK'HPG)MR: u"jRr!jSD`Cb^*-(*D!_JKc$N/xm)0/y'*0;~f%%oD=\y9b*K4kfnxOaY;) .sU<,sh}% oEAQYNMm?5# KV*7<, 2xJ y }5ye:kqS9 ; 2k8IVK|sjaR:~@H//0cem] &bF0IGH@z} ml8`SamD+s\ (/CuZ?=xl :m81NaJWXb  jxK!DEtK[N y8 "t-^]O]3>M'=?+XB@'wDR7X~,r@Wj|W0rjbn*Jlm@ 7^}0 7nbi ME*S@X9wn-`uzW\HY< Dp>"("|W@Z:("uK"CQg`HL(0s0Zeydby5)yY5(MO"&Tf\73d(}JzMBMc{}]+>)qe&Fnn7%"E 'h%H\v.H$Q^V@$kfs3y+J* yBE Ya-wJ68S_Qf A@<b?viQ%1iHG&5T&|8t40&w'y ^B59LoEl/Pfs{94@W Vj3,PO/(s`SeQMbaR8e"}`PLNPOC'nYMf(Iij=Xx&;c*B&Ul; 5}tr<B`cS9AJ^ydYg2OxG>N9CI0SG~N# 4v;'b7]poZ2S+  R+Q]K}E.EP2n/b2dh',AM89yes@;b&Y<(*s(q $?DIG('  !I a#o(/! Z, M_yr9  z(pPAZP`[>Z64Hi^aw`PNZt!Kv/?EDGX~4'-k\shh#y G}"kB"?x0Yh]; {vL SnI kD hw8TreB2% -@Nf'N6@pCro ,;GQYbs,i Q uI" TGimf5 3kx+886>W*f.Kt4SbcV<1><,Pz7PqT8,El^2Xv&vVj(!Ug9vV}!X&89/!,IkD 2hX(:q8!(Ci)P{0Lp KG(^ 380D-~7f+ZY |O_AE s6hCjfzYSf0 v,k.j:KT[h~:D9e)Zq&pkt1d'VF~^?qxX6k,H{phZ>FOl 9;Yv{\DDkm4Lr-m5UsA]ox}uko qw G` ))r=pVOUdv*XCAF L~@t$6?CJUcljW1j$w_F'vO, OGmTZ([#e%Z#:p#R{A~Ck;VjyqS0 8p.t{U3dA.1M|49)_/3yQ3o 0`sR5PrDa n$3u"IoQ SNb<%!3Pu)R6g)`:KG2tts%<qCswFM22Lx  @rF lU ;n)gXiF2++%w[E. 5a lP>2$ NwrO"{^H801?\@c2k!f9?,S(4jc, #OuuV#uyD?1ch U *TT%h<Q Fqu; t[C'oo} H}pmw?[r m' *2!iVNNRYaq)=4(v  g_nAq+}?#NsC  +.,'!k2k5n]Yi=d*:FQf;1BJKJMXvL ^ PdHV\?(Smyyn]J;6BaveeqR-p'e0y7a~ -BE4a>! }?C+[.i0_m.w~eaglj]F,;o=y1e"Uu~pLUH>(*=kzfQ<,'0In$Jr1J"Ov$Y+/* aG2&"&-5::/Q4E iC_;Pl>/r@ `9#*?Zv HyNDv|[2~L%zw_9b=[oy|{~oO9007@HKHBCOhma/kK-a _@-)2E[rqI{+Y v5a)2[mH)w*8YMBM$conW=w0QqpgdfihbUA*+\[7O9u3sx^OMYpi7|T,9wDekOXS2k>0OyU|?|qt Q mb!RAXfllheelwqX<# Ml?|)jHCwywh[PHA7% jo"ziP/ ~^5\5a5}+weVG1=g$fsMulyM _X.m )4>JXhy{qdR8M#`NP }1L^lw~lUD=@M]lrgIf*d4q^QE5b!H2IP~/[%b+E{H#di37bE,v"Oy%2@MYeq|kK!1Wx E/VCw>c}dL913?Qaknh[H/Mh;mH$Y 8;S`!`v.aC/'/IuF3ieI/@v8} M%Ou .Ya7/KuCCV(q-;?<61-,,-/356568:93% wB}Z1eUSY`^O-V2ts 1R?zP;?Z N,Qo}lW>&J}S%m-5:APiDimO. ;pW*},T  )44'nU2OqLi v]i)] TH3g)RrfH*:pE@cz7q  |nkq~ N\S9U [T!wZ-[_}8in DO!W4FPRQMH@0)tX 7Z@b~ zslgiv7hWV ^(>PauqDf,g<~6q6~6>3(:%Ku 7J[irreM+}hh}a7Og9Zw(Qxs`PE@DN\kz4y'?4e-Rjvyvnf`_`dkw}U#j.\3o8D YsR)L 8So7e[( .No!A]t-Y2Ld{raUQQUXXQC1!"9a fC$rJ*<EHFA==@GRatz@O%zX.Z$[)|5$Kxd>" Ay7fqQ- <` &Eg8[ 1N^a[RKHKQ[ehcVD/#GqU2-~ Hy&JnvIvG `4i8n;TTdYIAYfiaT@& *>O_u ,?Z~O *8FR\bbZL;' !@j!gSQ/a(Lqa4}Z?)   zDiN4s(~'0/rm* 3_5NZZM6!A_wAq*Jd{%290!2\u0<">PZ_bgo}/Y~]6 o^WY_daT;`=]'m/z3+Y1\. )T "/30*" *9@CCDJViDh,E\rVFa P '>\&QypCkF a=X/Foc-ZyR>;EYt /:>9/ %2BVp"Dc *Jh skjrd:Ak3Z;npP3 ~gTC0tN(iByBZ7p"wnpy5AB8% -Gc.No6Mf  jQA>Kifnq.To~B7[pxvpkfaZQF7%mU;V)xaK49|9i `&*($5H^x1Jd~7Pi sP3 (Cj4Zd*Q.f2MaowyvmbVF6%oR/sCqM cVBU#->HJE8'+AXn =Wn 2ZoN)+z=S5]._1e@\r~sgXG6$ j:Z;  |T!IBqT4#$/;DHF@8-! #0@Rh%07?L]v'E`yk34!o?|M{5kL"B\p~yl[L?61137971%R"~aI6' i02TlR{spponjdYJ8&  .Ln 4GZl~/_o8yfakT7DzDxQ4l 3Sjx}{tja[XW[airy{xn\B"sGtaUNJG?1oRx G`+q\G8-&#"!%0;AA8* ,D\q  (Hv%\f9 `LHTnCF6n >qU`!;LUXVRPPT\iwnU6V$vS#N(Q8lR:"scRA4-/8FVenpj_P?1)%(.8CLT]huN*Y}e:wWB:>NhVK$U&c8b)19AKWcqn@ rJ+M<hV JkTA0xf^_gutjb]ZVPH=3*&+9Qo0m MjyxhM)]B0'*7Op:t T-a/,} Du *2;GVii=_: (8B>, OXMCvI& vL!{eRD@FTl{}O,OdlhX>yV9#$>c6j ,Q|)sfTR9\ `%cRNT`my~{q`H)S?vT)TqT;%xf[WZey+53$ rghw![8KUSF/a\zGB;F-I_s7Vx5HK=P~M `SD ["^5 nL0",49:6-xf_bo+>E?-thfn"W:OVP<iG0#")8J`x-Jd~!fn'{K /LbsI"<GD5tJ! VDk"Y ^/`.zkdbgq}rV3 |.ETWO>$pa[_l K3:2 ~_D-%:Tr9l9)|(~` Fv%]/;=3]*#$ ~Dq'ZOIf3i; %>Q]a^UF0}\HAKe.f%#eE.%(4EYlzAp;a&x3Le<g,f,?B3mI*!-471!EBa.f3HR$$/1(j>+E_v|`9 p]UXf~.h"gVNMOQSSSUY_hr{&v1IS .JczLbdE*  $6FSYWK6e-~Eb8 ^<`IBHUds}yhP2sM,0QrfBy\JFTsZweTE<9>IWdnpjZE0 "9^YMLOw9j)p=tcF/!)6DR^hli]I,t> zS/ e';Rh>{U;/.6EYozHkK=BWy&Kkt[I@@HVfrwshWB,  #Bl1;:~ -HcN`2gkUB2'#%-9FTdpwwpbJ(g7 c:9LS* {Lrihom30^}oiint{|seUA,H tp?v4SycD6\v|lZG6&#4H^q~{jN(cI4! a*bt(y[JCEKQSNE7$ \+uw.::.Z):_}{vtttvykP1&aJH 7\}BvA%j3N_fdYJ6!%?[s}gK+ o]L;+l%(K~xvxywmW6R6JX^ZJ,`)$?Xn~ysru~{cF$T;!c3PnTgA(2/%*BXhrwwpbL2rV-p&O U!^-d:=\x]2oI+ 5Ldx{wuw{{Z3 }P,t._Dk*jP:w+CZkw{r_D$b=bw&a8 U$U..NmtMpSB;=ERap}{wux}T'smvVaFr/WTLIp$D\jlbO8  tCr~7yaOD??@@<3i.fL<7>PhW+}|ztqt~uDsq|IW*Jd}9tF0|+K_fd_\`n4CMPLE;. R;^|q\>x;{f^ctrK%{qkks nApip MGz8ToB0%e )?Xs *13."d$Fq9 a4F&/1)rQ4|mffn} {Ivjkx C~4h+MyB8)Op !:Ww !" p1V Q' l7R!)8AC<-fK3" tjffjrl=qmvU3VpC S'g*Jcy3Wz   %*'q+B]A.#l5U+ #2@KQPJ=( raXRNJD=2#wont&--$R{pxK} '=Sk3p@ Ey %>Vo7` #4<7%[|6sZJCBDD@5!q8pM/  3H\kqncQ9}uojd^SE4 vrv 5ELG7}?.X~)B`](kNw/OsDg}tqw2>?4S }9yjU:WdMB@FR`p}vgT=&~lU9xw})H_igW:l7)If3U}Z'f&Fd5[)Oqwg[UU^n2@A4r1xGnO(Ntmlou{ucL1yfO6o_WZh>Xgi^F Z- 6Pi )P~0q*a ,MjGx 7[u~o^K<35AWu #13'VxJ"\/d5 jT@- dAhZYe}A[kneO0 ^8 5J_p}&T/iX*@YvCr,PmlU='":Y~ y>c>#i< m?o]M=. P~ony=WjtseN/ ^<" $1+ p\H8.)(+29>;1 P5Slz}s^@eP?5.)'*1:CJRY]agr Az/j ;f @hQ&F\iomeXG6'&>^ $"c1fSIEB>7,Z+y`L<.! pXE945;GVcii`N4W'7ReoohZE+ t`QGBBFJMNMKGC@CL[o/d"c 5Sj~0dQ%G^lphXE3%-D_}#,*U#|vpg[I1}U/ hSA4-)&" r^RMOU^jwpT/b45OfxydI* }sjc\VTSUWZan1p-c)@Xu >z<{+/+# !7Rs&(e;p\D*a:o`XTRNF9)l^TPR[j|mHgE)5Oh}kU@+ynbUIABMa ?t@j $>_0q1g6] oR5~lYD+ c8wlaTE2n\QNS`r}bAoI++?Rbnvz{xsldXG4 n\L@9;CQe6m1Tq>qZ ?pAiwZ<kN+iE$yaE&vmknvsJw^NE@?BGNU_jvtbM9&~lYI<427E] Bv5I_xGy1q Ns7Www[A)uZ<_:jL- shdhrxW5l\QNQYervh[OD90'v]H937G`Gm0DZq$[_$<MW\^`djr~.Mj}iVC0 xZ8rU<) |`@wygH$rjginu{~|ytld[OB3% u[F5,,4D[v,Rw %9Su JCv $,28=FRbw2Lar}|o_M9$d@x]E/zQ(kF#qbRD:42358;;6+v`NA::?J\v-Qo -W2mDo0E^y (@R_ec[O@2& tV5fQC940-&iG&sX;~n_QFAADHLPQMD7'w]I;207F]{&?Sboz! ui`[YZ\_cfhfb[QC0ePC@FTh%:JXclv1c=oA^u-Nn  jE"m^SKD>6,c@ x]E1" ~yvtsuyvcI+ rbZY^iz (/5;CM\o>nH}%5BO\j| &D`|bBvoje_WL<& uW9 o^PF<4+  }~lQ3tpr} )25+b>  ")5F^~(W;e#8Rn,?N]juyY:}wof\N;$cG0 |une\O@0 qR4  $4F[u =o#D`w $?Yt&1:BKUbqgL1vjYD* mWE7/*%###&'&$ vj\K8#wV7  0Fb1^+E^v:Wt#3FYnt\B(p[C( }gVI@9542/,)$u`H0eL7&  $8Pm%Ls(?Vl/Iav 0DXl~hO5q[B& ufYOGA=950,& q]K9' %/686. q[H8+$!!$)-02/,& %7Mf8Yx,Gc4FVer~-BVhxr`K5mYA(zmc\WTPKD;.!kUA- &/6:==:5+ o`UMGDBAAA@><83,& ,=Sm#A^y0Nl *:HUdr 4HXelnleYJ9&{m]K5zrkd[QG;0&lXF8.'!"'.6>GMQROG;-xpjedccb`[TLB80)"")5FZr*C]v8Tn &2>LYi{,<GNPKD8) xhT>(}sjaWMC8-  o]L=1(" $,4=ELPQOJC8+}yurolhc^WMD9/'" "'1>Nau*Da|!<Wq(6G[q )./-'yjZI7%ynaSF7+! xeUH>73237=CKRZ`a_ZRE6'~wmbWLA93015;CNZgv4Lf*D]u /E[t ~rdTB0 xk^PC7-%  qaTIA>>@FLSZafhhf`WL?/ xmcYQKFDDDHNVan{*B[u!;Tj| /E\tteVD3#vj\OB6,$ ~pe\WUVX\chntxz{yqg\M<,umfa^]]`elu$Tk|ocVH<.! zk_QE<3,)'')+-.-+'!xutvz~|si^SI?5,#  6Oi->MYcmw(@Wl|qf[OC8.#qbVLC=96444579974/(wnd[QH?70)# .Ga| 0=IS\enx/EZl|}tkaVK@5+" uh]SJB><;;<>ACCB>80%{riaZSKE>6.% )A[u-8BKU^hs1EWfr{~vncXNE<3*" wk_UMGCABDFHJKKID=4) ztle_XPH@7.%&>Wp&1:BKVao+;KXcnv|yrjaYOG?70)" {ncZSNLLMOQSUUSPKD:/# {uoiaYQH>4+!+AYq$.8BMYfu&4@KU^ekqvy}}ytohaYPIB:2-'! xmd[URPOPRTUWVURME<1& |umd\SJ@6,# 'JWfv '3=FOX_dinqrssokgb\UNF?81*%! xnd]WURQSUVWXWVQLE<1'yqi`WMD;2*# (=Rfz%0=JYhx(2<ELSX\`bba`\XRLF?81+%  ukb[XUSTUVWWWVSOJB90'wof\SLC;4-(# &9L_r $/;IXgu'1:BHLPSTSRNID>82+&!  ukc^YVVUUVVWWURNHB:2) wnf^VNGA;61+'"  (:M_o&2?KYgu%,49=?@?=:50+&  zpga\XVUTUVVVVURNJD=5-% {sjc\UOJD?:5/)"  %6FWfv $0<IWdq  %),-+*'# tld^XUTSSSSTUTRPMIC>70(  xqjd_YSNJE>81)! &6DScr'2>JWcp}  zpg`ZUQONMMNNNMMKGC?93-' {upje`[WPKE=5.% &4BP_lz$/:EQ]iv    zpg`[VRRQOOPPONNLIFB<61,% |wrnhd_XQJB90'  )5AN\jv$.9DO[gs~vme_ZVSRPOPPOPONMKGC?:5/*${vpjd]VMD:1(  )4@KWcp| )2>ITamz~ulf`ZVTRPOOPOONMKIFD?:61,&! }xqjc[RH?5,% &/9CMYdo{ )3>IUbnyxph`[VQNMLKKJIIIHFEC@=:50,'" ~wph^ULB91)"!(09BMXcmx )3=ITamz|skc\VROLIHGFFFGGGFDB@=961,'# zqiaXNF>6/)%" "%*06>GOXblw '1;FS_jv~vnf^XSNJHFDCCCCDEEDCA><962.*%  yoe[RI@92-)&&')-27>FOW`js|#.8CO[fq}xqi`YSNHEB@?>>@@??@?>=<:740-*%  {qg^ULD>84200258=DKQYbks| )4>IU_is{|tle^WPKGC?=;;;::;<<;;;:8752/-)&" wmd[RJC=8421136;@GNV^emw '1<HS]gpx~{tng_YRLGC?;997677889:9887520.+'$! sonic-visualiser-2.3~repack1.orig/samples/strike.wav0000644000175000017500000005215412252354725021425 0ustar miramiraRIFFdTWAVEfmt Ddata@TԫMM"("({{AA8%8%MMQQTdTd::ېۙי%%991=1= ((iiee LLyyNNcca9a9..YYi+i+' ' \\ӋQQaa7676$$XIXI++,,Ԧmm̵޵ޤYY// ڻڻCCڳOO,,77ѥ{{))q)q)!!JLJLC-C-㛦ɦ  ɲݲݮUU--66##ww < > !!]]E,E,11yyKK++iiFFjj::iiOO++  ʫ䬲ПЯrr==GGZZ11ײ>> X Xx/x/EEMM҆uu,,я  ? ?  ] ] ͣ̀^^,2,2߮߮Ѱ++WZWZ11ҵҵ%%ggZZ$1$1 KKxxOO  [[R3R3++##YY!!~~EEZZ||?@?@>>GG..@@^^ U U..ߑxx'L'L**@@i i 33?C?C"",,ww\ \ bbٓTTقff ``9797UUj/j/7 7 55´JJ**aaSS11oo11 φς//NNޟ//ttUUzVzVX.X.Lj ##ҮҖ__ HH<<7474XX==$$cc))Y(Y(ҁ҅ͽRR,,xLxL ( (!!žžɍɜ++f3f3-- ,T,T//WWoo]]̡ZZ//@@p p ٤UU\.\.GGeeWWffN&N&**۟۟Ɋɶu1u1cc$$H#H#++TT::!!  @D@D))??zz99""""  ''NN1<1<!!Ŷ$$++::  ] ] MMNNu)u)Ӥ/ / ggLOLOf-f-JJLL MM** <<--?"?",,""YYΘΘaaƁ55AA33Q Q H H LL``##VVY=Y=_!_!ddEE II~~YY]]oo22;;..EEIICC''aaOGOG((( ( & & iihh  @@||@@..4/4/ P4P4TT__ڕ22 ggll 55''QQ((ii&&)<)< & &**LL))Дc.c.xx}}<<VV kkBBE E OO22Y>$$~~Ք**VV//33yy-- &&-->>]]HH!!  44++HHaa9 9 MMGFGF_&_&RRee--||DDs*s*NN==˰˰ҵ B!B!**<<..Q Q QQ33PP--RRNNGG:://IIӥ\\==""hhAAgg{{  !!{({(xxսJAJA""WWII,E,E%%++++؁+@+@""mmη5500TTiixx؈ؙ55KK'*'*''uu]]ڸUUUU!! FFE.E.--\\wwqql l `` HH dd..99AA։/ / a8a8!! 11ppY5Y5  mmnn,,mmqq ?? ,,..aa!!ۡkk33Ӡ((g g kk ]D]Dp&p&//J7J7. . M M ƴgg++ &&$$OO''۝""||ooE E }}9922nnVV::ddqqF2F2BBssY Y 55 ا؇tt-- }}xxؓ ~~:6:688 ((^^==aa88PPa)a)11>>  ؙص ||[[ --uu""##77DDĶĶғk3k3II))!!??119966Ԃ44)) 44J!J!NNHHVV**zzyyԬ'"'"))AAcc'' 77**__<<є""ddII::Œגײ HH-- δ޴^^O O **BB5 5 11[5[5!! &&{{BB{{{{nn 11u"u"j j llъѿ##\\5511AA &&>>1"1"]]KK00TTNN 55^'^'GG%%wwН66$$ . . JJ' ' ##22kk33""ee**11ddLLف vvZ4Z4+%+%ss""үҲ߲oomm 33 VVVVHHߢ11""RR 22##qq,, VVط//1!1!GG؍ BBRR$$@@//11 E E bb% % ;;ʘ00hhNN==""mm |0|0##QQqq--("("EE  77 ' ' ooۛPP0606**qq{{ii Ԓ%%OO{{ll޵,,""!!܆44%*%*hh͵յզY Y @@CC~=~=00<>mm**((!!!!S%S%\\zz""11%%!)!)9 9 j j --aauu__YY}} pp   mmޛڛ''zzrr}}&&uuݙ aa!!$$TT  g g HHOOԁԧΧ--? ? / / {{OO""^^  aaZZ``     ܨר uu!!mm** >>} } J J yyhh^^$ $ 9 9 !!ssttFFnnPP    qqGGKK    aa''T T sswwooTT__--M M b b $$##ddppxx))NN33``aa@@qq11??JJkkddhh ]] NNJJ%%UUkk?? xxss)) rrG G   1 1 44vvbb""oojjpp DD X X ??  @@hhxxaa``TT > > cc^^--{{xx55>>EE__a a  NNcc   llBBGGFF 88ttH H hh,,RR55 << \\11C&C&9 9 ؆BB77OO**uuQQll55""pp AA>>//@@7 7 llLL>>ii uuaa66}}GGZZ222 2 **''33""00ii EEjj TTNNhh~ ~ 99WW  uu QQ  rr##jjXX88XXiiaa   ii  ;;]]%%&&55XXG G PP" " FF EEQQ bbjjSS nn77 ''ee ||vv>>OOY Y GGyy$$ssOO ) ) __KK  p p ..$$IIkkTTS S ZZ !!@@))VVFFttqqOO[ [ gg hh<<55iiDD]](!(!zzKK>>##//uu7 7 GG33  p p O O EENN 77%%l l uu``ww^^hhp p rrppSS QQ  xx~~mmSS  ii YYGGj j aa77OO//99R R // 55^^  OO4455VV!!iiFFqqo o ZZdd**00GGO O AAuub b P P ooLL55: : D D ::%%w w hhMMq q  66qq **``%% 66 YYDDccaaddeepp((55))BBEE< < __33kkzz/ / YYPPaa))  PP&& G G ''ff[[PP \\FFhh 99AA))DD tt<<11Z Z 33AAzzY Y SSff  **NNFF zz>>^^zz R R cc :: gg O O ``11::IIqq ++qq ,,( ( ..BB))~~GG??..FFzz"";;IIoo@@ yyDDcc))!!UUGG++qq %%OOFF%%v v ccttaa TT$$QQssSS>>bb`` ##00  77!!vvmmww,,YY.. ||##''CC {{00ww77OOMMKKaammBB88hhGG##UUCCCCkkHHqqTT""__mm;;!!PPgg--ggOO( ( 99##^^ ssMMTT QQWWrrQQrr<<++EE??BBGGkkccAAwwXXqq SS::99$$99WWqq__bbZZ!!5544~~||00LLPP{{XX}}TT99##mmUU``-- ZZ --cc88OO  ((AAzz''33aa]]//oo//nn6644qqPPoo%%11ddFFww//;;kk((JJ99''$$rrTTee""oooobbXX4455ZZ3311MMnn==QQ}}ccSSKK;;//ff##MM??''aaUUxx{{//cc""LL kk%%KK99  xx]]CCQQeeVVgg77--MMKKCC&&>>oo__NN}}!!''iizzmmUU mm))ggmm%%AA``CC55BB99))77--QQ yyvv[[AA11xx^^HHyyssyyee==BB$$]]**11ffHHoo KK;;iiDD  CCJJee22 YY##$$))ccEEccCCHH}}yy==SSllaa))==00kkVVZZXX77''~~%%''JJBBnn~~66wwPP((99TTaawwAAEEOOaabbNNyy99))PPKK[[GG]]aa55TTrrvv''QQUU}}iittgg--LLuu__++ttDDVVzz??LLii3311ggyy((**33DD]]oo{{yy))[[66!!55VVSS<<TTHHBBLLggqq]]55$$[[bb[[HHccee%%ZZssdd  --llkk  77PPqq""ooNNOO 33QQYY55BBGGzzWW22QQ__////==``EEYYMMUU QQqqrryy }}::XXiinnEE00""CC__BB<>||WWAAjjFFbbFFYY99uuppmmmmAAggQQcc((ssPP77jj~~uuMMUU\\]]oo~~aa99hhxx{{``88rrVV@@llrrxxyynnoo^^XXnn__{{__||ooYYwwxxss||WW~~yy}}xxrrsonic-visualiser-2.3~repack1.orig/samples/clap.wav0000644000175000017500000005715412252354725021050 0ustar miramiraRIFFd^WAVEfmt DXdata@^ t8k%%X3*t!%ttkpbkfb3 !tOTFPY 9?*!!TT 2F!f&(a-}# *tYP*A 33*  kp X b*kk*3X pOTy=pk * * ptKF%pAJ3T . 3*Ttpf=!3Ab K%~ fkkb%A!Jk%!8b!kF t%/tTpOFkpJ*fk%FKtTt=3t]6* T  k .  J3KTKk Tkbk X%X . b3 kb**3tpT=K**kOf fkFb%%pA ]t*OF8OFO F3!!Af%fFk%Tt fkk. * !!TT3T3%bJf!kpk*t]f*y!fpAf/AtkkXfOJJ/ft*bOkF *OO* %/X%]bbt3fObp%y y~/J%XO%JT3!=Of~/pJ%JApT~fAbt=3f]%%!*=%!Xf%A*/F!83tpO%//AttbTOyf%%fOJ%== yO%!=bkXbtOyt!p=OfAt]OAfA3kF pkFOJT%*tQV 69 2!ԨY*O]T"a-a- k A.].*!=OT%Tܨkb~AJ~  A+(}#3AtTݬ*kk ]3KOk3* !Ak3 *8AKp . ** b*kTOTAk%Fktf*fTkXX t ]kFpJp* O*TAf]A fT3k* D?a-+ kO~%Fb*~. k . 8  J!%8~y*PğOT"SB]4(a- 3.f&f&*!*! T]f&  OtkyOAX 33K .k/ 3 pTpkt!*f%T=tTkAb Jk* ]]Ab X . . /Xktf==fTt~k!A3 .   X FX  *] X  kk JTkJ*yOTk]A~t*KܱPOT͟ұDdSB}#AX 2]4 $XX JT.* }#/]4]4]4}# tf*YĨ͟ңTYy!X .  f&/ 2/f&X T".yft*TOy%ݚԃTkkT*/]4(X3 JJ kk%OOT%%%%y%3F]T k . .. bO%Obff3 O=t* A3 A3f%% yObO.  T A *. ~T=~3X ffTyATAkkkA*J * !bb3kXt. ! J=pk%kK3LXbK %X pktyTK%k*kTtkb=/J/kfX =Fk* ==FA!.   8=OAb 3X.k~TOAOOkyyO=]!J!. * pOp. * X A! !AkT%t*tFJ *k. F8K=f!O!  . p*f~K8~pt JkTk  . * bt**K*=kp8]8 . tKftf*O*p*b] b8*X ! }# y=~~]*ه+X3LX;~J}#fF׭F׌4 +9]4+? tQtQXL=!=4婖˱* X/?tQVOI}#yԌA= +? 2]4a-.3 ~ޚTƨKTyyOkT"$*!  b *=y%%yXT".  X TyJb. p f%X!bkk*Ak *%y tb  * XpKTtff3 !] TFFb%JJ!Akkfpk  X X !JXK OOtJt=X b~A* Jf]*!*3 . .  Jpp!*. t b!Jykpp%yt~]f 83b %fJ!*t3=3J !/%O]%f TAJ!%*K*ff!. %f=TT=!= %t k Xt8b!!!AATfftk 8TfpOK%% k/*!= K3k X %fJAK3 fTJtkt*bJktK*K**kFfk !k3kb k!3TJfkkkt==3f%kTt!   * !JJ/fJkbJkKF* fyJffF=t K*%*tkk=tTJ JFAO*kbyFObyJ!Ff*fAA. p8ptkfF . f~T=~ XkkJKKp pft!=%T3A%!Xp%K3K3!!!J%Xb/tp]pbJ%JKK Ofp3tt8k8*JAf k Kb%%F%kT=Tt t3K* X X X .  !=3%%/Ttp*tAptf3pK%!kX*TT Kt ~/=kfF%K!*pp%X*tT%Jk%J*=k ~**Tp!kA!%tyFk*FpF!F!bkt3K K3f!J t%3 TpJ=/*%FfbbX!kAbk%*yOp/ OkOp!Ff*Kt3pfFF88%tKk% pFJAOfTtK!tFT kJ Xpt%tKf8f3A%b%O=O=pK*Okkp~JJF~ytKKkKOTpfp! 33t=pJAb! b!Jk!%t*t *%8J~*TJ3fffAAAbXk*t%p=F*tb~8TJOfpf*T*f!kkAp*T pAb8Ak8J%A*k=b*3kK 3bbbb%!%k* F*%]*tK T3XbpkJ3fpkp/O%* 8XKXT8AkkkOp * pT*OO=%tT%8y!JJppffFbOKt*b8k%3T!k8 * %J%fkF*/fTk!FFb=JO%ptJOtXJ*TF!**/ y *Of!p!~3ttJt8bp8JO =O8%/kpt]]OObJ~%f8~38kO3JFtO%]kJk%kJT]t8*Ft*J~!b8==**!!~!fAk*O%8JJ%bAtppKJFfkpF%*t%3* !yy Tp **K Obpk%f/XX *%OpJfATA=tf]J!F!b~b /=%tK3 yk!y =Ak%fFFk3=tTJtTy3JtJ~%F*=8*=JO=!fJyOkT!JJFO *t]tbf/b/J%XOy Ot%=JffFp8Op]tb*Fk8tftO3!!/A8KOK%*kkb=A8*OO~!k/%ft**kFFX/ T=]J k=8*tX~=*f88/t8bTyTJJbO==AfOp=XpJ8tt]O*pOb*%tbA%!%JpFA]*kKO=AtpF!y%fJ%O*OO!A// TA=/FFX!~%O*OJAk!FF%fOObKtT3ttJF%!kFy*Kt%k!bOby!AbO]%!kKKptK%tJFf%JFk%%!~!%p]t=]p =%bt%kk!~/y**JT8O3F3yf8T OOTFFFTbppt3*kT!OO*Obyb !3/Tk Ot/Abb8f!~=p/X8%bpAf/=*]tO8%JXt*bAAbp]Kt Op%J TAA*]]3yT TbOA3ObtOTf k O=*=J%3X 8]8OO/kf~3yb]%p**Jpp88p*tfb OyO fTFff*OOJ]83f88ffO]JO*O/*bO=]J=tfp/!T!=%*bT X~kkk=8bObOJ]t /==t/!fFf~/bppOpAAOb / /tA=Ap]py*3y F3X fk3 OO*bO=bA bOTf/b%O=Otb fF%A A*%]OXf f *tO*y*= A Tf A*yfff*AA/TbbT/ T33ftt=*=!/f//AT**=ttfAAA 8 !pbb*=btyF// TfAp]=A !8 =O*]=Aff//T ttO /fTttb=OOb%AA!3f/OO=tT/tO8p= / b/y!!T*/yOt*p /=*=]8]=/!!y/ b*byybT!F% f~yT*8%Tffy A3/AtOAOO ATTt ff *8JO*b TA//ttt Tf yT tO*OfAAyf*=*%f!FAb*/T b**t f *yt**bbObA/T3yy!!!/**=*t t=O*=tttfyATy]A!bJ] /Fkk%F!yf*pJJf/ ffObt yAT/tOtb=OO=O~~!ObbAyyT *ObtffTfy fy=*/f/O=t=JO /AT *=*OO**bf/ttA bbt/yAyT*ttt=*bb**/ffb=*/fT/ttt== A/b*=TXX! OOb*J]O A =Ot=tbtT/fyTAA tA3yAbt//TTAAt /tt A//T Obtt=b T/ttbT/ /=btOtT!F!fAbO=*t fy tt=O/ A ObftOyAAy =bA OfT tb=b*=ttyyAtOO/AT/ t=b /AtOTy*bO*tt /  btbOtt=*btt / y Ab==*bb**/ AO=Obb t b/tt/yft=OObtbO=Ot=f!3AO= ttbt=b=t==bt bT!FTtObb=t O*ObObATyfA OO==t Ty/t=*=Ot Ttb/fy/  bAyy OOO/fT//A/Tf* /A/A /ffyf / O*tTyAbttO/yy/ bbt/AA  /tt  ttb=b /fftOO AT/OOt AyyA t=*=ObATt /fT tttbO=btO=btTf/AAttt=bTyTA/=*Otttbb / Ob yyTAAtOb AT/b=*t O=OO=*OO AA/ OOtOOTy tt / t  b=*= /Tf tt AATA////   ==bt TfffT / bOb Tf AfyyfTfT =***Ottt //TfAt** AyyfyAbOb //Ob /AA /A tbbbOb AA/tt // / tttt /ATffTAA/ tbObbbOOt  bbtt bb tt tbbt bbt ////  tOb ATAAA  t ///   ///    / tbt    sonic-visualiser-2.3~repack1.orig/samples/bounce.wav0000644000175000017500000012234012252354725021372 0ustar miramiraRIFFؤWAVEfmt Ddataʝ??. . 005;5;~A~AZEZEGG)I)I J JJJJJKK3K3KBKBKKKKKNKNKOKOKOKOKMKMKJKJKGKGKhUhUPPNNTMTMLLKKKKyKyKWKWKBKBK4K4K*K*K!K!KKKKKKK K K K KKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ|J|JxJxJ]]uUuUKQKQNNMMLLbKbKJJJJJJwJwJfJfJXJXJOJOJGJGJBJBJ>J>J:J:J5J5J1J1J.J.J+J+J'J'J#J#J J JJJJJJJJJ J JSSOOmMmMLLIKIKJJvJvJ@J@J J JJJIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII}I}IzIzIvIvIsIsIoIoIlIlIiIiIfIfIbIbI]I]IZIZIVIVIRIRIOIOILILIIIIIEIEIAIAI?I?I;I;I7I7IsRsRNNLLKKKK{J{JIIIImImIJIJI5I5I%I%IIIII I IIIIIHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH}H}HzHzHwHwHsHsHoHoHlHlHiHiHeHeHbHbH^H^HZHZH1Q1QMMKKtJtJII!I!IHHHHqHqHYHYHJHJH>H>H6H6H/H/H)H)H$H$H H HHHHHHHHH H H H HHHHHGGGGGGGGGGGGGGYYRRNN(L(LJJIIHH|H|H9H9H H HGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG{G{GxGxGtGtGqGqGmGmGkGkGhGhGdGdG`G`G\G\GYGYGUGUGQGQGNGNGJGJGGGGGCGCG@G@G=G=G:G:G6G6G3G3G0G0G,G,G(G(G%G%G"G"GGGGGGGGGGG G GGGnOnO^L^LgJgJ&I&IWHWHGGGGHGHG#G#G G GFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFNNKKIIHHGGbGbG G GFFFFFFFF|F|FsFsFmFmFhFhFbFbF]F]FZFZFVFVFRFRFNFNFKFKFHFHFDFDF@F@F>F>F;F;F7F7F3F3F0F0F-F-F)F)F%F%F"F"FFFFFFFFFFF F F F FFFFFEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE}E}EzEzEvEvEsEsEqEqEmEmEiEiEfEfEcEcE^E^EZEZEWEWETETEPEPEMEMEJEJEFEFECECE?E?E=E=E9E9E$M$MmJmJHHSGSGFFFFEEzEzETETE=E=E,E,EEEEEEEEEEEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\L\LIIHHFFFFEE@E@EEEDDDDDDDDDDDDDDDDDDDDDD}D}DyDyDwDwDsDsDqDqDnDnDjDjDfDfDcDcD`D`D[D[DWDWDTDTDQDQDMDMDJDJDFDFDCDCD@D@D=D=D:D:D7D7D3D3D/D/D,D,D)D)D%D%D"D"DDDDDDDDDDD D D D DDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKKHH#G#GEE/E/EDDUDUDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC|C|CxCxCuCuCsCsCoCoClClCiCiCeCeCbCbC]C]CZCZCWCWCSCSCPCPCLCLCICICECECBCBC?C?C=C=C9C9C5C5C2C2C/C/C+C+C(C(C$C$C!C!CCCCCCCCCCC C CCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB%%[[EEuu>>UU''0066::c=c=EERR9N9N8J8JGGEEDDCC;C;CBBBB~B~BcBcBNBNB?B?B6B6B.B.B(B(B"B"BBBBBBBBB B B B BBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~A~A{A{AyAyAuAuArArAnAnAkAkAhAhAeAeAbAbA]A]AZAZAVAVASASAPAPAMAMAIAIAFAFABABA?A?A=A=A9A9A6A6A3A3A0A0A,A,A(A(A%A%A"A"AAAAAAAAAAA A A A AAAAA@@@@@@@@@@@@@@@@@@@@@@@@VGVGEEDDBB?B?BAAjAjA/A/AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|@|@z@z@v@v@s@s@p@p@m@m@i@i@f@f@c@c@`@`@[@[@X@X@FF$E$ECCuBuBAA9A9A@@@@@@g@g@S@S@F@F@<@<@3@3@-@-@(@(@#@#@@@@@@@@@@@ @ @@@@@@@????????????????????????????EEDD C CAA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>DDeCeCAA@@3@3@??a?a?$?$?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}>}>z>z>v>v>s>s>p>p>k>k>h>h>e>e>b>b>_>_>]>]>Y>Y>V>V>R>R>N>N>K>K>H>H>E>E>A>A> D DBBgAgA]@]@??,?,?>>>>t>t>W>W>A>A>3>3>'>'>>>>>>> > >>>>>>>============================================BCBCRMRMII4F4FCCAA\@\@~?~?>>y>y>.>.>==================z=z=u=u=q=q=m=m=i=i=f=f=c=c=_=_=]=]=Z=Z=V=V=S=S=P=P=L=L=H=H=E=E=B=B=?=?=<=<=9=9=6=6=3=3=0=0=+=+=(=(=%=%="="============= = =======<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<|<|>>>a=a=<<<<>< < < < <;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;~;~;{;{;x;x;t;t;q;q;m;m;j;j;f;f;c;c;`;`;^;^;[;[;W;W;T;T;Q;Q;M;M;J;J;G;G;D;D;A;A;>;>;;;;;8;8;4;4;1;1;-;-;););&;&;#;#; ; ;;;;;;;;;;; ; ; ; ;;;;;;;::::::::::::::????====ZB>==-<-<;;';';::::::e:e:S:S:&& 77))OO'',,00v3v3&"&"??%%qqrrVV&&~,~,z0z0B3B37575667718188888==l=l=s9>9;9;9898959592929.9.9*9*9'9'9==*=*=<<6;6;::::9999f9f9H9H93939!9!999 9 99988888888888888888888888888888888888888888888888888888888888888888888<8>8:8:8787848481818-8-8*8*8'8'8#8#8 8 88888888888 8 8 8 8 8 888887777777777I7>7;7;7878757572727.7.7+7+7'7'7$7$7!7!7777777777777 7 7 7 7777777666666666666666666666666666666666666666666666666::BBAAg>g>?5>5;5;5858555552525.5.5+5+5(5(5%5%5"5"555555555555555 5 5555555444444444444444444444444444444444444r8r8??v>v>5<5<>:>:887766;6;655z5z5>5>55544444444444444444444444444}4}4z4z4v4v4s4s4p4p4l4l4i4i4f4f4c4c4`4`4^4^4[4[4X4X4U4U4R4R4N4N4K4K4H4H4E4E4B4B4?4?4=4=4:4:4646434340404-4-4*4*4'4'4$4$4!4!44477z7z7666655!5!54444q4q4Q4Q49494%4%444 4 444333333333333333333333333333333333333333333333333333333333333333333333333333333|3|3y3y3w3w3t3t3q3q3m3m3j3j3g3g3d3d3a3a3_3_3\3\3Y3Y3V3V3S3S3P3P3L3L3I3I3F3F3C3C3@3@3>3>3;3;3838353532323.3.3+3+3)3)3&3&3#3#333333333333333 3 3 3 333333322222222222222222222222222222222222266?9?988L7L7(6(6D5D5444433n3n3:3:3332222222222222222222222222222~2~2{2{2w2w2t2t2q2q2m2m2j2j2g2g2d2d2b2b2_2_2]2]2Z2Z2W2W2T2T2P2P2M2M2J2J2G2G2D2D2A2A2%%R R SSaadd $ $''n*n*n,n,--..//_0_00011)$)$BB --oo "#"#&&))++y-y-..r/r/00000011?1?1_1_1v1v111111111111111111111111111111111111111111111|1|1y1y1v1v1t1t1q1q1m1m1i1i1f1f1c1c1j4j4q4q433C3C322f2f22211111111q1q1a1a1V1V1K1K1D1D1>1>191914141.1.1*1*1&1&1#1#1 1 1111111111111 1 111111100000000000000000000000000000000000000000000000000000000333333222211g1g121211100000000000000000000~0~0y0y0v0v0r0r0n0n0k0k0h0h0d0d0a0a0_0_0\0\0Y0Y0V0V0S0S0Q0Q0M0M0J0J0G0G0D0D0A0A0?0?0=0=0:0:0707040401010-0-0*0*0'0'0%0%0"0"000000000000000 0 000000000//////2222W2W211T1T10000{0{0R0R020200000////////////////////////////////////////////////////////////~/~/{/{/x/x/u/u/r/r/p/p/l/l/i/i/f/f/c/c/a/a/_/_/\/\/Y/Y/V/V/S/S/P/P/L/L/J/J/G/G/D/D/A/A/?/?/=/=/:/:/7/7/4/4/1/1/-/-/*/*/(/(/%/%/"/"/////////////// / / / ///////........................................................................................#1#13333221100K0K0//|/|/6/6///..........r.r.h.h.`.`.Y.Y.S.S.M.M.H.H.D.D.@.@.>.>.:.:.7.7.4.4.2.2.-.-.*.*.'.'.$.$.!.!. . ............. . . . .......----------------------------------------------:0:0`0`0//////..}.}.H.H. . ...----------------------------}-}-z-z-w-w-t-t-q-q-m-m-j-j-g-g-d-d-a-a-_-_-]-]-Z-Z-X-X-U-U-R-R-N-N-K-K-H-H-F-F-C-C-@-@->->-;-;-8-8-6-6-3-3-0-0-----*-*-'-'-$-$-"-"- - ------------- - - - -------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,~,{,{,x,x,u,u,s,s,p,p,k,k,i,i,f,f,d,d,a,a,_,_,\,\,Y,Y,W,W,T,T,Q,Q,N,N,K,K,H,H,E,E,B,B,@,@,>,>,;,;,..N3N3U3U3222200// / /^.^.--n-n---,,,,,,k,k,T,T,@,@,2,2,%,%,,,,, , ,,,,,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|+|+z+z+w+w+t+t+q+q+n+n+----z-z---,,f,f,(,(,++++++++++x+x+j+j+_+_+X+X+P+P+I+I+C+C+?+?+;+;+6+6+3+3+.+.+++++(+(+&+&+#+#+ + +++++++++++++ + + + +++++++****************""ff  yy11oo& &  //d!d!## % %a&a&['['((((!)!)z)z)))))**6*6*L*L*]*]*!!jj++aa tt!! # #$$%%&&''I(I((())_)_))))))))) * ***"*"*)*)*-*-*1*1*4*4*5*5*5*5*4*4*4*4*2*2*1*1*.*.*,*,*****)*)*&*&*$*$*!*!*************** * * * *******))))))))))))))))))))))))))))))))))++ 0 0=0=0Y/Y/L.L.[-[-,,++w+w+++****W*W*.*.***))))))))))))))))))))))))))))))))))~)~){){)y)y)v)v)s)s)p)p)l)l)i)i)g)g)d)d)b)b)_)_)^)^)Z)Z)X)X)V)V)S)S)P)P)L)L)J)J)G)G)D)D)A)A)?)?)=)=):):)8)8)5)5)3)3)0)0),),)*)*)()()%)%)")") ) ))))))))))))) ) ) ) )))))))))((**++****5*5*))))))c)c)E)E).).))) ) )((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((}(}({({(x(x(u(u(r(r(p(p(l(l(j(j(g(g(d(d(b(b(_(_(](]([([(X(X(V(V(R(R(P(P(M(M(J(J(G(G(D(D(B(B(?(?(>(>(;(;(8(8(6(6(3(3(0(0(-(-(+(+((((())8*8*))))Y)Y)))((((((q(q(Z(Z(E(E(7(7(*(*( ( (((((((((''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''}'}'{'{'x'x'v'v's's'p'p'm'm'j'j'g'g'e'e'b'b'_'_'^'^'['['X'X'V'V'S'S'Q'Q')),,--[,[,|+|+**))g)g)((((H(H( ( (''''''~'~'i'i'Y'Y'I'I'?'?'5'5'-'-'&'&' ' ''''''' ' ' ' '''''''&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&~&~&|&|&y&y&v&v&t&t&q&q&((J(J(!(!(''''X'X'$'$'&&&&&&&&&&&&v&v&j&j&a&a&Z&Z&S&S&L&L&G&G&B&B&?&?&;&;&7&7&4&4&2&2&-&-&*&*&'&'&%&%&!&!&&&&&&&&&&&&&&& & & & &&&&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' 'N'N',','&&&&r&r&?&?&&&%%%%%%%%%%%%%%%%z%z%s%s%l%l%f%f%b%b%^%^%Z%Z%V%V%S%S%P%P%L%L%I%I%F%F%B%B%@%@%>%>%<%<%9%9%6%6%4%4%2%2%.%.%,%,%)%)%&%&%$%$%!%!%%%%%%%%%%%%%%% % % % %%%%%%%%%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&&M)M)))8)8)((''4'4'&&F&F&%%%%p%p%@%@%%%$$$$$$$$$$$$$$$$$$$${${$v$v$q$q$l$l$h$h$d$d$a$a$_$_$\$\$Y$Y$V$V$S$S$Q$Q$M$M$J$J$G$G$D$D$B$B$?$?$>$>$;$;$8$8$7$7$5$5$2$2$0$0$,$,$*$*$'$'$%$%$OO //ggQQss00 vvMMf f !!!! " "c"c"""""##9#9#W#W#n#n#############aa UU88    ,!,!!!!!I"I"""""""""##+#+#:#:#E#E#P#P#W#W#\#\#_#_#a#a#c#c#d#d#d#d#d#d#c#c#b#b#`#`#_#_#^#^#]#]#[#[#Y#Y#W#W#T#T#R#R#P#P#L#L#J#J#H#H#F#F#C#C#@#@#?#?#<#<#:#:#8#8#6#6#3#3#1#1#.#.#+#+#)#)#&#&#$#$#!#!############### # # # #########""""""""""""""""""""""""""""""""""""""""$$V$V$?$?$ $ $####{#{#W#W#8#8### # #""""""""""""""""""""""""""""""""""""""""""""""}"}"z"z"x"x"u"u"s"s"p"p"l"l"j"j"h"h"f"f"c"c"a"a"_"_"]"]"Z"Z"X"X"V"V"R"R"P"P"M"M"J"J"H"H"F"F"C"C"A"A"?"?"="=";";"9"9"7"7"4"4"1"1".".",",")")"'"'"$"$""""" " """"""""""""""" " " " """""""""!!!!!!!!!!!!!!!!!!!!!!!! # #{${$''Y'Y'&&1&1&~%~%$$S$S$####.#.#""""""`"`"@"@"'"'"""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}!}!{!{!y!y!v!v!s!s!q!q!m!m!k!k!h!h!f!f!d!d!a!a!_!_!]!]![![!X!X!V!V!T!T!Q!Q!N!N!K!K!I!I!F!F!D!D!B!B!@!@!>!>! > = = ; ; 8 8 6 6 4 4 1 1 . . + + ) ) & & $ $ " "                          9!9!,!,!!! j j P P 9 9 $ $     }}zzxxttrrppoolljjffddbb``^^\\YYVVTTRROONNKKIIFFCCAA??>>==::884422//..,,**&&$$!!    !!F#F###S#S#""8"8"!!;!;!   6 6 uuVV>>))}}zzxxuussppoolljjhheecc``__\\ZZXXUURRPPNNLLJJHHDDBBAA??==;;99553311//--++((%%##!!    EE   ++ll  AAcc44iibbSS..??NNZZbbjjoottyy{{~~@@x x pp006 6   11RRZZ((UU}}  !!""""!!""        ppUU??++  ~~||yyvvttrroonnlljjffddbb__^^\\ZZXXUUSSPPOOLLKKHHEEDDAA??>><<9966442200..,,**((%%""        CC$$OOSSffII00  }}zzxxttrrppnnlljjffddbb``^^\\ZZVVTTRRPPOOLLJJIIFFDDBB??>><<::88552200//,,++))%%##!!    iiyy^^EE//}}zzxxuurroonnkkiiffddaa__^^\\ZZXXTTRRPPOOMMJJJJFFDDBB@@??==::88553311//..++))&&$$""        JJppXX??(({{xxssppnnkkhheebb``^^\\ZZVVTTQQOONNLLJJIIEECC@@??==;;9966442200//--**))%%##!!      ##dd==rr,,^^;;~~uuooiibb^^ ``ss. . U U   ""!!**kk??YYnnggb b 22  ggW W   jj}}KK  SS$$33@@LLSS\\aahhkkooppssttuuuuvvvvuuttttssrrqqppoonnlljjhhffddbbyyooii``[[UUOOMMHHDD??==::552200..++))%%##      ~~||zzxxuussppoonnkkjjhheebbaa__^^\\ZZXXUUSSQQPPOOMMKKIIFFDDBB@@??]]{{ZZ99{{mm__UUMMDD<<55//))##  ~~||yyvvuussppoonnlljjhheeccaa____\\ZZXXVVTTRRQQOONNLLJJHHEECCAA??>><<::9966331100//--++))&&$$""  SSPPss11CCQQ%%ttaaQQBB55))  }}||zzvvuussqqoonnlljjhheeddbb____]][[YYVVUUSSRRPPNNMMKKIIFFDDBBAA??>><<::8855331100//,,**))&&$$""        ==mmXXEE44%%  ~~||zzxxuussrrppoommjjiiffddbb``__^^\\ZZXXVVUUSSQQOONNLLJJHHEEDDBB@@??==;;:: e e \ \ hhhh b b $ $ hhgg//  EEvv  $$==PPaapp``ee> >   OOffW W I I / /   l l nnhh88~~||zzvvttrrppnnlljjhheeccaa__^^]]ZZZZXXUUSSQQOONNMMKKIIFFDDBB@@??>>==;;9966442211//..,,**((&&$$""        ~~}}{{yyvvttrrqqoo%%OOCC  bbBB%%  ~~ttllcc]]XXQQLLFFBB>>::5511//,,))%%""      ~~||{{yyvvuussqqoooommkkjjhheeddbb``__^^]][[ZZXXUUTTRRPPOOMMLLJJHHFFDDBB@@??>><<::9966553311////--++))((hhqqee\\QQII@@::22,,%%    }}zzyywwvvttrrppoonnlljjhhggffddaa``__^^\\ZZXXWWVVTTRRPPOONNLLIIHHGGEEDDAA????==<<998877552211//..,,**((''&&$$""        llyyii\\NN??44''     ??ww33oo  0 0 ' ' L L $ $ ^ ^   6 6 U U o o &&,,005588<<>>@@BBDDEEGGGGGGGGGGGGGGGGq q 7 7 m m [[@@nnr r N N O O > > l l   . . D D W W g g w w ggrrMM&&ggOO::''   | | w w u u p p n n i i g g d d a a _ _ ] ] Y Y W W U U R R P P O O M M J J H H G G E E B B @ @ ? ? > > < < 9 9 7 7 6 6 5 5 2 2 1 1 / / . . , , * * ( ( ' ' & & % % " "                                     ~ ~ } } z z y y w w w w u u t t q q p p o o n n l l j j h h g g f f f f d d b b ` ` _ _ ^ ^ ] ] \ \ Y Y X X W W U U T T Q Q P P O O N N L L t t   w w o o h h d d ^ ^ X X T T O O I I F F A A > > 9 9 7 7 2 2 / / - - ) ) ' ' % % ! !                                 } } | | y y x x w w v v u u r r q q o o o o m m l l i i h h g g g g f f d d b b a a _ _ ^ ^ ] ] Z Z Y Y W W W W V V T T R R P P O O O O M M L L I I H H G G F F D D B B A A ? ? ? ? = = < < : : 8 8 7 7 6 6 4 4 2 2 1 1 / / / / . . , , * * ( ( ' ' & & % % " " ! !                                         M M x x m m b b W W M M D D 9 9 1 1 * * " "         J J   GGWWKK  AAtt  4 4 P P l l       ( ( / / 6 6 < < @ @ F F H H M M O O R R U U W W X X Y Y \ \ ] ] ] ] ^ ^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ^ ^ ] ]   88OOhhww  ccjjFF$$PPxx  , , A A V V g g w w % % V V ' '     b b D D & &   u u a a O O ? ? 0 0 " "     ~ ~ | | x x v v t t q q o o m m l l i i g g f f e e b b ` ` _ _ ] ] \ \ Y Y W W W W U U T T Q Q O O O O M M L L J J H H G G F F E E B B A A @ @ ? ? > > < < : : 9 9 7 7 7 7 6 6 4 4 2 2 0 0 / / / / . . , , * * ( ( ' ' ' ' & & $ $ " " ! !                                           ~~||zzyyxxwwvvuuttqqppoooonnmmlliihhggggeeddbbaa``__^^qqyyuuoollggdd__\\WWUUQQOOLLHHFFDD@@??==9977664411//..,,**((''&&$$""        ~~||{{zzxxwwwwvvttssrrppoooooollkkkkjjgggg__88__//SSvv..@@SSccrr                              {{  77cc##CCbb||  **77CCLLWW``hhppww~~~~||{{{{zzxxwwvvttssssrrrrppoonnllkkkkjjhhggffddddccbb``__^^\\\\[[ZZXXWWWWVVTTSSRRPPOOOONNLLKKJJJJHHGGFFDDCCCCBB@@??>>>>;;;;::8877776633333300////..,,++++**''''&&$$####""            <<WWoossgg[[OOCC88..$$  ||{{{{zzxxwwvvttssssssppoooonnllkkkkjjggggffddccccbb``____^^\\[[ZZXXXXWWVVVVSSSSRRPPOOOONNLLKKKKJJHHGGGGFFCCCCBB@@@@??>>>>;;;;;;887777664433332200////..,,++++**((''''&&$$####""        nn((''wwOOCCKK[[qq  ##CCgg  ##''++//3366::;;>>@@CCDDFFGGHHJJKKKKNNNNOOOOOOOOOOPPOOPPOOOOOOOOOOOOOOOOOONNLLLLKKKKKKKKJJHHHHGGGG==EE))??WWqq  !!11AAOO]]iiww}}}}{{{{yyyyyywwwwwwuuuussssqqqqoooooommmmkkkkiiiiiiggggeeeeccccccaaaa______]]]][[[[YYYYYYWWWWUUUU[[eess}}{{wwuuqqmmkkggeeaa__]]YYWWUUSSQQOOMMKKIIGGEECCCCAA??==;;;;9977775555331111////--++++++))''''%%%%####!!!!              }}}}}}{{{{yyyyyyyywwwwwwuuuussssssqqqqoooooooommmmkkkkiiiiiiggggggeeeeccccccaaaaaa____]]]]]]GG##ii99  &&11>>JJWWddpp{{      ++77CCOO[[ggww{{wwqqkkggcc__[[WWSSOOKKIIEECCAA==;;99775511wwII00%%""%%++33<<EEOOYYaajjss{{~~~~}}||||{{{{{{zzzzyyxxwwwwvvuuuuttttssrrrrqqqqppoooonnmmlllllljjjjiiiihhggggffffeeddddccccbbaaaa``____^^]]\\\\[[[[ZZYYYYXXXXWWVVVVUUUUTTSSSSRRQQQQPPPPOONNNNMMMMLLKKKKJJIIHHHHGGGGFFEEEEDDCCCCBBBBAA@@@@????>>====<<<<;;::::99998877776655554444332222111100////....0055::@@DDEEEEEEDDBBAA??==<<::886655332200//--,,++))((''&&%%$$""!!                kkTT==00**(()),,//4488>>BBGGKKPPTTWW[[__bbeehhjjmmoorrttvvwwyyzz||}}~~~~~~}}}}}}ttffTT@@,, !!%%)),,00336699;;==@@BBDDFFGGIIKKLLMMNNOOQQQQRRSSSSTTUUUUVVVVWWWWWWWWWWXXXXXXXXXXXXXXXXXXWWXXXXWWWWWWWWWWVVVVUUVVUUUUTTTTTTTTSSSSSSRRRRQQQQQQPPPPOOOOOONNNNNNMMMMLLLLLLKKKKJJLLNNQQUUYY[[[[[[[[ZZYYXXVVUUTTRRQQPPOONNLLLLKKIIHHHHGGFFEEDDCCBBAA@@@@??>>>>==<<<<;;;;::999988777766665544443333222211110000////....----,,,,++++++**))))))((''''''&&%%%%%%$$######""""""!!    sonic-visualiser-2.3~repack1.orig/samples/tap.wav0000644000175000017500000010625012252354725020705 0ustar miramiraRIFFWAVEfmt Ddata|ȒȒdsdsuupp(o(o ^^ll,,uu -g-gooچjjccݛݛVaVa''ffşş11\\!!fZfZ[[NN..މyy))rr5 5 ww AAb b 66!!((::vv ((::^^hhDDcc;;$$ WW]]۩..KKA7A7 9393(( 00LLpp&&yy++Ӱy y `)`)""ՍY Y ߷X&X&ۂ۟  aakk>>YYxx{{))}}55qqCCAA99RR  ttoo\\&&BBhhuu^^##JJEEIIUU  xx ' ' 33dd11}}55PPww<<EEAA++))SS))KKww88BB??????yy<<VVmmHHcc99::}}mm11kkgg==jj''MMllGG[[IISS[[GG!!==ww,,55++//++ee**__zz^^NN##''22@@mmll##oo:://jj  ++  ffQQEEmm--YY{{||rrff~~!! 77##GGqqFFff@@&&$$AA==tt88**kkWWqq))HHKKbb99llrrssWWMMLL!!vv55&& 5544UU((##00CCXXllHH[[^^  11GGSSeeuummmm''..))!!UU55WW##EEssVVMMNNuuJJJJ&&==88KKQQ11UUOO;;II99kk__ii!!LLLLxxgg``GGHHTTdduu00ZZ??{{;;mm55))55//xx((!!33dd-- ==BB YY++..%%??IIAAppmmff ''bb''++88mmIIoo99  ++TTiiAA??QQFFdd<>YYFFIIVVggxxJJ;;@@NN``zzSSDD..aa  __EEYY%%ZZooQQ==eeff!!hh//++``CC[[IIII..FFddpp44mm[[mm22kk~~~~vvll``UU;;kk))  uuss**vvCC==yyzz{{MM}}wwUUXXddeeHH]]QQ6666..FF]]))SSPP::AADDhh xx**iiwwggrrnnWW??aaYYssssrr99oo\\vvbb**NNPPxxbb22''##MMggkk!!dd]][[""GGll!!iiEE..LLoo\\))ee&& YYNNTTaa ffSSccRR}}}}OONN[[''yyyyNN??]]WW^^>>KKQQUU##cc11 __44ffffOO00WWEEIICC11!!7788qqYY>>wwpp||mmGG))''''..++BBii00ggAA  gg++zzqq--((99!!55&&GG''==))$$TTGGaaww}}))ddhh66MM{{((JJ22KK++OOMMnn}}==--<>::VVnn%%vvttgg[[++9933II--EE 11XXSSvv ##NNIIIIOOoo^^uummtt}}WWII__IIuu))77""]]11  xx%%!!^^XX22uu!!##""ii~~GGcc$$ %%}}yy//!!ee77}}kkwwJJ11##;;ccUU{{88bb%%22{{wwgg``  66[[99}}ww$$++ii99xx^^//XX00vv$$__eeEEEE~~))HHiiIISSnnJJEELL%%{{))33LLGGtteeBB((**88;;  JJ}}UU11))WWddXXBB))55ZZxx]] nn\\WW""zz55**HHRRQQKKSSQQKKDD==66//)) ee11  ))hhqqmm//vvYYrr..eeFFuu==SS&&99WWii{{yyOOGGOO^^oorr''@@00))yy99JJgg<<77 ``EE}}GGYY~~||?? @@11MM~~''JJnn55NNTTQQvvhh GGLL::aawwCCNNww//uuuuyy88 qq//--qqOOkk++  qqhh))==@@hhhhqq ggCCyyee//ccyyiiEEaaPPaaVVaassCCzz??wwUU{{zzKK NN||%%??66==CC""uu55rr>>//OO]]eeOO AA;;,,DDeeww""$$## !!  $$jjkkOO99\\NNqq7799  mmaa##[[==uuooQQ;;22^^,, //BB##GGyybbUU[[11''[[//ee$$~~::HH||OOSS++  ww,,::zz{{&&MMllXXZZeett ;;MMPP22$$//yy;;  ll 44QQ::AA{{ YY)),,++((rruuXX}}!!  \\%%XX33//KKpp@@yyZZ==2299KK  &&__II  XX //JJHHDDpp55 ((##&&0022// QQ JJaa77**55VV##oo||##\\SSOOUU\\zzll``ggNNMMWWBBss<<KKQQXX--zz""11{{66hhgg ooOO}}BB"" eeXX\\hhvv22//dd!!aaXX11!!{{wwaaDD<<ssJJ{{%%LLiiQQ qqAAtt##//UU//##TToo||XXRRYYiiAA((==XX11YY22QQ``eeJJ  ss00>>dd**66KK--CC^^[[""11RRHH!!..2200HH  AA[[BBEE;;EE##RR""EESSFF VVIIPP??}}[[IIYY &&((&&66QQ ]]oojjUU  UU//VV--;;XX((YY??mm##88>>>>{{mmooUUSS\\jjCC uuAAOO!!@@cc{{$$ee''ooff''[[nnzz^^uu77~~oo 11II++[[##LLAA##rrXXIIuuGGffoouuuuuu!!hh6600mmxxmmJJUUGGRRWW>>00&&SS@@CCPP``qq55%%99!!yyddtt^^wwxx}}EEHH}}ff{{,,OOaaEEyygg))(( lljjII CCii}}11!!eecc9933vvoo88PPtt<<==uuRRnn<<VVZZPPccFF%% **{{KKyy))ccIIww++aaQQaa__""__11__zz++^^UU !![[uu##[[(([[XX..::%%((99MM``ssbbGG[[ZZSSSS77QQ<>YY..MM&&77\\000044ggBB.."" ppSS ^^SSCCCCjjBBiiDDOO--wwoomm====WW;;;;__bb@@kkOO]] 55CC>>kkww}}!!CC==1111))%%44XX11||RR??11bb  xxqq\\GGee22 ooeejjuuWW""%%RR~~jj  SS!!QQ''))IIGGee{{uussWW77xxvvYYGG::11**&&,,BB''QQ2222AA;;OO<<--QQUU>>YYHHmm ""''++ttttgg\\QQGGss^^^^DDNNuu  ''55''))""KK99CC mm))ww\\**ee??FF}}oo!!00AA++??mm||{{ttii__||~~ttii^^ CCYY))EEZZ==66ww{{MM??PP wwuu UU;;cc||__  ll&&HH yyrr//66//%%SS@@WWbb,,ZZ77OO55[[TTEE..((JJ;;rrKKgg''44 nnSSRR[[iixx}}{{##;;CC99##rrOOWW%%((%%gg''==;;rrmmvv--))hhUU44yyUU]]\\ttxxssxxkk^^SSLL////))XX1111..ZZcc{{33WWEEIIccaa..11||88((!!``22$$ff <>__llnnxx]]__xxpppp$$~~ {{}}ddTTWWbbqq&&<>NN``qq00WWTTUUKKssmm33uu44++55!!LL$$BB99UUwwJJ22RR11ddSSYYUUyy==mmJJSSqq77SS__ccbb``\\XX''  kk00,,4400<>CCDD\\ddeedd``\\XXTTPP 11II 88||LLyy--WW{{{{&&{{ vv::NNhh}}uu]]$$oo<<%%KKccZZooDD SSoozzzzooKKbb""MMhh\\AA<<DD<<??yyff``ffff:: 1177;;<<==<<<<;;5522000011jjhhIIEE rrss ..""mmss++~~uu}} CC,,EEPPSSSSQQVVVVUUQQOOLLIIGG``iijjhhdd__SS``QQSS11 JJ&&""CC11LL""11,,TT66$$II66SSMM``gg~~ww$$ yyFF``CChh66}} yyAA 77JJ~~^^{{HHpp##00kk**77[[==eeeett**hhLLgg{{UUss++!!44ppbbYYwwoommkkddGG<<99;;??CCGGKKOO||ddKKAA==>>ooTTvvNN NNhhMMjjllFFQQMM[[CCHH%%VV22qqbb[[XXXX[[]]__aabbccddffhhjjjjkkkkkk88##HHPP__ppOODDUU&&ffrrww55\\ JJ``{{rr]]JJCCBBDD>>>>AADDHHLL||}}ii__$$bbZZcc||!!KK44dd55\\yyddss88!!ff ]]yyqq]]ooMM44**""ll22~~__@@441133''''~~--aa55cc66kkttJJ++<<sscckk77ss//VVcc66ooNN%%rrddrrbbQQ(($$''++XX@@776688..--0055::??DDHHMMbbTTQQgg\\nnuuhhjjnn77mmzzFFiill))jjll++<>rr''99ZZmm~~dd&&BBQQvvRR||xxyy||``BBppxx??33ddSS##mm22yy##<<II""YYZZzzzzqqddbb[[AA99FF!! !! !!YY ""||""hh99>>11dd}}kkee~~}}~~UUBBXX%%:: eeff%%66%%uumm22OO{{||XXYYNN&&__--qqlluu}} YY??ZZJJ[[JJ KK))vv))nn))__oo~~bbTTvvhheeggss bb??ZZgg[[``hhwwdd==WW__@@--jj GGzzwwww{{uuttvv^^22nn//``II@@<>xxzzkk [[mmggggkkppxxWW``eennKK33AA33dd33\\3333]]kkmmAAxxZZhh MM :: ||WW66nnxx 66kk TT``77 77ppvvNNkk{{ ooXXllccmm;;ee||99NNQQ::99ddDD::zz::FF}}{{oo{{{{}}nnCCbb\\<>zzrrHH{{>>zzwwwwttvvyy}}{{TTFFrrEEWWOO}}gg\\@@qqNNbbhhkk}}||LLxxAALL{{JJuuiisonic-visualiser-2.3~repack1.orig/samples/cowbell.wav0000644000175000017500000003225412252354725021552 0ustar miramiraRIFF4WAVEfmt DXdata4,|BI $3 uBuPnnnI2;Ȅ*PøBI27.7.vÚ UUCu0X| HR ÷͋B.|%B| n_f3τ4W< _**7W<,B__X܋ϰ˩;X ,;ȷ!PG$37@4Jo:hPG7|%PP'PG:hHR! P|%f**#.|%!$)#4ӄgƩ,,BXgXհø,g,ޡ _,@NYA]@ !u0I2W>??AACCEEGGGGHH6H8HFFBB<<662200////`0^01134r6p6R8P8\9Z999j:h:4;8;<<>>??"A AhBjBCCDDDDDDdC`CBBBAFAAAAAAAD@D@x<z<7 711--++****++ - -x/z/2244445~5h6l6V7T7882:.:<<==??@@AABBCCEEGGII\K`K8L6LLLzL|LJJFF@@::66443333446688 ; ;$=&=F>D>>>|??n@l@AACCEELGLGxHxH^I`INJLJ|K|KVMXMOOQQRRSS\TZTSS(R*RMMHHAB==;;::::D;B;<<??BBDDVFTFVGXG(H(HHHBHFHFFEEEEhEjEVFTFGGIIJJM M6O4OPPfQjQQQQQOOKKtEvER?P?::88777788: :<<>?>==>>AADD4F8FHGHGGGjHhHVIZIJJLLNN:P]>]|^z^p_r_ ` `T`X`````````6a6aaa__JZJZfSdSvLzLGG$E*E8D4DXDXDEEFF|IzIfLfLNN P PPPQQRRTTVVXXZZ[[ ] ]^^h_f_ZaZaccee2g0ghhhhLhRh,f,f&a"aYYRRdMdMJJIIIIJJvLtLHOHOHRFRTTUU~V|VWW"XXYY[\*^(^``ZaZa^b`bfchcddff ii@k@kll~mmmmjmjm"k kee^^"W"WQQPONOVNVNxNzNBO@OPPSSVVFYFYZZ[[\\]]@^>^*^.^$^ ^r^v^8_4_B`@`aabbddXgXgiijjkkc@cccZdZdheheTgXgii&l&l*n,nooppqqs s*u*uwwzzv{v{H|F|||{{@y@y6s2sjjbb[[XXWWWWvXxXvZtZ]]0a0accDeDe f fffgghhLjNjkk$m"mnnlnooqqrrtt w w:yx>xzz||H~J~zt~~{{uullcc:]:]YYtXxXFXDXXXZZ]^~a~addbebeee~f~fggzi~ikkHnLnTpRpqqrrssuuFwDwyyd|b|}}~~~~}}zzttkkLcLc ] ]YYXXXXFYDY:[8[~^|^aaddffff|g~ghhjjll~H{H{uuLlHlcc6]8]ZZXX|X|X2Y2Y2[2[^^*b*bddFfFfffgghhjjmmpopoqqrrssttfvfvxxN{P{}}.,~~{{uullcc"](]YYHXLXXXXXZZ0^0^aaddeexfzfffggiilloo4q2qrr|szsbtbtuuwwzz}}~~.2LH~~zz|t~tvkxknbpb[[tXtXVVtVvVWW*Y,Y\\``ccddxeteeeffiillooqqssttttFvHv|x|x>{<{}}.,~~{{NuPuDlFl2c.c\\FYFYWWWW4X4XFZDZ]]pata2d0dxexeeebfdfjglgpijikknnpprrrrss u uVwTw zz~|z|}}~~~~p}p}LzLzssjjNaNaZZWW~U~UJUJUUUX X[[:_<_bb\c^cdcddeegg(j&jllnn4p4p>q>qJrLrssuuxx"{${||<}:}`}d}D|@|yynrnr i i__6Y4YVVdUbUVVbWbWYY\\T`V`cc^d\deeeeffhhkkmmoo q qrr*s(sttvv4y6y{{||}}}}}}yy(s&sii"` `JYPYUUTTTTRUPUJWLWZZ*^*^``HbFbbbccddffiik~kmmoopp&q$qrrttVwTwyy{ {{{{{zzwwpp|gzg]] WWSSVRXRXRVRSSUUlXjX[[^^````VaTavbxbjdhdff8i6iJkJkllmmnnppJsNs|v|vyy{{||||{{xxqqzhzh^^(X(XTTnSlSrSrS8T4TVYY2]4]__NaLaaabbcceeggjjdjzlzlmmooppxqxqss$v$vvxxxyy|z|zzzyypvrvooffp\j\UURRPPPPPQTQFSDSVVZZ\\^^^^4_6_@`@`$b bddffhhbjbjbkdkbl`lmmoobrbrtt v vvvvvuubrhrk~kaa(X(X2Q4QMMhLhLlLnL6M4M0O.OxRvRUVXXYYZZ"["[b\`\t_v_ccggjjzl~lzmxmJnJnooqq^t^tvv"xxxxxxwwttmm.d0dZZSSBP@PNNNNFOJODQDQTTLXNX[[L\L\\\,]0]*^(^``bbddggThXh,>@@XCRCFFvIrIJJBC>CCCtDvDEEzGzGII@L@LFNHNOOPPQQ@S@S^U`UWW6Z4Z[[B\@\\\[[dXfXbQbQrGrG==<78744&5&5j7h799B<B<??BBpEpEFFHGFGGGHHJJLLLONONQNQRRpSrSPTPTUUWWXZXZ\\ ^ ^^^^^0].]YYRR2I2I??8844D3H32233~5~588|<z<2?4?@@*A(AAABB|DzDFF(I,I"K"KzLxLlMjMXNXNOOQQPTNTVVWWXXXX^W^WTTMMrCpC9922`/`/----h.d.V0V03327.799;;;;<<==?>bAdACCEE G GGGHHJJ^N`NRRVVYY"["[ [$[YYVV>>>>>??AADDF~FxHvHIIJJdKfKLLNNjQjQSSU UUUUU T"TPPII"@ @6~6//++8*:*))**h,j,//F3F35577j7j77788N:N:<<>>@@$B&BCCCCEEGG~IIKKLL\M\MBMFMKK~HzHAA88h.h.z'z'##""!!<":"N$N$''++..//////0044::@@*>>>??@@BBZEVEzG~GHHIIHHGGDD= =N3R3))d"^"6448""T&V& ))H*D***&+(+(,(,..003 355~6~6z7|7x8v899;;>>AA`B`BBBBBAAn>n>~77--P$T$ljp!n!$$J'H'**,,F.H...6/6/ 0&0112404~6~6t8t899::;;==??fAfAzCzCDDFEJEzExELDJD@@99//%%8:JL8:##%%&&|'z'''((**--p/l/h1l12233445577h:f:<<==^>^>j>n>.=,=9922>):)xxd`\\ *!*!!!""v$t$&&F)F)P+N+x,z,$-"-..//33N8R8<<??8A6A`A`A??v<v<55++.","88`bZXlp ""##z$z$$$%%''))J,J,B.@.//00n1n122447 74929b:b:::::99>6>6././f%f%XX&*TVdh|z8<|!|!##%%&&''(())++..P0N0111111t0t0,,%%$"XZR T \^RN 02RR ZZjj0%.%|)z)++h,h,,,--//t2t24455~6|6r6t65 511** PJLN L R 8 8 .0\Z$"..b!f!"":#8###%%&'))++,,H-H- - -z+|+'' H J :< PR |zDDB>..bdB"B"$$&&&&&&R%P%""22zvPRh d 66pr46hf ""`%^%''))d)f)()&)''$$|| T\v p  P L , 0 ~~8:  02$ ( l!j!!!!!` ^ l n ttd\LP & ^\ BF P N ##$$$$0#2#68x|xt$(b\ 2 0 xzHF86&*"hl\TDDhd\`00vvBB :6XZLH\d4ܾ4ܾ վ վҾѾѾѾ4Ӿ8Ӿ@׾D׾$޾(޾|TPttX X llxxljvx"  ޾޾۾۾۾۾ ݾݾ4,pl^`82fh20 ` b ~|dd |߾߾Ѿ|ѾHʾLʾ(Ǿ(ǾƾƾȾȾ˾˾|ҾxҾ|پxپ޾޾\\XTdh $(0,rp*,|~X X h j 84ԾԾ$Ⱦ ȾTþXþžž|˾˾оо4־0־ܾܾTTTP80TRJL B B  d h |ؾؾʾʾþþPTLžHž˾˾ҾҾؾؾھھ۾۾ܾܾ޾޾X` HL 88hd&&ljFFh޾h޾,˾4˾ld|40(ƾ,ƾd˾h˾;;ξξϾϾѾѾվվ`ھ\ھ߾߾pp>>оо4þ8þpp|žž̾̾ѾѾtԾtԾtվxվ<־8־ؾؾ۾۾lhPLLPH@x|x|^\(&,,  ־־`þdþphXX@D,8쯾䯾HL $<¾4¾xľľPžLžžžǾǾ ˾(˾ϾϾHԾDԾ ؾ ؾ|ھھܾܾݾݾ $׾׾ľľܣأ``И̘0,̬Ьxtാܴ ``ܿܿh˾d˾׾׾߾߾ hl,,lh\dLLHH;;ddxtܴാ@@|00¾¾8Ǿ4Ǿ˾˾ϾϾѾѾhӾhӾԾԾ,׾0׾H۾H۾d\,(`ܾdܾPξPξ຾ܺ|xdh܎|x䏾ܓԓСС00̭ĭܿ࿾¾¾tľpľLƾTƾȾȾT;P;ҾҾ׾׾Dھ@ھ<۾<۾۾۾XؾXؾѾѾþþ((84䐾ܐ ||<<̲ԲHHཾܽx¾|¾hƾhƾȾȾʾʾ̾̾ ϾϾ<Ӿ@ӾPؾXؾܾܾH߾T߾0,߾߾ݾݾ־վǾǾDH $PHĈPP LPpdLTPH ̯ԯ00ľľTXž|žʾʾXϾTϾѾѾҾҾҾҾϾϾȾȾ00LTyyzz@}@}܏܏țě\\44,,԰ܰtt, ǾǾϾϾվվ4ؾ4ؾؾؾԾԾ;;D@D<4<XXHHԎ̎ĕ|(,ةةxx ඾඾,(PLhľtľȾȾ|˾˾d̾\̾(̾0̾LɾLɾD¾H¾|쌾}}8p0pjjjjmm(u0u耾  Ȑ̐84Ěhl@@dhplt|,,`X컾豾䱾ģģ8<yy]] P(PJKpKhKNNVVccqq8|0|ll<<HDTTtx̶ж$ þþdľdľ ľľ칾쫾<Dnn`aP[H[8[@[ ^ ^eerrhdԇԇ4,芾DD䛾@@$$|xԬجx|쳾쳾|賾೾TP$(hhLL>>88x8x8X;P;0C8CPP(_ _jjXo`oqpqXs`sxwxwhX܉ ȐȐ\\dh  $쩾Ħ쟾䑾䑾||VV==33p6p6??pI`ISSHaHannxx}}p`PP 䊾䊾44䙾䙾XPȪ̪PTxp<D, ]]AB33----0x088PFHFTT__ddff(hhllss}}䃾xx,(䍾荾ppȔĔ<<|  @<0n nGG,, HP`%P%220A0AKKPPRRXT`TXXXXH`@`@jPjptht||LT薾ؤؤ즾llHHxxvvXPPP55''""##('0'H/8/<<JJUxUZZ\\h^h^`bXbiixss`}X}HHĈLL䔾04txpptx@b@b;; hx  P H pHP`%X%@383==HBHBDDExE`I`IPPhZ`ZcckkppHt8tww||lp44TX莾nnpGxG  `p`pp` h p%p%*)X+h+,,11@@SSgguu}} X\؍Ѝxtؕؕ{{TT--HHH@0 ( p&p&005577h9x9X=X=DDMMHW8W__d dgg@k@kp pPxPx,0 ||xt||X``` 9 9HPpҽpҽ`Ƚ`Ƚɽɽнн``P0  ( ( $$,,X6H6 @ @hHpH0N0NRRVVx\x\e eooxx~~,0x{x{HnPnRR**ԽԽppĽĽսսp@P !!&&))**..66`@`@XJXJxRpRWW0[ [^^ccllwwXX||40rrVV//` X ۽ܽpp`@ϽPϽ`ph p HHh`P#@#,-66?>xDDhHxH0L LQQZZdd0n nxsxs@uXutto o`aPaEEPP@@@0`p˽˽xx ''P0P0`5P5X8`8;<BB`PhP`h`ooyy}|||uuff8K@KP%H%00pɽpɽ`pॽॽPP ڽڽ0(P X @8PP %$//X7`7<<@@CCHHpQxQX\X\ffXk`kmmPlHl8f0f0X0XX<X<޽޽৽ЄЋЋ`P`ҽpҽ00xx##((`,p,//54==HHPRPRWxWXXWWPQPQ(C8C''pMM@8 888@F@F@h`h``p`Ž Žνν0ѽ@ѽӽӽܽܽ px++22P6P688p=x=HF@FhQpQ`[h[``bbba[[MM22 ʽʽ ss``@`cc q@qppппԽԽ޽޽0000hx##&&++p4`4? ?HHMMOOMMGG99 W`W!`! @>>u u`P0෽ʽʽڽڽPh HPhhx `&X&11;;AABBBB <(<..ؽؽ44` ` %%BBhh Ш Ƚǽ ͽ0ͽѽѽ`ڽ`ڽ@@hh@8X`##X,`,66 @(@PEXEPG8GGGxAA33 9 9@) )`]@] а`Pͽͽ0H@` p x))3388::(: :h4x4&& ȽȽww@ @ @@@@ 33iiP`฽0̽@߽߽̽ppH@`h  ((x&&33x<x<??P?H? 99 +(+x0ҽPҽ@ ټټüüGGppॽॽ00P½`½սսpp hp00#$--2244p4`4.. ]^zz;:QRǼǼMMw`wP```p`໽ϽpϽ߽߽  p %%''&& `)@)tu,,::~ED̼@̼II _ _`i@irs@@`ԽpԽ`Pp`00PPh`&&p,`,. .X-X-'' p ED@»@`7`7bbvv`p௽Я Ľ0ĽԽԽ߽߽00ph ( !! @@  ``d;d;<<;;h;j;32`H`H`Q@QXYiip̽ͽpԽԽ۽۽P@ppXPX`@@XPpӽӽxt;;<<;;Ⱥĺ--ļļ@F@F[[`ee mm`~~ @0ȽȽӽӽ۽۽ Xhؽؽ`@;;B<C<6<5<;;tt%@%@:`:`BBIIZZ@| |@@ĽĽ̽̽pӽӽp޽`޽ xx(8ppphʽʽ`}`}̼̼::]<\<<<@<@<R<Q<;;@@ `@@)`) 22CDee@@`ppPpƽƽҽҽp` HPpнpн߼@߼xp9<8<y<z<c<c< < <::CB@ռռ ,@, 65@>>OO`p`pPPŽŽͽͽؽؽhp p   @ H ĽĽoo;;<<<<<<<<<<`"`"@4`4UT}}В@0`˽˽`ݽ0ݽ@` `P@S@ScbP<P<<@<<<@<@<<<N<M< @`_ļļ@  ` ``DDv`v ```ppƽpƽpѽѽ`P   ``@<<@<<<<<<<<.<.<ټؼ` `))I`I@pp@ ਽`ƽPƽ׽׽ppPPxxp G@G43}<}<<<@<<<<@<<<<F;H;))@׼@׼`@ @89`@`PP   ѽPѽ@0ଽଽ??<<<<<<<<@<@<d<d<0:8:WW¼¼@@ ` `@<<ee`pИ`PЬЬ 0ӽ ӽ h00A A''@<@<<<==<<<<@<@<;;м@Ѽ`22Z`ZВPP௽Я`pͽͽ@0p@80߽P߽pp9`9 <<<< ==@=`=<<<@<;;żƼڼ@ڼ`)`)RR@}@}@@`0@˽˽p` `p;;<<<<`=`==`=<<@<@<;;̼̼@ -,@VV0 p` 0@0`˽P˽pP0HH @`Pݽݽ``56@<<<< =@ ===<<<@<;;@ѼѼ ##OO{{pp੽Щǽpǽ ߽߽PP ٽٽࢽ00@<@<<<@= =`=`== =<<<<ȻȻ@@@˼̼ڼڼ!! N@N`{@{ 0``ȽȽ߽߽XXPH۽۽22<<`=`=== =@ =@<@<<<;;̼̼ڼڼ@! !LM yypPp਽਽೽ƽƽP޽@޽P` ؽؽ`p..ƻǻ@<<=@== ===<<<<<<ļļּ@׼@@I I@s`s Ж`Ž`Žܽ ܽ``pp׽`׽)*<<==== = =@<<<<<<@@Ǽ@Ǽڼڼ `!@!`J`J`t`t`ƽƽܽܽ 0 0ڽٽ+ +@<< = == ===<<@<<<<|{@@ӼӼ@F Foppp@0Н@@౽ýýPڽpڽp`p`@@p`׽׽0`&`&TV@<@<== = =`=`===<<'<(<VXaa˼̼CCm`mТp`ٽٽp ׽׽`((<< =` =====`=@=<<<<wvϼϼ@CDm@m Г ½½ؽٽ pֽpֽ@#`#" <<=`== =====<@<5<5<"$VV@Ƽż @ @ii p`@P``00ֽֽP@p`ѽѽ`p<@< ==@#=@#= =`===@<<J<J<;:@@?>`jj0 К୽Pp`׽P׽ 0@ӽӽ <@<= = "="=== = =<<A<A< SR@@@@@@@=`=g`gP@@P`P`p ս ս`pp`ννPH<@<==(= (="="=`= =@<<c<c<89ҼҼ ` 54_`PP`pp`pp`ҽ`ҽp`̽̽`@:@:<@<==*=*=`!=!===<<R<Q<DF@ڼ@ڼ98cc``Ўp` P@ ӽӽ@@pPPͽͽЖ0@<@<==+=+='='=`=`=@<@<m<n<833@@˼˼` 22]\``КК нн ʽʽ::<< = =0=0=@*=*===<<|<}<::tu@@@üü@` ..`Y Y|}ЉPPИ0 νν`Pp0ͽPͽp`@`8:0:<@<=@=.=.=(=(===<<t<u<8:8:#$||ɼ@ɼ /`/`YY`|@|@P`ϽpϽ@@PP``ɽɽВ ;;<<%=$=@4= 4= -=-=`=@=<<<@< ;; ba))TS w`w  0 ``дд˽ ˽ ߽ ߽00@@ǽǽ;;<@<@.= .=;=;=3=3= =@ =<@<<<;;һѻAAno@ &@&Q R vu`pP`0Ф@ͽ@ͽpp`0ɽɽБ` ` t;t;<<*=*=7=7=.=.===<<<<P;P;NO{{@@%`%O`Or`r 0ಽɽȽܽܽpPŽ`Ž;;`= =1=1=`?=@?=`6=6= $= $===@<@<;;)*]]GF i iЉఽаƽƽڽڽݽ ݽ ½½Њ@@;;@= =6=6=A=B=@6=`6=@"= "=<<@<<v;t;߻߻DDkj@!`!LL@p pp` ВН`pǽǽܽܽ@@pݽܽ PP;;@=`=2=2=A=A=@:=@:=(=(=@=@=<<;;$#RRz{@ DD`g`g @P@@@ĽĽ ٽ ٽppP` ڽڽ@P00@;; = =:=:=`H=H=@=@= /=/= = =<<;;hf;:``@׼׼``?`?`bbyyPPĽĽڽڽP@ڽڽ@;;==5=6=@E= E=>=`>= -=@-= =` =<@<;; GGhh@ۼܼ@``C@Cff}}p`p`ýýؽؽ׽ؽ00@ < < = =`==@==`L=`L=D=D=@3=3===<<<<,,+*ON@μ@μ`::@]`]`t@tPpԽԽ00PpӽӽpЀЀ׼׼%<$<@=`=`C=`C=T=T=@N=`N=`==@==`=`=@<<<<ڻٻ ++rr `>`> d@d`{@{ֽֽ`00ֽ0ֽݼ޼<< =@=B=A=`P=P=I=H= 7=`7=`=`=<@<<<ܺCC@@ȼ@ȼ @6`6XXo`o@Ї `@ҽPҽݽݽ`޽`޽ѽѽ~`~μϼ;<;<`=@= J=`J=X=X=@Q=`Q=>=>=`=`=<@<4<4<99!mk`/`/RQi`iyzУкຽ@Ͻ@Ͻڽڽݽݽp۽۽νν`x`xT<T<==L=L=X=`X=`M=M=9=9===<<-<-<8 9 99@@ü@ü00@R@Rjj`||@ВP@ϽϽٽڽݽݽPݽ0ݽѽѽpp}}ƼƼU<U< = =P=O=[=\=Q=Q=`>=`>===<<C<D<::|zڻڻab `+@+NNeevvЃЃ@P̽̽׽׽`۽p۽ٽٽ`ͽPͽut@@l<l<%=&=V=U=@c= c= Z=@Z=@G=G=$=$=<@<Y<Y<4;2;0.NN@%@%GG@_`_pp @0p෽з̽̽ؽؽܽܽ@۽۽ϽϽp`@xx@@a<b<"="=R=R=@_=_= V=V=`C=`C=!= =<@<M<M<;;ZZû»SR@@((KK@c cssPP ල˽˽pֽ`ֽٽٽؽؽ˽˽Яpp@}<|<)=)=`Y=`Y=`f=@f=]=]=`K=`K=(=(=<@<i<j<l;l;:9 !C@CZ[kk@|| 0 ǽǽҽҽ ֽ0ֽӽӽ`ǽPǽff@<@<4=4=@c=`c=`n=`n=c=c=O=O=.=`.=<<<<;;8:0:%$@% %`I`I```pp@ pഽ ʽʽpսpսpؽpؽֽֽȽȽ@k`k<<`+=@+=\=\=@j=@j=b=b=P=P=-=`-=<<r<s<;;jj$$```AA XW@g`gwwІ@@Pƽ`ƽpѽѽԽԽѽѽpĽpĽЧ`a`a@@<<7=6=@f=`f=s=s=k=j=X=X=@6=@6=@==<<;;::bb@ڼڼ <`<RR a`a`o`op`pýpý`Ͻ`Ͻ`ҽ@ҽ Ͻ ϽpФऽ`[`[@@<< :=@:=i=@i=@u=@u=j=j=V=V=2=2=<<<<;; @߼߼<<TT`d`d@t t@ pĽPĽpϽpϽ`ҽ`ҽϽϽP½`½^`^@<@<8=`8=h=h=@w=`w=@o= o=\=\=`9=@9=`==<@<;;::,.}}@Լ@Լ@8@8@NN@]@]`l l``@0p̽`̽PϽPϽ̽̽p0X`X@<< ?= ?=n=n=|=|=s=`s=`=`=======<<<<:;<; : :ddǼȼ@33IIXX`f`f||Б0 PP̽̽`нpнpνPνpp[\<<`?=@?=@n=@n=y=y=@o=`o=[=`[= 9=`9==@=@<<<<6;:;88wv@μμ 33JJZ`Z@j`jP``ʽPʽͽͽʽʽ UUuu<<`C= C=s= s===`v=v=c=c=`@=@= =` =<<<<;;::XW@ -,CC T@Tdd@{@{`P pp@ƽ@ƽPɽ@ɽƽǽppP`MMRR@<@<`M=M=|=`|=Ѓ=Ѓ=|=@|=`h=`h=E=F===<<=<><;;X;V;@:@:JK  -`-`E@EVVhg``༽༽ǽǽ˽˽@ɽ@ɽRRee<<I=H=w=w===`x=`x=@e=`e=@C= C===<@<1<1<;;; ;OP``''??@QQbbzy pp`P0Ľ0Ľ`ǽPǽ Ž0Žpp0@ IH==@<<Q=Q== ===@=0=l=l=J=K=`==<<Q<P<;;;;::FH66"!@9`9J@J`[[rrࢽ½½ŽpŽpýý`p```F`F.-@<<@X=`X===p=p=`=p=j=k=G=@G= =`=<<><><;;h;j;::Z\=<@%&<<LM\\@s`s``p`ĽĽǽǽýýИ`CC22<<Q=Q=`=P==І= ==@q=`q=O=O=`=`=<<V<V<;;;;";";&%@` ` `7@7GG`W@Wmnpp`Ľ`Ľ```@@@<<@Y=@Y===`==P=0=t=u=R=@R=@==<<h<h<<<;;p;r;h`@ `00@A@ARR`jj ල½½@Ž`Ž?@&%@<<S=T===`=`=== u=@u=`R=@R=@=`=<<X<Y<<<;;d;f;@@5`5DDSS j@jПП @ýPý`<=<<Z=Z==Є==== = y= y=`V=`V= = =<<u<t<<<;;;; 9`9 -`-`=`=NMdeP`М౽༽@PлЭ`3@3@<@< a=@a===p=p===`=`=]=]=&=`&=<<@<@<,<,<<<;;;;ֻ׻@ `22`AAOPee 0``྽оp `p 99<@<@]=`]=`=P=====|=|=@Z=Y=@$=@$=@<<@<<)<)<;;;;p:p:@@ @* *::`K`K@b`b`P௽௽ຽຽ й01ȻȻ@<@<f=f===p=p=====^=^=)=)=<<<<F<F<<<;;;;׼׼@%% 66`FF`]`]`ppຽз ,,`= =j=i=Ћ=Ћ=P=p== ==~=`\=\=(='=<<<<;<<< < <;;::ݻܻټټ &&@8`8II``ЂЂ```P 000 ```0@0==k=k===`=`===Ѐ==_=_=+=,=<<<<R<R<#<$<;;(;(;}}ѼҼ ` ""33`D`D[[pp``жpp`*@*==p=p=P=0== ===p=p=`d=`d= 0=/=<<<<a<a<2<3<<<h;f;kkǼ@ȼ@`..@?WX~~ p`P,+@==l=l=p=P=p==Ќ====c=c=.=.=<<<@<Y<X<(<*<;;H;D;uu@ͼͼ ` 12BBYY~ppઽൽpp''`\ =@ =r=r=@=@= =0=====`g=g=3=@3=<<<<j<j<=<<<<<;;jj^]¼@¼`++<;RRxx `` ऽЇsonic-visualiser-2.3~repack1.orig/samples/organ.wav0000644000175000017500000077545412252354725021251 0ustar miramiraRIFF$WAVEfmt "VDdata4K^t 'eX t|)PN?YH[qh!&;~<R& R As#!),[/F1Y3a5 641.X,*($ ) q:ޔּٓ ְֳRւ֫מ ݼj^k:Ay0Sev @`!'/:cE&OUYf\_bbd_0YRXNJE7> 4w(q"[ʸƏ-<ɾD`|Ҽ$ݾ.Ϯ 7l\Nwu4hHBנԮԕӕhԘE~;: "(/d7@LzZelLprlu*xwzr/ja[VPcG:;-3"UC՗‰̿0޸n`ďͮZ_wY0*։`jԨӞ۶ sRp2%4+2n9BN[ gm!qEsu^xwHri|a+[UO^F9:,/ ߏ4\;;DO']$GtR>_i pr,tv xvq hX_XRXL0C 7) > j>ȗ&xط'/},;b( q5[֩-9=! SZ!(k.3#:t@bHxS`jps-tuwovXpDgt^WQ0KB6(T %@3!н4»r; cqܗi\k0jYE'uڞڅݺHhpp <$+05;AIWT`.kpstu:wuomf]VPJ@4'1p H+ G`ӿϼqH>(QϹ[ђhFycp5ubO| \V߲f| ;#|&>-27=GCJU]ak(qss%uv!une\UOH?3&Pocagy9ŽW?}յܸ7ŇP&a#C: 'Yf܂Cܽ:F E w (E/s49>zD}KUak>qrpstv^tmd[TNG~>2%uOѠ$<"@H_TC ި{ 9WU؎ۊއ+`J a "*71C6";\@E:L/Vbl5qrrsG:n 19"*,27)<,@OD8HMVa4ko7po`pAq5ofh^UNHA8-d!TٴTɽһXڹm ?m ѽҟ-ۖݭ|{y5a %,339K=ADHMNViajnYon@opn,g]TM|G@7- { nي#Ŗ$Zر(mvoǃ[]ܐZfiwFJhJ&.+5d:F>AbEHMU`"j8ncnmnnleb\oSxL`Fu?6&,E4h`aO+ï9GS<ִ+~, dWVHr]og.!!(0|6s;?bBEH=MzUA`vi_mVmllmkd#[?RXKKEo>5X+8h3dF%T%8!Zr߮Ao ԃypBr(Cp6PD) Z#k*17^j ki2bXO%I1Cr<'4)rߺzħѹ@5.?D 6¤̜J׵ܶu6Ag` * "I'g-39=@ECEGKDS]f.jihhig`nWNH1B|;I30)t+`&ߟYābٷGl]D ;(?µˑF"%(Ae#$| n$(.4E:8>@HCExGJGR\`ehlh8g}gWhZf_>VMG9A:w2(ߊ8VUYl̲3ЭA+C1EFJ6Qt[/dggeff eV^UL FG@91'hpQu E)_h0,~@ɟ}҄վF3 ]L8 2\ W #'q+06I;> ABD#FIP5Zb`feeddec]SKE\?80U' %oDز߻R}v|v%֧`P/ȰεC1 G9|>q3 Y%(,1/7;>@B!DRE HNXa eAdb/c0d~b[RJD~>8M0&;/؉ΦÌ^S?~Ϧ2.3GK`$fkw.v{ G!'2*-r27;>@BkCaDFM{W/`cbxaab9aZQI9C=W7/R&<d\h)ivXjd~}OdӞ `D%-J#~(I+q.37;>:@vABQCE4LV^0bRa_L`na_YPH^B<6$/%b}޽22Ⱥz뷸̫zisσӁ~T) $)>,"/v3%8;@>?@A5BEDJT']`_r^^`^vXOGA-<5.{% /oEސzjZ Esۣmwc*xMӉP| >PP I \&* -/3+8;=??@AB+IR[_L^\p]^r]WWNF@;a5 .%T a? _ͫ$öcFBmlբchԤgIw-6ӱٳh kcN % k =?'+-038-;3=D>>??AGVQ Z]\[\]G\EVME@:4-$w *)׍Y¿!S,q̦f֡ffԣx~n<9wtNMB0&~> ]~s+ U(,=.S037:y<`==N>f> @ FOzX \F[ ZZF\-[AULEQ?<:?4-R$D |IKڥa۠t࢛ɶ\[`'2IcZ :u59c!M)9-.y03w7:;c<< ==>mDNVZYXOY["ZKTKQD>93,#y `s+݀̏ȸҴE㫺ȥɣcퟒԩ3žϟڴr6=0&~n mH|"(*-.w036[9:K;;;;34,#3 $X'֗ 4pz Ԧߤآo r2V¢;ԉۯ[_oN\ 5 <g#*1./N0"3_689 :B:M:9F; AJS|WVUVXXR;JB[=82+J# n4̴³ʳf7롄6Dޠ^Aʙϫ^C < y  y^*$n+..02578888w89G?HQUUUMTXUwWWQwI"B<8L2f+"H T`>a*EnR[QO]O%"B _  I $+../146k77y7Z767=,GJPdTSRTaVVPHwA-<71+"e iY˻fZ%B!Ş}(\ƒ˲3dP8}d75 3T $JjI%,../.13t5'61665W5W6;|ENRRQRZU-UPH@; 7q1*L" *w*⵺-M2)\DĜ2էq*לm [pL}%,s.#.V.M02@4444I434,:C-M{Q/QnPQgT_TQOvGP@;61;*!z Rʌ3ϰ^{E>zq4ěoZ”O;Ui&  DsV >Uu%#,4.--P/12l3L332#238)BKPO7OPnSSNF?:60)!j lYCӹw9֥[YnDTL`VToYqkmkq2jfs& ,--,<.m0111o110s16@JNNNOyRR NFF/? :520v)3!  Uٛ;b(Ϊow֝48w󧩵@~J Z]t~Hs:x %+k-N,+-(/J00<0//./45>HbM`MLNQRrME>9&5/) L dfiȐ۲M֭W`hHW*RQܕQY 8^/ qH ^ %+,}+*+-./.?.-W-$.3E=GL+LKMPTQL"E >84K/(c 0 (;Ѻ޻ n&HŜbě=7t ֨жň0^z, /lz+my T ~%*:,*)*_,^-y--,O,+,1;EJJJLOP>LD|=p8,4.&(m i5<׊ #YȬ?_|A&0uѮؔ?dZo Y( !4!E] %d*g+)R(*)*++l+**4*+S0,:-DlIIIKOPKD<73[.'iE0ދR_ȫ{*_3Ӛ8ٙ2l$34CV7p6 JRs"#!# !!$)|*u(''h)A*<*)]))().8B5HHHJ]NkO#KCֿ^ j P#&'&#!!sB# (v(&P$$L&'&&#&%%&,5E@EFFILMN-JB;c6+2,&;oDgqT$t9ۜ;* ש4" "#&()J(e$z9"!o"$'_'$"/#$r%V%$$p$$%%*4>DEE,H.LMIB:51I,%/=kӏ!tԤQ f0Ӥ~y٭[j 65c$E(*L+)% VL"!Xs!&<&n#[!!###A#"""#1)=3=CDDWGyKM#IAX:551+$IڊҶPRJɧӧF?"Zښ,{Hv0d X!&O*,,+&r! ="P!=y $% "p!5""!i!s!K!]"'1KnG?843.)"T?t3ƘQдQ 'w (v#+"(,/J10R.1)#e!9! ]W :J"$L.J9?AnA.DHJFE?7z2>.(!Af)!>ۤ4gN=[UL@@cCGJBF>71n-(2!l8A)\{4fT!š[0꤮C]tٻkq%!"&+"0232/-*#n-P r5`}K5H35! ,7=???B*GHIE=Z60,A'b  2[$YUȧF%ojwV/v Kĺʿ%-)M="#%(-1443s0|*#/,i"V*W  *6<`>>AcFHD@=50+`& O|4zŎBu %ݡ[~f!ޣw$%'*c/,3W55d40*}# 3%]R)4;=>@EG3D<4/*x% lJˤԻeɦ邏材<2d[?;x0 UO [3"3'%( )W,04l6641*@#OF`$Ie}(3:<0= @DGjC;3..)$& $p%ӯ[g~΢I"Rt/@ʶs $)C**-M25^7U7_5I1*"r`8%e9U'39;T<9?DEFB:2@-(#- 6IҟÇI/r()ɞЛ6ǡ%[ NWLB&+>,,w/36 875W1i*"/k6'  ;oM&29:l;[>,CEA: 2L,'"3SrWͮ fi84:ͥ(:uEQ)-.K.0478G85I1*!AM T :]"w9L%1489|:q=DBD A91H+&!: tݛȫ^lRɥ<+XӤMڲO ?  N+///15Q8E9851)R!dvZ G] )T$09789{0T($Q >%VJ M#m-111 3689850-) kLWG` ` x y ] k# /3678;f@BD?67. )$D\ϣƂ.aܥ(ꠥ[֮۲$g( 3%s/l32O2347o9985a0(^ _ D .   V ".'56}7:v?AI>46-(#A(.j 7ۭPrէۦRn^FD@Q=25,&"r;<I͌Ű٭袜˨3MɯlӼg/F S)265G4j5$899D842/' s t O d`{ <  k +34{5q8=@Yg:2)x#23~G {qwzФ@-3S@ﺒ-ʓhbC!-&71:o836m6y89962,&$O2Vf [dg#  I / (/1525":ҧu/$:^:yҰ2(&N14:<:6M67S857n4/) . nML#<  tF%i,O..16o96-$j`Uğ S)yW-lŞ4I1OH'42:!=?:6577a6v3.h(oc B Gpa5;2([ & V $=+--U0}5X84,#r˘P8?"Čk݊^C(2f;o=X:65v66q5o2-4'' A +T]2,B>x5 <" *+D,/K4K73v+"h[ %0 ĜĬ' |ּIQ6Г՞Y )3;=L:N6455j4N1,% 8Ndd9+SS8 !(**- 3(62O*s!AE u@iLqP@ƭ3Wa {ŢTB] _A!).49<=:5H444U30]+$Lo ,IrB8dg-- x 'I)),141$)C 8 G hץ 'ﺗۺ鹨0i 6+ P"[*4r<=9]534312.*}#8\7:5}LD$mr; '*&'@(5+03e0'8[ O)Hcf-RuSČ3ϦشV:x BC#*4<=i942321-(&"|(&NF'pq@t h$&&)G/t20/&DB ͙:ģDyٿ%Qº[e1P+% #*+4<[=83121/V,x' " -\2t&9SH(oj<; xb#'%|%o(-A1.%[ p (٭Σ{"`5ݻ|sĈ-3$W+4M<=L8#3000.+%&|9 htL)ZXI&h^0%"#$',0,$ "Vٙ+5R&CǴIJU_=YM o$\+4;}<762//V/C-)$'z h"X#.rJ%_N N""%a+.+r#E= /ڥUwKF#ʕdž#о6Yv,V n $:+4;;611...+_(y#0 &srG':U$X>j*bG 5!I$*-*e"  x@pÊz˟^}#'x%{d *>J>բ;tD|Qمۊ(A) #p(0660N*'&%#F 6X '(C\]z%p3:fxRI"&$ 1Dn  _vӈh8 u-=K.Hc` ["'/5~5/)%#%${"SE %9PsV0- u!(.".'  %`)J2k-?zvrE X! mGA N1>p('ߖXUPledB6'-,f&> ;~3Q|[~i}o GBx  &R&] b7f( ?9r,{{W9  {!wA% Pl,18u&:| ZKMp%$0V ZXD'mpAS&|N`Q  "}C~JQfN/`T/n M3$#/ !UpE+"TSfߊEC8$KKqU %^!"z)/ S DyiQVwH PX "m"r4n ?o^649cU<LY/F_- uT!#- (3D 4T#L| !C!^]7< yk0 8E ۊܜݽo[}z]"z$ 8 $! 1X:%ajRl]n\` n - U  %{ tX&mQcKc%#%!""xa"{#-#!#- afQ## ]c E&W#6W[ 9vCdغٝqTٟٖ3ߦG#&#X!$%%$! ks ? r"oK]f> 3 s#bCn [ F qWׁ`#MT٫(Ksق޲?5ep %'%!\! $&T(R(H'$y* D [I S b1J!j OEzkcp ^dC۰:݊6֯֔'Gޑ| B NC&d)&##T&_)***'^"}A !d A T5f  7 .| B(ڋ ۗ,9b֨!.<  I'*(%%(+{--,c**%3 6RTk2 4DO %6 3 +(VԏUT=dӰUէ PW4 c(,v*''+c.#0b0/(-'` UHp /   7QhLmlv I* J Uxӌ:g_IӠ ~Rڳ'I {Y*c.s,)P*-023F2/*#]ou  Fy[*WKNLT ? X  \Uܕ<דݱ~ӞOiל8LO  +-0.,,03o5552S-%w2 5 WN^V|$-&6 f ` n  )UnЅ#5ט@ϣϒ ѪfKۧ r"-20Y.&/2.6887V5/-(>!!b )T fmE]` ` L7 > z]p(6ށ ς+տڧ)UMϒuґՄب۳ $/4201L58:);[:7~2*#-#R    +63k6*u/ B 8 = s:VLMһbX>ΊεΓϜ؄Ub%196 5)3?47;q==<}:4,%! _ Ln JnhUps * 7}[ia̼rȨͪk}=C  '3r8]756:8>@g@z?u޴ڕբΓ ʹeJ/ȣ,ϼӞ17 oa+7<<:=>BFGGFCr=4,h'"  hTY Ku !  Zc/pg[˞;͚ғғ͊5`ρ׫H!/ CgC.BCGKLKLJGA8/)$ ; '|E 1#  px Y:<ȰFR'Q6[TӶ 9N "%3@]FEDzFaJMNmNLYIB90*u%" i  ] U! / bxE-_ tI_đl/ D\B8 H'G6JCHcHJG ILPQvPNJ'D: 2+&^ g  N  !)![m^Wv :M -d@` ؍ǚ͠Ȁn -ρߗ v)8EXKJIKLOAR(S^RQPyLpE;2b,y&~Y j{ ||BkdDk *OGoN]J!̀fRu̒DZ¥ƴFst+:HMNM1LMQpT#U(TQMF<3,&K l []k+&* c|YoAZpۼмNJ˘V[Ĵ}%YPPp!-c=yJ$PONQPSVWU]S'OG=4k-'t N  ~=HߛIGS>  Njfj/EZڐԺZɔx-ʒ?K0ĸvО܄ 0|}#,0?LRRPR$VXXWWTNPH>5-#'H J ? v,?F_3O o`%@mbw9 ZɠɆž#H[*э - &2:B]OTvT?ST>XxZtZXUSQ{I>?5.'j  W q";߸4ޜC 0 `vS"L9<ͪѹ'b{6#ǿљS߉qF b(4DQPWVUV?ZD\\ZV"R*J?5).&u M m=[L4j@;V q f"K.p?6 cœMm+znċTٵ'L^!*=7F0TYXWY\]g]6[WRJ@6,.&'A tJ܎ܡWߨNA gOd*)Ngƈ ˵ /32$,99I]V[[YZ]e_^:\XcSKN@#6.m& 9'1d'mF  nT ξ=I˻Il+Dl& /;sKX]][\`_`_]KYSCKl@6-&@-0V݇@eZ޴?mec I '3Cfa͜&EEƭ.HŗЕet2A| (@1=MZ__E]K^`a`]YT\Kg@5-%Dc #G߈ܿx\G}< W%R2/(kҽ̌Ǻи"oƧj ƃihO<"*3@O\a`^_-bca|^:ZJTVKA@52-%q#pL߽ٸ٧2j)$LZ u8JkDѿˌƮҷ aiBnǎ2}}h %-5QBQ^cxb`8ahcdYb^ZgT:K@p5,^$l z*EBؗssC,|H_yy&ٸʛŵc6?H,|ȸ̅w, R'K/7pDS`\e dabddba_ZTT K?5:,#\ c8ڌTY rudIiSɿֽ5j-fcŚэܝ R)r19rFUxb g|e@ccseexc_Z'TJ9?4+"F }ת׻׈ۜbRn+yi Q"߳DHīĸhz5ؗzV +3;dHWdhfiddCfEfc_ZS7J>3*"8 }w|+(:/ ؝8)a*eyODJ9U/mǁş@+qbG"-5=H3H*D!$ tNzckT߁?؏]ր։;6A_l%&͔Nj± 4l3ē>ƟŁȚ~YZ<%'07?KZfj iRfKfgg6d_-ZRIh=2)j  ]@tڬsArh}{b['֯NU"ǹ$+ԞةM_A@ 'H29AMw\&hligfgCg2d_YiRSH<1(=,d"\-\p0XՃc 4\w{ffG $ӣ^~MEiGՀښIl} N)[4y;[FQ `aknlhgqh:gc@^W$PE:K/&Hs߲؏{ӰئK:D! rRAŹ1':hOFۚl*q" 0:@GSalHonlhh[hfc]1W9OD9[.#%oO3!h[?mEӁԍ(8^!$1 v߉gŤ7IkԴ澪@4H[ +$1;BI+Talolih*hfb\^VGNC!8f-1$[_!fxyמԾW҆؜w2"zū^۰ȿR&[P0 ;&3n=xC$JUbmoliggfa,\xUIMB7n,:#s K\d oێ&>fӇ :0 e  U9xI\DʫaЦ'C4Nb 7(5>D2%ͤӌ^+8AFMEW:dmol~hfuf%d}_`Y^RI\?3k)N c 1S yPPҷЌ;"XzRI2]X{tCu OԼդג7\ -\:BGMWidmo%lh[feZc^WX?QH%>2a(Wh 5~MQ"K,ji ՔLCbX1n I-Dܞ^>Һƶ֯ތpc pe!/;CH2NXwdmoklgedmb]@WPG<1R'ayUd.>ܚكљι@FCJO&Xcblmiec+bo__ZS}LCC9-.Q$!"Fۡ`mͬmHғޥc޷lK{=Ad3aۼ̔ɪƌ̯׽ߛf9# '4?FJ4OXcklh+db"aY^>YRCKB8-`#J!3"EAYݍG:˜wѼݢZݜ5EmNvS|֤̮§oΚ3tZ> 4(4Z@;GJ1OWbkkg2ca `?]XQ JXA6,o"ua}yUOq/׊bϏ#@̕ ܢ[zܚph߼ۆaS~WUVНqIKl))5@GJOVWKbIjkf"b_^"\VOPH@5*!?EV^˩0ۣTtm}Jb!97!4Uһ/9r )Y68AGJNVaFije`^]ZUOG>4) J9*}uח3v CڢGgW~.!:.AЫr"ŠcLU IK, *6xAGJAN)V`.hhrd_]v\YTMfF=k3(KV@Tڤҡfʠ ȇ"Wٝ;bTެL g3ݖ:Ԛ=Τ$ħ~}qھ ,Bʁv^`Ԇ&Xf%9)(uIٙ&ԞHմqU\l 0eqcq"7,A7{@MEFIpPYq``(\WUT5RkMG?7!-b#7 0-mӃ΃ɡjljӈ5Ӈӥ%t+I)5۹XIѫJ7ojl H/_",6?xDEH;OzX^_ZMVcTsSPMLE>61,"@Y ,wdIQW4_ٛȽYnҙSҾp-xy{Qݖܙ@ԣ@LsZO o &842"+b6(?CDKGM WT]j]!YT S2RO7KD=!5Q+! #! 3*οEt̊Ѻ{@YWJ[x>%ڟ[{ab. 7Ld!/+5^>BCFLU[[WiSQPN%JCў9{OM {F$!rHb٭B߹x= *vT!*5=ABD0K(TAZ;ZVQZPOM"IC;h3)k  KV7ۧкeÈʩϋt_\]ߍ-ۊD >d )243k;/?@+B[HQ&WWS-OMWMvKBGFA(:1"((jqQsL:Rbo;ʽ2vZόz)!I[V]}$NC~O ~T E(923:=>@FOnU|UzQM|L,LiJbFy@d90k'u<s<߃ٟըҫp>]&͢nIH,~Y{76=OT e@}7J'"18\GSDH$ /$Q{5&/7 ;;=CbL R4R~NKJIqHD>7/&RA(?dS,/+Y׹6ڹ)1Ƹw͐ά6y&{x`>87 'a' yU>m]%.O69q:e<_BJPPMIHHGC0>G7.v%.k\sUZkjSKnݸ%ظIs̴`ήu).|&Jd!G+} x ]c#r-4:88:@UIOOKuHGGFC{=6J.$&B GJ ܎֢ҙυ%m)۷wĄʇoGOWD4~SBadJy%| Tm^",36g7n9j?GMM+J5GFFEEB<5-,$IaM(3۾άTŘ<7 .SRչ\@R}IlPwe0 W  +hm1!* 21557=CFKLHEEEDA.<[5,#E $A5{\ɂž˹X0 ëM̗rGhI` qzF6"  % 7)()u03E4j6z9B |\V %7M7?I'.124::CH IE}C`CDLC5@:,4+["? (4 xG"VWC3)kδ@˕dϦ -RIj[7D  5tD&D-X01E3y9AQGGDFBXB6CB?`:38+!Nt CmgF΍2wq3'eפWJq-m'4P6 2 b $f;n2L.$+./17Q@E3F\C$AYA^BA>93*1!4 5=߬*8jѫ}ǻĶX+~!G͏AآH;0HIeR ss "*--Z06>wDD"B@f@AAM>>92* ']  aFN֎**l̰/s=k\F/u#p < H \ j9|TC  + &I!w(z+g,.-5=C}C@ ?~?@m@=81x) YPߪ_կ 1P1aٲǹ€̍?f 2~. O o x | 8f  C W&)*u-3??= 8^1(N|5 Z.'@cޮl=uȣĖtr`[ӟw: hx< ;   R  4 Z  #%D(H)+l2:c@@><=/??<70D(@ +at݁ݼـpӹ m'OЍ2D UU d W NJ  J ` HI T#&'*1u9??]=;r>; 7?0'C NޗۭܩؘͪrÊFŰrW}ޣZ 5t N 8 ?  U F!%C&)/28=x>E<:;==d;6/'kx'׶@|¸gS<PTv 0  "Kox *7( D 2 _  N #$'v.6"!'nB4 50 W(y*;I")f2887O670::i8~3,#B jlrs̓'4!aO8Vٺl@PT Q=\#$#=!F{ ('3 .%qRmJ#I!(M1676e5%7t9972+#|5 "#52֔֝ҹM9uEZ|ɫww "%'!&2# ?Fgdb6M]DX ':0565v4Q68@97;2:+B"Fd _^1}u3 bũo.Դٳ% OhY$T(Z)@(% a.[/.';V[@v&2/45 43z578a61*!w d׶n dČO.|-Ռ۳ $~s R  !'*+K*&=";hZG0m*vg zGP'h%3.34 32417750)  ?ӧXolƊ{@iεvo}w?w| :k[#)--=,(#+thRXtG\B!)/0..0342-|&SJ  Lѹ8 JC% y·iȮ` c$,2z5d52R.R(p# Efr=+P'..] .@ (./--/231,%x8[ /~@MdQAGrēv Oɠփa OS B'.4S77S4s/-)# )P0O$\DT  >(-|.,,/120,$Oh>!۰ЎͩQŸ7x˧ز j"n)06985y0)i$)! MLYCc&&L^g D',}-++. 12 0 +#dsOq[eЛa͚rŲG6£'}'2< $+2G8:96]1*$X=h9A3+%  S ~D%`TN k"(n)'l'),6.~,'M  V>2@ub{ɃS%Fė;HHUN#'x),29A>?4>:3+$R 6Dt VX ~2L\}B  p!'X(&F&(+5-+&`$ s ϗ3иɛ]G8ơ6I͋A)"%)m+.W4:~?@>z:3+$j~ x.(tf -r &D'%&%'*4,*%r6 :m u׽υ:Kfb^ɋq̬@dɐڲE '+G-)05<@A?:3+-$6z?ʪNs͊J<Դߥu#+/02'8">)BCu@-;3*"#PM[`4~kfgGSF d}x#$:"!#$'2)'"{3D/rϭwQϋsΦ·к#*LG %-O1*2>4,9>BqC@0;3*q"y%JX7 5D/q40k }N"" ! "r&#(&!ezwOցEҹ}j΋nӃF =٩ '/23h5:?VCC@;33)!Gcn,f t }#!!X!U%'%!HҝSkիՒ~}z.0oa !L)1j44o6:U@CC@:2?) E%:h2-a7j |v w  6$&$' $>~2zѣӥ@ϑ1ՀI޴ Fh!+B355Q7;@D D@e:'2(r VJao s~ f`tk#$#9)6219ץsDҥoO(ש8"/$.eQUM6܆J0ف}1 Q 8   ^p;Nl֞٣)(,,"Fl5" *739:99<@bCB+>%7/.#d S'ߛ)=ؔiv5 xbcj,k C5_Ӽ#]SMOM#+R4k:;:9<@BAe=76%-")*Q z55"3۾' ޕ=M-׫OR i>2-KHV vrHTڂA&3ܒ߆fKzf2= h%,B51;<]:9\<>@hBAA<<5,! 9WޏڍܕXcA51ig 1x N6tML Ae^۹֧֭ڈ"I%$ !&-6;<:9;?A@;54*[ gu rk ߢRmb۝v\ $E8K(+ g=lt#Sg*BsDez> s#'.69<<~:j9;?@?:#3)%K 8Cz4WIکܑٜv z *)fg e'aٹPKBq^n5N$! k$)/s7<@>92( k۬d!E<ټ,ۮؼՎݯDP~ %EC "%h)t< u0b$Fq-2 #'+18&=2l* ( _]1}N_`D[351OP0r8! '>cC @?b/V2dF1|F (!H'*0-92k8!<:63f468/60) ߁ZwՋmzLLM`[ &̱4Zq_  =NB P8S/T}PN!p"'\*G-28;0:52+3564/'Q} ޓցӞԹՑӕefgkb ˓GG<  I ,qd 5P.1KBM=N&##(*=-17;_9411b4k5k3.Z&M>YݧխԽұ~{уrd h̖Ӳ2  " L% 0fuuun% %r #\(*-187`:}83[0034 2,%w7ܼ !͒%͍А wc?^tܬg=G# 5&3|xF^K& ; x X#x([*,16972/X/120T+#gLa"P]̠6̟Ϛv]("4ev ^n5v} JMdc' |b  C f$p(*H,0586h1--L0N1H/)T"%'O@МѧP̣?˭Ο lP"S%(N& 0 o;E. s y ,'$>()+/57q5'0d,,./-(!j I y~*˳Eʴ͝^>ƪή{ ?],y `: sE2QH{ Xk K k$'8)+!/I46D4.*&+t-k.l,='B pO-]<5ѰJKɼ̛H)ȮŀIJƑj׍2_ g  . 33 vN 8;v #'(c*M.f35 3-)),-*%y& fYK %ؚ%ΛϏg]˜+ǒQ}X(ݢI?H KOm2 D < P   P k^ol#t& '(v,|130*&&O)I*@(/#I f.VeP5d̖dƾɄ˧U ɬӸd&'`k_ :lt > r ^J9BNm7"%B&'{+h02Q/p)\%|%'(&!3 pKy5̭s΃˞_ŮeʄƩ2u|*3*A8] -S_D $c9 {PkY2`{sYP"$K%&r*K/@1.(#$&'% ,pkoͻͪʮSĞH\țń {FOKvb 1AD(  Z  nCi^ :u&s!$A$%Z)*./,&t""-%H&p$30 Ծr ɼAÌ(.lY߾T1o  Y w[R:  SF9Cyrb "#1#f$4(-.B+ % I!#%0#wERPKH`-~ 7+]h*BM"q \W !K! #-% 7 K VuIlV """:#'+-)#"#!Sb~T݅_ˆ@˵ ˿ n*<VLg$ M!v#"#!Y+h_ Yq`; <)3 ! "%*A,(M"-`!" ? ]aܾѬȝAPĠҽa¾/eK ZO:#.%%1#}@>dkzGi !lTmB $)+*' N, s!4 D5_ƻ.¥rž?Fߕe $&'e%!7{w!o C{!"m I.5Iq\#?()%yw Y 3 iRɒIilŦv;h"ַ ڛ#5A*!k&(<)'Z$p! y! rPN#L"#,v"9# x u  "&j(q$;< \;EVDƟȡyė^żH3[ET#-2B"0(*g+*&#b#$!#if!f% $D _7 <##!!{r t %'" W;L fْΕ(zÈ@Ҿž:鶧'ɑҧv݂nw69 U}$*,-j,8)w&%&%!=#F'%!u!#2$R!G p '.np$%!9dlxv yD~N~p(Ӻе%fKO dV&,./.+)(]):(#z %)$'"` !n$y$_!] ( &v[8#s$D E*0 EĠBƄS`ƽ[UAюו'.;{ 05(.,1H2E1?.+6++*%^ "'*z(#%!"$$E! D ' : a"=#5I9b(.Hwł,޶@q)v ǷD{U  !*+0m3430*.-.>-@(" &$)Y,)$!#-%$!?! J   "Z@qJ)]3~l&Łr%JrYDz5⻏D!/i m"!,I25%7E6N30e0%1/|*$" &+-*|%w"h#_%$ :cs' 7 j%Q fO4N+]pKʣïdĒ[η&E׸CرذB!φq~Wv ($8.{48985I3232,&$'H-#/+!&"#w%r$W   (;-r/c{=_@zɷëHP %4 ߲˺i%)S, b 3&h06q:!=:H87l860A* (9+0Q1%-&b##$%#31 > kT5:_\ A' S,m/[9'Taŗoևz ; T+4z;\?,Ag@X=:Z::82+),V1$2-)'m##$(#zZ XA  *|&cL o^7^i5쵊OYHٹOŘϗ{ !P-P7=ACB?#=<<:N4-+.r22.M'R#{#b$"mS a Y& 2 " CU{美 ޮҳq[ްXſM5R 3n3#/9`@fDCFgE?B??)?<5/g,2/t33P.Z'##'##!k [G 9 K o 6'{ fw' 8J/pĈڷ᰾زc|H%h RVa%17Z0-J0\44y.D'""Y#!\i< 0 $!r+ | };$~ÞD۾߱ױM㬢cװks5h'O4>BEfIZKSJFD]C.C@81.L154.'"?""9 D Rf Q w  o [ D<Z 4}Aڃ¦s(8ŭxa~$`؆F%6#)6@GKML6IFFmEEA;:2//254p.&#"!!RW Ae  "/ j Y XI 6.}dكɻ: ~| RHU$29Ɖkk   M,89vC:J`N;P ObKTHbGFCd;302764D.I&! !K 9 Gt)T q 'tW؆Ժz(opF#F lj>}1x  jQ 5{ 8\h骊Ŭګ)5~< 'G%1>eH%O=STrSO)LJIEU=51464|-% Y-b:|Y] J Ci ` l+C^߱j&XݺSQcͧ)ѭLe]gۤ5 '3@JQU?WUqQMLbKF>5c2474,f$Ek1vL=|A@x s  B5 jyޮR̽0]N`q,+𱬼B_")6 C)624?7`4X,#gm y <\}'  62 { D$ݰ>ȥ3ǷJsSb̨>ŭS:(+q+ $1,}8EO4V/Z[Y UDQOMHM?635774+"{c@"N s8  6 X# c NmLܪ$ǬA ^Y5ԭ嬪̭)lxh#&.:HRzX[\]l[VRPNRI?6H3#573*!xG~ =O? m vjU  ' {ۧƨoUڷz\ )q{ !C%()1x=zJ`TZs^_]'XTROI?6L3562) ^0N|Eo4  U d n $3۪Ġ?)?aNN51/E[. g#v'i+~3?LV\r`ca^YLU"SPIJ@6-34Z6'2(2 COX1z  0 K^1ڭÝӳ<ݫ]+2ZxN ]м? %)-5SBOX^Vbc!`ZjVTLQJ@6245S1'li cM7[RD( !`s p +eAٞϱ”WݵO4׭ Qݎ['+/78D[QZ`#ddra[sWTQJ@o62j4V5u0&Ii/A ?.$V&i   N\~ M Do S؉Α17˱n-IɭQ>5FůH ).&2|:FS\befb\TXU\RJ?6n234/%  ,`MY v  2_xg~͂p_&өgv) sͺUz;#-,90j4<7IU^gdZggc]Y,VRJ?52|34.z$Tu,o7 _0^  `y|,}tzGEqg´h![ןS%i.a26 ?cKW`fhhd^YVRJ?)51203-4#}  9[/)n   J|Mܛlnɳ #˨]Q!Ey-$Aق '0{48:AxMYdbgji{e-_%ZVR[Jz>z40G2L2Q,!, x[+}.o 3 #- pxhAka{ZaТkgiԿ9mr-*26:MCrO_[dhGkj"f_{Z&WRI=3-01e1+ `MF %/ }2"9 = n d:(#Yxgv_`6 <ȰoIƵ;Z0 h,48&G S^fekRmlgG`Z:WFRH^<<2./e/(7 iHqh` Oh޹uȰbAʰòմϸm%te!08[<@HT_gbl%nl^gc`ZWQ(Hw;W1-/e.Q'ar P WtI|OAfX4іƠ˯CyѢ2tm[մH!$"3:)>FBJ=VCaiCmn*mgZ`ZViQhGz:W0,(.Q-&H(  J4RHO"qK*N(nV>9l'Fβ9'Rɛ~U&O5}AEMXcjnomqg_.ZUP}EB8*.*%,*<#~ y0S @ IGyJk?N4{+3@14g*I9R@BFOZ{dkNopm2g_YpU=OjD7,) +)! LA=JXP_ek33gA aΈڶ4ϲۤ)@L(6Іޫ >,$;A^D9HGP'[@e?loSpzmf_(YTgNPC5+(*l(u 2 oU &$DQKJ8sԻL./VULd*:i `.DFJVR\mfm.pnpme]WGSL@Y3)&'&uO jc?Xr kYXjveӫToj۩^K߾5ŐǣחyG'} 25@EHK1S|]f;m9p;pl?e]W`RpK?1;(%&$bOj_D]e1jt+ :NvVଡ଼Y-s<#Ǧne m"4A3GHqLS ^+gUm#pold=\,VkQJJZ>0&S$%{#@u-jE@J+Cf_ת ,0fWi߱XܩԾO=ɽbqO$U63CEHI8MTr^^gVmoofkcE[;UmPI< /%-#f$'"_8?/e Z~jU~m]:'Lf8;]iSB-7` &7VD2IJM,U^fgAmoojbEZ>ThOG;-!$ "Q# J u}>'QM߹':e|m~ܒ#ҡϯ Iijj-ƊroՄ `Cx `'\9hEIKRNU^Pgl\onia:Y0S[NF:=," J" cQ!j9rj>i?\g Y7<х˷#Oʯ'?ȷ̠(Ҩw )J):jFJKNU^glnmh`XRHMuE8*!K! fp]ݯ*M~JN-K?RтQx0nqY}*n,mhq_VPL7DA7\)t D  r iP-k CQ,1[9QBѕnV`M ¤A.ԇA~ F&,7=H|K*L'O V^kfkmGlf6^UOJB5'57zep~2D@RܨX^T& +^ڸ2˹+*9 Ľtn3֯}D6 Tg-:>HKHL6OU^ejlQke\cTNIuAM4a&/PAQ[Ej~m0W\xcwD?յ<̯Ѫfګ d . ?XI LIL"OU^`e+jkIjd[ SQMhH@2$&36Nenێ_/Ks թґiAӻY=#ד6m91#~/?I#L.LNU]d^ij/iFc>ZQ L%G>W1#;}8W AaQ5`h {*:y[gPP5%ڹ Pf : [0N@I LKN#U]cqhi haXaPJEV=/." l"DJAh?ڍW]*pwQ1o֌ӑ)<(ԿJ78!ƃ͑|`&TKs Kc!1@IKK5NTS\bjghf`jWO~IDvANCdy#2AIJJmLRY_c:ebV\RJE@7D*n$ (ayq:^ޙ܎f0dDDmktiƾ#ZǺ^ς֌|(#2yAFII7IKQX^bcaZoQSILD?6(. r*x|ٕދݢۼޔ\`**I-Qaܦ=/&dȄ7Dް.:8$,!$2GAH[5'azL _2_#ݼݤݼhPHU ݘrӀɠoʯLJȩu1FY 7$2@H`HMGIOmV0\#`Ia^W}NFA$=%4c&Fy4)3\68f&#ܜt{R=ZZݤں&t"Ɖ L.&4u A!2$2@WGmGLFHN6UZ^_U]aVMqgWBȰ 03r{M 3k.x o!;$2+@FhF>E|GWMSwYP]|^[TKCR?:1$% NxӮևق1A  ܗͤBm;db΄^ۧbL^ q$J2?ESEDSFLRX[]vZwSJB >90"+sq$ܤռ{&`4< .?F]f/٫τfơ:}֡ӵ'ףf@E #1>D"DB EJEQVwZ[XQH?A<8/!24^7?fgg!&7ؔ4ٝBK &qekɐ΢@T30  Y#:1>CBfACwIO>U Y7ZWP=G?;v7o. Sw >pJ ;!dc?\ ׬r[H XNAN+[O'D՘7d0 /`!"0 =qBoA?CBHmNSWX,VOE>:m6Y-!  w!QG(ӥЮӄzӻA OhZcX ;]yYڂ. "#q`&"/<A?Z>@FLDR*VzWTMD=9u5S,L jV8 J|N(lHҮן֠d E S#-WO4ߗܵ"J@rRW!.;?i><2;=CIIO6ST*RJA=;73n* r i K 5B߷w9nֿЉ}6R\Hgh=/ڥ8gsߎ1DfZbQIn-8<-;9<"BHMQESPI@%:62n), h lB"V֢bͭ73ߴJm cxEvpJDJNnw|,7m;97:@FNLYPQxOgHw?951r( @ :_ΙrRj5ԐOx ;/= =X}tj"'f*697-68?sEJNP*N#GR> 840'+  &z !'5Ϻ~кζ)ggK?*'E0hU}hwWSr ]3g~)4086h407p=C]IMOOLE?=73/& C : kuT?^-SL3.ˁ ]Ӳ CFHiJ^HA9930,^# c J fhPG̟='c5(,D+UqwaPu5\= . / J "-/-+.5I?G@=820+x"$ q J(>.NɴK˂ϗ0R˞1c j ~O~R}U35\6i ?!`+-2+)C-/4/;AE H*Fw?R72M/+!7r l B H(klϨ5Φ˫hݪ`xDC~~G&b9\>D  b )+Q) (+29?DG$Ez>w6?1.a* r A8& GY֯ȷVʈt,ʽѥ|b '@:E%lV\e3coz'-*~'4&)41j8}>qCF-D=50-)QY^ DrfJ|b9 ʡ݃GVT z_nP?0h}P(4hvY&](%$[(/7>=HBEFC<4/G- )8 #WHʼnɘ͎bʁ V"w, ` O*Q=$%J}r $&#"&Z.5<-ACdB;4-/,K(y$!nCnڣԣ'\9<(kKdYh2/ {K E_&1o.&.g6S{PI O#$"4!R%,4:@BgA:23.,'Xw<$T.y@")N ̮kʙa bu  X  s 0lk.d/aTQ u!#O #+E39? Bz@:b2-d+&Hbze=oߙ\{JŮ̯ɪ` 1 o Wm- OUf)V!W">* 28>A?%910-*(&8G|Ċıȴ̊ˣPn o{p(eAtYUj~> (07#=;@>K80,>*}%BE2kʙjĤȲ~hXԺ;2z A#m'RP l b$jkp:-3x'/60=6/c+ )8$ h >r߼ ڷ"|?ĭȨ̖\\՚7J *"{/ oE)0C4tP@%-4N:=8<5.*r(r# bd]n܀5֣ɷ<̴ְ̬  =; !kVy / W=!D1@Uf.k>Q$m,3p9Xi_9Ⱥ3`e,͠}< Hjf$)*&"!" ( ] I0;KjL iMW(/<6981T+'%xn۫}׉1xͽiWA &8,,($3$$!\L  1 .Q,b)>f'/r59f7#1*9'$J?E&GuQ:U j˞NEZp +!>)./5+!'Q&&o#CS  W)R 4 Um`= vs&G.4586h0)&I$(1#qG95;P|"dЧߕ#+0d1b-H)\((%^e - }2ag( $G O m%y-3r75/C)&#IVy3eܴ0 q'CюqgMa:\% ._33y/Z+\*_*&!SX V} _iMb[4A2 * j$,8365.(g%#jfA=)eژ@.ϼ_@ҏ=W,` 1(b0551Q-<,+'#! >ym8 oLrߧ("Q m  e#+26Q4.'$x"8yeݰ$zij YӧӂӖ9  S *277y32/.-)  W J ;JFߛXq g b"+1Y53f-@'0$! y,H nk֣ϚЌ/ڬ2 3#,4 :9`50/.%*N%f 3q2}\PܘR=l>f "T*!142,&#N!N#8l!)!ʍCѱ 0ېq%/87,<;,7281E0+g yb I4&z#)*q-!)d0 4-2+%# ,M "۽{\@՜жd̊Vגׂy< W 'R1q9E>=89421+ B E 6pB_ٹެ{=߅G Q (/E3x1%+:%d" gL PMں٠جױ)wN9Uؼ3i e E)3;P@?:5 42,V!Z}LBVߓZD7޳/Z v'.~20c*$!a{ LjHtLp 6[kʄc8ھ` 5 }!,5=IBUA<37J53s-!tfLB2)5>ۭT,p  ,,'$.1/)#-! -z1+l&ه֓Tʹ[xi  g #%.7?!DB=8p64.!o:B8Dn%ۦډKh D`&f-0/(2# /* # < x+ڇُk` ͅџ]:!' D%:09AED>9w7?5O.!@C ;97+.)  _ e. <.@ֿЕʣ=̣Ѹ+>EbpS 'H+c)#JSfC z8 ކW3؍[=[i(=")38;7-2C  1 7Nu\ٞ׵@=] ˆ{҉!3z l&z*("8F#oEO0@ޔߏVaق{9? %? B$+'59>FLOjLHE?M;6-)@  U!G64 xNK(, %)'?"}#{rQm߻ާۀܥEKGEUM""*&-6?GM3PLE?A;6o,/:B6L8֗a̧p,ή&D %('!&aHl')VBHt݂ykasB !O$$'>/8@HNP ME?;-6+9 {X'Kݲ֬Tcp̎ *` .$ ([& yFzS9Jekߑ  #9&v&)0u9AuISO1QVME ?:5*+ .\H.:)ӕ΢!a μl1*8y T#-'%E $-[v*he'H2s]X %(I(I+F2:B2JOQjME>x:,5* GG1Yگַӯ%yHY̍GD& [~"Z&$<E=3OLbl8Ur%')*,3;CJ;PQhMxE>9h4+)b Nmgt7;=ƚXiT! w!%$52}q[0Tc e5!)++c.4m93(:8 ݊cʱwbW^14 $V#n0 D66re o%5L#n+@-(-/6=EKPQLD=82&=~/pR)kkswue }Jh?=Y $$"mS]4MB'.{UR$'-..07i>EKPdQL7D< 81%6F;!4>RĽC¥B w2f^Fn# "w/< QG!]S. 0:"z J&.B0/27?ELPQLCG<=70$vIw9}ӿʃBܼl?#̉L~ {"r!4dR(e&y8c /Q(01038?FLnPPlKB;X6/E#7 90rw˓E5D2˕)i? ! +Z}_T1p " )12"23R9?7FKP6PJB:^5.!@~6;X17Sǘ̿,ſ C 8ʙ9Ef 4!6 %g9x+VO/u+23)349)@>FKOOI;A9S4p- #!aջcì,8!L4ɞHs O? Db#DDUNvw.  I^ -&4 54r5E:V@(FfKNNI=@843%,9 |f#[Jӌš=š.C/oBc*ȦP2@ 1/Qx2Xlj.M!^n   Y.O5546:`@EJRNMH%?7 2* HۮeͦɩĂ Guody+DZz\] uB(%`'.Rk,J Y"z/L66n5y6:M@EjJMLF>j60|)6q ("=62ڃG̊ȑŨf f‹1Iƺ pK'E\3XbO( xByIg0L  ],#07756:!@8EILKE<=5/&(zy^2zǂėO FCa H]SE%85Y?sQ/B$17 8R66:?DIKJD;3S.&5FJWP&szÌ>EUzLoߠu.n \<nQv\O G4 }&d2o8{867:s?D#HJI?CF:2,r%voJL%sz‡4뼒ļMqެq7FXU@ 2(o iV\n @ 5%&'238867i:>XC/GIHHA8P1+#>uxL.{ā.仠ܳ;ۻFp ݢL8>b { rtQC;/f0yX'3h9 966 :_>B*F@HFw@r7/'*e"xNn}`dS>ǏÓ2ຫ;,YJlܝ?(ObLcU / } On ?l CDd(]49$9669=AEFXE>5.( Tb\Ʈ°7㹻EBo~ lf ۡIL n,3Z82H s NH o EQ)4996Z69<@CECb=|4-U'md!d@MwʁؾFմ|ӷ#ڱ1qT$( 2 ia} UVW ^)498R65g8VAB@6:t1&*x$xg_fsлKG hܯ#]#J6ߊ(m 4;*?k q Z . = D3'p*4n9E8^546%:_=?)A?8/(#2 ]:]ِ"Ê>gKP0v 8 k W p j p I M*4974359!<>?r=6N.='! `(_ص8lӾɻq&.!v!a»4 {WuL 50 @\ .h!"c!*48&74347:==;:5,%/ 56 'ZM+l}Ƽ#5GWܮ.<ɺC"355H0 dR!Y!_ F<dS2C#d"O *V4%8u6?3236}9;<<93+N$ ߁ Ϳ{aڷصCam߷_й,aMzߦ}.! w""c" :!8nea1\$6# F*375P212t5!8 ::.81)"hnq^ޚ4eؼW{ūf ƲNƑӃ !% ?q #$% BC&EI!X%# )8364J1/x1 46~88r60(l! W6ݶwPÿ7 WsfH>~ ަa%= 0! %w%Tr! ~">&p$)25300.402356374k.{& ?Ӽʫ!bA$;w|ڇ:D>j q #s&&A!wn!#^!1k34AX#'$)142 /-.\13@5{52,$tF# ÆҴ`H4~*4e\7n \R !V$'("XA#%#B p M! F$'O%?J{(03{1-A,-/,233E1+o#J)ZsvIG(Dib۪iqů8bҮ@~йzu.87#!"%)M*$I}%(%" ^!"""""<"r O%^(%:'"02;0,*%,{.011{/y)!?eQ "gUцbҹqN 7o<!Qr"#,'2+,&I"'=*1($g##k$$$$#"!zp!%(%>U&/v1.%+)*,/L060-'m  Zc%1s؂&μ>ѵƯϬߦZ>χאvayam #9%(,.(UtE"*,{*V'%&&&&&$."a 7"&(%&-'0~-)(@)z+-..+'&Q~ bsEJۋױ ǃ91ر3FձDi3 F $&P*./*e!C$M,.,)((d(((@(|'%"#%!"& )%u+%,.,5(&')+ -,E*$c ކkqڮc濬KI9HU9Αگ22<!!=%'+u01,~#r&.1 /+}****)('#!_#K')S%}$R+7-x*&%A&l(_*d+#+("2M םتθR!\1 _qצP~뫸Y.֑ژ]V;"l&`)-[23.%S!-)0F3M1;.,,-,j+*'$r"#') %")+( %}#$&()x)&r!, W þTYr ̯J*9Yڙޠ^'#'*p/R450'!#+3s5~3p0.//I.,+(J%"$'($!(*6'v#!,#Y%@'*('a%uy *UFԑ^- p0f"Uvn2ڨWM$),L1_672C*i$%-Y5752110/4.,p)%9#G$'("$9=c %'{(%!` !#%&0&#q"XXۙQ;xˬÔ4B`6w'Q%t*<.:3|8":85,&}(E079741332z1h/,)&`#M$c'P(#[9%&#"  W"?$%$+";(%Ԛq֝Ux̩YƢ1Ʃ*©5Ҿ8 &+/.5:v<7.I)*2:<96;54l420-n*?&a#.$''"c#%!e- "## ## Ne Զ58\mȴtiT/t?n JX GL ](-1/7<>9G1+y-5M<7>;8*766?41_.*T&>##&'![`%;"9#- dV!*"!3.eE ~5yJjɋ:E($Ш$ذo˺#ڪ k@ !)+/399>@,<3#./r7u>F@=:8|87x5d2.*L&##1&f& L a!T : >!k :ҬN6Р'\]Yڞ hgڨQMn #J+0m5N;AC}>60T29@:B?u<::86%3C/*!&"#%%$f{(X*ar*  R pӪs#ն0Ң=f|@Aԅڔe~$,2\7l=hCtE@w824J<;":73/*%X""$$!rGI)W8 equҵ lN̥rBpܪOsC"zyD&.[4S9?EG>C:e57]>DE+C?=D<94/*$!!##"?P 9Em )8X5Bsj𽺸4gM[ڜ웙:]?|(fճۏx<i)2 8]=CXJL H?O:;BHvI@FBq@F?/=94/#*?$H 8 #"!7 -XI}oa pO5гE̙)ڬFx=NӾ=eH]&!~+39g?#FL OxJB<1>DJKGCAI@=1:5/)#Y8!R P1  H@aL}I: 2%ա,&~oy0Kw؞\[Mީ)g5GM& ""U-5;wAYHNZQLSD>m@ GLLHDB,A>:#55/)"f ix ]CgkZ %[) X9Ϧρϲ¶ᶯëߦ9! - ȩ&jv֒Q8 $:/7=CJNQSOF#ABI%NM JECA$?:5.](!dS $ {V Bn Yt0O0BSsxΝӤݩ1ר6vZca &-19?ELSVZQHSCDJO0OKFTDB?:4L.' E}gr a  :Yz Ng[Ε.F@2ʪɥΜ]x˩Ya%2~d(-3;AGO VcXS"KEFL@QUPKGDC?:4-& %   . H <Sy  l?zPh|$7/&Je\/,r] r6?a 8ۀ϶sʤqu|lhCҧ,櫴4b, -: D LRxXW`vg*iKcYSSWXTLNHEB=6.%r<;gezS3c3C  `y/Cǣ̳qg<8n2=6ع"s">0>{H(PUO\,dklZf\%VV;YYTM!HDAp< 5:,"G ]  j @Hg y @  az<΁,ɺ%5R@7ڕA a ԲS }U/ '4@J$RW!^elng]2WWYYxTMG5D@;3*b! s T'= o  =A[ٴA0UnzGA?Ѯ1XϨ"C `)-7 CLTY_ggnhoh^XWXZYTyLFyC@:2)/ $ LW_fvE2 ]>'LxȰţYGPZӘƗӨѰ2{%_ +z9NENVm[aRiopi_XvXZYSKEB5?91b(tVi mh^G1[Odl Y  m[j ;̷!X8ZvB#(U T-;GQW]"cjdqqj`YYZnYRJ EA9>b8c0' UVVce f 9\ׄwdžEi %ǝ?V"Š{ @0>ISY^dElr sk7aRZY-[%Y?R J$D@+=87/%^.;R)MUM@| 1  ,nĦǴ<  [ZëzƋESG"2I@KUp[4`fmsthlaZY%[XpQI C?<6-%$$%<IUN> -9Em֭!DŽ E֯ˮ+ثUQ?XȈ +%4BNW]aNgnttm,b[ZZ!XzPGAn>:4_,"0g Z1xQ]Pe }hf:n8x˫{гCQɣ|!^P? &l'7DPX^byhouZugmnbL[ZZ\WkOF@+=n9N3*.! ^]Q\reDUVtG>ˏǮƪ_\n^O ˜Ûe*&͇S)\9FRZ` dipqvumbT[ZHZVEN@E>?;81) a3|-lEH96,_GjvWy!5BÛthFϤf +;H TO\~aCevjqwDvmb?[YYUMC=s:6s0((f@tZ~}'_~~ ԲG:׮ ^0?yEl  .=JU]bCfNkFrwvmb4[YHYTKtBZ<965.~&*n?mp2F]5Rp-ƍ&ӮۮaXܡkYОHs.Ƹ%c 40?LW_c"glr(xvmrb[oFLH>T 9JC}3-G+<)̱r1ƢZdd7gh>P J2ANfY`eglOsZxvmbZXWRHW?J9562+}#;+ zD VS-Fr( ݸ@ᯧӫͣdlFbÝQ؏4"S4CPZ1beh msnxvMma"Z,XWPQTG=7g40k*!$5 1%'D+?~57Ů_R%龜Ϣ۬Ÿjp̫$@6tE=Ro\^cfi]msbxSvl aYuWUOE;62/(  (pe> MV(  |GA ųkqE!DMw"&83GS]jdxgkimsCxu1l\`XVTND-:I4%1f-D'PO 4/6,("6@b]KvFz z$v1߫юɍ6ƭ6 ۳ԳAƫxɪ6F.Jؐ->LX(bg ii5mrvSsh\DURSPH)=3c-*'.!N_^>S~Nz*i |ގѢLJZ籘Ҳ̴dJQ0%ҬnIH/?)NYbh7iilXruArg[,TQNFQ;31+(q%['qD0~'e 8Hss<H6յ,NyMl8F^R 0A6OZc^h2i2i~+^g÷»v幘C]!¶f@   $5DR\dhgf!inpk`TNKFH>2'" O2?q,D`PB a('Wu{O^lD݀ѭ2ɋƺ ^ R9ܻKNrDbr R#w%5CE_R]dNhXge hlUolj^FSLJF =D0#&J!QgGjTA_Zp}DD#8V#h 86?̴BąpJ ܽ[ĺӀ@  kJ&}6ER]dgfdgkmh5]QLK*I9EZ;l.U$JfZ bއnS_ 5(̬[ּt2.Ք2Fc&6FR ]`d?geceVjVlfv[PIGC9,"V; |<>9q1(߂ގ<m<+cA݇E,wO,KׄI 5lm'R7#FR\cfdbrdhj>eY`NlHF]B8* pK/ 2z:p ܌pޮMmJ?yaҡ;-KlS/<ټrb:_h '7#FqR|\ucecacg1itcWL GLE@n63)%g/ Zw>A1݄$f20-d~Ӓ,&@[W+@lƂ#ʽ~}N8 ,(7FR[bdbA`aegaV:KED?4'rBH5 6Mo+j\E8*f Ԕw4O\4/%ɳs(Ѣ2~ n |(7EQQ[bdoa^9`_de_.TI]DB`>Q3%3D |^F2`;۫qH;h ;&ޯԤҗєʥռ*H 6ÃVԾ BMQ=4k#(}7hE QZ"ab$`a]^bd]IRGCA<11$f{(a U&=zt, S \[ޒV db6{b͠&IJ> (47DSPY`a^[ ]`b[]P7FAO@;F0"KxR%F(!Jݚه$|6FAB+9.߂<ա_w,ŒRιϾ ~4tزi ['6HD~OX^``?])Z\[?_8`YpN~DK@?<:. WM<' lw'cو؆޲Ru3b{רՓ_ŪĈ́ q}Oϟږ%PI]'-6CNW]^[XY][^WLB>=8`-058 aUYpظڇFޕ(1]>n%B#<ؓДbŋзXԌAͽˉѷb4)Ok ~&|5BvMoV|\]ZVW[|\UJJA=<7,/z 8Q $]gZorSBݚ5٫ڲA:'Ǜ'ԳMԪ$ι(byk UO-&4AELU'[ \tX9U4VYZSH?\<;6*c]Gu g=-ٰ߈P֤G~Y E܂ɹV7qٹ ҄tR b%3}@KSY|ZVwSrTXXRF+>;:5s)-H"f @+Qsݱ+1قwL3$֋ܐRSu8Onѓցn#Z(ؿ#  $2S?I?RXXTQR=VVPE<9v9V46(?:+  oSj~Xr} 8Df߹Vފ۠Gڗh .W#1 >=HPlV WSOPbTTN=C;8h8%3&7 > "g%%Gbܔ߶uF?խ؝گ گ% "B"ߴ{ٻ'^"(6'S\fN%$ .O/j"i0QMNRRLqA97i7 2%7 V dv z׹IQo+~SF [ abҥ{݊ 3:M)y QYW!/0;1E~MSbS`OL,MPP&J?8y6y61$~ < y )f݈ۀSܨ%ވ^k1)Oa5CѨ @9.m6 2`2 -9CKLQQMJJjKOOCH>6p550# P > iݚՓӍט݈ظghكGFYS3tqt;GsfI0OO {s,,7AJOOKyHI@MTMlF_<5~44 /" y z> cܜU13D)3* )١;ٌnEuE߻C dM*R6 @@HMMIFGyKKD:O433Q.!  WLz]&ZwݧaMї.GgB~JiFKKGD2FIIB932#3j-  >HۭA6!Eӽщ֖=؛-T871l4I'  MQ'2^U܋܆QHgABd9YRߢ %0:BH HCABSFF'?50 11+6K?۾Z * ЧEn'aaIR:Gߗ$|V MJ # /8@3F#FBg?,ADLDo=q4/H01*XS__{~NзےՀ|2 VC]CHvu C i9 7!-6?`DCD>@=?*CB; 3./x0/*?AD9^ڟ;լۇϕf*t^X9;IIaqo $ s h#+4=BcBi><>AA:1-./)J+];OJE׷َٿriJh$۶l\1\SR9nO:zD+ P 0)2-;@@<:<@v?|8B0,P.R/( r`g8Ӣ7^vG_O=a+k^7OF[Z &;'0I9>>:81;>=6.+-.5( U)M^׺{ ۀ=6va.$aB}[#]m1t m )?%.m7<<'9a79,=7خKW7]E<5ϣ=d}z-HN#V&U&?,&! &<#,5;;75y8;:3_,),-&[ |lnװn"ڷG{$yU:_<?qra[d$<#+STb>% &7!+3P9T95{417:I9s28+), -3& Vޅ5֍֮,̢͸ ڤ_J؛rMyI r bYS 3od{);V9$/)177Y4(35U971*q(+,%  iTN =$ׅϝlͶڙӅ0!`JB C =e  S(q{_n E$*'055214"86/)'+Y,%l Qt>;ͿڞӷΝQٵyY:\. Q & $6 x wg4~69L&D%O.24]4U1036M5^.''*+$f p-ZXݩ֑h:Ԏ{ ڶeRlo _=1 s o HWH 1K3,/]Fc.f#,u22/\/253-&c&=*S+#-4YS_e֬4Aϝџ+: 7 [ n  #L 1hQT. rzo~ 1!*0$1k.%.142+%%)*R#4g{ >@D,\&)J& W "))((,/,%/!"(( ? f3\zQ܃r4׿QqCzGo!<$f[  y.MO c@cO !'x(&((,.+$@ Y"'Z( +a-iNЛMȺ͉ݝ;]cK5x!Y#&|  Fk>DC` L&'%$'a+-*#Q!I''YZ=@!5Lxեce2؉< ؆ըzI@-6 !c$"de%(V"w f0tfWzF"$%$D&*,v){"~G!&\'p2ֲ-{1ʃȥO(.?#&.$a% O(*$. liY#g(zک-\JC+T#}$#%*.,h(j! &&'H1o]DN_ʧ1ϭ7 ص܋]~  !1&)=&P 6#*,% r$X/`r uc "D#"$U)o+e'` Q P&&{; MF v8fPulY:, $ #({+P(M"1 @%,n.' =pHNYf# P.'_( "!$(*j&Q&%&@-p8ڭ֏֘PxU z4!#>#)&i+-_*?$4"X'.0g(K  ?oS/O/M8g  Q#()j%:LG^%y%Na\I'{^U-LܿFNxjN#G%%( .D0f,!&3$_)01) a $_Je$.2҈RQ2c5NK I,"]'([$!p$$ a >0%"Bd&}.WݐJbu%'(`+02c.'&Y+2G3* -6+0-о֊ݬ d !&.(X##,o$;$8 xe{Q۲גָvp|n*~c6 ')*-34X0)')-144+ BU ']f5ޱ$'ڲxY  D!.&q'^"+$#X I%@b4Ӻ81~tq lJ")+,05772I+).55,U _  z;ֽS ڦb+@x; %&h!2#0#6 9rY١e0!Zk xa$+6.I/ 38;93, +x076n-r z C1auDԺ`p ݍ;"8gejj % &q 8L?#" r 'km?UU%џː&Bj &.i015:S;5].v,1e87-C  : 56m|ԈӾZ_JULH## ! c? .yLqGHږӚEzm1.8^ -p468lP >%S18 ;<;AEDRCqG F=53j8x=u:.. ( p+p23Zѽe@Ƣл1~X Z 5! :BH .=}o)om.*?&x#~)r5v<>@QEDIoG>53 9=b:y.R yA6 ڻMCӺC p ^+w + g|oAH{]l[D+7Y>@B7:.3 l>!c.ڒyUG?NxN$5Ӑaj bmYB|7ת$A t -9*@{BDILIi@649F>9q-Y JyxH)C̄{Ƹ{AsҾzugjJ e< tRRI؃ "/u;A%DjFJ)N KAa7'5&:K>9,g_#@οD+΍̼e˼r^ oFO:Ky*,֪n"$1A=CEGMLkOKA7V57:= 9+qܘկ҄9ɵɐ:˜Ȑ 97sL w3`AvdS7ljl WMpR{h0uZ&3>EGsIMPLA7Y5%:==8*T#uN]ȬSV:ɒcІl0w? ! |G K`i Wjeo (t5@wFpHJOQ/MB7@599;15}'yb &M ަqHvǰN~kǝ΄ߗk |ra Y 'hX 6r$l #.:DJK=N_R9TcNB7o48:4-&73 YG2ӈ̵&ԶMA! B޵)^   b@/z2!shV+ z)%\0;<[F,KL*O6STNA64&8!:2$ Dt-N7(ͮ˕iy߸ ~ƀ:|=\ nh } A  $C( j-Mp h'2=GLMOS.UNpA,6o3f781T#{(Gm؈ˡʊț"PR޷ ̘T])JZ 2 xLLB}iy,S6 N!)3?HL(NPTuUqN@v52670!E,-Agݕ΃ʤɋg43궴>2g (gZ N _~4x}_utG= }#+P5P@fI|MN,QUU#N_@4156}." oPvߔnXɬȕA2Eew[KWzbF H" <R9EYxQRr  O {M%-6A8JN OQdUUM?31445,vj R,ȸǶ/+n?U˾ґچS, G 3 iz"f<3"J1l ll% ':/,8BJfNpOQUUSM>130033:+Ph{2 Ff'Z#7 վlٵ6> o 7 n]T$6;Dh \OG")0w9CKNORUUL&>S2O/2|2) @F֖8%ŨT;#[o  t JI C;\[xFtR$m+L2:KDKNO,RUBU L3=Q1K.M11'5 f_ܕ؇͂"vuͽ5B°h  [ ?G Q*yi_Y(&r0*B&-3;DUT[J:.+.-$ i<[)Ѵ’[+OhPٰkvȷ%םl <g  jk[ 'B8bU Hf")!06s=EJLaNNQTiSOI9-*-+"s޺Ӓ.ɠ¥Nv¢j]tѺiz&jS  w N w6 * D/$b+t1"7'>;F1LMN!Q^TR8H8u,Q)+*& iTYέe,Pvq36%,28>uFK~MNPSQGO7=+(5*E(:JЀ-/?}Rè^t%gB54|lcz\!3 ]% i ) Z riy5!h'C.38M?FKLeM P#SQE5)&(&N41Vڦwʽiꧬأh_yFF͏ݔj{s ep I6 A sfqC  |G` #(/49?FBK3LLQOFROD4(f%'$cN f `΅X۾"ƽ3MڵTŪ x }@k  A z ,@M K$eR  ! "$=*05@:?YFJ^KK}NVQN@C38'#l%"{ o?%¾нFk7@WݶZf{g%h 9 -| "&[  ;#j#%o+1b6:@ FIfJJMUPmMA1%"# } ߘω˽ƼȼgMdĐG:Zn W < uA| ~ d ]  6"$$&,}26;%@E IVIIL>OL+@0$$!/"vSm{лhձCnRwk. adۓe)~*e pL[ j\ K  %* 'x#%%(-;3t7J;@.E H+HHkKNJ>|." $%oiuxYԻ(%:ֺh&sȝYrÄ6 6 6 #LZM,= ? ?{fi{ MH$&&(\.37r;?DGFOGEJL]I<,g!9Zn$FULӵ`ɺoA?i[ mb8 L;T1 <) b\ .&'n')/f48|;?CEEEIKGZ;F+#!W#p W'h()(*/4A8b;D?#CDDDG8BpCBCFFHD7'  S( ^JG'ROF 汑A"ه]6M W!TaMPwAS& (7! V#Q))2)+0.5*8:)>*AA@qADCGB6)&$V o`+j*lɸ\6/wWͬ<8h SIRLr c" uuxB!5)L*D# $**)+0)57g:m=@m@2??JCEEAR4$K4_+ JCךD ߷ ٚ*ҥiȯؒp  v#!4LX$+o,7%%*^*),0579<>>r=">A.D?2"EdZ·kr)̝(z)<pؽH~e!%8$u! !I!?u>!)I00(dz 'b+*)+0[46s8:'<`;9:|>@7<.V` G'kJ˶84ˣ}gѿAjyWiWKo"&%#"##!  Q ~p#i+22*!q!(+~*)+C03579:978̛¡ᡶ󫏵' n` $-00h/1q33[2@10/J-, 1;9??=^3 )$S'*)e&$$'+-.k/0/+)+0e3+.P!K r `جc&{H^q'tcU-0 5'&/21Z1B35,643631 //.2:@1>)4){%'[*(W%#&)K,6-..F-)n') /1m,A } c2y#i"Ҭtw xVxZ]ƳϲC6 ({1c43X3x5$88176530/!4'CT@5*j&'(%!8"%(())'#Z!&$*,'J_N1 ַ$zqBD]Ӫcy' 3l"! %P/Z798K9<??M>= LAA@Z?!>);649@6=r?>f?BElFECBj>96::BNFA!6$+:&V&% E!"}#[# L#&! SR˓R3[`㜔d5G!*()((.8?pA@oAD(HH?GEC?':7v;BFA5*%%l$we#E (!!!Z-"@%  l H/nӄ9c񫭦Ѯ*X 29˪dʡ 0{aN#))*11 ;+BfCmBzC GJJJNIGE6A;58 <)CFXA5g*p%%1#rh|L  x #ZH*Eޡ B%h7K GܛŶbUˌ!#ZD$e++,3=YDiEUD~E*IcLLGKI?GwB;8v!-AcܔC-F穬ְndWʠm͚bT|(.r/.1{8BHvI(H]I=MoPPNL8JDm=9=CUF@3(i#e"F> T}Z[)Cmru7asLvK8dGϚ3̠(bإrM)l0i13;E.KuKJLK6OYRvRPNKE=:%=C Fh?2'"\!^'>PFm uߨhuɉ—¨g% ݗΠ-Z+82c35=GMzMK/MQ4T.TAROLkFO>%: =iCE>2&!9 Zw  Ry<nD #: }6E2@ʪߠ"c̜vhDg284i o-4a5-8@9JOOMNRUUS?QMG>:<CD=0%   _ *M  !@ $HcFYPзαçXTy|Jtɛ 6$>њ )/5_7z:BL9RQOPTWOWUkRNG>997x9;4AB::[-t"b3 :< * y 6n ܀Իμ*3ð^@efX1WۮL5F);  %k4Z;l=QAAJ'TXWuTGUY[Z_X1UPvH>9;m@@8+7!24 $~ Q`q Zw cI+ <*c?OiwΠ#5`C&oʝlțѢʨG&D63=}?CLVZXUVLZ\[5YU QHU>8[:e??z7*    5T{E׵Ǹǹ/yʣJhsI;WyԾ,y(-8?A FZO%Y\ZlWWw[]\YZVCQ{H=79F>n>5(Y  ey ٩0rƃyNTۚ6ÜŜ^2;c*':@CvHQ[ _/\XYy\^]vZV]QAHR=78=߆؃;ҫC1cXDo`j s}.=DGLV_b _[[#^_^1["W=QyG OcU__gic^]_`^Z@VrOD(80#1M42T) OLHtH$B hV~{܀&ŔϸqJr1-]<%}˹ɑؙ(SU $?8FzMQVWTai|jd+_]_`^ZUN~C6}//20L'A1 x":YJd c:oϖćиۮw⟄[U~ZBnڧSwo &:HOR*Y1cPkke_^_`H^ZUMbB5..0.7%  g=C!zy"  Qt}aKĀ߸ݮϪ\F^ϤJFȭͼ7Lܸ (;JPCTZdllQf_+^_A`]Y[TL7A[4,~,/,(#: FX|FqS }e8e9JѤʷ~߸ꮖEp+<.>_6+ *=KRU\fnmf%`^r__!]XSK?33+*?-*!hy W 9md)Lg23 H@|BɝĀXC -$^9,?!MlS1)H)z+( n)_&; .*(]́ɅĈޤ2tHB eDy*,Zx (x.TANTX_ip@oga`]^j^[ WQIF=09(')&m 5=MW[_{gp5uHpe[VUFSOJD;.]!}! .o/#D `&dp "t8N] M8UCo$+Q75<29 %)1?lNW[_gptodZbUSQM6IBC*:,,)%j X0 ?)JdQG#zA?^2)kȈG¹[O٭oVnabMK P"')+|3 A&O4X\_gptodYTQO#LuGAh81+KF%K6$L>nE1ZqO4i'#ˈLZR+M?cԿhŽPY a$D),4)BOYX[_gp tMncXRVPNMJE?6m)*lp>3*GFW&WQ@PbJ/v%)˹F\0X٫dJg ŭ½ Rd fe&*V.=60CMP\X[_ogfpysgmaCW$QN%LqHC>4'N {MS]߉^mo.URUAHQm\10..:ȿĹ!:aqMQQd\%(j,/7DPGXe[E_g prrl`UOL=JFB:<(3%LN( Qqpx޶֕֗ܗn1:`26JK`FBǼĚ/寴w26"˒>0.LR7 )- 18D QXZ^fwo$rek_T N KMHD$@f:Q1.$m+  }ۿDo{m2Suq͏ˣǑōHJ_I{sˇȏ:132!l+(/129xEQWSZ3^fn6q?j7^#SnL-ISFBH>8}/t"{ iu4(7%R. FuקФʇoƑr KY}3^~#,V073:EQ>WYy]sempi\QJIGOD@j<6-  s Qǫ­=ݳڸQ,ū/Z#α7 $-f14>;hFPVX\d mngJ[OIdELB>:4+"2 v  2i I۱ӑkZL g ]EΌAĵ /^rԣC\1sf&$/_24;FPUW[clm(fYPN=GwCC@<8039* 9 OG*ҪؓzP@`O& Ѳ̿K\XzN¢Vҳ{іg !'20635Z:6k1(op f4"7٠e*]l2qyW/χtd#оa{˼Ӽ ((13I6XS`hi{aT]IA=$:62-% !lp71xDѠ_6~=16m|_Ǽv•#}ТݴT6vI+257H=FN.RSV^g!h_0SG@;841 ,m#=Y  }iгը*qaa_!r)ё(Uʐ÷Ěɴ'݂c }}+K3a5F7V=iFMPQlU]eef#^jQED>962P/W*!+ gF`{S(X܉?}`g]Bc#}?ŭǖː30Yuqn,35H76=EMxOOS%\ddQ\ODo<740-(: j Wxz9NGϛϻRYq<8<1SկKdhƪaɦ͸nAx׭Db߶#| ,3597xu֦A!ұa ȰRƩϦUFѷb:\zGwcy( UwתOOӸƤэQZMg!-4v56@<DIJJNJWS__VEJ>62;.1+J(#TaHXղPR 6U BqmԎԅՎy&b ԄL҉Jޠ*c^z "-4.56;9CyHIHLU]] UwH=D5&0N,W)&U"nLo4$Dvҵn7*?<U y֜?JԿi|LֆAԨ׋PRQtH;"-346;IBGPGFJS[\=SF^;3Z.k*'$  U{z-yIjsU14׀*б@ՙ؊1ֹٽ#j+,L"-3E4`5\:BAEsEDIQYZdQD91,(%H#P &`;0{$\wъA7 m+܃5أڥsҭڂ/VYHW?"_-2349'@DCBG%P$X-XvOC740*&$!] ejުͤׯe0LB_,F"ڙڵeW"2qXf",T2238>lBA@DINWVLVMBA=6.,)%X"% ~ 02f 0CӿL̀l%2QV/trYl۫c0קyס2߂۹-jhX!,1227=@?>BfLTsTK?4,'n#   r֡߷{%wH|>v>@:ިCDrݞAx'a!+0126q<?=<@yJRRI= 3d+%!1!/eWJ$u.o$B M7* Qzےَܤߢ  +/00\5:c=r;Y:>HPPH<1)h$@ YuqV ˉk֫k.B^^!C/i )/$i *../49;R985>Kd}$iCFg|2Sye6N3=PS.Q',%,,U1X67 538B KJB 7-%; PRU-E O&)4ʇ^ݔ}@+p; EQuttA. h<^F&**+/452i1a6@5II@u5+|$f 1Sڕʚ@΁/Dq1@ oR }qQFw5zq0]C_ Mw$@%))*[.3308/\4>oGMG?3C*:#T+l zJR`UGE;Ч|,ԗ+f @ 7_i;D\avtUVt#''(,q11.-T2=EEK=\2("zzJ0 1Vxc;{/&q z\bW kTX{M"%%&-+//M,*X0-;CC;0' OG21 7!.^Y;TكKMʽͥ3^4jYaC dq,b;- xL=#  $$;%)--*(X.]9BB9X/m&9!9 5f$?ʨ{ӭ-eR&` D}nOVPC/ w7"+"#',+'Y&O,7H@<@F8-1%/Fx "4߾Fx6ʜ[|Am%^ HCJ|E P#{ H S !4&J*)%5$V*5>k>6l,$- `'f4Il>ظ5ʔ>Pے|z4  bvV;d4hW$;E 5(Uw$('#;"g(4<<4+"4+ 4kqoׄ?ʑ*0nfA2 ~z `_[u$# JYD"&%!> &2P;;u3)!D 9 CSNZʚ!Y HW!U "c\ !exBm?k?g f=wD#"rO2#H/8880F' A r?8%)ʢ8Yx{3Jap 9P^s CDx F#x!% dX{!-6z6/&6# S|^IDoHֿb2neS _`e VYJS!`yo*w #0ec-,44-$n/J j"F/#yܫUո#DΓ[ې_pq<Z! 3B`GF Mz]$E09 UoH!*p3F3N,#Ep | QuK]G{վWE˄ӌ۷:)8BH/ ecO 6YVl`18Ba  Fu}=)11+"B 5' <ޏ͕ʏ g[w_; !"t8 6EvQ~Gi.;%Ps\ Z 8= '0p0)!b __i~_Si\Z* "#2 ( I# 4  ZRR% m, 2"~&Q//( Yd CA7\C۝)%ŎϬb| Mf!- $% *;j V vxaL ;0}D zShK"%--d')6  l"e۔t˻cl&'"# Z C { ]v^hr\F #,z,D&4 /K 02sZh/uТDb1x4<"()$1=P\  E 7BR!AIT= !_  ".++&%<% 4G\iYXpb 6,̵2s>d 4!*+&!. y P$vz p t~!))$kY(*P[ܰvΦEΗzތ  J#,-(q#s  L8 Nq%nYS}( g Go ((#1 rrO.KܡԶ*9}2=u*B / H o%./*%!j#  grsqhj1FK>@ %p < M{'m'!@/ p1G\ #= Rz tHKGܑԡѣAaL7UD, 5|5"1c,(4%< x V GFw$݋E 5  4 i$$ e hH(`Jlm1ۭбі@z%DVl\ .)7k7"3.(+S'#"/W  w} J" ݅ۊ+ aP#"H\ N:G+ٜۙ'ԊuҚ) T ?f[Z"0M9[950Q-`)#&B0t *zG AK% HK"!.p Q)b2#QӭRH8 FYZ'%!3T;R;72j/Q+%0 LG,g#8Q 1lg -ؙ0ڜ\H;p]4 > +S! Lc, ]1s >0-HUAؒޚ{7I ]WQ'\5;=/=84n1)-Q'!`eh- /@rt 4}և۰; nrP*/X u\ m8! bڅ)Mۤz> ^N.$)7$?>:6[3.("R{K 1 u"`iO` x.kI - }i Zh:ߋiZ 6NXhIm1>_eo f,9A@<8750J*$%~ Un + Uٞ+ӳKh޸[t[%%h a HN߶B8atժ!y ".'`:752+ %3WI B hҒұ.Y$ jh S }ۺo԰ Qa3 q ET#" e%P1l>DD?<83,%r T  g]U-7u1ϖ#ҟ:Km|e=\= WeCL8B@.&|9ޓܔׂ-Y u!2&$#'3@FEA=C:5-& \o   ;TFhϥԴٰMvo r6 PRDOL>Uof'YC#Y(&?%*6B{H,GCI?;Q6.m'@!R: \ c = |;'53ٲ~̑&ϟ8%[Dw# }D IRjfߎ~*ڌV 7&~*(k'|,o8DJHpD@=q7/'!* L e ׹ϼS̴8֢ܻ=_s&+Q :1h~i ݱS;'`T.(n(,+).:FKIEB^>v8~0x(!, M d[*# bռ ɩOl+,Es($1 \nݾyryڃھ{6 5p *.>-+1ۦ9ۂդs!WYбW2Qr,,! t4`G*gj  Si)37t5Z4:xEvO9ROJFB;Y2(  &efӊũ>z؋=~gYK:f Ganz(:iUVߌ; aX+%69h7M68IARS:PKGC<62L(QI 4 /&WvQRÙ!0}2d#*v4d 3wT! H+d" 0~:=+;2:?JSTPKHHC<1' LDn%mۑq/[sĐ£'Bv{Ou6[[ >.rt5jA F u$82JA>=C)NUUQ!L~HC;1&-'IP׋nҦ{Ʉ&˺߼]8D*%p JO c =  , bA s7Vd [*F8^BDA@FPZWaVPK*HAC:/$cQ8uԘϜR͵мط>˺ռ(D3 "^3sa 9 o  [,&  oI A,4:DF C=B7HQWnVPKGB :.#c ^}+CjӹabBԬ~ h \ }`($`NM52#J%".WcG Rt"5)15BK=LwHGMU?Y1UM@HBD>65w)upSei1P 󺃿ĖzЧLS@pB 9 e e"@WM_"yr j %$*6;DLM/IH6NVYTMFG8C=3!(m?{ӧɃƛ nܱqY^X@*ۂLJ5Qw " * p  k  nnt&6b\`]RU}F"%Y,P8EMMI INRVXS%L/FBI<2&K(~0.QNw _й~Jlj>Ϫw Y^ ' i $ WP&6o 53 )$'-9FNNjJIOoVLXSKE@:11I%w Y"݇7hĆJR߮ EHæȘ/ڑMLdO Q Q k N .CUEQ:Ch E84!% )h/!;'HO OJJlOpVWRIC?9/# M]'δ)>LQ P Fjͼ"u@9  u { Os|[~m f5#'*0i<;IPO(KmJOXV,W QHBB>:8=.E"bU pZsPiЬM7ҴC&AYtTGٽA7F:  Rz1s@AH !%0)+2=J4QOUKJOU}VOiG&A<6, jط! ƼOlް?ʷfG * NU m*l+ o-c#  &*%-:3>JQPVKJOUUNE?F;5+,5kR:_ZW#6b}oF^ D T 9qG^ iK1!"(*,R.G4?KQPBKJrOTTWMuD">9g3c)t,:O:jUȳvbqc몖-Ú uwr 9 '  Rwy W - p 3>> <${*-/65w@DL'RP'KTJ*ORTaSKB<81'y0cN߹޷ݾuǮ0*cCz5zndy2u\ U7 b  oQ, E >N ] EW I$ &$,.0*6;ALMROJ JNS4RmJOA:f6/% HV9@W.ƨ\[e2्d%*JeVvB:4 9:  P_[ N w v} \ Dk&Q!"r(-017ADM]ROJIBNRPH?094:.,$k ۸ۺڱпĞq{/"֭ɵ󺙿y&` dFm  z @|U U P ` C y*I $5*5/#1W27jBMTR?O J2IMQOMG=z72p,c" IT;9E:uäv3pRD:t7YK}tLyXb DB Cl0 P e " h !0 %+023L8BM"RNkIHLPMNE6<51* G ߱ڸ׷'¯}Aģΰ$hؾ½ɫL]g , V. J3w& {  "'u-1238#CMQNHGLOLCb:3./(L]pu@J=񹙴g+:iܴ$}Waz{"CV . p {h` Z|! ~v#T).2339JCdMQDMGG)KhN&KB82Q-&,Yܫ(ܹCɳgb۹.0ER&fZ   L~ iuZ|%*H03R4o419ZC%MiP`LFF6J M|IH@6(0r+$g/Vւӗپ2ĩŢ@Cѽjz֥FZ~" i (JZ$ /N HHNb0T! 'W,1444e9XCLO_KE0E4G.)"Q@ ӦӶ7Gͽn 1eê/Qke 2  2 g &1) AJ;7"(-25254x94CnLNLJD8D)HJF<2o,'! Eoeؾ~wȼѷ_|3wHȮX3dO :; 8'  - k$).3H654c9BKMICCF1IiD:0*%B oZGӪž\o͠]ϩ`ZѸƼ Aȷ;&W 2 PWa Wbm!x<%+/465409BKLG]BAEGB8 /(#[U 9]P/G WΑļx$&ߟ.Z|dzd~ rT #~  a-#e!b #'=,0L5)7548B;JKhF@@pDE@6 -&"n3= bٹյs?_ꨫw?bǮG  j  n  r!2q"%P#w2/"V(E-15n7504b8pAGIGJD{?Z?COD>4 +$# t.S|oߐ@H F_ SYE tǩ1Ku *  A FOT _ M# Y$'!%#n)0.2p67b537@GHH_C==AB<2 )"O!XV6?δ( q˻-Ǫ~R?X %%3 +V"%! &)& #$i*.=3675X367?0GlGA<c KW$&# ##(+(@"z %I+/3$77426? FE@:1;>o?8.5%J@y ?kʡ,% γɬv֝BtuI!Ǻ՟It D7 {%na&(r%"_%7+-4*#!&,804A7d7 415 >DMDO>W99s== 7,F#{ OA.,B̹%Ĵ^2Ѣ{$2㱡滃ա>hn* M  55hcM:d|(*B'$'x-/+%K!"',0X4;7 7^31484,58z81g&, fcp~+.E8͛Na@9+X H5 gwV I""g5&j.0,*.3/50($%).C1f46M50-R1&9><6J23e76+/s$u> ,g(,+7ìb qF]hK Ki}  dZ"${$!WUF(h01V.,-056A1)P%w&m**.7124 64/,07<:402559-" `VɒŕLj)ݹ#21ҥ-R;c׺t`Zpq&!#%j&#Px {*k230..27M8a2{* & '*9.1353.+.J63;82.0{4s3X+ #7.# U\Ӌ ]bڛr>.CнȥwK/V0"%'b(%L ",v4D51^0%499k3E+&'+0.0f342A-*e-4m960-/21)g fpĎǂ@̱#XBmܪ-',A_kL*$A')g*'J"%.67f3'2 6Y;5;W4+J''!+.i0241+(+3~74..+-m1 0'$> hOyƲ~m<$*\/P9Z  %(n+d,)I$"A'1s88437{=5,'F(*I-E/`112(/)z%(/30l*'n*o.,$X~@  GU9EڰV\=Mxꤊ- k+Tg& *#),K/\0-D(:&+<5;;76 ;?e>c6-(<(*,.~01-'##'.1.j(%( -5+f" F;BВŻĊ;WD嚛Ƥu*]B:n?s ;e ~%*c.F1f2/O*;(-E7=4=?9N8<@/?6L-((A*,-//e,%e"%i,/y,p&!$'+) % M+ޛe€Rݽ-'2ޯAϚb2[[Ʉh%%xL ?',@0H3v41W,e*/C9c?>:9=B? 7m-'')Z+,v..*@$ #*-i*t$t"&^*5(6 ` }Α ĸ8dӯ2ܘeY)Aq{Q|H !(K.&2S563X.,1C;A?;:&?/C@Y7l-'t'()*+M-i-b)";"(+V(r" $(& & SĹ0ÍuRޥW]A^ ׾VʏRK'E}n#*04Q785M0.3)=B5A<%7DbB=5=LADxAb7-<'}&'()**&^9%'+$pf!&&#zF 8xQC3;RʲݰAKI|zʷY𺡿}ڏN&R.37Y;<94m27@EvC>>.BaEA<7,&%&u'D(t))X$}o#%" $M"tmOٰCyJ("́>xV!(059[=>;5@49JBF]D?>BEA6,& %%L&&(u'"O:! $ 0C# m CY̪±u/ұxҰ 7U1Ǻi=[$ T~T#*17;\?@f=76{;CG4EM@?C8FA6r+M%-$$ %%&% }'""I4  h \}k ]HͰ粂~1`4sݕ{  !z!L!%f,3a9=gABD?97,=_EIE@%@D{FbA6*x$3###-$%K$ J*M *)Lf!x 5i+h J$Ž#ǰϲHGT'mO-}Dbn "$##&C.5F;?tCDAk;9>FJFA@DF"A5*#"H"M""#"5zUj;b$ S "~g ʸkڭðò$SղFG_6w$$$()076=AjEFB =l;s@HK6GA ADF@49)" "!! PPuRd`"X@3بb꿶)²0: H2M&&&* 29%?CVGdHD>ACGJ{LHNBbADF? 3 '^ kyr  O0h>p6 0qQްز2蟀Bs ehLO# *I*w*.6O=BGKKGA?D1KL'HFBVADE>2%~ /L#= *ap0nK=gFؾDp R˥캗'p6)-%+(,Y,07/?D_IL}MDICAEKRM;H!ܲ6MdĮv,ix^3 =-33(4I8?hFK>PgSRS@NGDEHMMKG@~? BA9+-2"m1A kv   mS C&kd(ՕȆ^Y:5o)ihķcQˆٚ f/55!6>:WA#HsMQTyTBA@18J*6Z2jz o I    p*~rȔk~9X#Ü"u"YWĮD]"K1778(<CIN;SVUP IFINL FD?=R@w?6({ "F \> 3p@FUȡyfݭPyS8|D^΄sb $H3{999=DGKpPTLW{VPIFIMiLCEm>35+'P D cKY t _u ~Nu4ȦHk_^ Ic5ʩȱtGw;ul &U5l;;;?wFLQUoXaWtQAJbGJMKdD~=;4><3% 6 C  P [\% :;> d4Ȩ5})jı{<ҚBףz]¢şУߑ )n7e===AH:NS W|Y0XRJG%JjM KgCn<:=;2#]i  z V N@Ye$j,ǰ#Acz)Mٞb d <,:W@h@p@CJO@TWYWQCIEGGJdG ?767F6q,[ MY] WW0E¡Nl>gd]\NqBȑ=֮vO JC=%6tD0I+HGFIMRTV+WSKB>>?;2*(*'|A||WLuF8[ @ ' :SiZcȌĹ @VëTVȑTQT~? "0ANRPNOSUBWWVQAH=76V60&|mf*V#z9m3 _  *Dx˧?߾Pq3װɻ?bμtS$$,*:TITOFh}Ź:R`;#C*2>JQ'S7QNMLLLPLVLIBc7,0$6QR׵ԈOߟ}MMJ>T ?4 zAsؿ>̓|˔ξ-˔ƼÙ#Sq{VF&,5p@(K"QQOMKJyI;I,IF?J3'5~ uI)PhҒθ +ZKr { nzu\ FSaC͘ϲҷʦdڦRB )O$+1 :D/NRRmPMK~IGFFC:."j Vrm ܋ՍВF ֯0ުPb{ T P ,T݆sC+x̳x;Ϗul`xy'.64 <FNR^RPMK#IGAFE)CT;J/f#O 7b$eUѸjdK"? 5T7Gg%(poRϲΤ;^Bi *d(.3;DLPOMKIFVDCCA9*."X f(+e>&|Pm,lp%J:W˼ϒθθg\2+sb !*/4<*FMPNMML>J`GDCCA_:=/K$d'_5^ fMYxڡF7"8iiKLE94ӨFSf;v "*04<&ELHN MFKIGD;A??=6,!{ ^vWڬ]iLV3go>`hDs{EQR+ִٛ M#0+/3:RCIxKJ,HFD{A><<:3])Fw y>H\#r۟qn7 8o|cEQ0UD)ލذf̮iҔ֭٠ۇK\  A#V*{.k29pAGIGEDBs?K<;c;9$3(8:$ 6;L-B߈ 7=mH1r:Gch`>إ6ҝͭD]a!ץ׫H> 2R #**-1T8@F"HFECQA=:9:v832U( {x89u%_OB6GbK9sNHӾNȢBIsٰ4 !%;+.2H90AFIH"GEiDA%>:9:_812(9 ''mvN1J0=?&p߷qԗͽɕǹɺ҃x|&::'-0r4:eBdGhHGEtDA=98860N&p S_q&g?0wQ{ZaqU XX4ֹѴ:!ЉWҒ}R-,=l&o,/3y:AyF8GEDCA<8O7c7F5.$o0 / ;bA8,g.D;҄T~FÌ(7&͚΁ -5.442%,"C1v:Q A)uR\'[aFsweͩΧϢ b-z l"D)8-n/838:AEPEpKݴ>}*S"*G 790AޚP2{9MZڢR6 #k*/8225;ADBC?<9@5 /)('$;; hpc ~݉`ۖYGtzG+WkcK~A+~:7 2+-&$# BKKet8Rth5dc(Xm >*urJkZw)ݹטҍ|*#0s+T I"t&+0^1l139?BB?:k6W2-&.!I UQ~u)޶c$Bi)}y 9_?;Mڒ՜ټ߅0IAnQ"Z&G+.//1<7@=]?n 0 )9B_%2^?lBb#&}+./p.#0g5;<9V44/x*$*0&= k )@U8VxM!+]n$|'*#.`/-+,]/2u3/)h# a,nj:0ֆ`ս#%/5*:U:+  y=TBtFmW  9$'^*a-2.J,)),.0a0,&K  o6-lYΪa.}2y|;"ZqNI%  HUOU+F! p ;i"$'*U+')|&O&0)8,-,Z("Km^̢>@+ FӆԻ TV[_ p,C8 e  X h-yF$ t]!%'I(%:#"%~(Q($ <8k2ƉȖ̱bZl!5aVްN { DXt k , \ \o J |,;s H`WD|"U%%#  p""%%!9 Kyt:!͝DMӞwDڧ߷]WP]`; u9  {cr >&<9 t z#$!/C ""XNwOO^y=ao?0ԯ ׯX ZP Y;!a< Jbx~x%g H J\X*""q fo:  " 0ZP&ʯXuLԚlAF@kcc Jw>#;*je  d  q 3 T D<@!a"5,^ qj { يlÈԗ@ؿ>~!f#T o[j%DU   9 _ { Y d2G!!;,T4 B8cXjuUǴȅМҬԛ WbO9H Amc6vS5 "  (  g!!h',N#5 6wޑضȪ7".iלnr$y-; }0z1He{JbO+ 3;g  % : 9"2!!QaviEBv!Z 9qNWǾ6bӊ! b8y#ib 6y>j*+ mR| ]S ^ ~I">"ru 2q*&5#}iYǓͻ7Xzֆ֔Y؂.pdcKF yimi?_ "k +59_1D "~"NW,G QM,Nt1ؘ>Ќӱռ֪֡?9ܞvEcfi 8bv~#t {z  urkS@G "K"`Tm ^j6؟Mk5<'֧֏5){UD  qe@ y b(H1!"!{U; [d HǡJ\X6`רփ'(46 /U VL>a+ E  X/8xfY!"!#tx hhHH|>ȟ !1*VkFTQu+%(% 1)% +g4  fHI'Yp6k"'#!_4y~* g{:ݨׇд?ȅs͓ЛӶ:֣ՊLk{>Nk= r`{ k 3 1%"?"H#"t!=U ZY"};#Ow~JiooԳX߼bT|G+rE 6dfQ-= mhr"}m' ]"C#!{<M nycPpjɳ3rOְ7^ug=v^  ?2p  & W|e7e!#o$"{% nkmiޒgШǤ>ѡӗӠfԖe):G0vQ 5>0t LS(("0$$#13 u RB1>H)qyΊ@ чR]ڞPU~ #  @]+]h;2:xhYsI "G$$",Y5P# ~ hn`J<VN ҄NVCܨ\- Ai"q3@![O#o "*%u%U#~9Wb]  +#޵lʭƉqr̥s(ϒЦژ߁yH{& p D*-m($ Vi  #\%%K#EK 4ib(:މ>Уʊdž3ИFϛ/ٯQ#6_-s x\L1nS! i{= "&%:%"I o1~6 ~)p"a}ƛŗ3#ΌK*ն؝#  D ! (I2!=#S") | X{ #-%$%"|k!Y Ikw·Qə̡΁|TksweM wg l )#$#& RgR 3$%$x" Fc #$$!DVp  6&KmGӏ ̨jǩ͡гAu:R~`$ "S1  "$u&%Y"k]"&'&8$F"P!  -#$$!ZCA R}tQݿʕ",ŒƢ`(MӒ 0fT '?i "=$&( ($ !e#&-(&=$"   !"="&ri d^F`yߦD۶,vlđ]pNάΨ3oV^_l,_!#u$&g)4+a*'" ^z #'#(!f)!W m@"G݂z0ΆI)Uo¢q˛_M3g՘ۭ5&i? {&>!#%M&W(++,,(r$!" wr #'(J&/# O4P# gw"ͺo!>ůώЯ.J٩Y!I!6 x9. O#%&')[,.-r)W%m"  #&'%|"p5K] Z]7e]Ucz[ػ8A*1Zp̡NҷH\۱hQ Ku` "+%''g(*,C.-R)*%."p (jC "%%#i xi J  Yspߒ$+زnBSeȘ΃Ӛ*؅+a) A G" #$+'(.)[)* -m.,)$!""O#!kY a tW])s_3Vͷ3YeŒ Ի՞j7[ ,)~n+ fM #$~%+'d)**~*+-.,($ I' \r  %v L C1V1EY ORqAӷ{C!^Cn|_ 6&f U #A%&')**w)8*+,*C&![aY(  e T 6j#+==ܥؑ|Ьˇ. ,Ԋ؍%SQ$1 h sv} #$%'(\)(',()2*'n#0-tQ ' # T. 0 cI'RZPڧ.uwu՛}cyUc%! " yo6vg!$%%J'()'&'((P&!qvFy ] V C 6 2`EQ^se2ڿֺ7aȲǡ,ʛ՚ޙC+ H HT !$%%.'(x('%%M'V'$6crs1 b= ""2(XhKY6Ӧȭ)˧֖mq+0z uZ g)!$$E%x&''&$$-&1&]#m_>>j  xvF: @ wZ:?3qolckۭr]"hЁGAoA( czV{"J% &d&'(c(|&$$%%"h ?G\S hn 7 hC q3|iEݲ?|HүgB%Ȱ\*`g$ &8Y$'''()<)&$$W%$!ja}5 m ' * ) N} , Qgߢ8j؀:ϸf`Zҳ  x|TqW!`%((({)4*[)&}$#v$# `tQ f  V &  ?[Pڦ;ӊϏ͝ +ܾvB  T, #'h***{++*'#%F$$#N PK  2 w -^[nR2B9sImܿڪ:ׁӗ6ϒIkѫޠ6=xN` _K !H!"%),_,5,,,*'j$#"!O^ 1 / ~4:ZD~0y[K-/cMۮZ7рHт r4T z=!r##:#9$k'+,,,,,|*&#!m Ls  eTj*"&b[t6 _@ۯڠ2ԩiWӠ `8AysKc?ޚy%^ړ4Tܿݖ*3f P  PdQ!%)-.-++,.o/.:.-,)x$z2 NJR Li;'us4rU9pWu_ږbzۭ+iE~   #&*:./c.r,+d-I//k/..U-)$.A4k [B b )h/\Kz d%)ݜڠ@yH!2,K |"&*-.-+*+--t-,,x+(('#Fui ^ slQ0Tcc94~rC=0G٤ـZޙߕ-Yi t#'r+g.K/-+*+, -d,+V+*&!_QZM Q,N)5Goh" JNlP.٧>ޢߙ!~|# A $(Y, //E., ++x,,+*>*(X%I /LfR 6~![aC(MQ+I% ڳ8n] B;| %%),//[.X,9+z+",,!+/*Z)'$ # LT9%!4xeSCbf6JF7?GJ>P TL $(+7..-+~**+*)((&t#- -}mSkWe^_4C`NmaXQۢFOw 7$ $(+-/.-^+5*))~)('&"%/" }C *?k,2% WYJRE5F3>ېbx:/H" K>)K!%),~..-+*O**y)w(r'n&$!x 9T<_d5+jmr?pP}UY& ݨdjB>D[sl` ybP2z!%),p.{.J-+* *)('&%+$J!.br 2 Ah 6:[ALs Bݤ ;+B* sS"='+-g/@/-O,+P*)(S';&!%o# ae( v=Q8*ak~W~,s4ޒߵf(w aL} $$),/0Z0.-+*h)(&%k$"K YEI;} N*t-e,8qi \EHh m#!'+o.010/ -E+)_(&L%$" c c@t |fS\^Gx~LD$knu\>6 b "#&)-0221/c-L+o)'%#"&!-/*.- }aiM80T (4}'SSݧ3iE\}  H"'"# %&7)L,/2]4o430!.+d)'$6#!1 : c [94n\*u$ޟݸݤ? 2zU/ w5e S!#n%&&(F*-80 34q42K0-*(S%"!Q< j\dH\i }8oGb9|߫JhIlmCFA > I#k%&'F)$+-0c3442&0A-H*<';$!8oN NJp3$KD%b'dl4cup /!$$&E'>(c)+V-(02431/,(%Z"~8y J46Rj~hOtnRMnCDE9 !A$%&'c()+l.0!21/,)&E#j), ~WWglc}:v8w(B~,Y /L~[L(y u=j!#/%%k&'/(),.$0/-*'$1!* K:7Y\y5aXFi-d1 k@k W=>ZGl SC!#$ %Z%%&c(* -J.-+(%"_@1M , F]3$wil9lW?b_- ) N!Y#+$[$$$%/'b)+-,*'$!BIv. 7[C ~a6" $&M%  k!#$$$%%' )w+,|,s*'$!Jh4Y w`EWX8bz]QB.a_ 1}X*R$  ]"$%n%Y%% &&')H+,\,Q*v'}$z!#+3_ U+->bWaI4#'Q{:>252^#l`c? 9+ $&&i&*&'&q&Q'(+Q,+)&#  {+2 UK8&E b/$,O,CmF^{Kߏ5+d'x/aq8\ws` Bp"l&e((|( (''(*+,f,L*U';$! \O $~s TiD<'aI}V?_u-i7\ F 20$ $(*d*)E)((!)L*+,0,* '# 9$h'X umIfCcTu~NnG.޳9=P ߮ߕ3>n5 vm)!%) +g+**)5)`)E*+O,+)&F#,MD Ub,DR UoPNJ '_fTN1;jJOC l>Ys!%E)B++ +4*)) ))*++(%"xS F `@'c6~߰=dpۣܰޮn.)Bfb ] z <!*&)+,m+*))()*b+*(%"JnW1Y xaT_k0MtܟۛFw=\JZP > L!&)++0+E*c)(D(()R*)'$s!6& <3 #/z8sXޓݷܥ0a$}+Q5x0t a Rtn(!U%(*$+*)('Z''(;)(}&# cx19  EO?)&K.>Qxkp j.}  ` ~% L$')*c)('& &O&0'''%\"c{)S ? :G,69j#S[hZ57|l/UFg_ B ^# '()}('&%$%%f&%#I!N J  5o'5;Q߻A5v ioEA+3] ,r"%''&&%#B#f#A$$;$q" V  H xild+ML1rߢ߲V)& p\)^ B 9" &'''%&%##$##s$#"'9XMj  @e9Wu 'X@) +T2Dij(S4PY[- q : "%o'w'&%$#""#-$#!!/7 t # (6M)H%{J,]sl J9iYd ts#aQd   'C+"%D'G'&%$U#j"^"##3#!R(I / % ~ev3rw "J\+KFRH <dD;"%n&O&|%$h#"!!!U"!i NJt j ^ 339 (w5B{hnVl}E r 1cx*qOM @ M!$%%$#[" + P x HVXqurjKhA0Jnuz@e :TLp %@!$%I%K$'#!) `%25 (w:B,gZ/C 9e(Ry^\KII1 f/E!%$/%$#"U!*$4,G I_0}O0f1CNcU;EC{22Bi7B9: h Y 7#<$##! H[-+? GQ p[D< =%8hc],@"sR|,3{x)`^ r @* w"o#7#b"C!On 4i(DBa"U1(dB*'7So (!Tq_![" "X!J ciLfU L+7SW;(qJ\Z*4[ugpV@-@a*lEbnw KUe_i)=!"!! hkJ t~@ Vp!spC4UMJ_1%moh*3LuP 4  Tm !r! W~X> wHR KI1O@xGaN!47`ov -beh H pyztvX 5 5_w "(s6=T\Pb {=-is85"doa 7<gWh:a)j| #DNje, d>\"'r/8Z_?2T-MYFfWupC[F' Dg9  %tUJGh- K>8{%:6vNn<O/77P) E,b55-J " 24-'} m.Q !\Vwl'OTrz B cmm?.R4 j LOgD.PZ7f rs[ bn'87t09Qp E|K mm5VQ| Ya}OyvXP*1zRe|PRL l SolrRCz*P1 9v~3!t0:||<_Bxq6[0$ v. s2 W P{&0+O~ d .XLh 'G'G[ 08+&.v5gjB:}:8>;] 0 5aeqWbR{:, "8)mazWaV|ALzsq{  HTNuFo[  HH=~3&t%Ku&D,sR-~Kgc I )U>Tu 5 D`MqY1 [ g@q}e55>n))"cH N;SZuMzNN=4 I D8UIGQOx(; rII]`1 9@b8%Gi,-`]ww(>& z&d0 0 :|eQ! 3 K & f#Y]>( i[cK#Kpv #*{w6e R2c {'iJwOpaEg.rU;3``+($hx9) d d$ W w t  I/1>d Z   S  ; F6 N | _ s # 2 qv'mPM25Mu 9d \5  ; B F y D  u * 9 V D F uUHkr~1e`"D?^ f'E<]Z 9 e T " % \ K2 ; _ d $  IV # k \ TETcn/7,Uovtb{X %I)$  W ?u k ] # n AMFP C yRs ^ [ )[#9:]<+&Ig?  $  f~88  G m<k^? .\g7 C ]m\En.$V$%U^!kt=+ # R 3 b 8 FMt p -OC3 | >7  Y zElvC3m\2[l- $ # O  0  ,9W Ae3k. _| ,I~p$;rTUIxBqqaug h [[IW (A0yDI}9sqZoo q & il2.eVV.(X#`T yWQK  7 q9+1'>M"iSy4t. Xr`i{ Q/ d(\w M>K(j 5 k Itc}6,c4g B+W6  t6I#K"go*XT $ LdXNz xH~1K{^0q  Al@HH}"M^6g\A4+nw dy,C  A P 9iFB\ P[ChI  ,JW!9,iV3u . ,E@ ' -  N=e!~`5] PH]:Qs $yB?" Lv]] d *   2B)v_E;V$ & e +}YjPc=oG{'|B/ : m > ES]wQg` L nmITfl94n2tNmZjXoh*d!R T  "9O3mLXqRqh  SZf+";qy4L-9fSqE&u w [ ? B ~ Q 7x,ydho (`R V'&19/=t.Tfv beG5Fa 87  7 c !H_[<o;Nv < q u 7Lj rDLnD##Xy+hSUN9 4  u _=7,reBrT jq+Pi$33x:?3xae@  ~ p ) ?Yl}TWQ<  Y [NG[sRu< 0k}~hn4{H! R6eO3|k)p C  ~ wOZ6w*{{Aa9aE1cE|-'9aK9 p , IDyu43:Gf 5  ,7vthV-nh 4F30]-Mui & $OSgQ Fo GS(o $ I Un ]VMO~ze6Pvg]pF Ddg4%O}e?T/t + 2l SD6tqaOql8z& Fo_Wh~ " 6 -S!!XZ B p}iTK? M=(oi3hD V 9T fE+GGN ,JWEBl=FlX>Qg2@'u#4 RDZR   ( S+%SA9G 7  ANC3Di#^:kJIu=z;hKwj ]$3IxJ _0WlYo:eC#qu.Iq.>C5oWr - ;sndh)^K]?d V (dvIyn3zk,R!j0`uY(i)L@  h    34Q"/|8b}(7{v l S|C0+=*3sQy3GR-1a(  ^ H a C&=,7D#(   #F^T (wo]&]PeE?t=c~ o oR@dJqc @ Lg6ue.2xS%6HsU .o^Qg/ :(1fZ"5u ^ t l \  +sD@]fva^D b;Rq}Z4\8j$z#"As}:lH%+ 7 2 T -vA5NLO0 I 4 p =L^,`lz[)I [ N  L ! sEccT{cYt8dYcLSj?Yxqq7 4 A o 7 ^ > 7 8  A  T  !* O|}Dr/\5%8,=$ [  7 > c 3 [ e=*BZolB?(^9 bJ0O7VM >Y$ 6 V 7   U  _~8u T+XFKn $(ey3n[D,.IO{`\hXb)oz  A & b+sZ=Yzbc.iz6tA'zki E^V4qe3$=EcA69! , B       <}C}#EfQ[;|Tu* 6T1AZ$\ ?D9@ _.pZNL/ R  W2uOw3'g -E.)i^! OyK9))JyJZ B v r M * . S t%=8<#Exs?s> $OQy*/G G f m X ]  A5Nr1.eui7=lngvF].{l= $B3u-:b5|  0 ' 6 w y z Xo ; G zOykV{:jH XDO&t,xp)4r z - ~ B atWpnu8O8!V/Jfq56T[!     '   G ` "&e$e:oDq uv5eJCl-bFs@&8iswF  I a  | 0sV:;Rv.VJp~ K|U# FGsp@+G0]  v k m r ' % : qaaqDxEFE5cTo/gRv[G ? , w X  J  H D 0un)=b x+Yx ](7c7ylN=x[{@jo " g *  i %  X :eq-yg N U2o#m:@h[(vKhtJK[~D>> . 4 : $ >4y: iAz@ 1"OoeW5)ikHz8uy\?#'NpO X M"_ Z | S4j# $VGd! I#9 83JX{( er wPc'4@JL3(}z E Q}S3  @1DT|zCoqB9KkSC}T0%JdV& 1s^ G  ' fyj y f t 4=wpI$U G.2%R $f*,X]H1Yd&\w@7h 9 O (}L .  [ g1Q Z wn$ysP^~QnXXd*NpP4w[x28M ] & 2 c  { 9 z o 1 L S wu+G`(TGwsO Z*lbQCt_C=n~ ) J H io- # | T UotZ=GgL(f@f>"00bXt6W5{e % | = 5 ~ h.u- O 3 B e  A[e|d5DiX Z9]"=f8tC T \ : \ 11  Z V O s . )I#KU8qxy@gp"EP0hpDg@`-0  G  r e }  ` 3 % m ? Z bRT% Hsswa#i!A6bX G c & | ! + [ w  r4(`wVq@wLGR?Can._|}9_S8[3N l  ~ ! b R=z G  6 ? 78RI`S-3K>~pA|,4em < u  Z @  n O+.-*B?l6!jSbL=Pj2CO['|zEaSF  @ G p {  Q 4  " + :Reh,m5G*dN]F<7Vao%~D? T #  ^ n , [ r g Z w % S n z ofIA0$D5A3'}l61q-/SF /K 5 c ~ .  : \ b G * 5 c y 8 u[97%2-H;B8@^Nf*%Be{} D  Y  - D >     E Y W<&R,Q#/=MN 4Fq$ uUs o  \ } N E X N D j }wXBr Io:W/n1DT~8;H"&9   + .  }  j g*XQ3bDd" =ot_OMKDLbykfjcS * ~ = ) 1  *"c&$%b dg68~L${G%QGzj A  t 3  B&?ht-jk =zr#!Wc<jf;~k : z d u g  + s19YnsL J52g(Aie-gN W  w ! { 5YolL3X4mB!0v?G9^ "o(U  p  [ u + 8x1ne Jf?{p E = U  n ` a a a Y 6 >  2GE)07* M m C +    N zb5Rz7/$T9J_' IjLtn8   r # e }9&^vK{$9&;iuFF~[>&yd p = L r(W>XLk6x%6%HV2j\y#Y3SDbS? a `  _ $    NZ\d%F X$A*P7\XM lR'@vOl0Qm6 ! ZRfc*}KF1cTrg`:Hq^YxZzx8oC3' e#HyOl/MTa + ` 0;!_q'Y}voICR#<9;W1#`-'5%fs Vl`i 6 h%7$^||Cy+ g}e5-@D&BE~YK?%V;<<EtNu3A#w b F #h'DP(dTa1At| 2Hl9zSy=4U%9)0Mm=s7d+QYa{]YSM@\T0fVDx=x9EsX1g@mR1Bos[,uz |)Ud6;Sx{W=gK-2I,]Q[.cpPQg}\gJpXi +pzF_@QFpNE7fD]9WjLWh~vs D|_6" AwWF9v-jEHE kkz4XR9O9/+=honiI*  IA{,H-{Z/h MI2#z2f<bEcJmIf,\><\D&2|J[>4R\4c@>5N?vVkrgX6U]X_zWJ@~+-JuK89{ CMa'VP.Vmf', #j-|X-l<B7u1q\\D`g{=fei ( A2_u@zJt.|/F=W9w,V?:}@i2c~brf+8 #.?{a2Re)WrS]' JNu [Upr@h^}BFfuO Ua,xWnj}G? 3WjI@SNV5h 0\zf~gu Rl{R    CW]#@I,h="m #3)-W:w0!`um'@uy~~pX("T Q ` \ T =  $F5}L g1Lss>/_=TlhkMS.%U#GF6FRPA ; i  %    PrT {{)!n+A9+, )\T~ R*42.LQ#C\ !5=7 ! C w t  As!gVvz7&iSnsH"GuB)+K^e9+e O  '  G Nit?"9S$g019.8w('Th;wXRb#|(Wb^x m = K S j  h J % h Bx|C:@fP{I~aTlK Tr!fb,z  ] v u t _ 7  J x&p)'sUU@OM.5e/ \@&7]Z)Eqvk?5)  -  i 6  ' o,B!wVC\wI rbaP+efH9Q\K:!,n? QlY4_< e u T 8 d  XY>+#Ce8 dMG{/ BA#.aB::2P@apar}L H e *  k / kBopV@502Z[9"es_o_I5!RR}VcNXPl  U R  { B :F-#&1AvS(8D C r8A3zQ PnvHW{774I;7   \ ( wEZ]~Yv>cQ#s/ohoj3aC /D0 ,-H 5 < g 0 NPm#JzNK'\ks2-c6EaMGPx Jz oZ ym!\z> 8 G  R  }N#9T|1vH $tJZ @Iv? +iGU:G*DsYjV}E G Z 5 h 2  R6 X+gI,062Z)SQX=p b6l|4X yW) @ ^ E  i K 6  >"4^r7B:JiZ?q%AeA K4R5P|S4  # m L ; 4  XJXMB Y(PG0@O48Pq_c) BuE$#KWBDrJ-  $ x \ Q P < e<25% Z 6yWCo0)UE7 ] k N ; ; F <  $Eb4p2d&xYPN7i$)SQd*a^[JY w ] <     n~; rP_[bOV+V0&:tep :TV31cqB  uh ,<hUu0W ];/,Ib}9!,;7"+Wsw !<A #Y^)n{U6(1ECIkX7)vLPDw4 cFyX4G?Y_=9mYOc.LpzTH6nB&/j q1B 'R' V07Rlwp@HxVd f.&\VVoR5'w3\|dO :u<0k*`M.hCHb3p*R,$9Yc4-oF_T~)ZFp#{)e",XqKaa0wk:KWK;UMOtG4CDIf3*C[moL]lGA[li$-&cO7`[ b[gSi@=aqF j&xN@Lg:i!|D;LZUF>>=31K`1x,O\OOoj J>d&=xsO{?zkAP )3PJ^lgXPOH81J`'\V'"FCp.#G :NiY; Y`I1%?60-+X`\Rt83r4U+ x@Cli GIg  PL RJ m3< ! \ V/ Rh@FgsAc$% 2RYcJ%ETq,$RJ\AZ)5\'QL:QVv]} *("W2T%qFO^ L#&50z[D'|DX }f1@'G3vdN_Pf_0ng]y? -7$AtBXDe^e Z0=w "6=/)r|k-K4}bG'$o9bN Cews~ bCh(~ 4GRZV<#ebIY }9TE& )!6v ~ ]wl9GESjn +vw!6"|R&rzs kQ- jZ X7FA(uN sgqOXU -EJ7 )iV&uV[&Y7{v>3/g  FTL+yN!_.570KC iMyNE5^5YO"q-8AT> h  H2FA"^,2xo ^'+,Z N@i9ouA3!z }; :rc pl[a^HLS/<.gK,YlaTh#w7cZG'xY Bwm1z?:aod wq2|+9eux@Y"k/GgpjPg1/VdKnjx]qyH XCVzz~Vx 5|V/WhiW%Z^7a wm|f u}RkRWrn_\nZ? ZLCq] 9RM l' k ZTo&r % 45n).W\t(JpwC}{xltJ]@[[Yu' m P*%HCq)AI; f/$:\xq7i]|geyNl: %"7{Oa^0$g+y;Rw}I_JShz~g)S;WFHc43E0iFVYk~o>1:nxJxquxpN Kzq~+2/mbBFz3*a|}|1m -[9M*0T}Dy#x%#,J2#j(( t229{0{G*_Y3p){!*e7{# }[ .'=B ]2yp.^.g$t5Gj^ Jv[]i63P :X~ll+Ne)4`c%58Fv(mtWj7p {H^poV92.(~>!6Gn}wV3yKkwu}H^UVopf,B50I 9N={Lna'c*_k /WzXSn.~J- :ivpY 5\vxg\o?M6l0D(I ol XHG {^=!QDpvK5ayL{Gp(AC!BaP0n]3)Mq7V<aG]m DblO{:Qem^<(G_dS $m#CNcTc1S dH7'-msVNDBp Vdr;6YE4to?/}:r \^@_[w. (j!>]tyV!W Q)-\sq: KgWUXbOK|%D9im>Lf w[: n1bVazO`q!w;Y--Gx[v4wG;tEjF%6_P~kV:5s r.oK}?V~g9'S/DG$J}-~<_HuT6qT\wP q d >  k$"/io $Bj1b]RRz=P"@rm ]1%pF& Y<yrk } A  gT]\4^.\uKf4Y0}TILAeJ@E\ Y:i<~n;cqwA( n ! wFX;Ah~Al]'iT?|Mp\%*"^2SH  A yWOO2y_ ; TupTx[g }>P>T U P  a !D' =KjDGT>[\<^Cq&u0H*|L$.7{ v 0 Z K > RMM"}AR28H'-kw.WT57;t ie>l/qF  S y e  F H2'Qg0#>Ou8n 6K|@*>u;hxn~D[Ki'm)19 - v w ' A 4 dhp, \ds+k6E"J~')`U0(V(} @ y  [ @ S < zY [W \8?JGm,y>q!W~C }Kmp+ b F ; U Ez85E#rv|2s= K #Et E^!wrW$AF4 t  ` | a  2 "th1,9%vz7U,l&+6Ll<4Dlv5zSkd? ) E , }  eSR'0M$VHa ;x=+F .:?HZv>1=\WWOo!i(dUO  _ ra`r\}EDo \ \{`EV(?fv +s*--QA2!P u ? ^\mg3 h<_)+mGP{7xL\zZEn, rD. v T  0Bl ?<nJukxNdTNLm/*\ Aj|Qxq!TM ; r%g$rU#f2 HJ*E!Hdlg]Y`u@;W}VC_~G~Av u o  :`;T3u6r&s!!~;GFBBMh@>a4w4k1v?5.]) p  8]0E#_U{[Icr[J !#*<^LQ|WZ"]dM Dq7 x  Fp >R.fVzQ9IO4"%MHPaj3ja;'R k e  DzRiH?wfENN4"-IuzHA&@k@oM: B /lLjN$O%pDA; (<['2aV8Sy >{_G; I :|^{_1Ta)wY}KHf4g }!WXLu T z"4"Q q k  N$XlF rPq!zYF-K!$Hz H5/[8a*+UPX[9d! s Z .d/=i(7X#}k]m2k3^[a>)n)m-}.sj >g n S O%JX(W]K=9V<}Dk6#L>?}#Kuf Ac O f  Fe(K=LCu`0,-P ^{2r  j.N ; N = M[y 5Iy:MzL:Us:`@fS{/q1fK!O \koA;a+96=q JM"!M+h;Ub&HBx,Xj1x.i}!%.Ma<l/| a3N<:K#A_!AYCr  DOV;uNzhj3}X(} |[}!or$)s8Ogyt)A)Xj~ &')]U~r9l]_|5$qIT$'bQ[U:Zp*7O1[l}d"AUm&-{NjRC*R6I78_99_#X*wIbB 4>ABt+6Da~!<qwfdC:=OfjZ:t%"V} Bt}|rb+t 0Wo.T:3L"1') yhzr!8{\cdnhld"[I1\ uP!sAO~sh\Ve@8q%rF[(# r.Uvr2*d7aG1g [3\8  /9==>=:;O0OspOje7#<NY`c_M%HyRVzaOV,{rqzNP4KoWIbPs,7;81&tO^V! /W}dFvEw^dA*?Nl&kqaS*9Yt 6Qt2FWchl~6| D, tfwFJnpQq ?1Tn,C`?c5{(102BhQJ@J NDaYx&,E29y'Ei +OxMvP),&#0S91*> s.s OJ[=:{p3V}Aj Al C',(&4YJGEY$% C"Z TgF?znz"Bf!Jx!Mo%f$&*>imqu;:P[]UC+z"MNE|(n}XKpz"?[s2f#>Tcjp `H_p~M,Vps^G)k &0|"K6 -;IZq:p ,T]T5,2nwY-;TFT9]A |.KqJt5wW 6x>Jtm'qzOb|p~_}XxpxG(RvcRG_s #M\#|Dw++}pqxzwrnljhgmw.pIp$v-+IkLGn}F)*yK ax(hTwuRCCFF?6/)# +:Rv3w*[5WEtI(EkQ)OekfT6_q 0nQgW1 G#m/c,f$l9u06+]|iEYmA]hGsmoxK@!aM/q'XUZtNvwX,]#7_e)r UZu,|eSD:7 Lk;A>$Ojuq_Ah.nd}39h?GThQ k0A!5DFul;%=T]VAn#MV%@=n \1Yob[Y^hw'w*NcKkS"a rP'DSTG.I_jIjL [d?h"m]TSXct#q!Hi\$*%V0f)?F@- h}05zC<hkL{gZUW`olv?noIY2`^ *88*z2<B&Z9v> }mZ/ xrt}?5[%:Ez HC,2(=@<}Lz`=CKNT/ S;O|g:tT$Tj${75}%l;kY U&yC%!N%{1[0=*ABiB EG&oBs KzW iV@=CGD:- %7Nn pr-ZaEW)Os:{O h I8tAwmZ= c-whjvzpf``gt(n \ fXd,Oo!]}GpX@ V%Y<,I6 *UfWR2ef"A^~=mk>{+uT>uABy-9 /E_'nL5HMrj:Vt#LdgU493qa:p RZz8 +/0/06DXpV1~d ts,Hb}?PM6U _:*i@{)vFu9 ,BPVXY[bqO%o YP2DQ ;Zr4=1_g E0vT6tlibK ]&1L]fklnv;z VA4yGw -CG6G>{T9sSwR>650v62EPVX[dxL.| w$VZrX!7O\X@3wN `-kr> b)7LY`dit6vf^o6*=A%/444:GUZM,^5h(e.i b"|H$F`p{6oVL[w!GY`_YQOSYU?.Z:j4f ^g:LuWW^2q|oieW8f6Qp6`PdQMUesueF!=g"Tgdv= hqMk-Dn$gM,&8JQG/Jw9k,|!r~C f{e>Ws|,Su Op? '@WebR:! .`%6PtQ0xp)bYX'ilYL@+}@Oc{ ;cGrC'%9Uq{iUD:isA2.@j}n[LC:'{@Ocx0R2W%+FX]UG8-(0Kx E`s.a`/-L6*4]sysdSF?8&~#J_v!JnOo: .ETWN>/"&Ao;UguP Hll1 u8NUPC4)$j?Yv)WeP-*>S`bYJ<1-7S+Pj}2dX&y"w8f.2, F!@aJucW6(*7L`nogYKA>If >b{Fx0pEG]<{!-+ ]U| 2Y'XQT7,1AXo~znbZYe)Y{7dPgjzQ$~  d("Ow 6l<9tF,&/B[szqln} Hy!DlG OD<e(ysfP(L#SX0|1qE-'0C[rumim}Q ?e5x>#vf~3|mVF8"w#e5jFl!f=% )J*n\QM iH88E]x["iZ(`5q >n{I}X"75S 7I pa`k +8Kj)s (A[{MRDx,U{Z(fO?+ LRu/i#@~uy-?KVcs&w >e.cT&T6Up}`5X&|?X ~;|@l)}Bcy,uW<i?x -Uz,BOP>y=z\.cJ \$^ RD{d'<Wy/c (HgMdB0&^X Q"wB%R "2ARe~k>Ufx!Lz/FZk|_%e(g5|@ zN(xN2"#7W*]IPx?b '1;GR\a^L(o,yXHA7!c+yR/rb_cm4s*Rg~UBuP$|_C( :r3k!M4RagecemyyfFGN0$#"vU;'*VH$2@Qk Covi[I1T ~@nK,;c L3Obp~ Fz~rfWG8* Hx6gG& @h NV#S|iYJ8'e(\wbG&0]W/m+M|&#|fSA.^"Xyvtm`K/ 'Wc@ /Ef6BA5! hP:%vD;cQJF?2oc]`m+a5!j1DTdy$JcppdP9& sW>'p=t/vO9.'tXD727EZn~K({c.CUg~.Uq{hS@0$qW?,T) {Cl"\/pI%3Ja{8,0}<Wo ;izgXKB=7*dH4%FiU&sO'(@Z|apn8VsP~rdYRK=$kN9*Lo$Z(a=*EgKah?b?pri`P5kK2!x<]HjL( 'CcF]gGm$Ruk`O4cB) o3ZJkN+:WvPah Jq/] tdXL; vL)WH{A~fJ*:Xw)r#6 ?j$Nz jWI:& \1 i;|4k3u^D%'Jk<1@Do HqeL9+ vJ!pC FJsZ=>`K@MLv!FlbD*yM"_6EV*oT7<]~)`OULt8\~dB$ ^4 ~b; XoD lN10Oo0eQVKs5XzpK(g@ya>i-hF( jK1&=Yw'ZAF :c4Z}wS0jBya=g-mM0lL1#9Tq Tb&d#S'qAyf`gx&N f3[)`%X-?GD7"{hR8tN1 s4dm:m8rL.-E`~G;J'd?w=\pywlX?"sR,dOB:2&<^Rp7X*"Cf%n(zJ2qX0Wt|gN0a<{fZQI<&Op%_%s6M0U|c tE/p Y2XtzgO3hDqcXM=$B\H Yk8 4[*w8\E6n=`yu`G* zY4 t_OC6% p(Hw:Oi9 -Rz KV3 nR B{Ee|oY?"jI#dO@3'bAy>XwI# )Lq*h lBvR<s5Remj]H0r\B#hM:-" e"Ta*F sN06UxM"Ox I(]'592# y_I6# gG. a!\u@ _&pUA79Hb L}K o8Y+]jJ0 jG(Wc(Z&Mril{(Pz l BO?kwY:jG%r>X#h: yK"4Z(dO\!Q~$LoqU7ycH*kHT&e>xZC1%!(:Uu$Iu2(x+V~4TmqX:s\H5 fN>51/-%|S, kO14Ts<| W;`7M[a_S?"jD# sQ0]={dL6$  4Pm=n&j4Tr)584&zO"rZ?#nT<' ti`\`o1LpB8SmyM|bK4~t^I7) 6K_xU1G\pb6yQ2|h\WY`kxtdVKB>?EMUZ[YSG8( 4Kau>o1CSbqyR%b3 pZE4*(,7FXgpog^UOMOVbq}seXK@4--5EXm +S)5@KUan}}eCY'rbRA.0EYeifa]\_fsyw} <] !(0;GRXXQA)W(p^OA4%)@Velljilr} #4Id !'(!i@rcWMB5' !4I]jolheejt&+1;I\s  b>}tkaUG9-'&*4BSbkkd\URT\i|*7AHOYfx{[:wmaRC6-*,3@N[a^UJ@;:@K\n-AQ]eny  ~`B"q_M=1+),4?GIC6'):JZgry}:Sgu#(#   hJ* xeP>/&!"'.42($3BNX`hr&Ik ":NYYQE7,#rS4wk[G2 '4@KVdt5] 3KcvvhYK?71,%kK+ vog\L9$  .;GQ]k}Ak"5Jc{{jYK@6.#gC nWH?82) /@P^juBk#0=K\qkYJ</ mD~W6 "8L^mz5[/?KWevxcQ@0U*a: 5J\kx6\ 6GT`omXF4 k< h= 8Pev#?c$;JWbpmXE3[)yM!{}0Hb|*A`&4?JWhjXG6"['oA~}|xricafu &).8H_{ %/5:CTl$,7G^z|eRA2$~JX*k_YWVSNHCDL_|&07?L_x "'0<HPTW]j~#)3CZxmZJ<.OX)|dVPMLJE?;.]$_.uZH?:962-)*4Hi*9BKXk ,256:BMW]^\]cp%@creZO@* v>yGgRE=83-& &8W$-7EYs$')-6ALRSRRWcu#@dvl^I)X VaG4( )Q (?] &+/6AN[ceefkv "5Quv`Ao6h/gH1!)T;a #,9IWbghjp|#1Ea|\2PG xW=) ?hAj &6BILPXew &6Lj\(u= c&cF. -Uw5` 0=EHLR^o 0Gen;Nr4fF,Cf,W /=FLPVbs#3He{H_+G wT9";\v@j(3:AJWj .@Wv #" f+u>T{U6?Yl{"Ls$/9ETi);Og4=>:3,&"K Vd#~V35HXgy&Mm,:Md3G\u3JVXTNHB=7,`d*n,_= %>Rao'Lj &9Ro-CYt6O\`]XRLGA6$dXXkB.CScv'Oq +=Rl:Um<^u~vme]TG2fI=|Itihs#5FZs=a|#5Jb=_~BkviX@i=n&c/rd\]j $7I^xEk/AVn FhDk~oaQ>%I`H|BrdZTWf-BUk,Z&<Pdz HoAhlXC+ my*P |<o\NB9208Kj '?Vo @r 8Pf{#Kr =^sY@' ?EcPp[MC=98;F]$B[r$V&<Sh}&Nw,Hh{^A$[m}6k-zdULJJMR[m 4Yw!M{ .ATgyHq0MmnN.v;K\LhTHCDIPYg|#Ou549BO]o1[ .X *>JPXds4V{ #8Mc{zY4Y(RX F uR7&&2@Qj9_@p!9IT`p*Gg#B\qtK!U >Q_n7Rp,QpV(yG{"kz4M 3XCiM&Om$A\u2Uud2q@ 9%~4yE2\.^ O0d*Ea|5Tsi6]*7,z+g3?pW 4^:t%7Kb{0Id~rD^'@H7c,tgdk{&V J#Mv C~0CO[iy /CXmgCi0U~$lMqgfp>p(iEo'_(CT`jv ):M`q~ygN*Sw?i[zAtlmy(WE4c =s5O^hq{):K[gnppomi_O6{@h1` XH M|&fMx@r%<IQW`l{ 3ES\_abb_VF/w>f/` ^Z/ -Y \CpDq!*/39CPas&7BIMQSRL?) v=f/` _`8Iv:t Q|=f  *8J_s "4AINRUUOC.~E m5fglD$ -V =tFn%Nx $7Mcv/<EJORRMB.Ku>rx._@&)KrKDj9b "9Qgy #7FPV\__ZO;Ux?os(~X:! ,NvNEk3Y~ #<Sh{ '>NZcjproeR5 l2M v v*Z;"1SzNAe%Im*CZp-EWdnw}}s_Bs7HlkxU9"%Be 5d*Sv'Ij!<Ul4M`nx|hJ!x;Eb [hE*8\-\#Mr ,Oq4Qk0MewoO#t5y8PFU3 *OwN@d(Lo&Fd +JgqMg&c2|'c9EoMDj7\9Yx"Aa~~X(k'[xeI 0\BwEn'Lq.Mm 'Db}gAP ?]Op>>k#U)YAf.Ih0Ke|waBf!P z)y!KBq3f Bt"Dh !)7Lf !6LcwxjX??n(SXm4K|G{%^ ,Mp 5AEFGLWj *:L[eie]QB1G>y4Ks? 'My?pH)Jj4HSVUTW`o &1770%s@FJ |0h:-Mt:l@x7Yy?Ykturnns]5Rc)j$lC& )[sxtu|lU<]$}Hf&]E968>FRbw8k3h =j!=Yryqnqz{m\I5! X$T$Xm[STZdo} 8i1d;m,E^vuoot{~woga\WOC3  zS'f8 X%}{Bn1b1e5Kaw}nd`aeijg`WK?3( jQ4h>W+6Uz1_"U7Ncwqe_^`a`[QE6' {eO9!pH!uO'3NmHw8k5Ndxxjb__^[SG8'lU?*Z5tQ,1Id0_M+G_tvf\WURLC5$zbJ2dAmM* ,B[wFv6h"Eayvjc_ZRF6! rZ?% zY8lQ45Nh*[Q>a}{undVC,|cG* pR0u]F- %@[xCv@s 8a}uk^M6pV:w_E( u^I5;Wt2d1c.\ $-0,  sbM3oQ3z`G/~cK6$&Gg%W.c1b%2<EKKD4tcO6a? aD*oU=) =a!Q.e6g,;GQY_a_TB(xcM4{R,dD% uZA*=e-Z4m ?p+>LW_fjmlgZE(iR9V,xU3w]C* 3^ 4a5oDu9N]gnruvuqhX@!oT:]0oM+ jS;" +WYmy~zunfZJ3rL* _4dAhR>*=j6h1hFxA_uwmaR>$Z3jCwT3zbL8#%M{KN,_ ,Lfy|rgZL<' k@wS-kJ+ }fQ=*9b0e5jEw8Tk{xm`RD3! zO%a>fG+r]I5 @i6k;pHy5Peszysi]O@0 j@yZ9oS8s_K5*Jr:n:oCr &?R_daYM@0 uM%iL.v]E-vaJ21Qy @tBwL{-DU`b]SE4#a:u[@#ybM7 pX>%,Kq7k<rN4K\fgaVF3 yT-iP6|hTA,oU<#,Jo0d3iI{2IZde_RB.pL%gO6p^L9%|bG.(Ek.b5lP8O_hh`S@*c?v_I1wfUC/kP5'Di/e:r#Y#=Rahg]M9 pO+|dN9# teVE2 lP5(Fm:qL:q:Sgtzwl[D) iG!mT>(qbSD3! w\@% $En E)cW;YqnU7fB|^D,~hVF8)}fM30S~#^ F8t 1RmuZ:~]7lM3oYG8+ oYB* "?d>|0j\*MkvY7lI"xT5u]H7) ubM7 &ElQK>|Gi~_:a;b=w]E0 vdR?+6W)j,i\ 9``:vQ)tI#zbJ3 veTB/*Eg;}@}2oIp]5 g@^2 u^G/|l]M=, (@\UY G+X}yU+|T-xIwcN8" ugXI:)(=Tq)f'eK&Qtb=d=e7 lZF2 |n`PA0!,>Ri5q-jHEgjJ$rI"zK~kZJ9'rdUG90-0:GVh{R?zM>^v~iN-}Q(Y+u`O@1#{naUMJOYfw 8jP"T:Xn|wgP3^1g;zcPB6+ vi`^ajw>nON -J_lrqk_M5n?vM$mYJ?6/'  "HuG{4b2=A?7*i;sO*v^MB;630,($%)09AGKKGA91'-Ow8h?j sIa@yeVNIGEDA><Wu 2Tt+E[kuyysj]L7mS<%ym`SE6'  "/AYw,Mk2GWaffaYM>+pYD/xl_RE7(  ".@Ws#Da|2AKPPLE:,oYF2 ~sh\OB5) ")2>Oe ,Kf%3;?>91&ybM:&{ri_VKA70,+-04:AKWh~@]x'28:71)r[F2 zrkc\SJB<99:>CIPYev(If)3895.% kT>)|wqlg`ZSOMNPUZair@`|)5=?=7."pU;# vqpquy|~}|{|~}zxtpljjlpu{;[x"0:?@;2'z^A'zka\[]aeilmmmosy;Xu!+252*wZ=!o^QHCCEJOSVXY[^djrz !:Up "*/0+"hK.s`NA73259?DHKMPU\dmv ';Rj"%$nS7yeRA4+'&)-38<@CFLS\fq{ +;Ncyu\B( r`N>2)%%(,27~hUD6,#'1s\F4$  #.:GS^is} &5DUfx  yY8mVA/   !+7DQ]ju'3AP`pkN.lUA0" #-7CQ^lx %0=JYhwfJ, mWD3&%-6AN[iv  )4@N[iw~fK/vaN>1(#!!$(.5=FP\iv $/;GT`mxzdL3r`QF>978:>CIQYblw (4@MZfs~t_H/sbSH@<;;>BHOV_hs~".:GTanz}iR9 }k\PHC@@BEJPW^gp{(4AN[htmV>% ufZRMJIJMQV\biq{ #/;HVcp|kU<# vh]UPNMNQUZ`fmu} +7CP]ju~kV>& ~pf^ZWVWY]afkqy(4@LXdoy~kV?'rg`[XWXZ]afkqx *4@KVakt~|jU>% ~pf_ZWVWY]aejpx$/9DNXajt}zgQ:# }uolihikmpsw} )4>HR\fq|}iS<%|xutttuwy}(4?JU`my}fN6~vpkhfeeegjou| +6ALXdp}x_E+vkc\VSPNMMOSY`is})5AMXdp}hL0rdWLC<62/--.28@JVcp~ (3?KWcnzgG(}gSB4(  "/=L]n &1<GS_kw  hF$lT?,-?Qdx)4@LYfskG"{_E. ,?Sh} &0;GTan| "$"\6cF,-BXn  &-6@KWdq "%$ jCcC& /F^w   "&*/5<EOYer!'**' ~W.hF' 5Oj!*0221/../148<BIQ[eq~ %''"qI|W5 #=Yu$09>@@>;9778:=@EJRZdp}',.,'lCqL) 'Ca~$3?HMONKHEBAAACEHLRYblx',.,'i?kF",Ji-<GOTUTQMHEBAAABDGLRZdo})/1/*!nDmG$-Lk !3AMVZ\ZVQMHECBBBDFJOW`ly *021+"nElE!zy} *Ii#5DQZ_`_[VQLIGFEFGILQXaly$*,+%kBjC {z} )Hg !3BOX]_]ZUPLHGFFGILPU\fq~&,-+%i@hAyw{%Cc.>JTY\[XSOKHGGHJMPU[clx $,120)kBjCywz >]|(7DNTWWURNKJIJLORV[bjs~%,01.'g>gAxvx~<[z)9GQX\]\YVTSSUX\`ekqy&-//*!~X.~U/ }slknt9Zz/@OZbfhgeb``acgkotz  ',.,&tN$tL&{qkjmt;[{1BQ\dikjhfddehlpu{ "&'$iBlE!~vqqu|%Ee$7HVahlmljgfefimrw| wU/]7zwy=]~$9K[hqx{{xuqnllnquy}~_<rK&}}3Rs !7K\jv~yusrtvy}jK)d> &Dc-BUdr|}wrpopruy|cD"]84Qq 7J\kwzsnjiiknrvz~~bD"`<!HOTWWUPIB<756:@GOW`ir| vV4pL++C\v&1:AEHHE@:4.*),29BLV`kv]:qK*(?Xq&.48:972,&!")2=HT`ly &+,*$ hCqK) 5Mg'-1331,'! (2>JWcp}  )/464.$lEoH%/Ha|&-1342.)$  %-8DP]iv  (.231+ d=hA 8Pj %-368862,&! %-7BN[gr~!',-+% b;iB  ":Rk %-378851+% #*4?KWcnz  %&%^9jE$2Iaz '18=@A?<6/("!'0:EP[ep{ |Y4 gB" $GQZclu  qN)_: %>Wq !2@KRXZ[YUOG>61./39AJRZbir|fDY53Le/@NY`eggd`YPG?8558=DLSZahpyoP. nH& %?Ys*?Q^iptvurmf]SIB>=?DJQW^djqyy\<_:6Ql'?Tfs}}tj^SJEBCFJPUZ_djr|~dG(wQ- ,Hd $>Vk|wj^SLHFHKOSVZ]biq{jP4kG%!=[x!<Vmxj^UOLLMORSUWZ^emvvcM4}[96Sr;Vovi^WSQQRSSRRSUZ`hpw}{vncTA+dE%0Mm;Vqzk^UPMKKJHFDCDGLSZ`ehihgeb_YRG8&uY< 0Ki <Wr~m_TMHEC@=941/038>DHIIHFDA=81'gM4"6Nj$?Zt}k[OF@;73.(! $'('%# s^H3 %4FZr )D^wwcRD:3-("  }lZI7&   .=L\n3Oi   iS@1%vgYJ;,*8HXhy0Nj  {cL7&~pcWJ>1&#.Xu(2:?@<4'mN0vkb\Z[_chknprtw|zuqnkheb``ckw-E^z)2:?@=4'pR3rf\URSVZ^bdfhknsx~{vqnkigecabfnz2Ic~ #-7?DEB:- wX9zl_UMJILPTXZ\^`dhntxzyvrnifdba_]\]aiu.E_{ (4?HNQOH=-kK-~n`TKFDFILOQRTVY^dinppmid`][YWVTSTX_l|'@[w-:FPX\[UK<*|\<sdWMGEEHJMNOPQTW\aeggd`[WTQPNMKJLPXdu&?[x#2?KV^ba\QB1~]=~m]PF?==?BDEFGHKOTZ^aa_\XURQPPOOOQV_l}3Mh .<HS]dgf`UF3{Z8sbRD:411469:;<=?CINSVWVTQOMMMNNOPSZcq(?Yu+;HT^gnqoh\M9$ }\:o^OA6/,-/1355668;@EJMNMJGECCCDFGIMS]l~%>Ws.?MYdmtxwqfVC.eC"udTF;411469:;<<>AEIMPPNKGDA@??@@BEKTbs1Kg(:IVbluyytj[I4lJ) ygWI>74469<=??@ADHMQTTROKGDBA@@@ADIQ^n)C_}#5ER_jrwxsiZH2kI( yhXJ?8568;>ABCDEHLQVXXVSNJFDBAAAACHP\l %?[y "4ES`luz{wm_M7 pN-{jYK@85469<>?@@ADHLQSSQNIEA?>===>AFNZj&@\{ #6FTaltz{vl^K6pN-|k[LA:668;=?@AACEIMQSSQNIEA?>>>>?BGO[k&?[y  2BP]hpvvrhYG2nM, o_QF?<<>BEGHIIJLOSWYYVRMIEBA@@@ADHP\l #<Wt,<JVajpqmcUD/nM-rbTIB>>ADGIKKLLNRVY[[YUPKHEDCCCDGKS^n $=Xt*:HT_hmnj`RA,kJ* qaTIB>?AEIKMNNOQTX\^^\XTOKIGGGGHJNUap $<Vr&5BNYafgbYK9$ dD$rdWMFDEHLPTVVWXZ]`ceeb^YTPMKJIIJKOWbq #;Uq$3?KU]bb^TF3~^>rdWNGEFJNRUWXXYZ]`cdda]XSOLKJJJKNRZfv-E_{,:FPY`cb\QA.qQ1xk^RJECEINSWYZ[[]_beffc_ZUQNLKKLMPU]iy3Ke !1?JS[adb[P@,mM-wj]RIDBDHMQUWXXXY[^abb_\WRNKJIJKLPU^k{ !8Ql'7CNW]bdaZN=)gG' sfYNE@>?CHMPRSSTUWZ\^_]ZVROMMMNPSX^hu.F^x-<HQX^aa^VI8# _@ zm`SH?:9:>CHLNOOPQSWZ\^][XVSSSTVY]bis 6Me~,:DLRVYXTL?-wX9ym`TI@;:;?DIMOPPQRTX[^__^\YXWXY\_choy%<Rj-9CJORTSNE8&nO0}pdXLA9435:?EILMNOQTX]acddcbaacehlqw~2I_v  /:BHKNNLF<.bD%ui]RG=61138?DIMOPRTW\aeijkjiijknrv{ "9Ndz +5<ACDDA;1#wZ=th]RG>7325:@FKOQRTVY^cgkmnnnoprvz)?Ti~$-256651* jN2}qg]RI@9669>EKPTVWXZ]afkorsttuwz~3H\p!(,--+($u[@% zpg^ULE?=>BHOV[_bcdehlqvz|~~~3H\n #$" iO4uld\TMGBACHOW_fknopruy~ 5I\n  w]C(xmd]VNHB?>AGOYbjquwy|%9K\l}    lR9 zog_XRKFCBEKT^hpw|,=N^l{w_F/}ske^XRMJILS[eox0AP^kx|eN7! wpkfa\WUUY_hs}$4CP]hs|gQ:%}vqmiea^\]air} (6DPZdnynYD/{vsolifdfjr|+8CNW_hq|p_K7#}{xuspoqv~  +7AJRY`hq|yn_N;(}{yyz$0;ENV\cjs}zqdUD1 ~}}#/:ENU\cjs}~vl`Q@- '3?JS[bipxzqfYJ8% '2?KV_hou|vl_Q@.}zxxxxxxxz} #.:GS_iqyui[L:&xspnnopqqrtx~ "-8DQ^ju}viZI6" vnhdccceffhjnu #+5@LYeq{}qcTC/zqic_^^_`acdgls} !)1:DP\hs|xk]N=*{rjeb`abdfhjmry")19CNYeox{naTE4! xpidbabdgjlosx #*1:CMXcmv|ui\N?/yrlhffgjloruy #)08AKU_iqw|vj^RE6'ytpooqswz}  $*08?HQZcinrux{xncWL@3&}zwwxz~  !'-3:AIRZagknprtwz}~~{vmdYMB6+  #).4;AIPX^cgijklnpstspjbXMA6+ %*05;AHOU[_bccdefhjjif`XNC8-"  !',27=BHNTZ_bdddcccdeec_XPF;/$  ""!"'-39?DIOTZ_cfgfedcbba`]XQG<1% "%'('%#"#%)/5;AGLRW\aeikkjhfdba`]YSK@5(|zyyyz| "&*-//.-+++-17=CINSX]afilmmkifc`^\XSLC7+{vsrrstvz~ #&)-0355420/025:@FLQV[_cgkmnnlieb_\YUOG=1$yqljijlnquz $),0369<>>=;:99;>CHNSX]aehloqqpmjfb^ZVQJB7* xngb`_acfint{#).148;>ACCCA@??@DHMSX]adhknqrrpmid`[WRLE<1#ulea``beimsy%+.1469<?@A@?=<<>AEJOTY]adgjlmmkhd_[VRMHA8,vngdccfimrw~  '-1368;>@BCBA@??ADHMRW[_behklmljfa\WRMHB;1& }skebbceinsy&-379;=@CEFGFECBBCEIMRVZ^adfhiihe`[VPKE@:3)zpicaabfjpv} %.6;?ACEGIKLLKIGEEEGJMQUY\^`bdeec_[UOJD>92+! }ria]Z[]agmt| #/9AGJMOPRTVWVURPMLLLNQTWZ\^`abba_[VPIC<6/(  }rh_XTSTW\bjr{!.:DLRVXZ\]_``_]ZWTQPOPRSUWXYZZZZYVQLE>81*# wmd\WTSUY_goy"/<HRY^acdefgggeb^YUQNMLLLMMNNMMMLJGB<5.'  }tkd]YVWY^emw "/=IU^ejmoppqqqpnkfa\WSOMLKKJIGFEDB?;6/(  xpib]YXY\bir|,9ER]fmruvvwwwwusnic]WRNJHFDB@><:751-'! {unidaabfmt~*6BOZemtxzzzzzzywtoic\UOJFB@=:742/-*&"ztniecceipx$/;GS_irx|~~~}{xsmf_XQLGC@<9630-+($  {upkgddeiow !,7CO[emtxz{|||||zxsnhaZSMIDA>:741.,)&" ~ysnjgfhkqx)5ALXbkqvxzz{{||{yvqkd]WQLHD@=9630-*'# {vpkgdbcfkrz $0<IU`jqwz|~|vpic]WSNJEA=952.*%  |vqkfa^\]_djrz+8ER^iqx}|unhb]XSNID?;72-(! }wrlfa\YXXZ_elu*8FT`lu}zsmga\VPJD?:4/(!xrlgb\WSPOORW]eny .<KZgs~yrlf_XRKD>81*!wpje`ZUPLIHILQX`is.=L[iv{tmf_XPIB;4+"xohb\WRMIEBABFKR[do{!0@O_mz}unf_WOG@81( wnga\WRMIECBCGLS\ep|$3CSbp}{skc[RJB;3+#|rjc]XSNJEB@?ADJQZdo{ *:JZjx~wnf]TLD<4-${qhaZUOJEA=;:JV`ipvz~|wqlgb]YTOJE@;61+%~xsnieb`acgls{ ,9EPZbioswz}|xtojea]YUQLGB=83-'! ~ysojgffhlqw&2>HRZagknrtwy{|{ywsokfc_\YUQMHC?:4/)#~yuqooqty)4>HPV[_cfilnpqqpnkhda^\YVSPLHC>94/)#}zyy{~&09BINSWZ\_adefgfdb_]ZXVTRPMIEA<83-'!"*29@DHKMOQSVWXYYXVTSQPPONMKHEB>:51+&  $+169<>@ACEGHJKKJJIHGGHHHHFEB@<940+%   &,046899::;<=>>>>=<;;;;;<<;9741.*&!  #(,/24444333445554332222333310-*'#   #'*-/00/..---.....-,,,,-....-+)&"   #%(+-///.-+)('&&%%$#"! !!!!  "%')*,-.///.,)&#!  "&*-/1234444432/,($   '-26:=?@ABBBAA@><840+&!  %-4:?CFHJKKKKJIGEC@<71,&   !+3;BHMPSUWWWWVTSQNKGB=70*# #.8AIPV[_bdeffecb_]ZVRLF?80)! $/:DNV]chloqqrqpnkieb]XQJB:1(   #/:FPZbiotwz{||{yvsplgb[TLC90&  ".:FQ\fnu{~zupkd]ULB7-" *6AMXclt{}xsmg`XOE;0% '2=IT_irzytmf^ULA6+  )4?JU_iryzunh`XPF<1% )3=HR\emtz~~zvqle_WOG=3( $-7AKU^gnuz~|xtoib[TKB9.$  %.7AKT]fmsx|~}{wsnhaZRJA7-"  &.7@IR[ciotx{|||zwtpjd^VOF=3) "+3<ENW_gnty|}{wrlf^VNE;0% %-6?GPYahoty|~|yupjc[SJA6,  '09AJS\dkrw|~{vqkc[SI?5) "+4<ENW_gou{|wrkd[SI?4)"+4=FOX`hpv||wqkc[RH>3'sonic-visualiser-2.3~repack1.orig/samples/silent.wav0000644000175000017500000000040012252354725021405 0ustar miramiraRIFFWAVEfmt D fact,PEAK^Mdatasonic-visualiser-2.3~repack1.orig/samples/README0000644000175000017500000000017012252354725020254 0ustar miramiraSamples from standard Hydrogen drum machine kits, except for piano.wav (ancestry unknown) and click.wav (random noise). sonic-visualiser-2.3~repack1.orig/samples/snare.wav0000644000175000017500000017715012252354725021240 0ustar miramiraRIFF`WAVEfmt Ddata<7 ; T T T G G . . G z; . . zuumm7G . . XL~aH& 2"` G i\\L2ұeL& u& qm. X\L~3q \"&"mP\&?T . mam\XXiq` P P ~ zi7q&qez?&aH H3eXL3HL X?3H?.X~L~?3.3.eX?H&aHۗ.L.eeȱºL]ºe+ºq?$u:ZQhshs6o6okhswl^fQV:Zl^:Z:ZB?>E>El^bQQ996/i35=?qIi35((?qI-i3O15>EqI>EQM:Z:Z6oV6oVwbMkM6oQhs>Eb7V5Qi3M&B6/m" TuT 7u`\ XeX ?Xe?eHL?HH۱a..HaaHaa&qq \?X&LPLX PiT PG ; ; m&z LG XPai 2XaeHۋ qe&qaaݗHLºЏ]+eƥa/ʐ3ʐʐºʐºʐ/3aeȔeȔaa~ƥ+]]]]Џºa~L.٬L7T*\"-+7+7+9O1>E5qI-B&7$O1&i3+95>E>EQQl^Ql^>EQ6/;($ !(+O1i397=O17&-$\T u .   zu("-& zPPii\C3XH.LqC`CXG 2ez; uPiP+i35 B+qIi3M;l^Bf>Eb>Eb>Eb>Eb=l^;V?MO1qI-qI;M>EQ7>E-9i3755i3O1O1(&   P. z" v Cqeeza.~L]/]ºƥ]]ƥ]eºeL~~бԱeȗLƱ3LױaL2q.\C2 ~ "L` i u$("-&i3+7+7(i3$( !\ T  iz T \ 7 L. C&zCqiz2XXa.?e.LƱ3ı3ı333L.~&X.LaHۗ.ٗH۱H۱3ººaeޗH۱LeH?&X3X&&a&LL?P"$" !"&6/O195?9>E=M>EQ>EVqIbMkQ6oVhsQhsMkqIb>Eb>El^BV=M?MqI:ZMl^qIl^?Q7qIi3>Ei3>Ei3>EO1B6/>E6/qI5qI7>E-B&5(Pm ""q`z u` P" umX? C". PP. C?m\`q.2&& a&&a a&H.. a&&Haݱa~~3Hº.ُ]+ƥДƥH++a+.ƥ̔+].ُ ºLaººq3&&רHL~\L3׋ Xu" !$$$"($(&$&"$$&$((+"5+>Ei3M5qI+? !i3i3 !7$;(?(>E(>E&qI !B7uO1P6/\+ $Lz&. *P?z2?e33?~X?L~X~&~ .aae2TT;  TXT. q; *Cq""qiP.L`T  T T T \$O1=?QBV;M7>E7B7=59i37O1O1+(((&& !"""((----O16/7O15--+(6/(O1"6/(i !zG . ; ; qz; \u\ mi`2Le3~? q\ ?qq;2X?~&?חeΗҗ&H3..3He.º.La~ޗHۗ?L a.LHa3aLHe~~~L~3º3Lee~~Le3LL~3ė~—L q mz\ m$6/555 5 O1&m P(- +"+"-$-(6/O1i3999=i3;O1=i3?5B5=5=7?7?797759i3;i3=9?=B?>E=>E9B5=O19-9(5"6/&&(P !" !P&Tvz`L&L?e?q?X2X?q &~HX.eH? ~aLHe~&~L ~qe; * mCXzP T P  P m `  . CmP.\Pu\ mC. T T ` "XLe`m . umT\ 23XHHױ.H&&~~ & zqL&~&&XaaHaqPXze?LΰԹaei i\\ C G zXz.  P. zCTT T 7m.  \C\ iu m\""PzimT .7X;C?~CX C?.C\\2? &zaXa 3eT \$+6/ !+P; mPPT "$-O17;9?O1=(i3$&$"(&+$  7P *TC  X&z? ze3 Ha .X&~~&La ..aH&a3.&HۗHaݱ.ٗ.H~` *mT T \mi  X "$uui\m$(-i3i356/i3$-"u7mT *u. .   *P2m ` & ?aݗLLH۱Hױ. aݱH.aa3eºLa݋"2XX7?mXz?XX&7  \ ; im`  mu $ !& !&$((6/-i3-i3-O1(+$(" !(-++ -($ ! " !& !& !&"( & T `   . i` zPL\L&mCC? &P\2LX?X& &z?ޤ~HHeeX~ʗ~ʋ~ʆ\ІLЗe3aaººaݏH].++׏&?&e3.q ЗHX ??7 ; LP C&* XLX Ti !. $ +\6/m"uPuL $m( X""eei2 6/; 5. i36/zO1(??\. !i"$$("+("("&"\uu iL;  ` !zT u"mmiPu&.  !  L mT L~LP e2m2X2qLXXX& ..a ?a&H& &2 ދLa&ޱHH ae ae.qaݤaeHH.Hee Lqeqe*T G ; mmC. Pu ! $"$&"$""&&"$uC C ; P  &&-6/+6/(m  z !\; T "  PL; 7Pz\mX\P&i\& qz.zЬ~X3&~&L3?L3??&ºL&?`~*q&L*7z? \~&e&&.X ; mC* "m !$ $$(&"m m" ! !&$((-&O1i39u9T i3+7+5;5` -6/5(?G \ z"T !z$u-i(` mi""u u u;  G P\T T P`u `CCCLaX.XH۹ޤHzH۠X&3*LXL; P"Lq.e~°~ʹ.ٗaP3XL? ?&&Lea?aa.a~m?eHa?3qq?i LC&; q3&&??2L?L ?&? ~e T` ~i?2&qL a~?La ` ` TvvT; *`  P &az \ !  !"$&6/6/79-O1 ""$ !$-$(&iP *~Xiz az7m7ei?X ?~eq.7XCei2XP"\C7&C?22zLe?C`CXL?* C CCm**`T C?eL"L7m"T *zC"T mz* PmT; G `mLX qe\eX&aq&L7LTL"C\&L~&H&ޤq eq em"?Ce`a* iP`"LC i\"&(- !$\ ?zG i ! \. . . 7 Lq. G \&2~ L?mޗ.aa3?L~X~XL2?CTezz. L?&2; i z T. G \uuiu\\\PP\\P ! $& !i; PT; 7zXzm" 2;"` X\mmq LXL?ee"LXq3&~ 2LeL 3a݋ޠaXv2 m *X"~qqv3qL um\ LLXz?~Leqq&zX eq\ i*mi CiC X~XCX&. &Xe&7T ePuqu    ;   P7 LTm7T u\` u  &"-+O1i3-5+6/+((&($&" !` "G `uzT . Xz\z` " Tm eP??&~ Xa aHחЗұHLHۋ&qXq? ?LLqeeX \ X&.a.a?eLqzz27?2zL; ; mziPiP\u$&&+$+($ um"++i3(-" ; uiP\ G z7; ;  &Xm*G LX22L\P LXea݋ e qqX \Ce&?&~aqHXL? XC 2&qC ?~qe \&Tiz* ? Xzi. e PmPC\iaCT m`. ; mmi\\i\?T `i`mzz` \` iG P"; .` \Cmu  ! !z   77m &+i"T u * i7i7Xm; \v`X?"*.?&?3qq~ee3e?~qzX33e a?aa33~HeHq&~eee L& e~?3 eLX z&T \*iuC;  G P \G   .TC. ez $i("P\  ! !""iG 7uz C\*u. i; i\ zT "C `  PT      zG *~q~XqL"7&~2zqqX3q3q? C&PLXPLq\~"L~&Xi7LXT"Tz*`7. TT P &z. 2& qm ; `  G T  umi C\G ` uP\ T . C**mTm; &~i&TC"i "m\Pi` i. u. ; Cm\*  ;z G ?`T\"`LC&2i?P*G mCi2&3X&&&?3~?z?&qeLPL2X~; C7&?\\&2"X&C??.z2Cmq m& L `` ` P7u \ .CT T ; u \uzG ` m z T. ; T \` ; z\`\PiuG  *z\`\P?; ~& *qi?*qCi\PizT G .q~L~?e3L&qe?? z i*CqzT&CXG ` G zLq?Xzm. G*Tz\Pazi"*PL"?C XTa  mTe&&"*ziT.;  P \z?&"\q G T \ i   ` P\uz` G * mPiz` G . \uT ` ` " `vm."qmCmzmi2XCC2"&z 2~&2iLe&~&X\qPC~~?&ae e&Xz? XC&&?XiaG mT PzPPPT T CXeX.zXL i\P \  ;  !"$ !\T  . G  ;` ; \ uC *e?T&7`L&iCX&m &&?a LLXzz"XmzTLzX~?zzLXz.\T.*q&" P2eX X; z T  . L.P 2z* \ G &\P CCTCC ; *i` `  G m&LG 7u; m\izT T uuuC G P ; 7. . ` zvz P&eT. i& & 2~~qqeL~e?Xe?L&~~z~Xe?e3XLzPXC&~v"i\"*`z G ; i. P\uu; `  \Pu. ` PP \PG uz; ` ; m7z*P`\z  z ` ; C``"qTiP e&LiCzXP ?~~GqLeLPPP\zP\?X &XT*. ; ~?.C*\LL`XmX""PCG z. &2.L;. `mm `G  Cm T q; T X "m* C` 7m?. . &z**m*q   mm7G zmXm uPiT . 77Czz&*7a\e~C . &X&??CLXL\G  &C2Xz?L 2~.CLC7LT``"mmX27C ;"7. C. ; 7; mzz mP z  ; T G T T m. mG *`T ; m  z`  7`aCe&mmXL?~ "&X&LPi7mz*"C X iP2?qCL&*&m`77*~\q&L22&?Cie *LP~ eqm. *z"P iie m.C?* "*T;7q".*m Gm"z***i. . ;  z; mT G mT T `7*zC T  `; z zG . 7z T 7. . G T . mPq i\ii\PP XL22?\XXP\ eiX&zm?*X`qX~m\&e"Te&?X  C 7T ` X X T " mPme"imzq7?G zT.  G zmTTmG 7 zG LG XG`L7T**qTXGiee"P7XzL.X\P. z *iPeqLC Pe\.PiXX &CLeL&X.&CXi\i"LLqXeLeTq. &X&X&\P&*m    7 G `7&*LzG  P` *"CG  m T G ; z` m ; z7 ; z.  ` P   z. 7L**m T.X?"iX2&C? XX22z2?zzX2 ~qX X&qC C?&2PL 2&PeXm 7 *zzX*mL*. \` ~ ; & * z `G . ; Pi7 G  . um\T ` X ` T  C` ` . mz  m G ; 7 zTLT.m. i i2XLmCGP7P"iLzvL2 .z"2?L 2&PCLX.X P"G&\\& ~.&P\\q Xi"LT ; z**\PCz7iXam7z* ; G ; .  z C G . Ti*Cz*mz.  `m~iz*mLPq\m* ***qTPq.C&i  P\C"qei&;i&eCXm"C&2 L C\CLi &2&aiP X Ciq~. "Ci P Cm.z; ` zz; zC T. mT   7 7T ; m. m . L. z P. .m`;. T` . G z; 7 mT`7m. CPP"LzX7 a2e\X.&&2CPX&*P"? X&.LzP\PXiiLXX.Cq.C.i\\ia` \ v"ii"? ;*&LG* \e"&mzLXT"  . v*G z7. ; *zm. *L*GLC"zT`m`"*X*7m*mmXm*qq va?2?Pai&PXC\q\\\Cv&"\C\ P" ?2CiLP&P7.eeP\PX&*z* LqCT77. 7G . 2zT77z7XaePTXL7\7z*qLqam;"X7* z T&e"z7i" 22\*\.CCXX ;zG.vqiP".ii\&2*PqPiLqzT7X ?&PCe?7T~Ti~X"&zX*LT7; T G "a.  ` " T T 7X7*7"C. . . C 7`*maq2*zT7z\aL.P.GqTLC~eeiC CCC"iLaXiqLv"C\LiL\\ev\aTe L T` CT?`P* .zm`.TC"& G ; .C* ; `; ; T.   *T   ; 7; z. *7`mz. . 7v~P7"*7\L&7iXLL&"X"qPP&i C"\&"Xi?&ii\CC"Gq*".v&*ePPmPXT&TmmiX&77TT```. 7\"7 "C`7z 7G 7*7.iTaz?L"TGziziT;TqLPX7zX*PT.*X*qqzeev\qC.T .L?X&PPXCCP&&Tqi "a\\Pe*7e7a 7.z.*`qzq`zX. &m" zG ;qC". CXC;  z? z**7C`7`Ti*zXmm`7mPL?a.P77vP7 7Cvm&X&LXe Cq &. 2X?PLq&"eCe"&i.\&;LC\;PC ;mm*q&GiCm. CaT`"m"m*T"`T. mCiz*LL;2L?mmCPqeX`mTmTXC.2&G*2eL\72zm\L.~  e"?CPP\PCXLX C&eLa 7iaq*T.Pi Tq 7****X;m*""X\m*zm*7&z&~?T*zXmmmmT7P;~.ie7T7\*.e ivm7GvPPmLe&" P\CCi"PX.X Ci2.em"i."7i&Civm*7""*?TeXG*a"C zXX&TX?LTz*zmT"TPiPTm . *qiCCmG*qmq7&q.7XmzXLLTzm;Ca";2zLTP TGTiq zL;Liz"7""Pii&PP\""i\L.e CPX\e2Xqeqe"eLPa am&zCzLX\XXm``mTT*z7zXz777X*. zmzmG"`TiPPTmmz7P Cm"&q;T&ee& "XPP."Ci\. . \ ".q&"i Pi& \\a Caq"PP"*`XTmmmq?e\*T`777XGGXP`XqLTq*PiX7X7PG`ze**eLL?iq7mqmC"7~"Pve&ieiiCCCP&Pi. iiTLC.\.~;eG. .` &*TX*;XLG*m*C `m`mm;~Xz*Tm\;**mz. .C eiTiqCPe" "i~"LPC&PePPei& iiqqP.i "zT."qe.q\Pi77;7mTXzX*PTm~L&mmmzmG*"L*Xm"." XvL.*q.eLiXX&;e7LimL ePemL?T?**`q;X;?.q CT\q7eeqiq&q&&e\\XC &&?C.&CivPz&ai qiiiiCq2X"m~\mv**"*`T``*7"m*m`*"m*TX*X7L~\ammm7XLL2 .vq*?"&&&.\CGqzG~L*qq "PeePTzqqqTa27mz?aqLLm7X*7**mPi"q2;X7zXXTT.e?TCLGmXL7z7;?GXX*mm G"e.qeP?;T&\*TCqTm?;GG ?~q\*L&~iX`L7mT7PvTqP 7m2?  &&&eiPPi &PP\ &XXiPi &vCCC.\*~P7\z"T*"*7C`Lm7"mC7zm`T7;T"*7~**m;m`LmLTz"TP*P.".ma~v\vqeTi"iC \.7vmCG.\e \?CL*a&LC?e.Tm".i " "P\~.""qq*eC\zmzL*XXm*GX?mXz.~Gzm"zqGXzL7&TiL*7z7*aq??L"XX&qqaP; TeP"\ P..\e&&i\\eC\&mP&C e TeXm*7*L&mT`**`X"*T7m7XLm7&&&&PC"vePee? PCiqLC~"eC*?T.&Pe """.\ PCL.**C;GeXPG&T~qvG7\;*qL;m*XG*mLCvezPmqmX*PL\T"*L.*iX"T"zz*X&*L*mTzzmmL**&&z\&~"qC L;7P\&?*im"a;qmq""..&C\"m ."& e&\iiie&iiCqqe."Ce2mT\7"`L*m***m"XT"zXGXmTLmmT"*Lm777LLvL;Ti~.qPme".\i"?2 P" C?Lq i~iL~zqX7eP7XLX\\;*7mLiL77L.e~via"vP.ai.&CP.?PL\aTm~?e ~L7XLT*qX7*z;T;\maLm*7Xa7;mG~G\G&zXa m.PmG; eTvaPv"PqvC.av"CiiC."*iTL. PqXve"Cq.""eeq"\XGLLX~~TTmm;Xz77`"`*m"7*zGTaqq;e7 T~ PPmXq&P&iie&&&&&P.2.q&.2qPvP~m" e.LzTqTCzzXmLm\mG\X~Xma v2P.a\LTqP &P"P"2P\ "?CqP?.PqC .i&Xm.mX77mLX""&T*Xm77m`LLzmmzXz;7XT&TzPmXG2vaCaeePC CiP2"C&"". C"C"e& Cia.2vC".q.qv.XGq~7zL&7LLGXi**G~zLXzLLzmmmq\7P\*Gqi .C.;e. P &Pq. .i;LPL7*;\GqLmT`z7TTTm\7L*X\Lm\PeL"Cee\P~L aT. \"Cz qPq"?&mmGGi7&z""TTzXXTmmXmmLzz77mq?7*PT2PPP ". .Ce"CeeP"&\P" qi" qq.iee""C2.GL*;2 eP?am7;PmzmmmzLzLXXzmL"LLm*\aGzXz.L7L*i7m~\.iP P. Gv.a?mG2.X&\&v**a7XamL7L*m*.GLG*mLi;7G*;~~q??"?&\.\\\i&e"TiP"i"P2q *P\2.&7\mm*`~TP TmX&Lim?zaiePT2i7qePCi2&P aq"Pv"qe;a";?\qz*zL"T"zm;z77XGTXT**LX**Tz*i~i?\.*Ga27LT eT. qPeP.PvT"e mP\Ce..mma aP.e.i2mLz~mqvm&\\iz;aaa??CT"~L"?2e??e"."eP Tee?qeLimz;7P~*mzziTXL77`zm"T`T```z"**"X**?iLaveCT&e"Te.eq.\q.eCiiqePPP"*2;2*qiim.aaevz"a7aqqX;z~?eCiP a&7P&q ""CvP .7vLav~v2.Pq~\mqqq?.?e Laq.m\a;~X7XTLG*zLXL7q\? a"7;&q7mLiX&P~m7*&7zmeqmP";eiCv?mq.vT?aaPT.av.eP;;\G**Liz&L7L;7***L77*i*z7z*7Gi7PCLTaqX eCqqCi&i"i ii& C\P& \.Te Pq. aeqCLzqXqm*L;mz\7XXTTT*XXz7Li&&"&mL*7&mLCLPq"Ta"LC2TGzvLqCm\;mX*mi7~~LL.v?P*~zXzLLz&*~;&X;;7Lz7;m7L*Pq"zX& zaT Pm"". T?q.2 .PC...eCv2 .C CqqC;me\me~q.?m*X*7Lz&T7L7zTX7T7m\&m*XGGzmmPC Cq~q&i2eqC"CC.P "2 q Pam*qC*m~7m\mzm*zXzL**i"2CGTeCm2Cq i&&&&.q q"eTT2v"C2P\\\ mC;Lm?7m7;7LTGPmz*Lz;\?L~~qa.mq.e?a*&iiqT PPPqee qL\\v~L;;Pm.~P&L*L&*7*&&X*m7"7T77"z""Tm77Xaz.\ qL~7q.X X q~P22eqv"PP.PP".."C PaP~CqmLL**;~vaPqmLPq~&L*qamG~m~L~qaLzP7q" P eCCC qqqq~q\C"X&zmimi~\;;*iTXTz7*m7X7mG*7*i\i;z iaz*aL am*qP;qqv""TP"??~;?2e2e? qaePeqa*L"Pm*X\mm;m\~\7**~a*GX7L*m\LX7XLm&\Pq.q~Lq*\q2a222 q.qq"Cvv2 v2CCC2P" PP...Pm&;q.C"PCLaXqiGLmmi*G*zLm7Lm"LT7*qi*L*mzm*.7**&" X?q*.*aP.qC.P2? a;\&~XX&XG7~~?XLqLGXz\7LGLm7\7a&aGavevv.P.~TmCPTP.eq.qqPPPe . v"2Tev vq";aa&G*L*mm7ii&&iLLXziz\G7GzzL;XXzqGLqa\LLmi&\i\;*XXX?qTPP\L\?*PTaq\m?C.e?*; LLi***7mP.m~G~m&aqC.eCC22 P..aqv.TTq a .q*Tvq.P;z\*i**Gq*iL*mLm~G;;;;\i LT2?CqTCq2TP qPq2v~q7qma"P2q*Gm7G*m7miXX"T7L*zGm*\im~m\G*~m\ .*;~.~  C" PPL;aaP??\PC "aPCqv\m\*vT;ev*q.va?vvCv&\m\PP*~;\;m~?q~ ?P**7~q. av2Paav?a\;Pq qa.\\;mL\;m~L~G***\*****zGLi*77&imX&\~*&~P*;m.m~;.q..e2 2 2aqv."PeP e Teqq?P*i*&a*mXz?**L*iXGGiXGm\qqa\*m\mm~&P.~P;PP  PaqP. q?q"CT?qa?P?C  e..CeL.L.~.G7&G\7LGz*X7i7G~G*;*X*z*X\*Xq7\GL&7mL~qmLGL*i&**\iim**za?q7\;;\*a~~mq 22e\&\a .aPa~\7GG&PPi&zaL~GmGL7X\q\qTT." PP a aq?P..qC*TCq 2q.2vee.ve ?vq*\G;7qz\**;~\G;LLLX&&L**;zX\*;q 7;q;a?;C"v?LLPq*;L\*2v;qi;Gi&Lm&mmL* LGmLLLL7iL?qqemqq? q.Ce2aaP m;m~qa ;*CLCzz. qLL;mLL~;mm~PPamm\m;a;m;~ia;X~iL ?~*\*~\;q?vaCaaPP; aPmLL;\LmL~L*&X&ii&LXi*z&&G7m*;m7X&7m&7L?~?q.e ?a CqvqP q"?qC;* ?*q;a;?;qm~m\X~LL*iqP.PPqqa~~? ?*.*qaq aa?Pq.P?a.??m~m*\*\mL;~L;~*7X~~Xmii&zzz77G\&;\Xm*L**m*~m7iG;m\~*z\L;qPqL*~Lm\;m;*\;;**PqPaq*P P;?2;*aL? ;\~\\;?qPC&m;~&m&m\a; aL;~;\*Pa?.qq.qq. ?.P.?T?q.L \~~L? *P*~\m7&X&mL7GGGzG~m\7**LG*XqmP;\  . qq?Pq?Pq?q\\av?q~77;*??P.;PmL77\L~L\\L*aa??qv? q~~P.  P\ a*mLqa.?m;. ~~LPaa ?7\7L? P**LX;;m~\aPXXXm&*m~*;~mL&&z7z;XL;\L*;LGLzL;*X\L~**.q? q*m*?P?\\LL\m~;;~*;*;~;*z7;\;*L~L\mm*;;a?qa.aqa.P..PPPqvT.aa?qC2.\a~L~;. *.\\q?\\G&iG&7Lm\~&*&*L?aa.L.?;q*;*;qaa\~LL;L;;a;m;Lm~*mL&iX\.qL*Lm~\?*a\~LP?\*L;~mLLmm**;a q q\mLa;; qq.LqLa ?.PqP*;m;~LGG~\;L*?\\m~;~~*."C .mPqq*L...?a**G&G7&mL;~*mXziG&&m~~\**;*L&\~Lqqmq\L;~qLP*..aaaqa.a ?.P??qPqaqqaa;P;?;.L?\q~~\\mqa;mmL*L;\*;m*L;LP;aqPaqP;L. qq*La.q*\**.?;m;*;*LL~mm**LL~L\;;*L\~XLi&*m~\LLm*;~~\L\mqq*L~L\\;;P.aP.qPq~m*PP~~\qq**L~;*L\*m~*~~ma.??q;;qaaqqa. .qqaa. .q?a.?.aaa***q L.~\m~;\;*qa;L*m;LL~~LL\m*L~\~\L~**;;;L~~;P*qLmmL;;LL****~*\;;LL\;\;q;\mm\&;~m~mm~m*;L\aL\L\\L;;*qPaqa**qaq*L**L;.P;L**Pqq.PP;Lm\*;*;L;L*;m\;~LmL?PPP*q;L*aqLmm\a?*m\m~~*mLL~\;~\*q;&\qa.? ??qqqqqaqaqaaqPq P;\aLP\PmP\?;P;Lm*\~~~\;\~;qLa~q;\L**;;qq?qmmm*L\~mL~~;LLLm~~m~;L*m;L;mm~*\~LL;;\\~*m*L*.* \ m?;qL;\m;LmL~L\~\;Lqa;Lmm;aqPP?P?qL~qLP**;L*;LL*qPq~\m*\La q.q?Pqaa aaP?qaqq?Pqqa~**\;**;;\\m~;;LmL**m;;*L\;LLL;*m~;~;P.P\m\qmPaqq?qP*;;*;*LL**LL*;*mL~*~&7~~mL;L;*;*.aaqPP*m*\aPqPPqqqa\~~mmL;**;;m;Lq.?*;**;;*;;*\;L\;**;*;\;~*m;mmm~*L*L*L*\~\LLL\\L;m\*;*\*m;~\~mL**\\m~mm\\;L\;~L\\\mm\\L\\~\\;qP.?aP? P?? .aL*\;LL\m\;*m~*PP*L\\\*;*;*;;;*L\;L*\mLqaq*LL*??a*\~;*~*;L;L\\\\Lmm*;\;LLm~mmLL\;mL\\\mm\~Lm*;***;;L;;L*m;m*\L*qaPaqqaqqqPaP?a;\\*\\*qq*L***;*****Lm~~m\\;L****qqqqq****L\\;;*L*~~mLm;LLLm~\~;*L\;**\\L\mm\*.?qaqqaaq***L\L*;;*;~;\m\;LLL*\~*\*;;;;;;L;**L;aP??aq***\*\L;;L\L\\*m;m\\~LL~;L*;;;*L*L;;L;*;LL\mL;;*~m\L;***LLL;\mm\m\;;~~m\*L*LL;*;\\\\*Lq??aaPaqqqa?Pq*LL;*L*~\~m~~\Lm*;;;m*\;\LL\Lmmm~~mmLL;***L;m;m*\LL;*;*LLLm*~m\***\\*L\;*L*L;*;;*;;\m\\\L~\mL\;***;L\mmmmLL**;;*L;\;L;;;;;;\~~*\*;**;LL*;;*qaqqqaqqP?*LL*;;a??P;LL****;*LL\\L;;\mm*L;;**;*aPq\~m***~\\Lmm~~m~L*~~~\~~mmm\~Lm;LLL~~~L~Lm\~\~*m*L\m\;*L*qP???q;;aqaPPaaaq*;L;Lmm*m*~;~;L;LL**;L;**;LL;\;\;*LLL**\*L;;;L*L*******;\;m;\*;*;**;;LLL;;*L;L;;**;**;*;;;;****L\mL**Lm\;*;;**;;*;**;;;;L\L;;;L;\;\;L;;*L;m\mm\~m~m\\;\;\LL\L\;;**;L\m~\~LmLm;m*\*L*;;**;L\L;*LmL***;;;;**;;;*****;************;*L*LLL\mmL;;;L;LL;\*m;~L\~\~m\\LL*;;;;*;L\m\;*;**;L\;;*;L;;;L*L;L;;;*****;*L*\LLL;L;;;**L\\L;**;L*\*LL\\L**;L;;;L;;L;\L\\*;;;*;L*L*L;********;*********L*\*\L\L\;L;;;*L*L*;*;*****L;\;\*;;;;*;LL;***;;;L;*;*L;;***aaqqaPPPq*;aa;L\;**;;L\*mL~L~;~;mL\LL;;*;*;;*;*********L*L*\*\;mm~~~m~mmm\mLm;m;\L\\\m\~\mm\~Lm;\;;**;\;\;\L\LmLm;m*m\L*;LL************;\\;;;L**L*\;\L\LL\;\;\*\;m;~L~;mLL\L;;;;;;;LL;******;L\;****************;***;*L*;******;;;*****;*LL;**;;;L*L*L*L;***;L;**************;;;;**;;*L*L*LLL;*****;*L;L;;**;L;;****;**;*****;*L*;********;*;*;;*;****;;****;;*****;**;;*****;;*;**************************************;*;**********;;*********;*LL;;;**********;;;***;;*;*;;L;L;;;******;*;**;*L;L;L;L;L;;;;*;**;L\\LLLL;;L;;;;*********;****************************sonic-visualiser-2.3~repack1.orig/samples/hihat.wav0000644000175000017500000006625412252354725021227 0ustar miramiraRIFFlWAVEfmt DXdatalW5,k‚¸3ĩ &/ya a5Rj:WR, &C*5'NOT,5?ǚt15M[YLI:OW6 C*5!':3 & S+;̽ղORӽ,0 3>G,5 /C*e`@` &'j"# C*t8jBa/W6?DN+;g̖ݮ,R @ ٸ5! 5t~''j3 5fjj'/'aܛk³'¸k‡T~'RRt / j"`f1@Ж[Y'y''Rӟ#+ tjBRjB & "@,?+;RIJO'N+{[YyRӂ1@+ C*OXM jH' 0" 0+f IH`L8NjORӂ `1ta?D0^0,ۑ :5 kLRө#~0'ejo M W6?/+;k¥W1' +e?k›3 eM?R0 :1',=fՖ?D0^ ,"f`1թC*@O? 0~HeC*8e H $5ՇTj"t'`'jB՛RC*?ǖT ''D5O'RC*,'j 55̽ՠ~/ɽ//'5!5~+y5L5/?~+; k 5W ecaɖ 0jR~j"fC*,?W6=Lk³3a3?~$ 350T,?D"¸''/~+ j,۩C*WfRө' ?ǽ3k®,y 5!$kC*Dk¥ ?~5!+; + &5!0 C*t j"5j"'ؽծ,D'8¸3IyR[YHRӖ+0~Λ3/M`"/'5/ D¸ &,,+; 0 W6j"jo=?`e,"RӲOj5'MT'ؠW6M¸C*ީ1+ :~30k Մ5O1?='a W6~ΖW6j"03 5oM5 :?1 &'ؖ݌,"1je~~ΖDH 0~ 0M~,۳+C*Ղ",3j+ 'j555!tj ~? 55!W ' &~$/0t t'35 5/~νWf\`R3'`+ 'jI'޽?MM ,? C*,3eW?ǖ =j" /kjO, I1W6o#+ 5,""f+ "eRefC* RӖ@1?W6k 1,,ۂq٩ɲOj0~/,5,0#et"y0"+ 0j5 ""fR` Ю,'ɳj'jfo50jMj` 3I3¸ f8k5fjC*j#jW3 ¸$ ?/ ej?'e/̖C*?f1:ՖjC*+ ?M + e:W ~"f '~'+/aޮ, &'5/ ,یD+e:`eR,?e e: '''~5!e 0et0C*' +\f5'"R'خ,/M"a0+D M 5!`ݩ05 :H ~jW6o50:jj~ '~"ja`+jR~o ~'ؠ5:oef~0je+ M \e5  5 C*j?'a j~ ՠ"'o'Mj' ~j3 5' ,H5+5'0j f?"+ t#R? 5'Mo~'/ # 5~ W?f`0t :0tj/+ 5 '5 f? W6af?'j0~D 5!a + 50j"+ "tWa:M0a?t'jtej0"H e' M`~"j'a$0j"~'5 + oWM ~5+ a fe?~~Ra"0We'M'Mt, ݠ"o  tH RӛC*WRH'a :e ?+ j"j 5a"0M 0t'5+ , ee5H`0:a H/f+ et W05M"`#?toMW'?j  :~ ~t"5:'W'5: " ` +'"`+ eނ 'e,:/5 \eM~ eH+M"W j5+  +j00o &Wfe j\:f ,5 j+to0"+ 005 5j"oH05`,5Wao'؂ a ~5f"Hf'W?Roj5 0e0t efee:5:\~'oj0W5` o'tf"0+5` " o  M0e5!f j?Mjo+ a j5 a 55`o? ?t~M'a  j::Wa 5~'fD f0?:Mo:' :5e+ M 'o 5'o0j j?WW5Hea j0tW~ a e5 + '\W0\~e :?H jj ~oj55'55jjj?y~feeM00fe'M?5 55?05M~55 toe a MM'y'o f5e+ ?t\+ j o 5:\ f'0Mf ef\W ? je t0? 55 j ~~ e?H'f ::\D jfeet M ~Ma MMj'H': '5 05\MM Mo Ht+ 'MM? Me 5?jW+ 055 0' jee:M"0? 5 e5 M\HMj+ jj5`00a~5:a Heeee~t'M 0  "5?0 oHtaa5?'5 :ej +oo"M0H 5 ?:t:?M?M5 Hj'H:My\HW  f+t' jH?R f M05?5 t5'5 0'R tH?\~ \M0 a 5 eo0R?e~~\"0o MM+H:f0o??a:MM\jo5a0'tHM~tReejRj~? W?5?oH t~ tj \M'j"e~o: 05\M'e5M5~tj+ee 5Mj++ejHM M?'j?tojo'af:D'?t'5a~~ejoMMy\tjMea0tW5et?tt5e~e?o\55aMM5o~f+?~jM?? 5y5\"ey\H?DeMaM+?:e'eM5 '?~?a'\0'M~ t~ee0toMe5e~H~tyee ?~5 ~ M\eMo'o5HMe\\~?0y'''5"'\jae5j~?MM??:0R~HHMH Wt+'e+05yH\RjRe"M+t\ea WM'Wy+e':'oM'M'\'yMo~j+RHa5+~'?\:We'Doj'5'Hj''eM?5e~ot0ee'?att'~a:ya0ote5~"j+t5?~Ma'?\ \:~0ye  t+\Wt~5'o~"W+\5'Matt555:ee:0\\o??5t0a '??o5tj'y'~5'~t?5'0 ~o'eo~o? H?DW:+Mt0MRWeM~H"W\""~RjoMWa~M\MR5~'\WaoMoy~ayoR"y'y0~j?'5\?W~o5to5a:\' yy\""Hj?a\+yayH'~"aW ao\j0aea \+~'~0R~~o:\MH+jHe?\Mye""~'Doj'H\0ottMMa: ~+\eDHa\y\o\?yWaoH??y00RD~''D? :j"++H0e?W050oaM:: W\~ M:M~a"D\WD0~?R~Rj~05W:Wjye'?5'~aM"?+~oWa+Wy'MWo\++t"t'MW'5~~"M0oj~:?: \R~~?~ee~HaoD0j5jjD? yeotD+R0WHH~eM WW+ 'WRDjD\aMeeR+Dta?Wo~jWM5e ~y~+oW0oMH e~o~oeojoeajoW Wj~o~\0: +~+HyR:MoH\5eyR5o~5'RWHe\5jRoW?j\ j5 yoo0DW ~R H?j~D+y DW~e~ Rj\+~WDjj H"~ 5D \o+ oj55\tt ~~D+ 0H\M\oDeoj~ +~ MteRM\? RD?~+~?j+~HWo DD5j~ Mo0y 0+WMj~\y 5HMj5eyjyDjD~ D\0D5R+ RR5H 5 \a5Do "DjDD RyHD00 D\D'oHy+D?5M+R05~0e \tW"\ j~?+ o+j\ReHM5"W0~0He 5?Ho5 \j\~5Do\5 ~5DDee HD0D0+H~~ 0D+?WH0D5D\DjyDDD++~"?WyeH0W ja~R5Wj~\H \~ D0~o0+Do 0D~ Do00\0oo oWD"o\0\DW ""e05DDR0R?W+j+~0?Weo5 Wj0~D?y~ Djo\50~R+j~DDHH"WW0H:WjWoM\Da"50 \?\: \o\oW0jDR?jD???eW+0jj~D+H 0\D~W0o jojW05D5DoW  5j5W "5DWW~HD~"5W000j5o0j~W+Wy"0 jW0 ~D?~W?W+~ Dj55DWoH j"Hj H0DW \\HH5oo 0jHWHoo D5oHjHjW\0WDWW\ H5~~DWo0DDjD jD~5o0HWo5\WjDW 0j~j Dj~0W0W~~D0D\ \ Do~ "jW\H 0" ~00j~j"0Dj0W\j0D\Ho\o \o~ WW Wj~WD~Wj~DW j+ W0~0j~0o0"W oo5 o"HoHo5W ~000W0H WH D 00jD 0jWDW W~ 0W~0~W~~0WDj00oWjj~"WDj o"5HHH5j D~D00\D\~\j j DjjW0~ D~ ~ jDjDWo~W \H\j D0j0W o\\00 oHjWW D~ D j 0DW j~j50j 0D0jW0 00 o 0 D D0 0 WDjWj~ D0 o j D~WW~D0\\D\ DW~ ~WD~jD HH\0 j \~ 0 \ W~DDo0WDD D~W W0DD~~ jjj0 00o\5HW0DjD00WW DW\"o\ D0D0j H"5H\D DWD0DDjDjW D0o jDj0 ~WDj0DD D D oj0 jW0DDD 0~~o5DHj DW 00D~0D0 D0W~000~jDo000DD 0 \Dj0DD0~W o\ D0  0  0 0DDj~DD0 WW0 0D0DWD00DWDW0 W0D jD 00 WW oo ooo\\o0jWDWD0D~~~0D00  W 000D0 D~DW~WDWjjW0000o 0  o\o o  0W00 0D0 0~jDDDD0WD0 0j00000D0 00 000  o  D0 WDDDW0 Wj0DW00D0 00DW    \o D0 0D  D 0 D  0000  000   0 0 0WW  DD 00  oo    0 0WD 00W  DD    0 D0 D   0   D000   0 D  00  00 D 0D   0  0D    000W0WW0D 00 0  0 0 0  0  0 000DW0 0D 0 0000 W0 0D  0 D0 0   0   WD0 0D0 0 0  0D 00D00D0  0    0D   0D00 00 0  0 00 00   0      00 0WD DDD 0  D0   000     0WD 0000 0  0000DD000000 DD 0  0  D000   0    00  D 000   00D00D0 0D  D0 0     0  00     0  00 00       00 0    0   0D   000 000 00   0      0    0               00       000  0 0  0   0  0D 0            0                                              sonic-visualiser-2.3~repack1.orig/main/0000755000175000017500000000000012264464201016650 5ustar miramirasonic-visualiser-2.3~repack1.orig/main/Surveyer.cpp0000644000175000017500000001146712252354725021217 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Surveyer.h" #include #include #include #include #include #include #include #include "version.h" #include "transform/TransformFactory.h" #include "plugin/PluginIdentifier.h" Surveyer::Surveyer(QString hostname, QString testPath, QString surveyPath) : m_httpFailed(false), m_hostname(hostname), m_testPath(testPath), m_surveyPath(surveyPath), m_reply(0), m_nm(new QNetworkAccessManager) { QSettings settings; settings.beginGroup("Survey"); if (!settings.contains("countdown")) { settings.setValue("countdown", 15); settings.endGroup(); return; } int countdown = settings.value("countdown").toInt(); if (countdown == 0) { // The countdown value will now remain 0 until we have // successfully tested for a survey and offered it to the // user. If the survey doesn't exist any more, then we'll // simply never present it to the user and the countdown will // remain 0 forever. If the survey does exist, then we offer // the user the chance to respond to it and (regardless of // whether they want to or not) set the countdown to -1 so // that it is never offered again. QUrl url(QString("http://%1/%2").arg(m_hostname).arg(m_testPath)); cerr << "Surveyer: Test URL is " << url << endl; m_reply = m_nm->get(QNetworkRequest(url)); connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError))); connect(m_reply, SIGNAL(finished()), this, SLOT(finished())); } else if (countdown > 0) { settings.setValue("countdown", countdown-1); } settings.endGroup(); } Surveyer::~Surveyer() { if (m_reply) { m_reply->abort(); m_reply->deleteLater(); } delete m_nm; } void Surveyer::error(QNetworkReply::NetworkError) { cerr << "Surveyer: error: " << m_reply->errorString() << endl; m_httpFailed = true; } void Surveyer::finished() { if (m_httpFailed) return; QString title = "Sonic Visualiser - User Survey"; QString text = "

Sonic Visualiser: Take part in our survey!

We at Queen Mary, University of London are running a short survey for users of Sonic Visualiser. We are trying to find out how useful Sonic Visualiser is to people, and what we can do to improve it.

We do not ask for any personal information, and it should only take five minutes.

Would you like to take part?

"; QMessageBox mb(dynamic_cast(parent())); mb.setWindowTitle(title); mb.setText(text); QPushButton *yes = mb.addButton(tr("Yes! Take me to the survey"), QMessageBox::ActionRole); mb.addButton(tr("No, thanks"), QMessageBox::RejectRole); mb.exec(); QSettings settings; settings.beginGroup("Survey"); settings.setValue("countdown", -1); settings.endGroup(); if (mb.clickedButton() == yes) { QString svarg = SV_VERSION; QString platformarg = "unknown"; #ifdef Q_OS_WIN32 platformarg = "win32"; #else #ifdef Q_OS_MAC platformarg = "osx"; #else platformarg = "posix"; #endif #endif QString plugsarg; TransformFactory *tf = TransformFactory::getInstance(); if (tf) { TransformList tl = tf->getAllTransformDescriptions(); std::set packages; for (size_t i = 0; i < tl.size(); ++i) { TransformId id = tl[i].identifier; Transform t; t.setIdentifier(id); QString plugid = t.getPluginIdentifier(); QString type, soname, label; PluginIdentifier::parseIdentifier(plugid, type, soname, label); if (type == "vamp") packages.insert(soname); } for (std::set::const_iterator i = packages.begin(); i != packages.end(); ++i) { if (plugsarg != "") plugsarg = plugsarg + ","; plugsarg = plugsarg + *i; } } QDesktopServices::openUrl(QUrl(QString("http://%1/%2?sv=%3&plugs=%4&platform=%5").arg(m_hostname).arg(m_surveyPath).arg(svarg).arg(plugsarg).arg(platformarg))); } } sonic-visualiser-2.3~repack1.orig/main/NetworkPermissionTester.cpp0000644000175000017500000000607712252354725024265 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "NetworkPermissionTester.h" #include "../version.h" #include #include #include #include #include #include #include #include #include bool NetworkPermissionTester::havePermission() { QSettings settings; settings.beginGroup("Preferences"); QString tag = QString("network-permission-%1").arg(SV_VERSION); bool permish = false; if (settings.contains(tag)) { permish = settings.value(tag, false).toBool(); } else { QDialog d; d.setWindowTitle(QCoreApplication::translate("NetworkPermissionTester", "Welcome to Sonic Visualiser")); QGridLayout *layout = new QGridLayout; d.setLayout(layout); QLabel *label = new QLabel; label->setWordWrap(true); label->setText (QCoreApplication::translate ("NetworkPermissionTester", "

Welcome to Sonic Visualiser!

" "

Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.

" "

Developed in the Centre for Digital Music at Queen Mary, University of London, Sonic Visualiser is provided free as open source software under the GNU General Public License.

" "


" "

Before we go on...

" "

Sonic Visualiser would like to make networking connections and open a network port.

" "

This is to:

" "
  • Find information about available and installed plugins;
  • " "
  • Support the use of Open Sound Control, where configured; and
  • " "
  • Tell you when updates are available.
  • " "
" "

No personal information will be sent, no tracking is carried out, and all requests happen in the background without interrupting your work.

" "

We recommend that you allow this, because it makes Sonic Visualiser more useful. But if you do not wish to do so, please un-check the box below.

")); layout->addWidget(label, 0, 0); QCheckBox *cb = new QCheckBox(QCoreApplication::translate("NetworkPermissionTester", "Allow this")); cb->setChecked(true); layout->addWidget(cb, 1, 0); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok); QObject::connect(bb, SIGNAL(accepted()), &d, SLOT(accept())); layout->addWidget(bb, 2, 0); d.exec(); permish = cb->isChecked(); settings.setValue(tag, permish); } settings.endGroup(); return permish; } sonic-visualiser-2.3~repack1.orig/main/main.cpp0000644000175000017500000004450212252354725020313 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "MainWindow.h" #include "system/System.h" #include "system/Init.h" #include "base/TempDirectory.h" #include "base/PropertyContainer.h" #include "base/Preferences.h" #include "widgets/TipDialog.h" #include "transform/TransformFactory.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../version.h" #include #include #ifdef HAVE_FFTW3F #include #endif /*! \mainpage Sonic Visualiser \section interesting Summary of interesting classes - Data models: Model and subclasses, e.g. WaveFileModel - Graphical layers: Layer and subclasses, displayed on View and its subclass widgets. - Main window class, document class, and file parser: MainWindow, Document, SVFileReader - Turning one model (e.g. audio) into another (e.g. more audio, or a curve extracted from it): Transform, encapsulating the data that need to be stored to be able to reproduce a given transformation; TransformFactory, for discovering the available types of transform; ModelTransformerFactory, ModelTransformer and subclasses, providing the mechanisms for applying transforms to data models - Creating the plugins used by transforms: RealTimePluginFactory, FeatureExtractionPluginFactory. See also the API documentation for Vamp feature extraction plugins at http://www.vamp-plugins.org/code-doc/. - File reading and writing code: AudioFileReader and subclasses, WavFileWriter, DataFileReader, SVFileReader - FFT calculation and cacheing: FFTModel, FFTDataServer - Widgets that show groups of editable properties: PropertyBox for layer properties (contained in a PropertyStack), PluginParameterBox for plugins (contained in a PluginParameterDialog) - Audio playback: AudioCallbackPlaySource and subclasses, AudioCallbackPlayTarget and subclasses, AudioGenerator \section model Data sources: the Model hierarchy A Model is something containing, or knowing how to obtain, data. For example, WaveFileModel is a model that knows how to get data from an audio file; SparseTimeValueModel is a model containing editable "curve" data. Models typically subclass one of a number of abstract subclasses of Model. For example, WaveFileModel subclasses DenseTimeValueModel, which describes an interface for models that have a value at each time point for a given sampling resolution. (Note that WaveFileModel does not actually read the files itself: it uses AudioFileReader classes for that. It just makes data from the files available in a Model.) SparseTimeValueModel uses the SparseModel template class, which provides most of the implementation for models that contain a series of points of some sort -- also used by NoteModel, TextModel, and SparseOneDimensionalModel. Everything that goes on the screen originates from a model, via a layer (see below). The models are contained in a Document object. There is no containment hierarchy or ordering of models in the document. One model is the main model, which defines the sample rate for playback. A model may also be marked as a "derived" model, which means it was generated from another model using some transform (feature extraction or effect plugin, etc) -- the idea being that they can be re-generated using the same transform if a new source model is loaded. \section layer Things that can display data: the Layer hierarchy A Layer is something that knows how to draw parts of a model onto a timeline. For example, WaveformLayer is a layer which draws waveforms, based on WaveFileModel; TimeValueLayer draws curves, based on SparseTimeValueModel; SpectrogramLayer draws spectrograms, based on WaveFileModel (via FFTModel). The most basic functions of a layer are: to draw itself onto a Pane, against a timeline on the x axis; and to permit user interaction. If you were thinking of adding the capability to display a new sort of something, then you would want to add a new layer type. (You may also need a new model type, depending on whether any existing model can capture the data you need.) Depending on the sort of data in question, there are various existing layers that might be appropriate to start from -- for example, a layer that displays images that the user has imported and associated with particular times might have something in common with the existing TextLayer which displays pieces of text that are associated with particular times. Although layers are visual objects, they are contained in the Document in Sonic Visualiser rather than being managed together with display widgets. The Sonic Visualiser file format has separate data and layout sections, and the layers are defined in the data section and then referred to in the layout section which determines which layers may go on which panes (see Pane below). Once a layer class is defined, some basic data about it needs to be set up in the LayerFactory class, and then it will appear in the menus and so on on the main window. \section view Widgets that are used to show layers: The View hierarchy A View is a widget that displays a stack of layers. The most important subclass is Pane, the widget that is used to show most of the data in the main window of Sonic Visualiser. All a pane really does is contain a set of layers and get them to render themselves (one on top of the other, with the topmost layer being the one that is currently interacted with), cache the results, negotiate user interaction with them, and so on. This is generally fiddly, if not especially interesting. Panes are strictly layout objects and are not stored in the Document class; instead the MainWindow contains a PaneStack widget (the widget that takes up most of Sonic Visualiser's main window) which contains a set of panes stacked vertically. Another View subclass is Overview, which is the widget that contains that green waveform showing the entire file at the bottom of the window. */ static QMutex cleanupMutex; static bool cleanedUp = false; static void signalHandler(int /* signal */) { // Avoid this happening more than once across threads cerr << "signalHandler: cleaning up and exiting" << endl; cleanupMutex.lock(); if (!cleanedUp) { TempDirectory::getInstance()->cleanup(); cleanedUp = true; } cleanupMutex.unlock(); exit(0); } class SVApplication : public QApplication { public: SVApplication(int &argc, char **argv) : QApplication(argc, argv), m_readyForFiles(false), m_filepathQueue(QStringList()), m_mainWindow(0) { #ifdef Q_OS_MAC // Override the Qt plugin load path. The default contains the // Qt installation location as well as the application // directory, but we don't ever want to load plugins from // outside the app bundle because we don't know for sure what // (potentially different) versions of the Qt framework // libraries they may have dyld dependencies on. QString apploc(applicationFilePath()); apploc.truncate(apploc.lastIndexOf(QLatin1Char('/'))); apploc = QDir(apploc).canonicalPath(); if (QFile::exists(apploc)) { setLibraryPaths(QStringList() << apploc); } else { setLibraryPaths(QStringList()); } #endif } virtual ~SVApplication() { } void setMainWindow(MainWindow *mw) { m_mainWindow = mw; } void releaseMainWindow() { m_mainWindow = 0; } virtual void commitData(QSessionManager &manager) { if (!m_mainWindow) return; bool mayAskUser = manager.allowsInteraction(); bool success = m_mainWindow->commitData(mayAskUser); manager.release(); if (!success) manager.cancel(); } void handleFilepathArgument(QString path, QSplashScreen *splash); bool m_readyForFiles; QStringList m_filepathQueue; protected: MainWindow *m_mainWindow; bool event(QEvent *); }; int main(int argc, char **argv) { svSystemSpecificInitialisation(); #ifdef Q_WS_X11 #if QT_VERSION >= 0x040500 // QApplication::setGraphicsSystem("raster"); #endif #endif #ifdef Q_OS_MAC if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) { // Fix for OS/X 10.9 font problem QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); } #endif SVApplication application(argc, argv); QStringList args = application.arguments(); signal(SIGINT, signalHandler); signal(SIGTERM, signalHandler); #ifndef Q_OS_WIN32 signal(SIGHUP, signalHandler); signal(SIGQUIT, signalHandler); #endif bool audioOutput = true; bool oscSupport = true; if (args.contains("--help") || args.contains("-h") || args.contains("-?")) { cerr << QApplication::tr( "\nSonic Visualiser is a program for viewing and exploring audio data\nfor semantic music analysis and annotation.\n\nUsage:\n\n %1 [--no-audio] [--no-osc] [ ...]\n\n --no-audio: Do not attempt to open an audio output device\n --no-osc: Do not provide an Open Sound Control port for remote control\n : One or more Sonic Visualiser (.sv) and audio files may be provided.\n").arg(argv[0]) << endl; exit(2); } if (args.contains("--no-audio")) audioOutput = false; if (args.contains("--no-osc")) oscSupport = false; QApplication::setOrganizationName("sonic-visualiser"); QApplication::setOrganizationDomain("sonicvisualiser.org"); QApplication::setApplicationName(QApplication::tr("Sonic Visualiser")); QSplashScreen *splash = 0; QSettings settings; settings.beginGroup("Preferences"); if (settings.value("show-splash", true).toBool()) { QPixmap pixmap(":/icons/sv-splash.png"); QPainter painter; painter.begin(&pixmap); QString text = QString("v%1").arg(SV_VERSION); painter.drawText (pixmap.width() - painter.fontMetrics().width(text) - 10, 10 + painter.fontMetrics().ascent(), text); painter.end(); splash = new QSplashScreen(pixmap); splash->show(); QTimer::singleShot(5000, splash, SLOT(hide())); application.processEvents(); } settings.endGroup(); settings.beginGroup("RDF"); if (!settings.contains("rdf-indices")) { QStringList list; list << "http://www.vamp-plugins.org/rdf/plugins/index.txt"; settings.setValue("rdf-indices", list); } settings.endGroup(); QIcon icon; int sizes[] = { 16, 22, 24, 32, 48, 64, 128 }; for (int i = 0; i < sizeof(sizes)/sizeof(sizes[0]); ++i) { icon.addFile(QString(":icons/sv-%1x%2.png").arg(sizes[i]).arg(sizes[i])); } QApplication::setWindowIcon(icon); QString language = QLocale::system().name(); settings.beginGroup("Preferences"); language = settings.value("locale", language).toString(); settings.endGroup(); QTranslator qtTranslator; QString qtTrName = QString("qt_%1").arg(language); SVDEBUG << "Loading " << qtTrName << "... "; bool success = false; if (!(success = qtTranslator.load(qtTrName))) { QString qtDir = getenv("QTDIR"); if (qtDir != "") { success = qtTranslator.load (qtTrName, QDir(qtDir).filePath("translations")); } } if (!success) { SVDEBUG << "Failed\nFailed to load Qt translation for locale" << endl; } else { cerr << "Done" << endl; } application.installTranslator(&qtTranslator); QTranslator svTranslator; QString svTrName = QString("sonic-visualiser_%1").arg(language); SVDEBUG << "Loading " << svTrName << "... "; svTranslator.load(svTrName, ":i18n"); SVDEBUG << "Done" << endl; application.installTranslator(&svTranslator); StoreStartupLocale(); // Permit size_t and PropertyName to be used as args in queued signal calls qRegisterMetaType("size_t"); qRegisterMetaType("PropertyContainer::PropertyName"); MainWindow *gui = new MainWindow(audioOutput, oscSupport); application.setMainWindow(gui); if (splash) { QObject::connect(gui, SIGNAL(hideSplash()), splash, SLOT(hide())); } QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = (available.width() * 2) / 3; int height = available.height() / 2; if (height < 450) height = (available.height() * 2) / 3; if (width > height * 2) width = height * 2; settings.beginGroup("MainWindow"); QSize size = settings.value("size", QSize(width, height)).toSize(); gui->resizeConstrained(size); if (settings.contains("position")) { QRect prevrect(settings.value("position").toPoint(), size); if (!(available & prevrect).isEmpty()) { gui->move(prevrect.topLeft()); } } if (settings.value("maximised", false).toBool()) { gui->setWindowState(Qt::WindowMaximized); } settings.endGroup(); gui->show(); // The MainWindow class seems to have trouble dealing with this if // it tries to adapt to this preference before the constructor is // complete. As a lazy hack, apply it explicitly from here gui->preferenceChanged("Property Box Layout"); application.m_readyForFiles = true; // Ready to receive files from e.g. Apple Events for (QStringList::iterator i = args.begin(); i != args.end(); ++i) { if (i == args.begin()) continue; if (i->startsWith('-')) continue; QString path = *i; application.handleFilepathArgument(path, splash); } for (QStringList::iterator i = application.m_filepathQueue.begin(); i != application.m_filepathQueue.end(); ++i) { QString path = *i; application.handleFilepathArgument(path, splash); } #ifdef HAVE_FFTW3F settings.beginGroup("FFTWisdom"); QString wisdom = settings.value("wisdom").toString(); if (wisdom != "") { fftwf_import_wisdom_from_string(wisdom.toLocal8Bit().data()); } #ifdef HAVE_FFTW3 wisdom = settings.value("wisdom_d").toString(); if (wisdom != "") { fftw_import_wisdom_from_string(wisdom.toLocal8Bit().data()); } #endif settings.endGroup(); #endif if (splash) splash->finish(gui); delete splash; /* TipDialog tipDialog; if (tipDialog.isOK()) { tipDialog.exec(); } */ int rv = application.exec(); gui->hide(); cleanupMutex.lock(); if (!cleanedUp) { TransformFactory::deleteInstance(); TempDirectory::getInstance()->cleanup(); cleanedUp = true; } application.releaseMainWindow(); #ifdef HAVE_FFTW3F settings.beginGroup("FFTWisdom"); char *cwisdom = fftwf_export_wisdom_to_string(); if (cwisdom) { settings.setValue("wisdom", cwisdom); free(cwisdom); } #ifdef HAVE_FFTW3 cwisdom = fftw_export_wisdom_to_string(); if (cwisdom) { settings.setValue("wisdom_d", cwisdom); free(cwisdom); } #endif settings.endGroup(); #endif delete gui; cleanupMutex.unlock(); return rv; } bool SVApplication::event(QEvent *event){ QString thePath; switch (event->type()) { case QEvent::FileOpen: thePath = static_cast(event)->file(); if(m_readyForFiles) handleFilepathArgument(thePath, NULL); else m_filepathQueue.append(thePath); return true; default: return QApplication::event(event); } } /** Application-global handler for filepaths passed in, e.g. as command-line arguments or apple events */ void SVApplication::handleFilepathArgument(QString path, QSplashScreen *splash){ static bool haveSession = false; static bool haveMainModel = false; static bool havePriorCommandLineModel = false; MainWindow::FileOpenStatus status = MainWindow::FileOpenFailed; #ifdef Q_OS_WIN32 path.replace("\\", "/"); #endif if (path.endsWith("sv")) { if (!haveSession) { status = m_mainWindow->openSessionFile(path); if (status == MainWindow::FileOpenSucceeded) { haveSession = true; haveMainModel = true; } } else { cerr << "WARNING: Ignoring additional session file argument \"" << path << "\"" << endl; status = MainWindow::FileOpenSucceeded; } } if (status != MainWindow::FileOpenSucceeded) { if (!haveMainModel) { status = m_mainWindow->open(path, MainWindow::ReplaceSession); if (status == MainWindow::FileOpenSucceeded) { haveMainModel = true; } } else { if (haveSession && !havePriorCommandLineModel) { status = m_mainWindow->open(path, MainWindow::AskUser); if (status == MainWindow::FileOpenSucceeded) { havePriorCommandLineModel = true; } } else { status = m_mainWindow->open(path, MainWindow::CreateAdditionalModel); } } } if (status == MainWindow::FileOpenFailed) { if (splash) splash->hide(); QMessageBox::critical (m_mainWindow, QMessageBox::tr("Failed to open file"), QMessageBox::tr("File or URL \"%1\" could not be opened").arg(path)); } else if (status == MainWindow::FileOpenWrongMode) { if (splash) splash->hide(); QMessageBox::critical (m_mainWindow, QMessageBox::tr("Failed to open file"), QMessageBox::tr("Audio required

Please load at least one audio file before importing annotation data")); } } sonic-visualiser-2.3~repack1.orig/main/Surveyer.h0000644000175000017500000000216012252354725020652 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SURVEYER_H_ #define _SURVEYER_H_ #include #include #include #include class QNetworkAccessManager; class Surveyer : public QObject { Q_OBJECT public: Surveyer(QString hostname, QString testPath, QString surveyPath); virtual ~Surveyer(); protected slots: void finished(); void error(QNetworkReply::NetworkError); private: bool m_httpFailed; QString m_hostname; QString m_testPath; QString m_surveyPath; QNetworkReply *m_reply; QNetworkAccessManager *m_nm; }; #endif sonic-visualiser-2.3~repack1.orig/main/NetworkPermissionTester.h0000644000175000017500000000135412252354725023723 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef NETWORK_PERMISSION_TESTER_H #define NETWORK_PERMISSION_TESTER_H class NetworkPermissionTester { public: NetworkPermissionTester() { } bool havePermission(); }; #endif sonic-visualiser-2.3~repack1.orig/main/PreferencesDialog.cpp0000644000175000017500000005205212252354725022747 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PreferencesDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "widgets/WindowTypeSelector.h" #include "widgets/IconLoader.h" #include "base/Preferences.h" #include "audioio/AudioTargetFactory.h" #include "base/ResourceFinder.h" #include "version.h" PreferencesDialog::PreferencesDialog(QWidget *parent) : QDialog(parent), m_audioDevice(0), m_changesOnRestart(false) { setWindowTitle(tr("Sonic Visualiser: Application Preferences")); Preferences *prefs = Preferences::getInstance(); QGridLayout *grid = new QGridLayout; setLayout(grid); m_tabs = new QTabWidget; grid->addWidget(m_tabs, 0, 0); m_tabs->setTabPosition(QTabWidget::North); // Create this first, as slots that get called from the ctor will // refer to it m_applyButton = new QPushButton(tr("Apply")); // Create all the preference widgets first, then create the // individual tab widgets and place the preferences in their // appropriate places in one go afterwards int min, max, deflt, i; m_windowType = WindowType(prefs->getPropertyRangeAndValue ("Window Type", &min, &max, &deflt)); m_windowTypeSelector = new WindowTypeSelector(m_windowType); connect(m_windowTypeSelector, SIGNAL(windowTypeChanged(WindowType)), this, SLOT(windowTypeChanged(WindowType))); QComboBox *smoothing = new QComboBox; int sm = prefs->getPropertyRangeAndValue("Spectrogram Y Smoothing", &min, &max, &deflt); m_spectrogramSmoothing = sm; for (i = min; i <= max; ++i) { smoothing->addItem(prefs->getPropertyValueLabel("Spectrogram Y Smoothing", i)); } smoothing->setCurrentIndex(sm); connect(smoothing, SIGNAL(currentIndexChanged(int)), this, SLOT(spectrogramSmoothingChanged(int))); QComboBox *xsmoothing = new QComboBox; int xsm = prefs->getPropertyRangeAndValue("Spectrogram X Smoothing", &min, &max, &deflt); m_spectrogramXSmoothing = xsm; for (i = min; i <= max; ++i) { xsmoothing->addItem(prefs->getPropertyValueLabel("Spectrogram X Smoothing", i)); } xsmoothing->setCurrentIndex(xsm); connect(xsmoothing, SIGNAL(currentIndexChanged(int)), this, SLOT(spectrogramXSmoothingChanged(int))); QComboBox *propertyLayout = new QComboBox; int pl = prefs->getPropertyRangeAndValue("Property Box Layout", &min, &max, &deflt); m_propertyLayout = pl; for (i = min; i <= max; ++i) { propertyLayout->addItem(prefs->getPropertyValueLabel("Property Box Layout", i)); } propertyLayout->setCurrentIndex(pl); connect(propertyLayout, SIGNAL(currentIndexChanged(int)), this, SLOT(propertyLayoutChanged(int))); m_tuningFrequency = prefs->getTuningFrequency(); QDoubleSpinBox *frequency = new QDoubleSpinBox; frequency->setMinimum(100.0); frequency->setMaximum(5000.0); frequency->setSuffix(" Hz"); frequency->setSingleStep(1); frequency->setValue(m_tuningFrequency); frequency->setDecimals(2); connect(frequency, SIGNAL(valueChanged(double)), this, SLOT(tuningFrequencyChanged(double))); QComboBox *audioDevice = new QComboBox; std::vector devices = AudioTargetFactory::getInstance()->getCallbackTargetNames(); QSettings settings; settings.beginGroup("Preferences"); QString targetName = settings.value("audio-target", "").toString(); settings.endGroup(); for (int i = 0; i < (int)devices.size(); ++i) { audioDevice->addItem(AudioTargetFactory::getInstance() ->getCallbackTargetDescription(devices[i])); if (targetName == devices[i]) audioDevice->setCurrentIndex(i); } connect(audioDevice, SIGNAL(currentIndexChanged(int)), this, SLOT(audioDeviceChanged(int))); QComboBox *resampleQuality = new QComboBox; int rsq = prefs->getPropertyRangeAndValue("Resample Quality", &min, &max, &deflt); m_resampleQuality = rsq; for (i = min; i <= max; ++i) { resampleQuality->addItem(prefs->getPropertyValueLabel("Resample Quality", i)); } resampleQuality->setCurrentIndex(rsq); connect(resampleQuality, SIGNAL(currentIndexChanged(int)), this, SLOT(resampleQualityChanged(int))); QCheckBox *resampleOnLoad = new QCheckBox; m_resampleOnLoad = prefs->getResampleOnLoad(); resampleOnLoad->setCheckState(m_resampleOnLoad ? Qt::Checked : Qt::Unchecked); connect(resampleOnLoad, SIGNAL(stateChanged(int)), this, SLOT(resampleOnLoadChanged(int))); m_tempDirRootEdit = new QLineEdit; QString dir = prefs->getTemporaryDirectoryRoot(); m_tempDirRoot = dir; dir.replace("$HOME", tr("")); m_tempDirRootEdit->setText(dir); m_tempDirRootEdit->setReadOnly(true); QPushButton *tempDirButton = new QPushButton; tempDirButton->setIcon(IconLoader().load("fileopen")); connect(tempDirButton, SIGNAL(clicked()), this, SLOT(tempDirButtonClicked())); tempDirButton->setFixedSize(QSize(24, 24)); QCheckBox *showSplash = new QCheckBox; m_showSplash = prefs->getShowSplash(); showSplash->setCheckState(m_showSplash ? Qt::Checked : Qt::Unchecked); connect(showSplash, SIGNAL(stateChanged(int)), this, SLOT(showSplashChanged(int))); #ifndef Q_OS_MAC QComboBox *bgMode = new QComboBox; int bg = prefs->getPropertyRangeAndValue("Background Mode", &min, &max, &deflt); m_backgroundMode = bg; for (i = min; i <= max; ++i) { bgMode->addItem(prefs->getPropertyValueLabel("Background Mode", i)); } bgMode->setCurrentIndex(bg); connect(bgMode, SIGNAL(currentIndexChanged(int)), this, SLOT(backgroundModeChanged(int))); #endif settings.beginGroup("Preferences"); QString userLocale = settings.value("locale", "").toString(); m_currentLocale = userLocale; QString permishTag = QString("network-permission-%1").arg(SV_VERSION); m_networkPermission = settings.value(permishTag, false).toBool(); settings.endGroup(); QComboBox *locale = new QComboBox; QStringList localeFiles = QDir(":i18n").entryList(QStringList() << "*.qm"); locale->addItem(tr("Follow system locale")); m_locales.push_back(""); if (userLocale == "") { locale->setCurrentIndex(0); } foreach (QString f, localeFiles) { QString f0 = f; f.replace("sonic-visualiser_", "").replace(".qm", ""); if (f == f0) { // our expectations about filename format were not met cerr << "INFO: Unexpected filename " << f << " in i18n resource directory" << endl; } else { m_locales.push_back(f); QString displayText; // Add new translations here if (f == "ru") displayText = tr("Russian"); else if (f == "en_GB") displayText = tr("British English"); else if (f == "en_US") displayText = tr("American English"); else if (f == "cs_CZ") displayText = tr("Czech"); else displayText = f; locale->addItem(QString("%1 [%2]").arg(displayText).arg(f)); if (userLocale == f) { locale->setCurrentIndex(locale->count() - 1); } } } connect(locale, SIGNAL(currentIndexChanged(int)), this, SLOT(localeChanged(int))); QCheckBox *networkPermish = new QCheckBox; networkPermish->setCheckState(m_networkPermission ? Qt::Checked : Qt::Unchecked); connect(networkPermish, SIGNAL(stateChanged(int)), this, SLOT(networkPermissionChanged(int))); QSpinBox *fontSize = new QSpinBox; int fs = prefs->getPropertyRangeAndValue("View Font Size", &min, &max, &deflt); m_viewFontSize = fs; fontSize->setMinimum(min); fontSize->setMaximum(max); fontSize->setSuffix(" pt"); fontSize->setSingleStep(1); fontSize->setValue(fs); connect(fontSize, SIGNAL(valueChanged(int)), this, SLOT(viewFontSizeChanged(int))); QComboBox *ttMode = new QComboBox; int tt = prefs->getPropertyRangeAndValue("Time To Text Mode", &min, &max, &deflt); m_timeToTextMode = tt; for (i = min; i <= max; ++i) { ttMode->addItem(prefs->getPropertyValueLabel("Time To Text Mode", i)); } ttMode->setCurrentIndex(tt); connect(ttMode, SIGNAL(currentIndexChanged(int)), this, SLOT(timeToTextModeChanged(int))); // General tab QFrame *frame = new QFrame; QGridLayout *subgrid = new QGridLayout; frame->setLayout(subgrid); int row = 0; subgrid->addWidget(new QLabel(tr("%1:").arg(tr("User interface language"))), row, 0); subgrid->addWidget(locale, row++, 1, 1, 1); subgrid->addWidget(new QLabel(tr("%1:").arg(tr("Allow network usage"))), row, 0); subgrid->addWidget(networkPermish, row++, 1, 1, 1); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Temporary Directory Root"))), row, 0); subgrid->addWidget(m_tempDirRootEdit, row, 1, 1, 1); subgrid->addWidget(tempDirButton, row, 2, 1, 1); row++; subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Resample On Load"))), row, 0); subgrid->addWidget(resampleOnLoad, row++, 1, 1, 1); subgrid->addWidget(new QLabel(tr("Playback audio device:")), row, 0); subgrid->addWidget(audioDevice, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Resample Quality"))), row, 0); subgrid->addWidget(resampleQuality, row++, 1, 1, 2); subgrid->setRowStretch(row, 10); m_tabOrdering[GeneralTab] = m_tabs->count(); m_tabs->addTab(frame, tr("&General")); // Appearance tab frame = new QFrame; subgrid = new QGridLayout; frame->setLayout(subgrid); row = 0; subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Property Box Layout"))), row, 0); subgrid->addWidget(propertyLayout, row++, 1, 1, 2); #ifndef Q_OS_MAC subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Background Mode"))), row, 0); subgrid->addWidget(bgMode, row++, 1, 1, 2); #endif subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("View Font Size"))), row, 0); subgrid->addWidget(fontSize, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Time To Text Mode"))), row, 0); subgrid->addWidget(ttMode, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Show Splash Screen"))), row, 0); subgrid->addWidget(showSplash, row++, 1, 1, 1); subgrid->setRowStretch(row, 10); m_tabOrdering[AppearanceTab] = m_tabs->count(); m_tabs->addTab(frame, tr("&Appearance")); // Analysis tab frame = new QFrame; subgrid = new QGridLayout; frame->setLayout(subgrid); row = 0; subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Tuning Frequency"))), row, 0); subgrid->addWidget(frequency, row++, 1, 1, 2); subgrid->addWidget(new QLabel(prefs->getPropertyLabel ("Spectrogram Y Smoothing")), row, 0); subgrid->addWidget(smoothing, row++, 1, 1, 2); subgrid->addWidget(new QLabel(prefs->getPropertyLabel ("Spectrogram X Smoothing")), row, 0); subgrid->addWidget(xsmoothing, row++, 1, 1, 2); subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel ("Window Type"))), row, 0); subgrid->addWidget(m_windowTypeSelector, row++, 1, 2, 2); subgrid->setRowStretch(row, 10); row++; subgrid->setRowStretch(row, 10); m_tabOrdering[AnalysisTab] = m_tabs->count(); m_tabs->addTab(frame, tr("Anal&ysis")); // Template tab frame = new QFrame; subgrid = new QGridLayout; frame->setLayout(subgrid); row = 0; subgrid->addWidget(new QLabel(tr("Default session template for audio files:")), row++, 0); QListWidget *lw = new QListWidget(); subgrid->addWidget(lw, row, 0); subgrid->setRowStretch(row, 10); row++; settings.beginGroup("MainWindow"); m_currentTemplate = settings.value("sessiontemplate", "").toString(); settings.endGroup(); lw->addItem(tr("Standard Waveform")); if (m_currentTemplate == "" || m_currentTemplate == "default") { lw->setCurrentRow(lw->count()-1); } m_templates.push_back(""); QStringList templates = ResourceFinder().getResourceFiles("templates", "svt"); std::set byName; foreach (QString t, templates) { byName.insert(QFileInfo(t).baseName()); } foreach (QString t, byName) { if (t.toLower() == "default") continue; m_templates.push_back(t); lw->addItem(t); if (m_currentTemplate == t) { lw->setCurrentRow(lw->count()-1); } } connect(lw, SIGNAL(currentRowChanged(int)), this, SLOT(defaultTemplateChanged(int))); m_tabOrdering[TemplateTab] = m_tabs->count(); m_tabs->addTab(frame, tr("Session &Template")); QDialogButtonBox *bb = new QDialogButtonBox(Qt::Horizontal); grid->addWidget(bb, 1, 0); QPushButton *ok = new QPushButton(tr("OK")); QPushButton *cancel = new QPushButton(tr("Cancel")); bb->addButton(ok, QDialogButtonBox::AcceptRole); bb->addButton(m_applyButton, QDialogButtonBox::ApplyRole); bb->addButton(cancel, QDialogButtonBox::RejectRole); connect(ok, SIGNAL(clicked()), this, SLOT(okClicked())); connect(m_applyButton, SIGNAL(clicked()), this, SLOT(applyClicked())); connect(cancel, SIGNAL(clicked()), this, SLOT(cancelClicked())); m_applyButton->setEnabled(false); } PreferencesDialog::~PreferencesDialog() { SVDEBUG << "PreferencesDialog::~PreferencesDialog()" << endl; } void PreferencesDialog::switchToTab(Tab t) { if (m_tabOrdering.contains(t)) { m_tabs->setCurrentIndex(m_tabOrdering[t]); } } void PreferencesDialog::windowTypeChanged(WindowType type) { m_windowType = type; m_applyButton->setEnabled(true); } void PreferencesDialog::spectrogramSmoothingChanged(int smoothing) { m_spectrogramSmoothing = smoothing; m_applyButton->setEnabled(true); } void PreferencesDialog::spectrogramXSmoothingChanged(int smoothing) { m_spectrogramXSmoothing = smoothing; m_applyButton->setEnabled(true); } void PreferencesDialog::propertyLayoutChanged(int layout) { m_propertyLayout = layout; m_applyButton->setEnabled(true); } void PreferencesDialog::tuningFrequencyChanged(double freq) { m_tuningFrequency = freq; m_applyButton->setEnabled(true); } void PreferencesDialog::audioDeviceChanged(int s) { m_audioDevice = s; m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::resampleQualityChanged(int q) { m_resampleQuality = q; m_applyButton->setEnabled(true); } void PreferencesDialog::resampleOnLoadChanged(int state) { m_resampleOnLoad = (state == Qt::Checked); m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::networkPermissionChanged(int state) { m_networkPermission = (state == Qt::Checked); m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::showSplashChanged(int state) { m_showSplash = (state == Qt::Checked); m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::defaultTemplateChanged(int i) { m_currentTemplate = m_templates[i]; m_applyButton->setEnabled(true); } void PreferencesDialog::localeChanged(int i) { m_currentLocale = m_locales[i]; m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::tempDirRootChanged(QString r) { m_tempDirRoot = r; m_applyButton->setEnabled(true); } void PreferencesDialog::tempDirButtonClicked() { QString dir = QFileDialog::getExistingDirectory (this, tr("Select a directory to create cache subdirectory in"), m_tempDirRoot); if (dir == "") return; m_tempDirRootEdit->setText(dir); tempDirRootChanged(dir); m_changesOnRestart = true; } void PreferencesDialog::backgroundModeChanged(int mode) { m_backgroundMode = mode; m_applyButton->setEnabled(true); m_changesOnRestart = true; } void PreferencesDialog::timeToTextModeChanged(int mode) { m_timeToTextMode = mode; m_applyButton->setEnabled(true); } void PreferencesDialog::viewFontSizeChanged(int sz) { m_viewFontSize = sz; m_applyButton->setEnabled(true); } void PreferencesDialog::okClicked() { applyClicked(); accept(); } void PreferencesDialog::applyClicked() { Preferences *prefs = Preferences::getInstance(); prefs->setWindowType(WindowType(m_windowType)); prefs->setSpectrogramSmoothing(Preferences::SpectrogramSmoothing (m_spectrogramSmoothing)); prefs->setSpectrogramXSmoothing(Preferences::SpectrogramXSmoothing (m_spectrogramXSmoothing)); prefs->setPropertyBoxLayout(Preferences::PropertyBoxLayout (m_propertyLayout)); prefs->setTuningFrequency(m_tuningFrequency); prefs->setResampleQuality(m_resampleQuality); prefs->setResampleOnLoad(m_resampleOnLoad); prefs->setShowSplash(m_showSplash); prefs->setTemporaryDirectoryRoot(m_tempDirRoot); prefs->setBackgroundMode(Preferences::BackgroundMode(m_backgroundMode)); prefs->setTimeToTextMode(Preferences::TimeToTextMode(m_timeToTextMode)); prefs->setViewFontSize(m_viewFontSize); std::vector devices = AudioTargetFactory::getInstance()->getCallbackTargetNames(); QSettings settings; settings.beginGroup("Preferences"); QString permishTag = QString("network-permission-%1").arg(SV_VERSION); settings.setValue(permishTag, m_networkPermission); settings.setValue("audio-target", devices[m_audioDevice]); settings.setValue("locale", m_currentLocale); settings.endGroup(); settings.beginGroup("MainWindow"); settings.setValue("sessiontemplate", m_currentTemplate); settings.endGroup(); m_applyButton->setEnabled(false); if (m_changesOnRestart) { QMessageBox::information(this, tr("Preferences"), tr("Restart required

One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.

Please exit and restart the application now if you want these changes to take effect immediately.

")); m_changesOnRestart = false; } } void PreferencesDialog::cancelClicked() { reject(); } void PreferencesDialog::applicationClosing(bool quickly) { if (quickly) { reject(); return; } if (m_applyButton->isEnabled()) { int rv = QMessageBox::warning (this, tr("Preferences Changed"), tr("Some preferences have been changed but not applied.\n" "Apply them before closing?"), QMessageBox::Apply | QMessageBox::Discard, QMessageBox::Discard); if (rv == QMessageBox::Apply) { applyClicked(); accept(); } else { reject(); } } else { accept(); } } sonic-visualiser-2.3~repack1.orig/main/MainWindow.h0000644000175000017500000002144412252354725021110 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _MAIN_WINDOW_H_ #define _MAIN_WINDOW_H_ #include "framework/MainWindowBase.h" class VersionTester; class Surveyer; class LayerTreeDialog; class ActivityLog; class QFileSystemWatcher; class QScrollArea; class MainWindow : public MainWindowBase { Q_OBJECT public: MainWindow(bool withAudioOutput = true, bool withOSCSupport = true); virtual ~MainWindow(); signals: void canChangeSolo(bool); void canAlign(bool); public slots: virtual void preferenceChanged(PropertyContainer::PropertyName); virtual bool commitData(bool mayAskUser); void goFullScreen(); void endFullScreen(); protected slots: virtual void openSession(); virtual void importAudio(); virtual void importMoreAudio(); virtual void replaceMainAudio(); virtual void openSomething(); virtual void openLocation(); virtual void openRecentFile(); virtual void applyTemplate(); virtual void exportAudio(); virtual void exportAudioData(); virtual void importLayer(); virtual void exportLayer(); virtual void exportImage(); virtual void saveSession(); virtual void saveSessionAs(); virtual void newSession(); virtual void closeSession(); virtual void preferences(); virtual void sampleRateMismatch(size_t, size_t, bool); virtual void audioOverloadPluginDisabled(); virtual void audioTimeStretchMultiChannelDisabled(); virtual void toolNavigateSelected(); virtual void toolSelectSelected(); virtual void toolEditSelected(); virtual void toolDrawSelected(); virtual void toolEraseSelected(); virtual void toolMeasureSelected(); virtual void documentModified(); virtual void documentRestored(); virtual void documentReplaced(); virtual void updateMenuStates(); virtual void updateDescriptionLabel(); virtual void setInstantsNumbering(); virtual void setInstantsCounterCycle(); virtual void setInstantsCounters(); virtual void resetInstantsCounters(); virtual void modelGenerationFailed(QString, QString); virtual void modelGenerationWarning(QString, QString); virtual void modelRegenerationFailed(QString, QString, QString); virtual void modelRegenerationWarning(QString, QString, QString); virtual void alignmentFailed(QString, QString); virtual void rightButtonMenuRequested(Pane *, QPoint point); virtual void propertyStacksResized(int); virtual void addPane(); virtual void addLayer(); virtual void addLayer(QString transformId); virtual void renameCurrentLayer(); virtual void findTransform(); virtual void paneAdded(Pane *); virtual void paneHidden(Pane *); virtual void paneAboutToBeDeleted(Pane *); virtual void paneDropAccepted(Pane *, QStringList); virtual void paneDropAccepted(Pane *, QString); virtual void setupRecentFilesMenu(); virtual void setupRecentTransformsMenu(); virtual void setupTemplatesMenu(); virtual void playSpeedChanged(int); virtual void playSoloToggled(); virtual void alignToggled(); virtual void currentPaneChanged(Pane *); virtual void speedUpPlayback(); virtual void slowDownPlayback(); virtual void restoreNormalPlayback(); virtual void outputLevelsChanged(float, float); virtual void layerRemoved(Layer *); virtual void layerInAView(Layer *, bool); virtual void mainModelChanged(WaveFileModel *); virtual void modelAdded(Model *); virtual void showLayerTree(); virtual void showActivityLog(); virtual void mouseEnteredWidget(); virtual void mouseLeftWidget(); virtual void handleOSCMessage(const OSCMessage &); virtual void midiEventsAvailable(); virtual void playStatusChanged(bool); virtual void saveSessionAsTemplate(); virtual void manageSavedTemplates(); virtual void website(); virtual void help(); virtual void about(); virtual void keyReference(); virtual void newerVersionAvailable(QString); protected: Overview *m_overview; Fader *m_fader; AudioDial *m_playSpeed; WaveformLayer *m_panLayer; QScrollArea *m_mainScroll; bool m_mainMenusCreated; QMenu *m_paneMenu; QMenu *m_layerMenu; QMenu *m_transformsMenu; QMenu *m_playbackMenu; QMenu *m_existingLayersMenu; QMenu *m_sliceMenu; QMenu *m_recentFilesMenu; QMenu *m_recentTransformsMenu; QMenu *m_templatesMenu; QMenu *m_rightButtonMenu; QMenu *m_rightButtonLayerMenu; QMenu *m_rightButtonTransformsMenu; QMenu *m_rightButtonPlaybackMenu; QAction *m_deleteSelectedAction; QAction *m_soloAction; QAction *m_rwdStartAction; QAction *m_rwdSimilarAction; QAction *m_rwdAction; QAction *m_ffwdAction; QAction *m_ffwdSimilarAction; QAction *m_ffwdEndAction; QAction *m_playAction; QAction *m_playSelectionAction; QAction *m_playLoopAction; QAction *m_manageTemplatesAction; QAction *m_zoomInAction; QAction *m_zoomOutAction; QAction *m_zoomFitAction; QAction *m_scrollLeftAction; QAction *m_scrollRightAction; QAction *m_showPropertyBoxesAction; bool m_soloModified; bool m_prevSolo; QFrame *m_playControlsSpacer; int m_playControlsWidth; QLabel *m_descriptionLabel; QLabel *m_currentLabel; QPointer m_preferencesDialog; QPointer m_layerTreeDialog; ActivityLog *m_activityLog; KeyReference *m_keyReference; QFileSystemWatcher *m_templateWatcher; Surveyer *m_surveyer; VersionTester *m_versionTester; struct LayerConfiguration { LayerConfiguration(LayerFactory::LayerType _layer = LayerFactory::TimeRuler, Model *_source = 0, int _channel = -1) : layer(_layer), sourceModel(_source), channel(_channel) { } LayerFactory::LayerType layer; Model *sourceModel; int channel; }; typedef std::map PaneActionMap; PaneActionMap m_paneActions; typedef std::map LayerActionMap; LayerActionMap m_layerActions; typedef std::map TransformActionMap; TransformActionMap m_transformActions; typedef std::map TransformActionReverseMap; TransformActionReverseMap m_transformActionsReverse; typedef std::map ExistingLayerActionMap; ExistingLayerActionMap m_existingLayerActions; ExistingLayerActionMap m_sliceActions; typedef std::map ToolActionMap; ToolActionMap m_toolActions; typedef std::map NumberingActionMap; NumberingActionMap m_numberingActions; virtual void setupMenus(); virtual void setupFileMenu(); virtual void setupEditMenu(); virtual void setupViewMenu(); virtual void setupPaneAndLayerMenus(); virtual void setupTransformsMenu(); virtual void setupHelpMenu(); virtual void setupExistingLayersMenus(); virtual void setupToolbars(); virtual void addPane(const LayerConfiguration &configuration, QString text); virtual void closeEvent(QCloseEvent *e); virtual bool checkSaveModified(); virtual void exportAudio(bool asData); virtual void updateVisibleRangeDisplay(Pane *p) const; virtual void updatePositionStatusDisplays() const; virtual bool shouldCreateNewSessionForRDFAudio(bool *cancel); virtual void connectLayerEditDialog(ModelDataTableDialog *); }; #endif sonic-visualiser-2.3~repack1.orig/main/OSCHandler.cpp0000644000175000017500000004764312252354725021322 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "MainWindow.h" #include "data/osc/OSCQueue.h" #include "layer/WaveformLayer.h" #include "view/ViewManager.h" #include "view/Pane.h" #include "view/PaneStack.h" #include "data/model/WaveFileModel.h" #include "widgets/CommandHistory.h" #include "audioio/AudioCallbackPlaySource.h" #include "audioio/AudioCallbackPlayTarget.h" #include "framework/Document.h" #include "data/fileio/WavFileWriter.h" #include "transform/TransformFactory.h" #include "widgets/Fader.h" #include "widgets/AudioDial.h" #include void MainWindow::handleOSCMessage(const OSCMessage &message) { SVDEBUG << "MainWindow::handleOSCMessage: thread id = " << QThread::currentThreadId() << endl; // This large function should really be abstracted out. if (message.getMethod() == "open") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString path = message.getArg(0).toString(); if (open(path, ReplaceMainModel) != FileOpenSucceeded) { cerr << "MainWindow::handleOSCMessage: File open failed for path \"" << path << "\"" << endl; } //!!! we really need to spin here and not return until the // file has been completely decoded... } } else if (message.getMethod() == "openadditional") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString path = message.getArg(0).toString(); if (open(path, CreateAdditionalModel) != FileOpenSucceeded) { cerr << "MainWindow::handleOSCMessage: File open failed for path \"" << path << "\"" << endl; } } } else if (message.getMethod() == "recent" || message.getMethod() == "last") { int n = 0; if (message.getMethod() == "recent" && message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::Int)) { n = message.getArg(0).toInt() - 1; } std::vector recent = m_recentFiles.getRecent(); if (n >= 0 && n < int(recent.size())) { if (open(recent[n], ReplaceMainModel) != FileOpenSucceeded) { cerr << "MainWindow::handleOSCMessage: File open failed for path \"" << recent[n] << "\"" << endl; } } } else if (message.getMethod() == "save") { QString path; if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { path = message.getArg(0).toString(); if (QFileInfo(path).exists()) { SVDEBUG << "MainWindow::handleOSCMessage: Refusing to overwrite existing file in save" << endl; } else { saveSessionFile(path); } } } else if (message.getMethod() == "export") { QString path; if (getMainModel()) { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { path = message.getArg(0).toString(); if (QFileInfo(path).exists()) { SVDEBUG << "MainWindow::handleOSCMessage: Refusing to overwrite existing file in export" << endl; } else { WavFileWriter writer(path, getMainModel()->getSampleRate(), getMainModel()->getChannelCount(), WavFileWriter::WriteToTemporary); MultiSelection ms = m_viewManager->getSelection(); if (!ms.getSelections().empty()) { writer.writeModel(getMainModel(), &ms); } else { writer.writeModel(getMainModel()); } } } } } else if (message.getMethod() == "jump" || message.getMethod() == "play") { if (getMainModel()) { unsigned long frame = m_viewManager->getPlaybackFrame(); bool selection = false; bool play = (message.getMethod() == "play"); if (message.getArgCount() == 1) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "selection") { selection = true; } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "end") { frame = getMainModel()->getEndFrame(); } else if (message.getArg(0).canConvert(QVariant::Double)) { double time = message.getArg(0).toDouble(); if (time < 0.0) time = 0.0; frame = lrint(time * getMainModel()->getSampleRate()); } } if (frame > getMainModel()->getEndFrame()) { frame = getMainModel()->getEndFrame(); } if (play) { m_viewManager->setPlaySelectionMode(selection); } if (selection) { MultiSelection::SelectionList sl = m_viewManager->getSelections(); if (!sl.empty()) { frame = sl.begin()->getStartFrame(); } } m_viewManager->setPlaybackFrame(frame); if (play && !m_playSource->isPlaying()) { m_playSource->play(frame); } } } else if (message.getMethod() == "ffwd") { if (message.getArgCount() == 1) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "similar") { ffwdSimilar(); } } else { ffwd(); } } else if (message.getMethod() == "rewind") { if (message.getArgCount() == 1) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "similar") { rewindSimilar(); } } else { rewind(); } } else if (message.getMethod() == "stop") { if (m_playSource->isPlaying()) m_playSource->stop(); } else if (message.getMethod() == "loop") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString str = message.getArg(0).toString(); if (str == "on") { m_viewManager->setPlayLoopMode(true); } else if (str == "off") { m_viewManager->setPlayLoopMode(false); } } } else if (message.getMethod() == "solo") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString str = message.getArg(0).toString(); if (str == "on") { m_viewManager->setPlaySoloMode(true); } else if (str == "off") { m_viewManager->setPlaySoloMode(false); } } } else if (message.getMethod() == "select" || message.getMethod() == "addselect") { if (getMainModel()) { int f0 = getMainModel()->getStartFrame(); int f1 = getMainModel()->getEndFrame(); bool done = false; if (message.getArgCount() == 2 && message.getArg(0).canConvert(QVariant::Double) && message.getArg(1).canConvert(QVariant::Double)) { double t0 = message.getArg(0).toDouble(); double t1 = message.getArg(1).toDouble(); if (t1 < t0) { double temp = t0; t0 = t1; t1 = temp; } if (t0 < 0.0) t0 = 0.0; if (t1 < 0.0) t1 = 0.0; f0 = lrint(t0 * getMainModel()->getSampleRate()); f1 = lrint(t1 * getMainModel()->getSampleRate()); Pane *pane = m_paneStack->getCurrentPane(); Layer *layer = 0; if (pane) layer = pane->getSelectedLayer(); if (layer) { size_t resolution; layer->snapToFeatureFrame(pane, f0, resolution, Layer::SnapLeft); layer->snapToFeatureFrame(pane, f1, resolution, Layer::SnapRight); } } else if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString str = message.getArg(0).toString(); if (str == "none") { m_viewManager->clearSelections(); done = true; } } if (!done) { if (message.getMethod() == "select") { m_viewManager->setSelection(Selection(f0, f1)); } else { m_viewManager->addSelection(Selection(f0, f1)); } } } } else if (message.getMethod() == "add") { if (getMainModel()) { if (message.getArgCount() >= 1 && message.getArg(0).canConvert(QVariant::String)) { int channel = -1; if (message.getArgCount() == 2 && message.getArg(0).canConvert(QVariant::Int)) { channel = message.getArg(0).toInt(); if (channel < -1 || channel > int(getMainModel()->getChannelCount())) { cerr << "WARNING: MainWindow::handleOSCMessage: channel " << channel << " out of range" << endl; channel = -1; } } QString str = message.getArg(0).toString(); LayerFactory::LayerType type = LayerFactory::getInstance()->getLayerTypeForName(str); if (type == LayerFactory::UnknownLayer) { cerr << "WARNING: MainWindow::handleOSCMessage: unknown layer " << "type " << str << endl; } else { LayerConfiguration configuration(type, getMainModel(), channel); addPane(configuration, tr("Add %1 Pane") .arg(LayerFactory::getInstance()-> getLayerPresentationName(type))); } } } } else if (message.getMethod() == "undo") { CommandHistory::getInstance()->undo(); } else if (message.getMethod() == "redo") { CommandHistory::getInstance()->redo(); } else if (message.getMethod() == "set") { if (message.getArgCount() == 2 && message.getArg(0).canConvert(QVariant::String) && message.getArg(1).canConvert(QVariant::Double)) { QString property = message.getArg(0).toString(); float value = (float)message.getArg(1).toDouble(); if (property == "gain") { if (value < 0.0) value = 0.0; m_fader->setValue(value); if (m_playTarget) m_playTarget->setOutputGain(value); } else if (property == "speedup") { m_playSpeed->setMappedValue(value); } else if (property == "overlays") { if (value < 0.5) { m_viewManager->setOverlayMode(ViewManager::NoOverlays); } else if (value < 1.5) { m_viewManager->setOverlayMode(ViewManager::MinimalOverlays); } else { m_viewManager->setOverlayMode(ViewManager::AllOverlays); } } else if (property == "zoomwheels") { m_viewManager->setZoomWheelsEnabled(value > 0.5); } else if (property == "propertyboxes") { bool toggle = ((value < 0.5) != (m_paneStack->getLayoutStyle() == PaneStack::NoPropertyStacks)); if (toggle) togglePropertyBoxes(); } } else { PropertyContainer *container = 0; Pane *pane = m_paneStack->getCurrentPane(); if (pane && message.getArgCount() == 3 && message.getArg(0).canConvert(QVariant::String) && message.getArg(1).canConvert(QVariant::String) && message.getArg(2).canConvert(QVariant::String)) { if (message.getArg(0).toString() == "pane") { container = pane->getPropertyContainer(0); } else if (message.getArg(0).toString() == "layer") { container = pane->getSelectedLayer(); } } if (container) { QString nameString = message.getArg(1).toString(); QString valueString = message.getArg(2).toString(); Command *c = container->getSetPropertyCommand (nameString, valueString); if (c) CommandHistory::getInstance()->addCommand(c, true, true); } } } else if (message.getMethod() == "setcurrent") { int paneIndex = -1, layerIndex = -1; bool wantLayer = false; if (message.getArgCount() >= 1 && message.getArg(0).canConvert(QVariant::Int)) { paneIndex = message.getArg(0).toInt() - 1; if (message.getArgCount() >= 2 && message.getArg(1).canConvert(QVariant::Int)) { wantLayer = true; layerIndex = message.getArg(1).toInt() - 1; } } if (paneIndex >= 0 && paneIndex < m_paneStack->getPaneCount()) { Pane *pane = m_paneStack->getPane(paneIndex); m_paneStack->setCurrentPane(pane); if (layerIndex >= 0 && layerIndex < pane->getLayerCount()) { Layer *layer = pane->getLayer(layerIndex); m_paneStack->setCurrentLayer(pane, layer); } else if (wantLayer && layerIndex == -1) { m_paneStack->setCurrentLayer(pane, 0); } } } else if (message.getMethod() == "delete") { if (message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { QString target = message.getArg(0).toString(); if (target == "pane") { deleteCurrentPane(); } else if (target == "layer") { deleteCurrentLayer(); } else { cerr << "WARNING: MainWindow::handleOSCMessage: Unknown delete target " << target << endl; } } } else if (message.getMethod() == "zoom") { if (message.getArgCount() == 1) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "in") { zoomIn(); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "out") { zoomOut(); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "default") { zoomDefault(); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "fit") { zoomToFit(); } else if (message.getArg(0).canConvert(QVariant::Double)) { double level = message.getArg(0).toDouble(); Pane *currentPane = m_paneStack->getCurrentPane(); if (level < 1.0) level = 1.0; if (currentPane) currentPane->setZoomLevel(lrint(level)); } } } else if (message.getMethod() == "zoomvertical") { Pane *pane = m_paneStack->getCurrentPane(); Layer *layer = 0; if (pane && pane->getLayerCount() > 0) { layer = pane->getLayer(pane->getLayerCount() - 1); } int defaultStep = 0; int steps = 0; if (layer) { steps = layer->getVerticalZoomSteps(defaultStep); if (message.getArgCount() == 1 && steps > 0) { if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "in") { int step = layer->getCurrentVerticalZoomStep() + 1; if (step < steps) layer->setVerticalZoomStep(step); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "out") { int step = layer->getCurrentVerticalZoomStep() - 1; if (step >= 0) layer->setVerticalZoomStep(step); } else if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "default") { layer->setVerticalZoomStep(defaultStep); } } else if (message.getArgCount() == 2) { if (message.getArg(0).canConvert(QVariant::Double) && message.getArg(1).canConvert(QVariant::Double)) { double min = message.getArg(0).toDouble(); double max = message.getArg(1).toDouble(); layer->setDisplayExtents(min, max); } } } } else if (message.getMethod() == "quit") { m_abandoning = true; close(); } else if (message.getMethod() == "resize") { if (message.getArgCount() == 2) { int width = 0, height = 0; if (message.getArg(1).canConvert(QVariant::Int)) { height = message.getArg(1).toInt(); if (message.getArg(0).canConvert(QVariant::String) && message.getArg(0).toString() == "pane") { Pane *pane = m_paneStack->getCurrentPane(); if (pane) pane->resize(pane->width(), height); } else if (message.getArg(0).canConvert(QVariant::Int)) { width = message.getArg(0).toInt(); resize(width, height); } } } } else if (message.getMethod() == "transform") { Pane *pane = m_paneStack->getCurrentPane(); if (getMainModel() && pane && message.getArgCount() == 1 && message.getArg(0).canConvert(QVariant::String)) { TransformId transformId = message.getArg(0).toString(); Transform transform = TransformFactory::getInstance()-> getDefaultTransformFor(transformId); Layer *newLayer = m_document->createDerivedLayer (transform, getMainModel()); if (newLayer) { m_document->addLayerToView(pane, newLayer); m_recentTransforms.add(transformId); m_paneStack->setCurrentLayer(pane, newLayer); } } } else { cerr << "WARNING: MainWindow::handleOSCMessage: Unknown or unsupported " << "method \"" << message.getMethod() << "\"" << endl; } } sonic-visualiser-2.3~repack1.orig/main/MainWindow.cpp0000644000175000017500000046014412252354725021447 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "../version.h" #include "MainWindow.h" #include "PreferencesDialog.h" #include "view/Pane.h" #include "view/PaneStack.h" #include "data/model/WaveFileModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/RangeSummarisableTimeValueModel.h" #include "data/model/NoteModel.h" #include "data/model/Labeller.h" #include "data/osc/OSCQueue.h" #include "framework/Document.h" #include "framework/TransformUserConfigurator.h" #include "view/ViewManager.h" #include "base/Preferences.h" #include "base/ResourceFinder.h" #include "layer/WaveformLayer.h" #include "layer/TimeRulerLayer.h" #include "layer/TimeInstantLayer.h" #include "layer/TimeValueLayer.h" #include "layer/NoteLayer.h" #include "layer/Colour3DPlotLayer.h" #include "layer/SliceLayer.h" #include "layer/SliceableLayer.h" #include "layer/ImageLayer.h" #include "layer/RegionLayer.h" #include "widgets/Fader.h" #include "view/Overview.h" #include "widgets/PropertyBox.h" #include "widgets/PropertyStack.h" #include "widgets/AudioDial.h" #include "widgets/IconLoader.h" #include "widgets/LayerTreeDialog.h" #include "widgets/ListInputDialog.h" #include "widgets/SubdividingMenu.h" #include "widgets/NotifyingPushButton.h" #include "widgets/KeyReference.h" #include "widgets/TransformFinder.h" #include "widgets/LabelCounterInputDialog.h" #include "widgets/ActivityLog.h" #include "audioio/AudioCallbackPlaySource.h" #include "audioio/AudioCallbackPlayTarget.h" #include "audioio/AudioTargetFactory.h" #include "audioio/PlaySpeedRangeMapper.h" #include "data/fileio/DataFileReaderFactory.h" #include "data/fileio/PlaylistFileReader.h" #include "data/fileio/WavFileWriter.h" #include "data/fileio/CSVFileWriter.h" #include "data/fileio/MIDIFileWriter.h" #include "data/fileio/BZipFileDevice.h" #include "data/fileio/FileSource.h" #include "data/fft/FFTDataServer.h" #include "data/midi/MIDIInput.h" #include "base/RecentFiles.h" #include "transform/TransformFactory.h" #include "transform/ModelTransformerFactory.h" #include "base/PlayParameterRepository.h" #include "base/XmlExportable.h" #include "widgets/CommandHistory.h" #include "base/Profiler.h" #include "base/Clipboard.h" #include "base/UnitDatabase.h" #include "layer/ColourDatabase.h" #include "widgets/ModelDataTableDialog.h" #include "rdf/PluginRDFIndexer.h" #include "rdf/RDFExporter.h" #include "Surveyer.h" #include "NetworkPermissionTester.h" #include "framework/VersionTester.h" // For version information #include #include #include "plugin/api/ladspa.h" #include "plugin/api/dssi.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::vector; using std::map; using std::set; MainWindow::MainWindow(bool withAudioOutput, bool withOSCSupport) : MainWindowBase(withAudioOutput, true), m_overview(0), m_mainMenusCreated(false), m_paneMenu(0), m_layerMenu(0), m_transformsMenu(0), m_playbackMenu(0), m_existingLayersMenu(0), m_sliceMenu(0), m_recentFilesMenu(0), m_recentTransformsMenu(0), m_templatesMenu(0), m_rightButtonMenu(0), m_rightButtonLayerMenu(0), m_rightButtonTransformsMenu(0), m_rightButtonPlaybackMenu(0), m_soloAction(0), m_soloModified(false), m_prevSolo(false), m_rwdStartAction(0), m_rwdSimilarAction(0), m_rwdAction(0), m_ffwdAction(0), m_ffwdSimilarAction(0), m_ffwdEndAction(0), m_playAction(0), m_playSelectionAction(0), m_playLoopAction(0), m_playControlsSpacer(0), m_playControlsWidth(0), m_preferencesDialog(0), m_layerTreeDialog(0), m_activityLog(new ActivityLog()), m_keyReference(new KeyReference()), m_templateWatcher(0) { Profiler profiler("MainWindow::MainWindow"); setWindowTitle(QApplication::applicationName()); UnitDatabase *udb = UnitDatabase::getInstance(); udb->registerUnit("Hz"); udb->registerUnit("dB"); udb->registerUnit("s"); ColourDatabase *cdb = ColourDatabase::getInstance(); cdb->addColour(Qt::black, tr("Black")); cdb->addColour(Qt::darkRed, tr("Red")); cdb->addColour(Qt::darkBlue, tr("Blue")); cdb->addColour(Qt::darkGreen, tr("Green")); cdb->addColour(QColor(200, 50, 255), tr("Purple")); cdb->addColour(QColor(255, 150, 50), tr("Orange")); cdb->setUseDarkBackground(cdb->addColour(Qt::white, tr("White")), true); cdb->setUseDarkBackground(cdb->addColour(Qt::red, tr("Bright Red")), true); cdb->setUseDarkBackground(cdb->addColour(QColor(30, 150, 255), tr("Bright Blue")), true); cdb->setUseDarkBackground(cdb->addColour(Qt::green, tr("Bright Green")), true); cdb->setUseDarkBackground(cdb->addColour(QColor(225, 74, 255), tr("Bright Purple")), true); cdb->setUseDarkBackground(cdb->addColour(QColor(255, 188, 80), tr("Bright Orange")), true); QFrame *frame = new QFrame; setCentralWidget(frame); QGridLayout *layout = new QGridLayout; m_descriptionLabel = new QLabel; m_mainScroll = new QScrollArea(frame); m_mainScroll->setWidgetResizable(true); m_mainScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_mainScroll->setFrameShape(QFrame::NoFrame); m_mainScroll->setWidget(m_paneStack); m_overview = new Overview(frame); m_overview->setViewManager(m_viewManager); m_overview->setFixedHeight(40); #ifndef _WIN32 // For some reason, the contents of the overview never appear if we // make this setting on Windows. I have no inclination at the moment // to track down the reason why. m_overview->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); #endif connect(m_overview, SIGNAL(contextHelpChanged(const QString &)), this, SLOT(contextHelpChanged(const QString &))); m_panLayer = new WaveformLayer; m_panLayer->setChannelMode(WaveformLayer::MergeChannels); m_panLayer->setAggressiveCacheing(true); m_overview->addLayer(m_panLayer); if (m_viewManager->getGlobalDarkBackground()) { m_panLayer->setBaseColour (ColourDatabase::getInstance()->getColourIndex(tr("Bright Green"))); } else { m_panLayer->setBaseColour (ColourDatabase::getInstance()->getColourIndex(tr("Green"))); } m_fader = new Fader(frame, false); connect(m_fader, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_fader, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); m_playSpeed = new AudioDial(frame); m_playSpeed->setMinimum(0); m_playSpeed->setMaximum(200); m_playSpeed->setValue(100); m_playSpeed->setFixedWidth(32); m_playSpeed->setFixedHeight(32); m_playSpeed->setNotchesVisible(true); m_playSpeed->setPageStep(10); m_playSpeed->setObjectName(tr("Playback Speedup")); m_playSpeed->setDefaultValue(100); m_playSpeed->setRangeMapper(new PlaySpeedRangeMapper(0, 200)); m_playSpeed->setShowToolTip(true); connect(m_playSpeed, SIGNAL(valueChanged(int)), this, SLOT(playSpeedChanged(int))); connect(m_playSpeed, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_playSpeed, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); IconLoader il; m_playControlsSpacer = new QFrame; layout->setSpacing(4); layout->addWidget(m_mainScroll, 0, 0, 1, 5); layout->addWidget(m_overview, 1, 1); layout->addWidget(m_playControlsSpacer, 1, 2); layout->addWidget(m_playSpeed, 1, 3); layout->addWidget(m_fader, 1, 4); m_playControlsWidth = m_fader->width() + m_playSpeed->width() + layout->spacing() * 2; layout->setColumnMinimumWidth(0, 14); layout->setColumnStretch(0, 0); m_paneStack->setPropertyStackMinWidth(m_playControlsWidth + 2 + layout->spacing()); m_playControlsSpacer->setFixedSize(QSize(2, 2)); layout->setColumnStretch(1, 10); connect(m_paneStack, SIGNAL(propertyStacksResized(int)), this, SLOT(propertyStacksResized(int))); frame->setLayout(layout); setupMenus(); setupToolbars(); setupHelpMenu(); statusBar(); m_currentLabel = new QLabel; statusBar()->addPermanentWidget(m_currentLabel); connect(m_viewManager, SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); connect(m_playSource, SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); connect(CommandHistory::getInstance(), SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); connect(this, SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); connect(this, SIGNAL(replacedDocument()), this, SLOT(documentReplaced())); m_activityLog->hide(); newSession(); connect(m_midiInput, SIGNAL(eventsAvailable()), this, SLOT(midiEventsAvailable())); NetworkPermissionTester tester; bool networkPermission = tester.havePermission(); if (networkPermission) { if (withOSCSupport) { startOSCQueue(); } TransformFactory::getInstance()->startPopulationThread(); m_surveyer = new Surveyer ("sonicvisualiser.org", "survey23-present.txt", "survey23.php"); m_versionTester = new VersionTester ("sonicvisualiser.org", "latest-version.txt", SV_VERSION); connect(m_versionTester, SIGNAL(newerVersionAvailable(QString)), this, SLOT(newerVersionAvailable(QString))); } else { m_surveyer = 0; m_versionTester = 0; } } MainWindow::~MainWindow() { // SVDEBUG << "MainWindow::~MainWindow" << endl; delete m_keyReference; delete m_activityLog; delete m_preferencesDialog; delete m_layerTreeDialog; delete m_versionTester; delete m_surveyer; Profiles::getInstance()->dump(); // SVDEBUG << "MainWindow::~MainWindow finishing" << endl; } void MainWindow::setupMenus() { if (!m_mainMenusCreated) { m_rightButtonMenu = new QMenu(); // No -- we don't want tear-off enabled on the right-button // menu. If it is enabled, then simply right-clicking and // releasing will pop up the menu, activate the tear-off, and // leave the torn-off menu window in front of the main window. // That isn't desirable. I'm not sure it ever would be, in a // context menu -- perhaps technically a Qt bug? // m_rightButtonMenu->setTearOffEnabled(true); } if (m_rightButtonTransformsMenu) { m_rightButtonTransformsMenu->clear(); } else { m_rightButtonTransformsMenu = m_rightButtonMenu->addMenu(tr("&Transform")); m_rightButtonTransformsMenu->setTearOffEnabled(true); m_rightButtonMenu->addSeparator(); } // This will be created (if not found) or cleared (if found) in // setupPaneAndLayerMenus, but we want to ensure it's created // sooner so it can go nearer the top of the right button menu if (m_rightButtonLayerMenu) { m_rightButtonLayerMenu->clear(); } else { m_rightButtonLayerMenu = m_rightButtonMenu->addMenu(tr("&Layer")); m_rightButtonLayerMenu->setTearOffEnabled(true); m_rightButtonMenu->addSeparator(); } if (!m_mainMenusCreated) { CommandHistory::getInstance()->registerMenu(m_rightButtonMenu); m_rightButtonMenu->addSeparator(); } setupFileMenu(); setupEditMenu(); setupViewMenu(); setupPaneAndLayerMenus(); setupTransformsMenu(); m_mainMenusCreated = true; } void MainWindow::goFullScreen() { if (m_viewManager->getZoomWheelsEnabled()) { // The wheels seem to end up in the wrong place in full-screen mode toggleZoomWheels(); } QWidget *ps = m_mainScroll->takeWidget(); ps->setParent(0); QShortcut *sc; sc = new QShortcut(QKeySequence("Esc"), ps); connect(sc, SIGNAL(activated()), this, SLOT(endFullScreen())); sc = new QShortcut(QKeySequence("F11"), ps); connect(sc, SIGNAL(activated()), this, SLOT(endFullScreen())); QAction *acts[] = { m_playAction, m_zoomInAction, m_zoomOutAction, m_zoomFitAction, m_scrollLeftAction, m_scrollRightAction, m_showPropertyBoxesAction }; for (int i = 0; i < sizeof(acts)/sizeof(acts[0]); ++i) { sc = new QShortcut(acts[i]->shortcut(), ps); connect(sc, SIGNAL(activated()), acts[i], SLOT(trigger())); } ps->showFullScreen(); } void MainWindow::endFullScreen() { // these were only created in goFullScreen: QObjectList cl = m_paneStack->children(); foreach (QObject *o, cl) { QShortcut *sc = qobject_cast(o); if (sc) delete sc; } m_paneStack->showNormal(); m_mainScroll->setWidget(m_paneStack); } void MainWindow::setupFileMenu() { if (m_mainMenusCreated) return; QMenu *menu = menuBar()->addMenu(tr("&File")); menu->setTearOffEnabled(true); QToolBar *toolbar = addToolBar(tr("File Toolbar")); m_keyReference->setCategory(tr("File and Session Management")); IconLoader il; QIcon icon = il.load("filenew"); icon.addPixmap(il.loadPixmap("filenew-22")); QAction *action = new QAction(icon, tr("&New Session"), this); action->setShortcut(tr("Ctrl+N")); action->setStatusTip(tr("Abandon the current %1 session and start a new one").arg(QApplication::applicationName())); connect(action, SIGNAL(triggered()), this, SLOT(newSession())); m_keyReference->registerShortcut(action); menu->addAction(action); toolbar->addAction(action); icon = il.load("fileopen"); icon.addPixmap(il.loadPixmap("fileopen-22")); action = new QAction(icon, tr("&Open..."), this); action->setShortcut(tr("Ctrl+O")); action->setStatusTip(tr("Open a session file, audio file, or layer")); connect(action, SIGNAL(triggered()), this, SLOT(openSomething())); toolbar->addAction(action); menu->addAction(action); // We want this one to go on the toolbar now, if we add it at all, // but on the menu later QAction *iaction = new QAction(tr("&Import More Audio..."), this); iaction->setShortcut(tr("Ctrl+I")); iaction->setStatusTip(tr("Import an extra audio file into a new pane")); connect(iaction, SIGNAL(triggered()), this, SLOT(importMoreAudio())); connect(this, SIGNAL(canImportMoreAudio(bool)), iaction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(iaction); // We want this one to go on the toolbar now, if we add it at all, // but on the menu later QAction *raction = new QAction(tr("Replace &Main Audio..."), this); raction->setStatusTip(tr("Replace the main audio file of the session with a different file")); connect(raction, SIGNAL(triggered()), this, SLOT(replaceMainAudio())); connect(this, SIGNAL(canReplaceMainAudio(bool)), raction, SLOT(setEnabled(bool))); action = new QAction(tr("Open Lo&cation..."), this); action->setShortcut(tr("Ctrl+Shift+O")); action->setStatusTip(tr("Open or import a file from a remote URL")); connect(action, SIGNAL(triggered()), this, SLOT(openLocation())); m_keyReference->registerShortcut(action); menu->addAction(action); m_recentFilesMenu = menu->addMenu(tr("Open &Recent")); m_recentFilesMenu->setTearOffEnabled(true); setupRecentFilesMenu(); connect(&m_recentFiles, SIGNAL(recentChanged()), this, SLOT(setupRecentFilesMenu())); menu->addSeparator(); icon = il.load("filesave"); icon.addPixmap(il.loadPixmap("filesave-22")); action = new QAction(icon, tr("&Save Session"), this); action->setShortcut(tr("Ctrl+S")); action->setStatusTip(tr("Save the current session into a %1 session file").arg(QApplication::applicationName())); connect(action, SIGNAL(triggered()), this, SLOT(saveSession())); connect(this, SIGNAL(canSave(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); toolbar->addAction(action); icon = il.load("filesaveas"); icon.addPixmap(il.loadPixmap("filesaveas-22")); action = new QAction(icon, tr("Save Session &As..."), this); action->setShortcut(tr("Ctrl+Shift+S")); action->setStatusTip(tr("Save the current session into a new %1 session file").arg(QApplication::applicationName())); connect(action, SIGNAL(triggered()), this, SLOT(saveSessionAs())); menu->addAction(action); toolbar->addAction(action); menu->addSeparator(); /* icon = il.load("fileopenaudio"); action = new QAction(icon, tr("&Import Audio File..."), this); action->setShortcut(tr("Ctrl+I")); action->setStatusTip(tr("Import an existing audio file")); connect(action, SIGNAL(triggered()), this, SLOT(importAudio())); m_keyReference->registerShortcut(action); menu->addAction(action); */ // the Replace action we made earlier menu->addAction(raction); // the Import action we made earlier menu->addAction(iaction); action = new QAction(tr("&Export Audio File..."), this); action->setStatusTip(tr("Export selection as an audio file")); connect(action, SIGNAL(triggered()), this, SLOT(exportAudio())); connect(this, SIGNAL(canExportAudio(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); action = new QAction(tr("Export Audio Data..."), this); action->setStatusTip(tr("Export audio from selection into a data file")); connect(action, SIGNAL(triggered()), this, SLOT(exportAudioData())); connect(this, SIGNAL(canExportAudio(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); menu->addSeparator(); action = new QAction(tr("Import Annotation &Layer..."), this); action->setShortcut(tr("Ctrl+L")); action->setStatusTip(tr("Import layer data from an existing file")); connect(action, SIGNAL(triggered()), this, SLOT(importLayer())); connect(this, SIGNAL(canImportLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Export Annotation Layer..."), this); action->setStatusTip(tr("Export layer data to a file")); connect(action, SIGNAL(triggered()), this, SLOT(exportLayer())); connect(this, SIGNAL(canExportLayer(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); menu->addSeparator(); action = new QAction(tr("Export Image File..."), this); action->setStatusTip(tr("Export a single pane to an image file")); connect(action, SIGNAL(triggered()), this, SLOT(exportImage())); connect(this, SIGNAL(canExportImage(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); menu->addSeparator(); QString templatesMenuLabel = tr("Apply Session Template"); m_templatesMenu = menu->addMenu(templatesMenuLabel); m_templatesMenu->setTearOffEnabled(true); // We need to have a main model for this option to be useful: // canExportAudio captures that connect(this, SIGNAL(canExportAudio(bool)), m_templatesMenu, SLOT(setEnabled(bool))); // Set up the menu in a moment, after m_manageTemplatesAction constructed action = new QAction(tr("Export Session as Template..."), this); connect(action, SIGNAL(triggered()), this, SLOT(saveSessionAsTemplate())); // We need to have something in the session for this to be useful: // canDeleteCurrentLayer captures that connect(this, SIGNAL(canExportAudio(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); m_manageTemplatesAction = new QAction(tr("Manage Exported Templates"), this); connect(m_manageTemplatesAction, SIGNAL(triggered()), this, SLOT(manageSavedTemplates())); menu->addAction(m_manageTemplatesAction); setupTemplatesMenu(); action = new QAction(tr("&Preferences..."), this); action->setStatusTip(tr("Adjust the application preferences")); connect(action, SIGNAL(triggered()), this, SLOT(preferences())); menu->addAction(action); menu->addSeparator(); action = new QAction(il.load("exit"), tr("&Quit"), this); action->setShortcut(tr("Ctrl+Q")); action->setStatusTip(tr("Exit %1").arg(QApplication::applicationName())); connect(action, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); m_keyReference->registerShortcut(action); menu->addAction(action); } void MainWindow::setupEditMenu() { if (m_mainMenusCreated) return; QMenu *menu = menuBar()->addMenu(tr("&Edit")); menu->setTearOffEnabled(true); CommandHistory::getInstance()->registerMenu(menu); m_keyReference->setCategory(tr("Editing")); menu->addSeparator(); IconLoader il; QAction *action = new QAction(il.load("editcut"), tr("Cu&t"), this); action->setShortcut(tr("Ctrl+X")); action->setStatusTip(tr("Cut the selection from the current layer to the clipboard")); connect(action, SIGNAL(triggered()), this, SLOT(cut())); connect(this, SIGNAL(canEditSelection(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); action = new QAction(il.load("editcopy"), tr("&Copy"), this); action->setShortcut(tr("Ctrl+C")); action->setStatusTip(tr("Copy the selection from the current layer to the clipboard")); connect(action, SIGNAL(triggered()), this, SLOT(copy())); connect(this, SIGNAL(canEditSelection(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); action = new QAction(il.load("editpaste"), tr("&Paste"), this); action->setShortcut(tr("Ctrl+V")); action->setStatusTip(tr("Paste from the clipboard to the current layer")); connect(action, SIGNAL(triggered()), this, SLOT(paste())); connect(this, SIGNAL(canPaste(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); action = new QAction(tr("Paste at Playback Position"), this); action->setShortcut(tr("Ctrl+Shift+V")); action->setStatusTip(tr("Paste from the clipboard to the current layer, placing the first item at the playback position")); connect(action, SIGNAL(triggered()), this, SLOT(pasteAtPlaybackPosition())); connect(this, SIGNAL(canPaste(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); m_deleteSelectedAction = new QAction(tr("&Delete Selected Items"), this); m_deleteSelectedAction->setShortcut(tr("Del")); m_deleteSelectedAction->setStatusTip(tr("Delete items in current selection from the current layer")); connect(m_deleteSelectedAction, SIGNAL(triggered()), this, SLOT(deleteSelected())); connect(this, SIGNAL(canDeleteSelection(bool)), m_deleteSelectedAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_deleteSelectedAction); menu->addAction(m_deleteSelectedAction); m_rightButtonMenu->addAction(m_deleteSelectedAction); menu->addSeparator(); m_rightButtonMenu->addSeparator(); m_keyReference->setCategory(tr("Selection")); action = new QAction(tr("Select &All"), this); action->setShortcut(tr("Ctrl+A")); action->setStatusTip(tr("Select the whole duration of the current session")); connect(action, SIGNAL(triggered()), this, SLOT(selectAll())); connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); action = new QAction(tr("Select &Visible Range"), this); action->setShortcut(tr("Ctrl+Shift+A")); action->setStatusTip(tr("Select the time range corresponding to the current window width")); connect(action, SIGNAL(triggered()), this, SLOT(selectVisible())); connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Select to &Start"), this); action->setShortcut(tr("Shift+Left")); action->setStatusTip(tr("Select from the start of the session to the current playback position")); connect(action, SIGNAL(triggered()), this, SLOT(selectToStart())); connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Select to &End"), this); action->setShortcut(tr("Shift+Right")); action->setStatusTip(tr("Select from the current playback position to the end of the session")); connect(action, SIGNAL(triggered()), this, SLOT(selectToEnd())); connect(this, SIGNAL(canSelect(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("C&lear Selection"), this); action->setShortcut(tr("Esc")); action->setStatusTip(tr("Clear the selection")); connect(action, SIGNAL(triggered()), this, SLOT(clearSelection())); connect(this, SIGNAL(canClearSelection(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonMenu->addAction(action); menu->addSeparator(); m_keyReference->setCategory(tr("Tapping Time Instants")); action = new QAction(tr("&Insert Instant at Playback Position"), this); action->setShortcut(tr("Enter")); action->setStatusTip(tr("Insert a new time instant at the current playback position, in a new layer if necessary")); connect(action, SIGNAL(triggered()), this, SLOT(insertInstant())); connect(this, SIGNAL(canInsertInstant(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); // Laptop shortcut (no keypad Enter key) QString shortcut(tr(";")); connect(new QShortcut(shortcut, this), SIGNAL(activated()), this, SLOT(insertInstant())); m_keyReference->registerAlternativeShortcut(action, shortcut); action = new QAction(tr("Insert Instants at Selection &Boundaries"), this); action->setShortcut(tr("Shift+Enter")); action->setStatusTip(tr("Insert new time instants at the start and end of the current selected regions, in a new layer if necessary")); connect(action, SIGNAL(triggered()), this, SLOT(insertInstantsAtBoundaries())); connect(this, SIGNAL(canInsertInstantsAtBoundaries(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Insert Item at Selection"), this); action->setShortcut(tr("Ctrl+Shift+Enter")); action->setStatusTip(tr("Insert a new note or region item corresponding to the current selection")); connect(action, SIGNAL(triggered()), this, SLOT(insertItemAtSelection())); connect(this, SIGNAL(canInsertItemAtSelection(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); QMenu *numberingMenu = menu->addMenu(tr("Number New Instants with")); numberingMenu->setTearOffEnabled(true); QActionGroup *numberingGroup = new QActionGroup(this); Labeller::TypeNameMap types = m_labeller->getTypeNames(); for (Labeller::TypeNameMap::iterator i = types.begin(); i != types.end(); ++i) { if (i->first == Labeller::ValueFromLabel || i->first == Labeller::ValueFromExistingNeighbour) continue; action = new QAction(i->second, this); connect(action, SIGNAL(triggered()), this, SLOT(setInstantsNumbering())); action->setCheckable(true); action->setChecked(m_labeller->getType() == i->first); numberingGroup->addAction(action); numberingMenu->addAction(action); m_numberingActions[action] = (int)i->first; if (i->first == Labeller::ValueFromTwoLevelCounter) { QMenu *cycleMenu = numberingMenu->addMenu(tr("Cycle size")); QActionGroup *cycleGroup = new QActionGroup(this); int cycles[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 16 }; for (int i = 0; i < int(sizeof(cycles)/sizeof(cycles[0])); ++i) { action = new QAction(QString("%1").arg(cycles[i]), this); connect(action, SIGNAL(triggered()), this, SLOT(setInstantsCounterCycle())); action->setCheckable(true); action->setChecked(cycles[i] == m_labeller->getCounterCycleSize()); cycleGroup->addAction(action); cycleMenu->addAction(action); } } if (i->first == Labeller::ValueNone || i->first == Labeller::ValueFromTwoLevelCounter || i->first == Labeller::ValueFromRealTime) { numberingMenu->addSeparator(); } } action = new QAction(tr("Reset Numbering Counters"), this); action->setStatusTip(tr("Reset to 1 all the counters used for counter-based labelling")); connect(action, SIGNAL(triggered()), this, SLOT(resetInstantsCounters())); connect(this, SIGNAL(replacedDocument()), action, SLOT(trigger())); menu->addAction(action); action = new QAction(tr("Set Numbering Counters..."), this); action->setStatusTip(tr("Set the counters used for counter-based labelling")); connect(action, SIGNAL(triggered()), this, SLOT(setInstantsCounters())); menu->addAction(action); action = new QAction(tr("Renumber Selected Instants"), this); action->setStatusTip(tr("Renumber the selected instants using the current labelling scheme")); connect(action, SIGNAL(triggered()), this, SLOT(renumberInstants())); connect(this, SIGNAL(canRenumberInstants(bool)), action, SLOT(setEnabled(bool))); // m_keyReference->registerShortcut(action); menu->addAction(action); } void MainWindow::setupViewMenu() { if (m_mainMenusCreated) return; IconLoader il; QAction *action = 0; m_keyReference->setCategory(tr("Panning and Navigation")); QMenu *menu = menuBar()->addMenu(tr("&View")); menu->setTearOffEnabled(true); m_scrollLeftAction = new QAction(tr("Scroll &Left"), this); m_scrollLeftAction->setShortcut(tr("Left")); m_scrollLeftAction->setStatusTip(tr("Scroll the current pane to the left")); connect(m_scrollLeftAction, SIGNAL(triggered()), this, SLOT(scrollLeft())); connect(this, SIGNAL(canScroll(bool)), m_scrollLeftAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_scrollLeftAction); menu->addAction(m_scrollLeftAction); m_scrollRightAction = new QAction(tr("Scroll &Right"), this); m_scrollRightAction->setShortcut(tr("Right")); m_scrollRightAction->setStatusTip(tr("Scroll the current pane to the right")); connect(m_scrollRightAction, SIGNAL(triggered()), this, SLOT(scrollRight())); connect(this, SIGNAL(canScroll(bool)), m_scrollRightAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_scrollRightAction); menu->addAction(m_scrollRightAction); action = new QAction(tr("&Jump Left"), this); action->setShortcut(tr("Ctrl+Left")); action->setStatusTip(tr("Scroll the current pane a big step to the left")); connect(action, SIGNAL(triggered()), this, SLOT(jumpLeft())); connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("J&ump Right"), this); action->setShortcut(tr("Ctrl+Right")); action->setStatusTip(tr("Scroll the current pane a big step to the right")); connect(action, SIGNAL(triggered()), this, SLOT(jumpRight())); connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Peek Left"), this); action->setShortcut(tr("Alt+Left")); action->setStatusTip(tr("Scroll the current pane to the left without moving the playback cursor or other panes")); connect(action, SIGNAL(triggered()), this, SLOT(peekLeft())); connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Peek Right"), this); action->setShortcut(tr("Alt+Right")); action->setStatusTip(tr("Scroll the current pane to the right without moving the playback cursor or other panes")); connect(action, SIGNAL(triggered()), this, SLOT(peekRight())); connect(this, SIGNAL(canScroll(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); m_keyReference->setCategory(tr("Zoom")); m_zoomInAction = new QAction(il.load("zoom-in"), tr("Zoom &In"), this); m_zoomInAction->setShortcut(tr("Up")); m_zoomInAction->setStatusTip(tr("Increase the zoom level")); connect(m_zoomInAction, SIGNAL(triggered()), this, SLOT(zoomIn())); connect(this, SIGNAL(canZoom(bool)), m_zoomInAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_zoomInAction); menu->addAction(m_zoomInAction); m_zoomOutAction = new QAction(il.load("zoom-out"), tr("Zoom &Out"), this); m_zoomOutAction->setShortcut(tr("Down")); m_zoomOutAction->setStatusTip(tr("Decrease the zoom level")); connect(m_zoomOutAction, SIGNAL(triggered()), this, SLOT(zoomOut())); connect(this, SIGNAL(canZoom(bool)), m_zoomOutAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_zoomOutAction); menu->addAction(m_zoomOutAction); action = new QAction(tr("Restore &Default Zoom"), this); action->setStatusTip(tr("Restore the zoom level to the default")); connect(action, SIGNAL(triggered()), this, SLOT(zoomDefault())); connect(this, SIGNAL(canZoom(bool)), action, SLOT(setEnabled(bool))); menu->addAction(action); m_zoomFitAction = new QAction(il.load("zoom-fit"), tr("Zoom to &Fit"), this); m_zoomFitAction->setShortcut(tr("F")); m_zoomFitAction->setStatusTip(tr("Zoom to show the whole file")); connect(m_zoomFitAction, SIGNAL(triggered()), this, SLOT(zoomToFit())); connect(this, SIGNAL(canZoom(bool)), m_zoomFitAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(m_zoomFitAction); menu->addAction(m_zoomFitAction); menu->addSeparator(); m_keyReference->setCategory(tr("Display Features")); action = new QAction(tr("Show &Centre Line"), this); action->setShortcut(tr("'")); action->setStatusTip(tr("Show or hide the centre line")); connect(action, SIGNAL(triggered()), this, SLOT(toggleCentreLine())); action->setCheckable(true); action->setChecked(true); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Toggle All Time Rulers"), this); action->setShortcut(tr("#")); action->setStatusTip(tr("Show or hide all time rulers")); connect(action, SIGNAL(triggered()), this, SLOT(toggleTimeRulers())); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); QActionGroup *overlayGroup = new QActionGroup(this); action = new QAction(tr("Show &No Overlays"), this); action->setShortcut(tr("0")); action->setStatusTip(tr("Hide times, layer names, and scale")); connect(action, SIGNAL(triggered()), this, SLOT(showNoOverlays())); action->setCheckable(true); action->setChecked(false); overlayGroup->addAction(action); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Show &Minimal Overlays"), this); action->setShortcut(tr("9")); action->setStatusTip(tr("Show times and basic scale")); connect(action, SIGNAL(triggered()), this, SLOT(showMinimalOverlays())); action->setCheckable(true); action->setChecked(true); overlayGroup->addAction(action); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Show &All Overlays"), this); action->setShortcut(tr("8")); action->setStatusTip(tr("Show times, layer names, and scale")); connect(action, SIGNAL(triggered()), this, SLOT(showAllOverlays())); action->setCheckable(true); action->setChecked(false); overlayGroup->addAction(action); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); action = new QAction(tr("Show &Zoom Wheels"), this); action->setShortcut(tr("Z")); action->setStatusTip(tr("Show thumbwheels for zooming horizontally and vertically")); connect(action, SIGNAL(triggered()), this, SLOT(toggleZoomWheels())); action->setCheckable(true); action->setChecked(m_viewManager->getZoomWheelsEnabled()); m_keyReference->registerShortcut(action); menu->addAction(action); m_showPropertyBoxesAction = new QAction(tr("Show Property Bo&xes"), this); m_showPropertyBoxesAction->setShortcut(tr("X")); m_showPropertyBoxesAction->setStatusTip(tr("Show the layer property boxes at the side of the main window")); connect(m_showPropertyBoxesAction, SIGNAL(triggered()), this, SLOT(togglePropertyBoxes())); m_showPropertyBoxesAction->setCheckable(true); m_showPropertyBoxesAction->setChecked(true); m_keyReference->registerShortcut(m_showPropertyBoxesAction); menu->addAction(m_showPropertyBoxesAction); action = new QAction(tr("Show Status &Bar"), this); action->setStatusTip(tr("Show context help information in the status bar at the bottom of the window")); connect(action, SIGNAL(triggered()), this, SLOT(toggleStatusBar())); action->setCheckable(true); action->setChecked(true); menu->addAction(action); QSettings settings; settings.beginGroup("MainWindow"); bool sb = settings.value("showstatusbar", true).toBool(); if (!sb) { action->setChecked(false); statusBar()->hide(); } settings.endGroup(); menu->addSeparator(); action = new QAction(tr("Show La&yer Summary"), this); action->setShortcut(tr("Y")); action->setStatusTip(tr("Open a window displaying the hierarchy of panes and layers in this session")); connect(action, SIGNAL(triggered()), this, SLOT(showLayerTree())); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Show Acti&vity Log"), this); action->setStatusTip(tr("Open a window listing interactions and other events")); connect(action, SIGNAL(triggered()), this, SLOT(showActivityLog())); menu->addAction(action); menu->addSeparator(); action = new QAction(tr("Go Full-Screen"), this); action->setShortcut(tr("F11")); action->setStatusTip(tr("Expand the pane area to the whole screen")); connect(action, SIGNAL(triggered()), this, SLOT(goFullScreen())); m_keyReference->registerShortcut(action); menu->addAction(action); } void MainWindow::setupPaneAndLayerMenus() { if (m_paneMenu) { m_paneActions.clear(); m_paneMenu->clear(); } else { m_paneMenu = menuBar()->addMenu(tr("&Pane")); m_paneMenu->setTearOffEnabled(true); } if (m_layerMenu) { m_layerActions.clear(); m_layerMenu->clear(); } else { m_layerMenu = menuBar()->addMenu(tr("&Layer")); m_layerMenu->setTearOffEnabled(true); } if (m_rightButtonLayerMenu) { m_rightButtonLayerMenu->clear(); } else { m_rightButtonLayerMenu = m_rightButtonMenu->addMenu(tr("&Layer")); m_rightButtonLayerMenu->setTearOffEnabled(true); m_rightButtonMenu->addSeparator(); } QMenu *menu = m_paneMenu; IconLoader il; m_keyReference->setCategory(tr("Managing Panes and Layers")); QAction *action = new QAction(il.load("pane"), tr("Add &New Pane"), this); action->setShortcut(tr("N")); action->setStatusTip(tr("Add a new pane containing only a time ruler")); connect(action, SIGNAL(triggered()), this, SLOT(addPane())); connect(this, SIGNAL(canAddPane(bool)), action, SLOT(setEnabled(bool))); m_paneActions[action] = LayerConfiguration(LayerFactory::TimeRuler); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); menu = m_layerMenu; // menu->addSeparator(); LayerFactory::LayerTypeSet emptyLayerTypes = LayerFactory::getInstance()->getValidEmptyLayerTypes(); for (LayerFactory::LayerTypeSet::iterator i = emptyLayerTypes.begin(); i != emptyLayerTypes.end(); ++i) { QIcon icon; QString mainText, tipText, channelText; LayerFactory::LayerType type = *i; QString name = LayerFactory::getInstance()->getLayerPresentationName(type); icon = il.load(LayerFactory::getInstance()->getLayerIconName(type)); mainText = tr("Add New %1 Layer").arg(name); tipText = tr("Add a new empty layer of type %1").arg(name); action = new QAction(icon, mainText, this); action->setStatusTip(tipText); if (type == LayerFactory::Text) { action->setShortcut(tr("T")); m_keyReference->registerShortcut(action); } connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(type); menu->addAction(action); m_rightButtonLayerMenu->addAction(action); } m_rightButtonLayerMenu->addSeparator(); menu->addSeparator(); LayerFactory::LayerType backgroundTypes[] = { LayerFactory::Waveform, LayerFactory::Spectrogram, LayerFactory::MelodicRangeSpectrogram, LayerFactory::PeakFrequencySpectrogram, LayerFactory::Spectrum }; std::vector models; if (m_document) models = m_document->getTransformInputModels(); bool plural = (models.size() > 1); if (models.empty()) { models.push_back(getMainModel()); // probably 0 } for (unsigned int i = 0; i < sizeof(backgroundTypes)/sizeof(backgroundTypes[0]); ++i) { const int paneMenuType = 0, layerMenuType = 1; for (int menuType = paneMenuType; menuType <= layerMenuType; ++menuType) { if (menuType == paneMenuType) menu = m_paneMenu; else menu = m_layerMenu; QMenu *submenu = 0; QIcon icon; QString mainText, shortcutText, tipText, channelText; LayerFactory::LayerType type = backgroundTypes[i]; bool mono = true; switch (type) { case LayerFactory::Waveform: icon = il.load("waveform"); mainText = tr("Add &Waveform"); if (menuType == paneMenuType) { shortcutText = tr("W"); tipText = tr("Add a new pane showing a waveform view"); } else { shortcutText = tr("Shift+W"); tipText = tr("Add a new layer showing a waveform view"); } mono = false; break; case LayerFactory::Spectrogram: icon = il.load("spectrogram"); mainText = tr("Add Spectro&gram"); if (menuType == paneMenuType) { shortcutText = tr("G"); tipText = tr("Add a new pane showing a spectrogram"); } else { shortcutText = tr("Shift+G"); tipText = tr("Add a new layer showing a spectrogram"); } break; case LayerFactory::MelodicRangeSpectrogram: icon = il.load("spectrogram"); mainText = tr("Add &Melodic Range Spectrogram"); if (menuType == paneMenuType) { shortcutText = tr("M"); tipText = tr("Add a new pane showing a spectrogram set up for an overview of note pitches"); } else { shortcutText = tr("Shift+M"); tipText = tr("Add a new layer showing a spectrogram set up for an overview of note pitches"); } break; case LayerFactory::PeakFrequencySpectrogram: icon = il.load("spectrogram"); mainText = tr("Add Pea&k Frequency Spectrogram"); if (menuType == paneMenuType) { shortcutText = tr("K"); tipText = tr("Add a new pane showing a spectrogram set up for tracking frequencies"); } else { shortcutText = tr("Shift+K"); tipText = tr("Add a new layer showing a spectrogram set up for tracking frequencies"); } break; case LayerFactory::Spectrum: icon = il.load("spectrum"); mainText = tr("Add Spectr&um"); if (menuType == paneMenuType) { shortcutText = tr("U"); tipText = tr("Add a new pane showing a frequency spectrum"); } else { shortcutText = tr("Shift+U"); tipText = tr("Add a new layer showing a frequency spectrum"); } break; default: break; } std::vector candidateModels = models; for (std::vector::iterator mi = candidateModels.begin(); mi != candidateModels.end(); ++mi) { Model *model = *mi; int channels = 0; if (model) { DenseTimeValueModel *dtvm = dynamic_cast(model); if (dtvm) channels = dtvm->getChannelCount(); } if (channels < 1 && getMainModel()) { channels = getMainModel()->getChannelCount(); } if (channels < 1) channels = 1; for (int c = 0; c <= channels; ++c) { if (c == 1 && channels == 1) continue; bool isDefault = (c == 0); bool isOnly = (isDefault && (channels == 1)); if (isOnly && !plural) { action = new QAction(icon, mainText, this); action->setShortcut(shortcutText); action->setStatusTip(tipText); if (menuType == paneMenuType) { connect(action, SIGNAL(triggered()), this, SLOT(addPane())); connect(this, SIGNAL(canAddPane(bool)), action, SLOT(setEnabled(bool))); m_paneActions[action] = LayerConfiguration(type, model); } else { connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(type, model); } if (shortcutText != "") { m_keyReference->registerShortcut(action); } menu->addAction(action); } else { if (!submenu) { submenu = menu->addMenu(mainText); submenu->setTearOffEnabled(true); } else if (isDefault) { submenu->addSeparator(); } QString actionText; if (c == 0) { if (mono) { actionText = tr("&All Channels Mixed"); } else { actionText = tr("&All Channels"); } } else { actionText = tr("Channel &%1").arg(c); } if (model) { actionText = tr("%1: %2") .arg(model->objectName()) .arg(actionText); } if (isDefault) { action = new QAction(icon, actionText, this); if (!model || model == getMainModel()) { action->setShortcut(shortcutText); } } else { action = new QAction(actionText, this); } action->setStatusTip(tipText); if (menuType == paneMenuType) { connect(action, SIGNAL(triggered()), this, SLOT(addPane())); connect(this, SIGNAL(canAddPane(bool)), action, SLOT(setEnabled(bool))); m_paneActions[action] = LayerConfiguration(type, model, c - 1); } else { connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(type, model, c - 1); } submenu->addAction(action); } if (isDefault && menuType == layerMenuType && mi == candidateModels.begin()) { // only add for one model, one channel, one menu on // right button -- the action itself will discover // which model is the correct one (based on pane) action = new QAction(icon, mainText, this); action->setStatusTip(tipText); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(type, 0, 0); m_rightButtonLayerMenu->addAction(action); } } } } } m_rightButtonLayerMenu->addSeparator(); menu = m_paneMenu; menu->addSeparator(); action = new QAction(tr("Switch to Previous Pane"), this); action->setShortcut(tr("[")); action->setStatusTip(tr("Make the next pane up in the pane stack current")); connect(action, SIGNAL(triggered()), this, SLOT(previousPane())); connect(this, SIGNAL(canSelectPreviousPane(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Switch to Next Pane"), this); action->setShortcut(tr("]")); action->setStatusTip(tr("Make the next pane down in the pane stack current")); connect(action, SIGNAL(triggered()), this, SLOT(nextPane())); connect(this, SIGNAL(canSelectNextPane(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); menu->addSeparator(); action = new QAction(il.load("editdelete"), tr("&Delete Pane"), this); action->setShortcut(tr("Ctrl+Shift+D")); action->setStatusTip(tr("Delete the currently active pane")); connect(action, SIGNAL(triggered()), this, SLOT(deleteCurrentPane())); connect(this, SIGNAL(canDeleteCurrentPane(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); menu = m_layerMenu; action = new QAction(il.load("timeruler"), tr("Add &Time Ruler"), this); action->setStatusTip(tr("Add a new layer showing a time ruler")); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_layerActions[action] = LayerConfiguration(LayerFactory::TimeRuler); menu->addAction(action); menu->addSeparator(); m_existingLayersMenu = menu->addMenu(tr("Add &Existing Layer")); m_existingLayersMenu->setTearOffEnabled(true); m_rightButtonLayerMenu->addMenu(m_existingLayersMenu); m_sliceMenu = menu->addMenu(tr("Add S&lice of Layer")); m_sliceMenu->setTearOffEnabled(true); m_rightButtonLayerMenu->addMenu(m_sliceMenu); setupExistingLayersMenus(); /*!!! These don't work correctly -- fix or omit menu->addSeparator(); action = new QAction(tr("Switch to Previous Layer"), this); action->setShortcut(tr("{")); action->setStatusTip(tr("Make the previous layer in the pane current")); connect(action, SIGNAL(triggered()), this, SLOT(previousLayer())); connect(this, SIGNAL(canSelectPreviousLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("Switch to Next Layer"), this); action->setShortcut(tr("}")); action->setStatusTip(tr("Make the next layer in the pane current")); connect(action, SIGNAL(triggered()), this, SLOT(nextLayer())); connect(this, SIGNAL(canSelectNextLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); */ m_rightButtonLayerMenu->addSeparator(); menu->addSeparator(); QAction *raction = new QAction(tr("&Rename Layer..."), this); raction->setShortcut(tr("R")); raction->setStatusTip(tr("Rename the currently active layer")); connect(raction, SIGNAL(triggered()), this, SLOT(renameCurrentLayer())); connect(this, SIGNAL(canRenameLayer(bool)), raction, SLOT(setEnabled(bool))); menu->addAction(raction); m_rightButtonLayerMenu->addAction(raction); QAction *eaction = new QAction(tr("Edit Layer Data"), this); eaction->setShortcut(tr("E")); eaction->setStatusTip(tr("Edit the currently active layer as a data grid")); connect(eaction, SIGNAL(triggered()), this, SLOT(editCurrentLayer())); connect(this, SIGNAL(canEditLayerTabular(bool)), eaction, SLOT(setEnabled(bool))); menu->addAction(eaction); m_rightButtonLayerMenu->addAction(eaction); action = new QAction(il.load("editdelete"), tr("&Delete Layer"), this); action->setShortcut(tr("Ctrl+D")); action->setStatusTip(tr("Delete the currently active layer")); connect(action, SIGNAL(triggered()), this, SLOT(deleteCurrentLayer())); connect(this, SIGNAL(canDeleteCurrentLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); menu->addAction(action); m_rightButtonLayerMenu->addAction(action); m_keyReference->registerShortcut(raction); // rename after delete, so delete layer goes next to delete pane m_keyReference->registerShortcut(eaction); // edit also after delete } void MainWindow::setupTransformsMenu() { if (m_transformsMenu) { m_transformActions.clear(); m_transformActionsReverse.clear(); m_transformsMenu->clear(); } else { m_transformsMenu = menuBar()->addMenu(tr("&Transform")); m_transformsMenu->setTearOffEnabled(true); m_transformsMenu->setSeparatorsCollapsible(true); } TransformFactory *factory = TransformFactory::getInstance(); TransformList transforms = factory->getAllTransformDescriptions(); vector types = factory->getAllTransformTypes(); map > categoryMenus; map > makerMenus; map byPluginNameMenus; map > pluginNameMenus; set pendingMenus; m_recentTransformsMenu = m_transformsMenu->addMenu(tr("&Recent Transforms")); m_recentTransformsMenu->setTearOffEnabled(true); m_rightButtonTransformsMenu->addMenu(m_recentTransformsMenu); connect(&m_recentTransforms, SIGNAL(recentChanged()), this, SLOT(setupRecentTransformsMenu())); m_transformsMenu->addSeparator(); m_rightButtonTransformsMenu->addSeparator(); for (vector::iterator i = types.begin(); i != types.end(); ++i) { if (i != types.begin()) { m_transformsMenu->addSeparator(); m_rightButtonTransformsMenu->addSeparator(); } QString byCategoryLabel = tr("%1 by Category") .arg(factory->getTransformTypeName(*i)); SubdividingMenu *byCategoryMenu = new SubdividingMenu(byCategoryLabel, 20, 40); byCategoryMenu->setTearOffEnabled(true); m_transformsMenu->addMenu(byCategoryMenu); m_rightButtonTransformsMenu->addMenu(byCategoryMenu); pendingMenus.insert(byCategoryMenu); vector categories = factory->getTransformCategories(*i); for (vector::iterator j = categories.begin(); j != categories.end(); ++j) { QString category = *j; if (category == "") category = tr("Unclassified"); if (categories.size() < 2) { categoryMenus[*i][category] = byCategoryMenu; continue; } QStringList components = category.split(" > "); QString key; for (QStringList::iterator k = components.begin(); k != components.end(); ++k) { QString parentKey = key; if (key != "") key += " > "; key += *k; if (categoryMenus[*i].find(key) == categoryMenus[*i].end()) { SubdividingMenu *m = new SubdividingMenu(*k, 20, 40); m->setTearOffEnabled(true); pendingMenus.insert(m); categoryMenus[*i][key] = m; if (parentKey == "") { byCategoryMenu->addMenu(m); } else { categoryMenus[*i][parentKey]->addMenu(m); } } } } QString byPluginNameLabel = tr("%1 by Plugin Name") .arg(factory->getTransformTypeName(*i)); byPluginNameMenus[*i] = new SubdividingMenu(byPluginNameLabel); byPluginNameMenus[*i]->setTearOffEnabled(true); m_transformsMenu->addMenu(byPluginNameMenus[*i]); m_rightButtonTransformsMenu->addMenu(byPluginNameMenus[*i]); pendingMenus.insert(byPluginNameMenus[*i]); QString byMakerLabel = tr("%1 by Maker") .arg(factory->getTransformTypeName(*i)); SubdividingMenu *byMakerMenu = new SubdividingMenu(byMakerLabel, 20, 40); byMakerMenu->setTearOffEnabled(true); m_transformsMenu->addMenu(byMakerMenu); m_rightButtonTransformsMenu->addMenu(byMakerMenu); pendingMenus.insert(byMakerMenu); vector makers = factory->getTransformMakers(*i); for (vector::iterator j = makers.begin(); j != makers.end(); ++j) { QString maker = *j; if (maker == "") maker = tr("Unknown"); maker.replace(QRegExp(tr(" [\\(<].*$")), ""); makerMenus[*i][maker] = new SubdividingMenu(maker, 30, 40); makerMenus[*i][maker]->setTearOffEnabled(true); byMakerMenu->addMenu(makerMenus[*i][maker]); pendingMenus.insert(makerMenus[*i][maker]); } } // Names should only be duplicated here if they have the same // plugin name, output name and maker but are in different library // .so names -- that won't happen often I hope std::map idNameSonameMap; std::set seenNames, duplicateNames; for (unsigned int i = 0; i < transforms.size(); ++i) { QString name = transforms[i].name; if (seenNames.find(name) != seenNames.end()) { duplicateNames.insert(name); } else { seenNames.insert(name); } } for (unsigned int i = 0; i < transforms.size(); ++i) { QString name = transforms[i].name; if (name == "") name = transforms[i].identifier; // cerr << "Plugin Name: " << name << endl; TransformDescription::Type type = transforms[i].type; QString typeStr = factory->getTransformTypeName(type); QString category = transforms[i].category; if (category == "") category = tr("Unclassified"); QString maker = transforms[i].maker; if (maker == "") maker = tr("Unknown"); maker.replace(QRegExp(tr(" [\\(<].*$")), ""); QString pluginName = name.section(": ", 0, 0); QString output = name.section(": ", 1); if (duplicateNames.find(pluginName) != duplicateNames.end()) { pluginName = QString("%1 <%2>") .arg(pluginName) .arg(transforms[i].identifier.section(':', 1, 1)); if (output == "") name = pluginName; else name = QString("%1: %2") .arg(pluginName) .arg(output); } QAction *action = new QAction(tr("%1...").arg(name), this); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); m_transformActions[action] = transforms[i].identifier; m_transformActionsReverse[transforms[i].identifier] = action; connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); action->setStatusTip(transforms[i].longDescription); if (categoryMenus[type].find(category) == categoryMenus[type].end()) { cerr << "WARNING: MainWindow::setupMenus: Internal error: " << "No category menu for transform \"" << name << "\" (category = \"" << category << "\")" << endl; } else { categoryMenus[type][category]->addAction(action); } if (makerMenus[type].find(maker) == makerMenus[type].end()) { cerr << "WARNING: MainWindow::setupMenus: Internal error: " << "No maker menu for transform \"" << name << "\" (maker = \"" << maker << "\")" << endl; } else { makerMenus[type][maker]->addAction(action); } action = new QAction(tr("%1...").arg(output == "" ? pluginName : output), this); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); m_transformActions[action] = transforms[i].identifier; connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); action->setStatusTip(transforms[i].longDescription); // cerr << "Transform: \"" << name << "\": plugin name \"" << pluginName << "\"" << endl; if (pluginNameMenus[type].find(pluginName) == pluginNameMenus[type].end()) { SubdividingMenu *parentMenu = byPluginNameMenus[type]; parentMenu->setTearOffEnabled(true); if (output == "") { parentMenu->addAction(pluginName, action); } else { pluginNameMenus[type][pluginName] = parentMenu->addMenu(pluginName); connect(this, SIGNAL(canAddLayer(bool)), pluginNameMenus[type][pluginName], SLOT(setEnabled(bool))); } } if (pluginNameMenus[type].find(pluginName) != pluginNameMenus[type].end()) { pluginNameMenus[type][pluginName]->addAction(action); } } for (set::iterator i = pendingMenus.begin(); i != pendingMenus.end(); ++i) { (*i)->entriesAdded(); } m_transformsMenu->addSeparator(); m_rightButtonTransformsMenu->addSeparator(); QAction *action = new QAction(tr("Find a Transform..."), this); action->setStatusTip(tr("Search for a transform from the installed plugins, by name or description")); action->setShortcut(tr("Ctrl+M")); connect(action, SIGNAL(triggered()), this, SLOT(findTransform())); // connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(action); m_transformsMenu->addAction(action); m_rightButtonTransformsMenu->addAction(action); setupRecentTransformsMenu(); } void MainWindow::setupHelpMenu() { QMenu *menu = menuBar()->addMenu(tr("&Help")); menu->setTearOffEnabled(true); m_keyReference->setCategory(tr("Help")); IconLoader il; QString name = QApplication::applicationName(); QAction *action = new QAction(il.load("help"), tr("&Help Reference"), this); action->setShortcut(tr("F1")); action->setStatusTip(tr("Open the %1 reference manual").arg(name)); connect(action, SIGNAL(triggered()), this, SLOT(help())); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("&Key and Mouse Reference"), this); action->setShortcut(tr("F2")); action->setStatusTip(tr("Open a window showing the keystrokes you can use in %1").arg(name)); connect(action, SIGNAL(triggered()), this, SLOT(keyReference())); m_keyReference->registerShortcut(action); menu->addAction(action); action = new QAction(tr("%1 on the &Web").arg(name), this); action->setStatusTip(tr("Open the %1 website").arg(name)); connect(action, SIGNAL(triggered()), this, SLOT(website())); menu->addAction(action); action = new QAction(tr("&About %1").arg(name), this); action->setStatusTip(tr("Show information about %1").arg(name)); connect(action, SIGNAL(triggered()), this, SLOT(about())); menu->addAction(action); } void MainWindow::setupRecentFilesMenu() { m_recentFilesMenu->clear(); vector files = m_recentFiles.getRecent(); for (size_t i = 0; i < files.size(); ++i) { QAction *action = new QAction(files[i], this); connect(action, SIGNAL(triggered()), this, SLOT(openRecentFile())); if (i == 0) { action->setShortcut(tr("Ctrl+R")); m_keyReference->registerShortcut (tr("Re-open"), action->shortcut().toString(), tr("Re-open the current or most recently opened file")); } m_recentFilesMenu->addAction(action); } } void MainWindow::setupTemplatesMenu() { m_templatesMenu->clear(); QAction *defaultAction = new QAction(tr("Standard Waveform"), this); defaultAction->setObjectName("default"); connect(defaultAction, SIGNAL(triggered()), this, SLOT(applyTemplate())); m_templatesMenu->addAction(defaultAction); m_templatesMenu->addSeparator(); QAction *action = 0; QStringList templates = ResourceFinder().getResourceFiles("templates", "svt"); bool havePersonal = false; // (ordered by name) std::set byName; foreach (QString t, templates) { if (!t.startsWith(":")) havePersonal = true; byName.insert(QFileInfo(t).baseName()); } foreach (QString t, byName) { if (t.toLower() == "default") continue; action = new QAction(t, this); connect(action, SIGNAL(triggered()), this, SLOT(applyTemplate())); m_templatesMenu->addAction(action); } if (!templates.empty()) m_templatesMenu->addSeparator(); if (!m_templateWatcher) { m_templateWatcher = new QFileSystemWatcher(this); m_templateWatcher->addPath(ResourceFinder().getResourceSaveDir("templates")); connect(m_templateWatcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(setupTemplatesMenu())); } QAction *setDefaultAction = new QAction(tr("Choose Default Template..."), this); setDefaultAction->setObjectName("set_default_template"); connect(setDefaultAction, SIGNAL(triggered()), this, SLOT(preferences())); m_templatesMenu->addSeparator(); m_templatesMenu->addAction(setDefaultAction); m_manageTemplatesAction->setEnabled(havePersonal); } void MainWindow::setupRecentTransformsMenu() { m_recentTransformsMenu->clear(); vector transforms = m_recentTransforms.getRecent(); for (size_t i = 0; i < transforms.size(); ++i) { TransformActionReverseMap::iterator ti = m_transformActionsReverse.find(transforms[i]); if (ti == m_transformActionsReverse.end()) { cerr << "WARNING: MainWindow::setupRecentTransformsMenu: " << "Unknown transform \"" << transforms[i] << "\" in recent transforms list" << endl; continue; } if (i == 0) { ti->second->setShortcut(tr("Ctrl+T")); m_keyReference->registerShortcut (tr("Repeat Transform"), ti->second->shortcut().toString(), tr("Re-select the most recently run transform")); } else { ti->second->setShortcut(QString("")); } m_recentTransformsMenu->addAction(ti->second); } } void MainWindow::setupExistingLayersMenus() { if (!m_existingLayersMenu) return; // should have been created by setupMenus // SVDEBUG << "MainWindow::setupExistingLayersMenu" << endl; m_existingLayersMenu->clear(); m_existingLayerActions.clear(); m_sliceMenu->clear(); m_sliceActions.clear(); IconLoader il; vector orderedLayers; set observedLayers; set sliceableLayers; LayerFactory *factory = LayerFactory::getInstance(); for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; if (observedLayers.find(layer) != observedLayers.end()) { // cerr << "found duplicate layer " << layer << endl; continue; } // cerr << "found new layer " << layer << " (name = " // << layer->getLayerPresentationName() << ")" << endl; orderedLayers.push_back(layer); observedLayers.insert(layer); if (factory->isLayerSliceable(layer)) { sliceableLayers.insert(layer); } } } map observedNames; for (size_t i = 0; i < orderedLayers.size(); ++i) { Layer *layer = orderedLayers[i]; QString name = layer->getLayerPresentationName(); int n = ++observedNames[name]; if (n > 1) name = QString("%1 <%2>").arg(name).arg(n); QIcon icon = il.load(factory->getLayerIconName (factory->getLayerType(layer))); QAction *action = new QAction(icon, name, this); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_existingLayerActions[action] = layer; m_existingLayersMenu->addAction(action); if (sliceableLayers.find(layer) != sliceableLayers.end()) { action = new QAction(icon, name, this); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); m_sliceActions[action] = layer; m_sliceMenu->addAction(action); } } m_sliceMenu->setEnabled(!m_sliceActions.empty()); } void MainWindow::setupToolbars() { m_keyReference->setCategory(tr("Playback and Transport Controls")); IconLoader il; QMenu *menu = m_playbackMenu = menuBar()->addMenu(tr("Play&back")); menu->setTearOffEnabled(true); m_rightButtonMenu->addSeparator(); m_rightButtonPlaybackMenu = m_rightButtonMenu->addMenu(tr("Playback")); QToolBar *toolbar = addToolBar(tr("Playback Toolbar")); m_rwdStartAction = toolbar->addAction(il.load("rewind-start"), tr("Rewind to Start")); m_rwdStartAction->setShortcut(tr("Home")); m_rwdStartAction->setStatusTip(tr("Rewind to the start")); connect(m_rwdStartAction, SIGNAL(triggered()), this, SLOT(rewindStart())); connect(this, SIGNAL(canPlay(bool)), m_rwdStartAction, SLOT(setEnabled(bool))); m_rwdAction = toolbar->addAction(il.load("rewind"), tr("Rewind")); m_rwdAction->setShortcut(tr("PgUp")); m_rwdAction->setStatusTip(tr("Rewind to the previous time instant or time ruler notch")); connect(m_rwdAction, SIGNAL(triggered()), this, SLOT(rewind())); connect(this, SIGNAL(canRewind(bool)), m_rwdAction, SLOT(setEnabled(bool))); m_rwdSimilarAction = new QAction(tr("Rewind to Similar Point"), this); m_rwdSimilarAction->setShortcut(tr("Shift+PgUp")); m_rwdSimilarAction->setStatusTip(tr("Rewind to the previous similarly valued time instant")); connect(m_rwdSimilarAction, SIGNAL(triggered()), this, SLOT(rewindSimilar())); connect(this, SIGNAL(canRewind(bool)), m_rwdSimilarAction, SLOT(setEnabled(bool))); m_playAction = toolbar->addAction(il.load("playpause"), tr("Play / Pause")); m_playAction->setCheckable(true); m_playAction->setShortcut(tr("Space")); m_playAction->setStatusTip(tr("Start or stop playback from the current position")); connect(m_playAction, SIGNAL(triggered()), this, SLOT(play())); connect(m_playSource, SIGNAL(playStatusChanged(bool)), m_playAction, SLOT(setChecked(bool))); connect(m_playSource, SIGNAL(playStatusChanged(bool)), this, SLOT(playStatusChanged(bool))); connect(this, SIGNAL(canPlay(bool)), m_playAction, SLOT(setEnabled(bool))); m_ffwdAction = toolbar->addAction(il.load("ffwd"), tr("Fast Forward")); m_ffwdAction->setShortcut(tr("PgDown")); m_ffwdAction->setStatusTip(tr("Fast-forward to the next time instant or time ruler notch")); connect(m_ffwdAction, SIGNAL(triggered()), this, SLOT(ffwd())); connect(this, SIGNAL(canFfwd(bool)), m_ffwdAction, SLOT(setEnabled(bool))); m_ffwdSimilarAction = new QAction(tr("Fast Forward to Similar Point"), this); m_ffwdSimilarAction->setShortcut(tr("Shift+PgDown")); m_ffwdSimilarAction->setStatusTip(tr("Fast-forward to the next similarly valued time instant")); connect(m_ffwdSimilarAction, SIGNAL(triggered()), this, SLOT(ffwdSimilar())); connect(this, SIGNAL(canFfwd(bool)), m_ffwdSimilarAction, SLOT(setEnabled(bool))); m_ffwdEndAction = toolbar->addAction(il.load("ffwd-end"), tr("Fast Forward to End")); m_ffwdEndAction->setShortcut(tr("End")); m_ffwdEndAction->setStatusTip(tr("Fast-forward to the end")); connect(m_ffwdEndAction, SIGNAL(triggered()), this, SLOT(ffwdEnd())); connect(this, SIGNAL(canPlay(bool)), m_ffwdEndAction, SLOT(setEnabled(bool))); toolbar = addToolBar(tr("Play Mode Toolbar")); m_playSelectionAction = toolbar->addAction(il.load("playselection"), tr("Constrain Playback to Selection")); m_playSelectionAction->setCheckable(true); m_playSelectionAction->setChecked(m_viewManager->getPlaySelectionMode()); m_playSelectionAction->setShortcut(tr("s")); m_playSelectionAction->setStatusTip(tr("Constrain playback to the selected regions")); connect(m_viewManager, SIGNAL(playSelectionModeChanged(bool)), m_playSelectionAction, SLOT(setChecked(bool))); connect(m_playSelectionAction, SIGNAL(triggered()), this, SLOT(playSelectionToggled())); connect(this, SIGNAL(canPlaySelection(bool)), m_playSelectionAction, SLOT(setEnabled(bool))); m_playLoopAction = toolbar->addAction(il.load("playloop"), tr("Loop Playback")); m_playLoopAction->setCheckable(true); m_playLoopAction->setChecked(m_viewManager->getPlayLoopMode()); m_playLoopAction->setShortcut(tr("l")); m_playLoopAction->setStatusTip(tr("Loop playback")); connect(m_viewManager, SIGNAL(playLoopModeChanged(bool)), m_playLoopAction, SLOT(setChecked(bool))); connect(m_playLoopAction, SIGNAL(triggered()), this, SLOT(playLoopToggled())); connect(this, SIGNAL(canPlay(bool)), m_playLoopAction, SLOT(setEnabled(bool))); m_soloAction = toolbar->addAction(il.load("solo"), tr("Solo Current Pane")); m_soloAction->setCheckable(true); m_soloAction->setChecked(m_viewManager->getPlaySoloMode()); m_prevSolo = m_viewManager->getPlaySoloMode(); m_soloAction->setShortcut(tr("o")); m_soloAction->setStatusTip(tr("Solo the current pane during playback")); connect(m_viewManager, SIGNAL(playSoloModeChanged(bool)), m_soloAction, SLOT(setChecked(bool))); connect(m_soloAction, SIGNAL(triggered()), this, SLOT(playSoloToggled())); connect(this, SIGNAL(canChangeSolo(bool)), m_soloAction, SLOT(setEnabled(bool))); QAction *alAction = 0; if (Document::canAlign()) { alAction = toolbar->addAction(il.load("align"), tr("Align File Timelines")); alAction->setCheckable(true); alAction->setChecked(m_viewManager->getAlignMode()); alAction->setStatusTip(tr("Treat multiple audio files as versions of the same work, and align their timelines")); connect(m_viewManager, SIGNAL(alignModeChanged(bool)), alAction, SLOT(setChecked(bool))); connect(alAction, SIGNAL(triggered()), this, SLOT(alignToggled())); connect(this, SIGNAL(canAlign(bool)), alAction, SLOT(setEnabled(bool))); } m_keyReference->registerShortcut(m_playAction); m_keyReference->registerShortcut(m_playSelectionAction); m_keyReference->registerShortcut(m_playLoopAction); m_keyReference->registerShortcut(m_soloAction); if (alAction) m_keyReference->registerShortcut(alAction); m_keyReference->registerShortcut(m_rwdAction); m_keyReference->registerShortcut(m_ffwdAction); m_keyReference->registerShortcut(m_rwdSimilarAction); m_keyReference->registerShortcut(m_ffwdSimilarAction); m_keyReference->registerShortcut(m_rwdStartAction); m_keyReference->registerShortcut(m_ffwdEndAction); menu->addAction(m_playAction); menu->addAction(m_playSelectionAction); menu->addAction(m_playLoopAction); menu->addAction(m_soloAction); if (alAction) menu->addAction(alAction); menu->addSeparator(); menu->addAction(m_rwdAction); menu->addAction(m_ffwdAction); menu->addSeparator(); menu->addAction(m_rwdSimilarAction); menu->addAction(m_ffwdSimilarAction); menu->addSeparator(); menu->addAction(m_rwdStartAction); menu->addAction(m_ffwdEndAction); menu->addSeparator(); m_rightButtonPlaybackMenu->addAction(m_playAction); m_rightButtonPlaybackMenu->addAction(m_playSelectionAction); m_rightButtonPlaybackMenu->addAction(m_playLoopAction); m_rightButtonPlaybackMenu->addAction(m_soloAction); if (alAction) m_rightButtonPlaybackMenu->addAction(alAction); m_rightButtonPlaybackMenu->addSeparator(); m_rightButtonPlaybackMenu->addAction(m_rwdAction); m_rightButtonPlaybackMenu->addAction(m_ffwdAction); m_rightButtonPlaybackMenu->addSeparator(); m_rightButtonPlaybackMenu->addAction(m_rwdStartAction); m_rightButtonPlaybackMenu->addAction(m_ffwdEndAction); m_rightButtonPlaybackMenu->addSeparator(); QAction *fastAction = menu->addAction(tr("Speed Up")); fastAction->setShortcut(tr("Ctrl+PgUp")); fastAction->setStatusTip(tr("Time-stretch playback to speed it up without changing pitch")); connect(fastAction, SIGNAL(triggered()), this, SLOT(speedUpPlayback())); connect(this, SIGNAL(canSpeedUpPlayback(bool)), fastAction, SLOT(setEnabled(bool))); QAction *slowAction = menu->addAction(tr("Slow Down")); slowAction->setShortcut(tr("Ctrl+PgDown")); slowAction->setStatusTip(tr("Time-stretch playback to slow it down without changing pitch")); connect(slowAction, SIGNAL(triggered()), this, SLOT(slowDownPlayback())); connect(this, SIGNAL(canSlowDownPlayback(bool)), slowAction, SLOT(setEnabled(bool))); QAction *normalAction = menu->addAction(tr("Restore Normal Speed")); normalAction->setShortcut(tr("Ctrl+Home")); normalAction->setStatusTip(tr("Restore non-time-stretched playback")); connect(normalAction, SIGNAL(triggered()), this, SLOT(restoreNormalPlayback())); connect(this, SIGNAL(canChangePlaybackSpeed(bool)), normalAction, SLOT(setEnabled(bool))); m_keyReference->registerShortcut(fastAction); m_keyReference->registerShortcut(slowAction); m_keyReference->registerShortcut(normalAction); m_rightButtonPlaybackMenu->addAction(fastAction); m_rightButtonPlaybackMenu->addAction(slowAction); m_rightButtonPlaybackMenu->addAction(normalAction); toolbar = addToolBar(tr("Edit Toolbar")); CommandHistory::getInstance()->registerToolbar(toolbar); m_keyReference->setCategory(tr("Tool Selection")); toolbar = addToolBar(tr("Tools Toolbar")); QActionGroup *group = new QActionGroup(this); QAction *action = toolbar->addAction(il.load("navigate"), tr("Navigate")); action->setCheckable(true); action->setChecked(true); action->setShortcut(tr("1")); action->setStatusTip(tr("Navigate")); connect(action, SIGNAL(triggered()), this, SLOT(toolNavigateSelected())); connect(this, SIGNAL(replacedDocument()), action, SLOT(trigger())); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::NavigateMode] = action; action = toolbar->addAction(il.load("select"), tr("Select")); action->setCheckable(true); action->setShortcut(tr("2")); action->setStatusTip(tr("Select ranges")); connect(action, SIGNAL(triggered()), this, SLOT(toolSelectSelected())); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::SelectMode] = action; action = toolbar->addAction(il.load("move"), tr("Edit")); action->setCheckable(true); action->setShortcut(tr("3")); action->setStatusTip(tr("Edit items in layer")); connect(action, SIGNAL(triggered()), this, SLOT(toolEditSelected())); connect(this, SIGNAL(canEditLayer(bool)), action, SLOT(setEnabled(bool))); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::EditMode] = action; action = toolbar->addAction(il.load("draw"), tr("Draw")); action->setCheckable(true); action->setShortcut(tr("4")); action->setStatusTip(tr("Draw new items in layer")); connect(action, SIGNAL(triggered()), this, SLOT(toolDrawSelected())); connect(this, SIGNAL(canEditLayer(bool)), action, SLOT(setEnabled(bool))); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::DrawMode] = action; action = toolbar->addAction(il.load("erase"), tr("Erase")); action->setCheckable(true); action->setShortcut(tr("5")); action->setStatusTip(tr("Erase items from layer")); connect(action, SIGNAL(triggered()), this, SLOT(toolEraseSelected())); connect(this, SIGNAL(canEditLayer(bool)), action, SLOT(setEnabled(bool))); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::EraseMode] = action; action = toolbar->addAction(il.load("measure"), tr("Measure")); action->setCheckable(true); action->setShortcut(tr("6")); action->setStatusTip(tr("Make measurements in layer")); connect(action, SIGNAL(triggered()), this, SLOT(toolMeasureSelected())); connect(this, SIGNAL(canMeasureLayer(bool)), action, SLOT(setEnabled(bool))); group->addAction(action); m_keyReference->registerShortcut(action); m_toolActions[ViewManager::MeasureMode] = action; toolNavigateSelected(); Pane::registerShortcuts(*m_keyReference); } void MainWindow::connectLayerEditDialog(ModelDataTableDialog *dialog) { MainWindowBase::connectLayerEditDialog(dialog); QToolBar *toolbar = dialog->getPlayToolbar(); if (toolbar) { toolbar->addAction(m_rwdStartAction); toolbar->addAction(m_rwdAction); toolbar->addAction(m_playAction); toolbar->addAction(m_ffwdAction); toolbar->addAction(m_ffwdEndAction); } } void MainWindow::updateMenuStates() { MainWindowBase::updateMenuStates(); Pane *currentPane = 0; Layer *currentLayer = 0; if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentLayer = currentPane->getSelectedLayer(); bool haveCurrentPane = (currentPane != 0); bool haveCurrentLayer = (haveCurrentPane && (currentLayer != 0)); bool havePlayTarget = (m_playTarget != 0); bool haveSelection = (m_viewManager && !m_viewManager->getSelections().empty()); bool haveCurrentEditableLayer = (haveCurrentLayer && currentLayer->isLayerEditable()); bool haveCurrentTimeInstantsLayer = (haveCurrentLayer && dynamic_cast(currentLayer)); bool haveCurrentTimeValueLayer = (haveCurrentLayer && dynamic_cast(currentLayer)); bool alignMode = m_viewManager && m_viewManager->getAlignMode(); emit canChangeSolo(havePlayTarget && !alignMode); emit canAlign(havePlayTarget && m_document && m_document->canAlign()); emit canChangePlaybackSpeed(true); int v = m_playSpeed->value(); emit canSpeedUpPlayback(v < m_playSpeed->maximum()); emit canSlowDownPlayback(v > m_playSpeed->minimum()); if (m_viewManager && (m_viewManager->getToolMode() == ViewManager::MeasureMode)) { emit canDeleteSelection(haveCurrentLayer); m_deleteSelectedAction->setText(tr("&Delete Current Measurement")); m_deleteSelectedAction->setStatusTip(tr("Delete the measurement currently under the mouse pointer")); } else { emit canDeleteSelection(haveSelection && haveCurrentEditableLayer); m_deleteSelectedAction->setText(tr("&Delete Selected Items")); m_deleteSelectedAction->setStatusTip(tr("Delete items in current selection from the current layer")); } if (m_ffwdAction && m_rwdAction) { if (haveCurrentTimeInstantsLayer) { m_ffwdAction->setText(tr("Fast Forward to Next Instant")); m_ffwdAction->setStatusTip(tr("Fast forward to the next time instant in the current layer")); m_rwdAction->setText(tr("Rewind to Previous Instant")); m_rwdAction->setStatusTip(tr("Rewind to the previous time instant in the current layer")); } else if (haveCurrentTimeValueLayer) { m_ffwdAction->setText(tr("Fast Forward to Next Point")); m_ffwdAction->setStatusTip(tr("Fast forward to the next point in the current layer")); m_rwdAction->setText(tr("Rewind to Previous Point")); m_rwdAction->setStatusTip(tr("Rewind to the previous point in the current layer")); } else { m_ffwdAction->setText(tr("Fast Forward")); m_ffwdAction->setStatusTip(tr("Fast forward")); m_rwdAction->setText(tr("Rewind")); m_rwdAction->setStatusTip(tr("Rewind")); } } } void MainWindow::updateDescriptionLabel() { if (!getMainModel()) { m_descriptionLabel->setText(tr("No audio file loaded.")); return; } QString description; size_t ssr = getMainModel()->getSampleRate(); size_t tsr = ssr; if (m_playSource) tsr = m_playSource->getTargetSampleRate(); if (ssr != tsr) { description = tr("%1Hz (resampling to %2Hz)").arg(ssr).arg(tsr); } else { description = QString("%1Hz").arg(ssr); } description = QString("%1 - %2") .arg(RealTime::frame2RealTime(getMainModel()->getEndFrame(), ssr) .toText(false).c_str()) .arg(description); m_descriptionLabel->setText(description); } void MainWindow::documentModified() { //!!! MainWindowBase::documentModified(); } void MainWindow::documentRestored() { //!!! MainWindowBase::documentRestored(); } void MainWindow::toolNavigateSelected() { m_viewManager->setToolMode(ViewManager::NavigateMode); } void MainWindow::toolSelectSelected() { m_viewManager->setToolMode(ViewManager::SelectMode); } void MainWindow::toolEditSelected() { m_viewManager->setToolMode(ViewManager::EditMode); } void MainWindow::toolDrawSelected() { m_viewManager->setToolMode(ViewManager::DrawMode); } void MainWindow::toolEraseSelected() { m_viewManager->setToolMode(ViewManager::EraseMode); } void MainWindow::toolMeasureSelected() { m_viewManager->setToolMode(ViewManager::MeasureMode); } void MainWindow::importAudio() { QString path = getOpenFileName(FileFinder::AudioFile); if (path != "") { if (openAudio(path, ReplaceSession) == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

Audio file \"%1\" could not be opened").arg(path)); } } } void MainWindow::importMoreAudio() { QString path = getOpenFileName(FileFinder::AudioFile); if (path != "") { if (openAudio(path, CreateAdditionalModel) == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

Audio file \"%1\" could not be opened").arg(path)); } } } void MainWindow::replaceMainAudio() { QString path = getOpenFileName(FileFinder::AudioFile); if (path != "") { if (openAudio(path, ReplaceMainModel) == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

Audio file \"%1\" could not be opened").arg(path)); } } } void MainWindow::exportAudio() { exportAudio(false); } void MainWindow::exportAudioData() { exportAudio(true); } void MainWindow::exportAudio(bool asData) { if (!getMainModel()) return; RangeSummarisableTimeValueModel *model = getMainModel(); std::set otherModels; RangeSummarisableTimeValueModel *current = model; if (m_paneStack) { for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; cerr << "layer = " << layer->objectName() << endl; Model *m = layer->getModel(); RangeSummarisableTimeValueModel *wm = dynamic_cast(m); if (wm) { cerr << "found: " << wm->objectName() << endl; otherModels.insert(wm); if (pane == m_paneStack->getCurrentPane()) { current = wm; } } } } } if (!otherModels.empty()) { std::map m; m[tr("1. %2").arg(model->objectName())] = model; int n = 2; int c = 0; for (std::set::const_iterator i = otherModels.begin(); i != otherModels.end(); ++i) { if (*i == model) continue; m[tr("%1. %2").arg(n).arg((*i)->objectName())] = *i; ++n; if (*i == current) c = n-1; } QStringList items; for (std::map ::const_iterator i = m.begin(); i != m.end(); ++i) { items << i->first; } if (items.size() > 1) { bool ok = false; QString item = QInputDialog::getItem (this, tr("Select audio file to export"), tr("Which audio file do you want to export from?"), items, c, false, &ok); if (!ok || item.isEmpty()) return; if (m.find(item) == m.end()) { cerr << "WARNING: Model " << item << " not found in list!" << endl; } else { model = m[item]; } } } QString path; if (asData) { path = getSaveFileName(FileFinder::CSVFile); } else { path = getSaveFileName(FileFinder::AudioFile); } if (path == "") return; bool ok = false; QString error; MultiSelection ms = m_viewManager->getSelection(); MultiSelection::SelectionList selections = m_viewManager->getSelections(); bool multiple = false; MultiSelection *selectionToWrite = 0; if (selections.size() == 1) { QStringList items; items << tr("Export the selected region only") << tr("Export the whole audio file"); bool ok = false; QString item = ListInputDialog::getItem (this, tr("Select region to export"), tr("Which region from the original audio file do you want to export?"), items, 0, &ok); if (!ok || item.isEmpty()) return; if (item == items[0]) selectionToWrite = &ms; } else if (selections.size() > 1) { bool multiple = false; if (!asData) { // Multi-file export not supported for data QStringList items; items << tr("Export the selected regions into a single file") << tr("Export the selected regions into separate files") << tr("Export the whole file"); QString item = ListInputDialog::getItem (this, tr("Select region to export"), tr("Multiple regions of the original audio file are selected.\nWhat do you want to export?"), items, 0, &ok); if (!ok || item.isEmpty()) return; if (item == items[0]) { selectionToWrite = &ms; } else if (item == items[1]) { multiple = true; } } else { // asData selectionToWrite = &ms; } if (multiple) { // Can only happen when asData false int n = 1; QString base = path; base.replace(".wav", ""); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { MultiSelection subms; subms.setSelection(*i); QString subpath = QString("%1.%2.wav").arg(base).arg(n); ++n; if (QFileInfo(subpath).exists()) { error = tr("Fragment file %1 already exists, aborting").arg(subpath); break; } WavFileWriter subwriter(subpath, model->getSampleRate(), model->getChannelCount(), WavFileWriter::WriteToTemporary); subwriter.writeModel(model, &subms); ok = subwriter.isOK(); if (!ok) { error = subwriter.getError(); break; } } } } if (!multiple) { if (asData) { CSVFileWriter writer(path, model, ((QFileInfo(path).suffix() == "csv") ? "," : "\t")); if (selectionToWrite) { writer.writeSelection(selectionToWrite); } else { writer.write(); } ok = writer.isOK(); error = writer.getError(); } else { WavFileWriter writer(path, model->getSampleRate(), model->getChannelCount(), WavFileWriter::WriteToTemporary); writer.writeModel(model, selectionToWrite); ok = writer.isOK(); error = writer.getError(); } } if (ok) { if (multiple) { emit activity(tr("Export multiple audio files")); } else { emit activity(tr("Export audio to \"%1\"").arg(path)); m_recentFiles.addFile(path); } } else { QMessageBox::critical(this, tr("Failed to write file"), error); } } void MainWindow::importLayer() { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindow::importLayer: no current pane" << endl; return; } if (!getMainModel()) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindow::importLayer: No main model -- hence no default sample rate available" << endl; return; } QString path = getOpenFileName(FileFinder::LayerFile); if (path != "") { FileOpenStatus status = openLayer(path); if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

Layer file %1 could not be opened.").arg(path)); return; } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(path)); } } } void MainWindow::exportLayer() { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return; Layer *layer = pane->getSelectedLayer(); if (!layer) return; Model *model = layer->getModel(); if (!model) return; FileFinder::FileType type = FileFinder::LayerFileNoMidi; if (dynamic_cast(model)) type = FileFinder::LayerFile; QString path = getSaveFileName(type); if (path == "") return; if (QFileInfo(path).suffix() == "") path += ".svl"; QString suffix = QFileInfo(path).suffix().toLower(); QString error; if (suffix == "xml" || suffix == "svl") { QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { error = tr("Failed to open file %1 for writing").arg(path); } else { QTextStream out(&file); out << "\n" << "\n" << "\n" << " \n"; model->toXml(out, " "); out << " \n" << " \n"; layer->toXml(out, " "); out << " \n" << "\n"; } } else if (suffix == "mid" || suffix == "midi") { NoteModel *nm = dynamic_cast(model); if (!nm) { error = tr("Can't export non-note layers to MIDI"); } else { MIDIFileWriter writer(path, nm); writer.write(); if (!writer.isOK()) { error = writer.getError(); } } } else if (suffix == "ttl" || suffix == "n3") { if (!RDFExporter::canExportModel(model)) { error = tr("Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values)"); } else { RDFExporter exporter(path, model); exporter.write(); if (!exporter.isOK()) { error = exporter.getError(); } } } else { CSVFileWriter writer(path, model, ((suffix == "csv") ? "," : "\t")); writer.write(); if (!writer.isOK()) { error = writer.getError(); } } if (error != "") { QMessageBox::critical(this, tr("Failed to write file"), error); } else { m_recentFiles.addFile(path); emit activity(tr("Export layer to \"%1\"").arg(path)); } } void MainWindow::exportImage() { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return; QString path = getSaveFileName(FileFinder::ImageFile); if (path == "") return; if (QFileInfo(path).suffix() == "") path += ".png"; bool haveSelection = m_viewManager && !m_viewManager->getSelections().empty(); QSize total, visible, selected; total = pane->getImageSize(); visible = pane->getImageSize(pane->getFirstVisibleFrame(), pane->getLastVisibleFrame()); size_t sf0 = 0, sf1 = 0; if (haveSelection) { MultiSelection::SelectionList selections = m_viewManager->getSelections(); sf0 = selections.begin()->getStartFrame(); MultiSelection::SelectionList::iterator e = selections.end(); --e; sf1 = e->getEndFrame(); selected = pane->getImageSize(sf0, sf1); } QStringList items; items << tr("Export the whole pane (%1x%2 pixels)") .arg(total.width()).arg(total.height()); items << tr("Export the visible area only (%1x%2 pixels)") .arg(visible.width()).arg(visible.height()); if (haveSelection) { items << tr("Export the selection extent (%1x%2 pixels)") .arg(selected.width()).arg(selected.height()); } else { items << tr("Export the selection extent"); } QSettings settings; settings.beginGroup("MainWindow"); int deflt = settings.value("lastimageexportregion", 0).toInt(); if (deflt == 2 && !haveSelection) deflt = 1; if (deflt == 0 && total.width() > 32767) deflt = 1; ListInputDialog *lid = new ListInputDialog (this, tr("Select region to export"), tr("Which region of the current pane do you want to export as an image?"), items, deflt); if (!haveSelection) { lid->setItemAvailability(2, false); } if (total.width() > 32767) { // appears to be the limit of a QImage lid->setItemAvailability(0, false); lid->setFootnote(tr("Note: the whole pane is too wide to be exported as a single image.")); } bool ok = lid->exec(); QString item = lid->getCurrentString(); delete lid; if (!ok || item.isEmpty()) return; settings.setValue("lastimageexportregion", deflt); QImage *image = 0; if (item == items[0]) { image = pane->toNewImage(); } else if (item == items[1]) { image = pane->toNewImage(pane->getFirstVisibleFrame(), pane->getLastVisibleFrame()); } else if (haveSelection) { image = pane->toNewImage(sf0, sf1); } if (!image) return; if (!image->save(path, "PNG")) { QMessageBox::critical(this, tr("Failed to save image file"), tr("Failed to save image file %1").arg(path)); } delete image; } void MainWindow::newSession() { if (!checkSaveModified()) return; closeSession(); createDocument(); Pane *pane = m_paneStack->addPane(); connect(pane, SIGNAL(contextHelpChanged(const QString &)), this, SLOT(contextHelpChanged(const QString &))); if (!m_timeRulerLayer) { m_timeRulerLayer = m_document->createMainModelLayer (LayerFactory::TimeRuler); } m_document->addLayerToView(pane, m_timeRulerLayer); Layer *waveform = m_document->createMainModelLayer(LayerFactory::Waveform); m_document->addLayerToView(pane, waveform); m_overview->registerView(pane); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); documentRestored(); updateMenuStates(); } void MainWindow::documentReplaced() { if (m_document) { connect(m_document, SIGNAL(activity(QString)), m_activityLog, SLOT(activityHappened(QString))); } } void MainWindow::closeSession() { if (!checkSaveModified()) return; while (m_paneStack->getPaneCount() > 0) { Pane *pane = m_paneStack->getPane(m_paneStack->getPaneCount() - 1); while (pane->getLayerCount() > 0) { m_document->removeLayerFromView (pane, pane->getLayer(pane->getLayerCount() - 1)); } m_overview->unregisterView(pane); m_paneStack->deletePane(pane); } while (m_paneStack->getHiddenPaneCount() > 0) { Pane *pane = m_paneStack->getHiddenPane (m_paneStack->getHiddenPaneCount() - 1); while (pane->getLayerCount() > 0) { m_document->removeLayerFromView (pane, pane->getLayer(pane->getLayerCount() - 1)); } m_overview->unregisterView(pane); m_paneStack->deletePane(pane); } delete m_layerTreeDialog.data(); delete m_preferencesDialog.data(); m_activityLog->hide(); m_keyReference->hide(); delete m_document; m_document = 0; m_viewManager->clearSelections(); m_timeRulerLayer = 0; // document owned this m_sessionFile = ""; setWindowTitle(QApplication::applicationName()); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); documentRestored(); } void MainWindow::openSession() { if (!checkSaveModified()) return; QString orig = m_audioFile; if (orig == "") orig = "."; else orig = QFileInfo(orig).absoluteDir().canonicalPath(); QString path = getOpenFileName(FileFinder::SessionFile); if (path.isEmpty()) return; if (openSessionFile(path) == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

Session file \"%1\" could not be opened").arg(path)); } } void MainWindow::openSomething() { QString orig = m_audioFile; if (orig == "") orig = "."; else orig = QFileInfo(orig).absoluteDir().canonicalPath(); QString path = getOpenFileName(FileFinder::AnyFile); if (path.isEmpty()) return; FileOpenStatus status = open(path, ReplaceSession); if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("File open failed

File \"%1\" could not be opened").arg(path)); } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open file"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(path)); } } void MainWindow::openLocation() { QSettings settings; settings.beginGroup("MainWindow"); QString lastLocation = settings.value("lastremote", "").toString(); bool ok = false; QString text = QInputDialog::getText (this, tr("Open Location"), tr("Please enter the URL of the location to open:"), QLineEdit::Normal, lastLocation, &ok); if (!ok) return; settings.setValue("lastremote", text); if (text.isEmpty()) return; FileOpenStatus status = open(text, AskUser); if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open location"), tr("Open failed

URL \"%1\" could not be opened").arg(text)); } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open location"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(text)); } } void MainWindow::openRecentFile() { QObject *obj = sender(); QAction *action = dynamic_cast(obj); if (!action) { cerr << "WARNING: MainWindow::openRecentFile: sender is not an action" << endl; return; } QString path = action->text(); if (path == "") return; FileOpenStatus status = open(path, ReplaceSession); if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open location"), tr("Open failed

File or URL \"%1\" could not be opened").arg(path)); } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open location"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(path)); } } void MainWindow::applyTemplate() { QObject *s = sender(); QAction *action = qobject_cast(s); if (!action) { cerr << "WARNING: MainWindow::applyTemplate: sender is not an action" << endl; return; } QString n = action->objectName(); if (n == "") n = action->text(); if (n == "") { cerr << "WARNING: MainWindow::applyTemplate: sender has no name" << endl; return; } QString mainModelLocation; WaveFileModel *mm = getMainModel(); if (mm) mainModelLocation = mm->getLocation(); if (mainModelLocation != "") { openAudio(mainModelLocation, ReplaceSession, n); } else { openSessionTemplate(n); } } void MainWindow::saveSessionAsTemplate() { QDialog *d = new QDialog; d->setWindowTitle(tr("Enter template name")); QGridLayout *layout = new QGridLayout; d->setLayout(layout); layout->addWidget(new QLabel(tr("Please enter a name for the saved template:")), 0, 0); QLineEdit *lineEdit = new QLineEdit; layout->addWidget(lineEdit, 1, 0); QCheckBox *makeDefault = new QCheckBox(tr("Set as default template for future audio files")); layout->addWidget(makeDefault, 2, 0); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(bb, 3, 0); connect(bb, SIGNAL(accepted()), d, SLOT(accept())); connect(bb, SIGNAL(accepted()), d, SLOT(accept())); connect(bb, SIGNAL(rejected()), d, SLOT(reject())); if (d->exec() == QDialog::Accepted) { QString name = lineEdit->text(); name.replace(QRegExp("[^\\w\\s\\.\"'-]"), "_"); ResourceFinder rf; QString dir = rf.getResourceSaveDir("templates"); QString filename = QString("%1/%2.svt").arg(dir).arg(name); if (QFile(filename).exists()) { if (QMessageBox::warning(this, tr("Template file exists"), tr("Template file exists

The template \"%1\" already exists.
Overwrite it?").arg(name), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel) != QMessageBox::Ok) { return; } } if (saveSessionTemplate(filename)) { if (makeDefault->isChecked()) { setDefaultSessionTemplate(name); } } } } void MainWindow::manageSavedTemplates() { ResourceFinder rf; QDesktopServices::openUrl("file:" + rf.getResourceSaveDir("templates")); } void MainWindow::paneAdded(Pane *pane) { if (m_overview) m_overview->registerView(pane); } void MainWindow::paneHidden(Pane *pane) { if (m_overview) m_overview->unregisterView(pane); } void MainWindow::paneAboutToBeDeleted(Pane *pane) { if (m_overview) m_overview->unregisterView(pane); } void MainWindow::paneDropAccepted(Pane *pane, QStringList uriList) { if (pane) m_paneStack->setCurrentPane(pane); for (QStringList::iterator i = uriList.begin(); i != uriList.end(); ++i) { FileOpenStatus status; if (i == uriList.begin()) { status = open(*i, ReplaceCurrentPane); } else { status = open(*i, CreateAdditionalModel); } if (status == FileOpenFailed) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open dropped URL"), tr("Open failed

Dropped URL \"%1\" could not be opened").arg(*i)); break; } else if (status == FileOpenWrongMode) { emit hideSplash(); QMessageBox::critical(this, tr("Failed to open dropped URL"), tr("Audio required

Unable to load layer data from \"%1\" without an audio file.
Please load at least one audio file before importing annotations.").arg(*i)); break; } else if (status == FileOpenCancelled) { break; } } } void MainWindow::paneDropAccepted(Pane *pane, QString text) { if (pane) m_paneStack->setCurrentPane(pane); QUrl testUrl(text); if (testUrl.scheme() == "file" || testUrl.scheme() == "http" || testUrl.scheme() == "ftp") { QStringList list; list.push_back(text); paneDropAccepted(pane, list); return; } //!!! open as text -- but by importing as if a CSV, or just adding //to a text layer? } void MainWindow::closeEvent(QCloseEvent *e) { // cerr << "MainWindow::closeEvent" << endl; if (m_openingAudioFile) { // cerr << "Busy - ignoring close event" << endl; e->ignore(); return; } if (!m_abandoning && !checkSaveModified()) { // cerr << "Close refused by user - ignoring close event" << endl; e->ignore(); return; } QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("maximised", isMaximized()); if (!isMaximized()) { settings.setValue("size", size()); settings.setValue("position", pos()); } settings.endGroup(); if (m_preferencesDialog && m_preferencesDialog->isVisible()) { closeSession(); // otherwise we'll have to wait for prefs changes m_preferencesDialog->applicationClosing(false); } closeSession(); e->accept(); return; } bool MainWindow::commitData(bool mayAskUser) { if (mayAskUser) { bool rv = checkSaveModified(); if (rv) { if (m_preferencesDialog && m_preferencesDialog->isVisible()) { m_preferencesDialog->applicationClosing(false); } } return rv; } else { if (m_preferencesDialog && m_preferencesDialog->isVisible()) { m_preferencesDialog->applicationClosing(true); } if (!m_documentModified) return true; // If we can't check with the user first, then we can't save // to the original session file (even if we have it) -- have // to use a temporary file QString svDirBase = ".sv1"; QString svDir = QDir::home().filePath(svDirBase); if (!QFileInfo(svDir).exists()) { if (!QDir::home().mkdir(svDirBase)) return false; } else { if (!QFileInfo(svDir).isDir()) return false; } // This name doesn't have to be unguessable #ifndef _WIN32 QString fname = QString("tmp-%1-%2.sv") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")) .arg(QProcess().pid()); #else QString fname = QString("tmp-%1.sv") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); #endif QString fpath = QDir(svDir).filePath(fname); if (saveSessionFile(fpath)) { m_recentFiles.addFile(fpath); emit activity(tr("Export image to \"%1\"").arg(fpath)); return true; } else { return false; } } } bool MainWindow::checkSaveModified() { // Called before some destructive operation (e.g. new session, // exit program). Return true if we can safely proceed, false to // cancel. if (!m_documentModified) return true; emit hideSplash(); int button = QMessageBox::warning(this, tr("Session modified"), tr("Session modified

The current session has been modified.
Do you want to save it?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Yes) { saveSession(); if (m_documentModified) { // save failed -- don't proceed! return false; } else { return true; // saved, so it's safe to continue now } } else if (button == QMessageBox::No) { m_documentModified = false; // so we know to abandon it return true; } // else cancel return false; } bool MainWindow::shouldCreateNewSessionForRDFAudio(bool *cancel) { //!!! This is very similar to part of MainWindowBase::openAudio -- //!!! make them a bit more uniform QSettings settings; settings.beginGroup("MainWindow"); bool prevNewSession = settings.value("newsessionforrdfaudio", true).toBool(); settings.endGroup(); bool newSession = true; QStringList items; items << tr("Close the current session and create a new one") << tr("Add this data to the current session"); bool ok = false; QString item = ListInputDialog::getItem (this, tr("Select target for import"), tr("Select a target for import

This RDF document refers to one or more audio files.
You already have an audio waveform loaded.
What would you like to do with the new data?"), items, prevNewSession ? 0 : 1, &ok); if (!ok || item.isEmpty()) { *cancel = true; return false; } newSession = (item == items[0]); settings.beginGroup("MainWindow"); settings.setValue("newsessionforrdfaudio", newSession); settings.endGroup(); if (newSession) return true; else return false; } void MainWindow::saveSession() { if (m_sessionFile != "") { if (!saveSessionFile(m_sessionFile)) { QMessageBox::critical(this, tr("Failed to save file"), tr("Save failed

Session file \"%1\" could not be saved.").arg(m_sessionFile)); } else { CommandHistory::getInstance()->documentSaved(); documentRestored(); } } else { saveSessionAs(); } } void MainWindow::saveSessionAs() { QString orig = m_audioFile; if (orig == "") orig = "."; else orig = QFileInfo(orig).absoluteDir().canonicalPath(); QString path = getSaveFileName(FileFinder::SessionFile); if (path == "") return; if (!saveSessionFile(path)) { QMessageBox::critical(this, tr("Failed to save file"), tr("Save failed

Session file \"%1\" could not be saved.").arg(path)); } else { setWindowTitle(tr("%1: %1") .arg(QApplication::applicationName()) .arg(QFileInfo(path).fileName())); m_sessionFile = path; CommandHistory::getInstance()->documentSaved(); documentRestored(); m_recentFiles.addFile(path); emit activity(tr("Save session as \"%1\"").arg(path)); } } void MainWindow::preferenceChanged(PropertyContainer::PropertyName name) { MainWindowBase::preferenceChanged(name); if (name == "Background Mode" && m_viewManager) { if (m_viewManager->getGlobalDarkBackground()) { m_panLayer->setBaseColour (ColourDatabase::getInstance()->getColourIndex(tr("Bright Green"))); } else { m_panLayer->setBaseColour (ColourDatabase::getInstance()->getColourIndex(tr("Green"))); } } } void MainWindow::propertyStacksResized(int width) { // SVDEBUG << "MainWindow::propertyStacksResized(" << width << ")" << endl; if (!m_playControlsSpacer) return; int spacerWidth = width - m_playControlsWidth - 4; // SVDEBUG << "resizing spacer from " << m_playControlsSpacer->width() << " to " << spacerWidth << endl; m_playControlsSpacer->setFixedSize(QSize(spacerWidth, 2)); } void MainWindow::addPane() { QObject *s = sender(); QAction *action = dynamic_cast(s); if (!action) { cerr << "WARNING: MainWindow::addPane: sender is not an action" << endl; return; } PaneActionMap::iterator i = m_paneActions.find(action); if (i == m_paneActions.end()) { cerr << "WARNING: MainWindow::addPane: unknown action " << action->objectName() << endl; return; } addPane(i->second, action->text()); } void MainWindow::addPane(const LayerConfiguration &configuration, QString text) { CommandHistory::getInstance()->startCompoundOperation(text, true); AddPaneCommand *command = new AddPaneCommand(this); CommandHistory::getInstance()->addCommand(command); Pane *pane = command->getPane(); if (configuration.layer == LayerFactory::Spectrum) { pane->setPlaybackFollow(PlaybackScrollContinuous); pane->setFollowGlobalZoom(false); pane->setZoomLevel(512); } if (configuration.layer != LayerFactory::TimeRuler && configuration.layer != LayerFactory::Spectrum) { if (!m_timeRulerLayer) { // cerr << "no time ruler layer, creating one" << endl; m_timeRulerLayer = m_document->createMainModelLayer (LayerFactory::TimeRuler); } // SVDEBUG << "adding time ruler layer " << m_timeRulerLayer << endl; m_document->addLayerToView(pane, m_timeRulerLayer); } Layer *newLayer = m_document->createLayer(configuration.layer); Model *suggestedModel = configuration.sourceModel; Model *model = 0; if (suggestedModel) { // check its validity std::vector inputModels = m_document->getTransformInputModels(); for (size_t j = 0; j < inputModels.size(); ++j) { if (inputModels[j] == suggestedModel) { model = suggestedModel; break; } } if (!model) { cerr << "WARNING: Model " << (void *)suggestedModel << " appears in pane action map, but is not reported " << "by document as a valid transform source" << endl; } } if (!model) { model = m_document->getMainModel(); } m_document->setModel(newLayer, model); m_document->setChannel(newLayer, configuration.channel); m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentPane(pane); m_paneStack->setCurrentLayer(pane, newLayer); // SVDEBUG << "MainWindow::addPane: global centre frame is " // << m_viewManager->getGlobalCentreFrame() << endl; // pane->setCentreFrame(m_viewManager->getGlobalCentreFrame()); CommandHistory::getInstance()->endCompoundOperation(); updateMenuStates(); } void MainWindow::addLayer() { QObject *s = sender(); QAction *action = dynamic_cast(s); if (!action) { cerr << "WARNING: MainWindow::addLayer: sender is not an action" << endl; return; } Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { cerr << "WARNING: MainWindow::addLayer: no current pane" << endl; return; } ExistingLayerActionMap::iterator ei = m_existingLayerActions.find(action); if (ei != m_existingLayerActions.end()) { Layer *newLayer = ei->second; m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentLayer(pane, newLayer); return; } ei = m_sliceActions.find(action); if (ei != m_sliceActions.end()) { Layer *newLayer = m_document->createLayer(LayerFactory::Slice); // document->setModel(newLayer, ei->second->getModel()); SliceableLayer *source = dynamic_cast(ei->second); SliceLayer *dest = dynamic_cast(newLayer); if (source && dest) { //!!!??? dest->setSliceableModel(source->getSliceableModel()); connect(source, SIGNAL(sliceableModelReplaced(const Model *, const Model *)), dest, SLOT(sliceableModelReplaced(const Model *, const Model *))); connect(m_document, SIGNAL(modelAboutToBeDeleted(Model *)), dest, SLOT(modelAboutToBeDeleted(Model *))); } m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentLayer(pane, newLayer); return; } TransformActionMap::iterator i = m_transformActions.find(action); if (i == m_transformActions.end()) { LayerActionMap::iterator i = m_layerActions.find(action); if (i == m_layerActions.end()) { cerr << "WARNING: MainWindow::addLayer: unknown action " << action->objectName() << endl; return; } LayerFactory::LayerType type = i->second.layer; LayerFactory::LayerTypeSet emptyTypes = LayerFactory::getInstance()->getValidEmptyLayerTypes(); Layer *newLayer = 0; if (emptyTypes.find(type) != emptyTypes.end()) { newLayer = m_document->createEmptyLayer(type); if (newLayer) { m_toolActions[ViewManager::DrawMode]->trigger(); } } else { Model *model = i->second.sourceModel; cerr << "model = "<< model << endl; if (!model) { if (type == LayerFactory::TimeRuler) { newLayer = m_document->createMainModelLayer(type); } else { // if model is unspecified and this is not a // time-ruler layer, use any plausible model from // the current pane -- this is the case for // right-button menu layer additions Pane::ModelSet ms = pane->getModels(); foreach (Model *m, ms) { RangeSummarisableTimeValueModel *r = dynamic_cast(m); if (r) model = m; } if (!model) model = getMainModel(); } } if (model) { newLayer = m_document->createLayer(type); if (m_document->isKnownModel(model)) { m_document->setChannel(newLayer, i->second.channel); m_document->setModel(newLayer, model); } else { cerr << "WARNING: MainWindow::addLayer: unknown model " << model << " (\"" << (model ? model->objectName() : "") << "\") in layer action map" << endl; } } } if (newLayer) { m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentLayer(pane, newLayer); } return; } //!!! want to do something like this, but it's not supported in //ModelTransformerFactory yet /* int channel = -1; // pick up the default channel from any existing layers on the same pane for (int j = 0; j < pane->getLayerCount(); ++j) { int c = LayerFactory::getInstance()->getChannel(pane->getLayer(j)); if (c != -1) { channel = c; break; } } */ // We always ask for configuration, even if the plugin isn't // supposed to be configurable, because we need to let the user // change the execution context (block size etc). QString transformId = i->second; addLayer(transformId); } void MainWindow::addLayer(QString transformId) { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { cerr << "WARNING: MainWindow::addLayer: no current pane" << endl; return; } Transform transform = TransformFactory::getInstance()-> getDefaultTransformFor(transformId); std::vector candidateInputModels = m_document->getTransformInputModels(); Model *defaultInputModel = 0; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; if (LayerFactory::getInstance()->getLayerType(layer) != LayerFactory::Waveform && !layer->isLayerOpaque()) continue; Model *model = layer->getModel(); if (!model) continue; for (size_t k = 0; k < candidateInputModels.size(); ++k) { if (candidateInputModels[k] == model) { defaultInputModel = model; break; } } if (defaultInputModel) break; } size_t startFrame = 0, duration = 0; size_t endFrame = 0; m_viewManager->getSelection().getExtents(startFrame, endFrame); if (endFrame > startFrame) duration = endFrame - startFrame; else startFrame = 0; TransformUserConfigurator configurator; ModelTransformer::Input input = ModelTransformerFactory::getInstance()-> getConfigurationForTransform (transform, candidateInputModels, defaultInputModel, m_playSource, startFrame, duration, &configurator); if (!input.getModel()) return; // SVDEBUG << "MainWindow::addLayer: Input model is " << input.getModel() << " \"" << input.getModel()->objectName() << "\"" << endl << "transform:" << endl << transform.toXmlString() << endl; Layer *newLayer = m_document->createDerivedLayer(transform, input); if (newLayer) { m_document->addLayerToView(pane, newLayer); m_document->setChannel(newLayer, input.getChannel()); m_recentTransforms.add(transformId); m_paneStack->setCurrentLayer(pane, newLayer); } updateMenuStates(); } void MainWindow::renameCurrentLayer() { Pane *pane = m_paneStack->getCurrentPane(); if (pane) { Layer *layer = pane->getSelectedLayer(); if (layer) { bool ok = false; QString newName = QInputDialog::getText (this, tr("Rename Layer"), tr("New name for this layer:"), QLineEdit::Normal, layer->objectName(), &ok); if (ok) { layer->setPresentationName(newName); setupExistingLayersMenus(); } } } } void MainWindow::findTransform() { TransformFinder *finder = new TransformFinder(this); if (!finder->exec()) { delete finder; return; } TransformId transform = finder->getTransform(); delete finder; if (getMainModel() != 0 && m_paneStack->getCurrentPane() != 0) { addLayer(transform); } } void MainWindow::playSoloToggled() { MainWindowBase::playSoloToggled(); m_soloModified = true; } void MainWindow::alignToggled() { QAction *action = dynamic_cast(sender()); if (!m_viewManager) return; if (action) { m_viewManager->setAlignMode(action->isChecked()); } else { m_viewManager->setAlignMode(!m_viewManager->getAlignMode()); } if (m_viewManager->getAlignMode()) { m_prevSolo = m_soloAction->isChecked(); if (!m_soloAction->isChecked()) { m_soloAction->setChecked(true); MainWindowBase::playSoloToggled(); } m_soloModified = false; emit canChangeSolo(false); m_document->alignModels(); m_document->setAutoAlignment(true); } else { if (!m_soloModified) { if (m_soloAction->isChecked() != m_prevSolo) { m_soloAction->setChecked(m_prevSolo); MainWindowBase::playSoloToggled(); } } emit canChangeSolo(true); m_document->setAutoAlignment(false); } for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; pane->update(); } } void MainWindow::playSpeedChanged(int position) { PlaySpeedRangeMapper mapper(0, 200); float percent = m_playSpeed->mappedValue(); float factor = mapper.getFactorForValue(percent); // cerr << "speed = " << position << " percent = " << percent << " factor = " << factor << endl; bool something = (position != 100); int pc = lrintf(percent); if (!something) { contextHelpChanged(tr("Playback speed: Normal")); } else { contextHelpChanged(tr("Playback speed: %1%2%") .arg(position > 100 ? "+" : "") .arg(pc)); } m_playSource->setTimeStretch(factor); updateMenuStates(); } void MainWindow::speedUpPlayback() { int value = m_playSpeed->value(); value = value + m_playSpeed->pageStep(); if (value > m_playSpeed->maximum()) value = m_playSpeed->maximum(); m_playSpeed->setValue(value); } void MainWindow::slowDownPlayback() { int value = m_playSpeed->value(); value = value - m_playSpeed->pageStep(); if (value < m_playSpeed->minimum()) value = m_playSpeed->minimum(); m_playSpeed->setValue(value); } void MainWindow::restoreNormalPlayback() { m_playSpeed->setValue(m_playSpeed->defaultValue()); } void MainWindow::currentPaneChanged(Pane *pane) { MainWindowBase::currentPaneChanged(pane); if (!pane || !m_panLayer) return; for (int i = pane->getLayerCount(); i > 0; ) { --i; Layer *layer = pane->getLayer(i); if (LayerFactory::getInstance()->getLayerType(layer) == LayerFactory::Waveform) { RangeSummarisableTimeValueModel *tvm = dynamic_cast(layer->getModel()); if (tvm) { m_panLayer->setModel(tvm); return; } } } } void MainWindow::updateVisibleRangeDisplay(Pane *p) const { if (!getMainModel() || !p) { return; } bool haveSelection = false; size_t startFrame = 0, endFrame = 0; if (m_viewManager && m_viewManager->haveInProgressSelection()) { bool exclusive = false; Selection s = m_viewManager->getInProgressSelection(exclusive); if (!s.isEmpty()) { haveSelection = true; startFrame = s.getStartFrame(); endFrame = s.getEndFrame(); } } if (!haveSelection) { startFrame = p->getFirstVisibleFrame(); endFrame = p->getLastVisibleFrame(); } RealTime start = RealTime::frame2RealTime (startFrame, getMainModel()->getSampleRate()); RealTime end = RealTime::frame2RealTime (endFrame, getMainModel()->getSampleRate()); RealTime duration = end - start; QString startStr, endStr, durationStr; startStr = start.toText(true).c_str(); endStr = end.toText(true).c_str(); durationStr = duration.toText(true).c_str(); if (haveSelection) { m_myStatusMessage = tr("Selection: %1 to %2 (duration %3)") .arg(startStr).arg(endStr).arg(durationStr); } else { m_myStatusMessage = tr("Visible: %1 to %2 (duration %3)") .arg(startStr).arg(endStr).arg(durationStr); } statusBar()->showMessage(m_myStatusMessage); updatePositionStatusDisplays(); } void MainWindow::updatePositionStatusDisplays() const { if (!statusBar()->isVisible()) return; Pane *pane = 0; size_t frame = m_viewManager->getPlaybackFrame(); if (m_paneStack) pane = m_paneStack->getCurrentPane(); if (!pane) return; int layers = pane->getLayerCount(); if (layers == 0) m_currentLabel->setText(""); for (int i = layers-1; i >= 0; --i) { Layer *layer = pane->getLayer(i); if (!layer) continue; if (!layer->isLayerEditable()) continue; QString label = layer->getLabelPreceding (pane->alignFromReference(frame)); m_currentLabel->setText(label); break; } } void MainWindow::outputLevelsChanged(float left, float right) { m_fader->setPeakLeft(left); m_fader->setPeakRight(right); } void MainWindow::sampleRateMismatch(size_t requested, size_t actual, bool willResample) { if (!willResample) { emit hideSplash(); QMessageBox::information (this, tr("Sample rate mismatch"), tr("Wrong sample rate

The sample rate of this audio file (%1 Hz) does not match\nthe current playback rate (%2 Hz).

The file will play at the wrong speed and pitch.

Change the Resample mismatching files on import option under File -> Preferences if you want to alter this behaviour.") .arg(requested).arg(actual)); } updateDescriptionLabel(); } void MainWindow::audioOverloadPluginDisabled() { QMessageBox::information (this, tr("Audio processing overload"), tr("Overloaded

Audio effects plugin auditioning has been disabled due to a processing overload.")); } void MainWindow::audioTimeStretchMultiChannelDisabled() { static bool shownOnce = false; if (shownOnce) return; QMessageBox::information (this, tr("Audio processing overload"), tr("Overloaded

Audio playback speed processing has been reduced to a single channel, due to a processing overload.")); shownOnce = true; } void MainWindow::midiEventsAvailable() { Pane *currentPane = 0; NoteLayer *currentNoteLayer = 0; TimeValueLayer *currentTimeValueLayer = 0; if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); if (currentPane) { currentNoteLayer = dynamic_cast (currentPane->getSelectedLayer()); currentTimeValueLayer = dynamic_cast (currentPane->getSelectedLayer()); } // This is called through a serialised signal/slot invocation // (across threads). It could happen quite some time after the // event was actually received, which is why event timestamping // happens in the MIDI input class and not here. while (m_midiInput->getEventsAvailable() > 0) { MIDIEvent ev(m_midiInput->readEvent()); size_t frame = currentPane->alignFromReference(ev.getTime()); bool noteOn = (ev.getMessageType() == MIDIConstants::MIDI_NOTE_ON && ev.getVelocity() > 0); bool noteOff = (ev.getMessageType() == MIDIConstants::MIDI_NOTE_OFF || (ev.getMessageType() == MIDIConstants::MIDI_NOTE_ON && ev.getVelocity() == 0)); if (currentNoteLayer) { if (!m_playSource || !m_playSource->isPlaying()) continue; if (noteOn) { currentNoteLayer->addNoteOn(frame, ev.getPitch(), ev.getVelocity()); } else if (noteOff) { currentNoteLayer->addNoteOff(frame, ev.getPitch()); } continue; } if (currentTimeValueLayer) { if (!noteOn) continue; if (!m_playSource || !m_playSource->isPlaying()) continue; Model *model = static_cast(currentTimeValueLayer)->getModel(); SparseTimeValueModel *tvm = dynamic_cast(model); if (tvm) { SparseTimeValueModel::Point point(frame, ev.getPitch() % 12, ""); SparseTimeValueModel::AddPointCommand *command = new SparseTimeValueModel::AddPointCommand (tvm, point, tr("Add Point")); CommandHistory::getInstance()->addCommand(command); } continue; } if (!noteOn) continue; insertInstantAt(ev.getTime()); } } void MainWindow::playStatusChanged(bool playing) { Pane *currentPane = 0; NoteLayer *currentNoteLayer = 0; if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); if (currentPane) { currentNoteLayer = dynamic_cast(currentPane->getSelectedLayer()); } if (currentNoteLayer) { currentNoteLayer->abandonNoteOns(); } } void MainWindow::layerRemoved(Layer *layer) { setupExistingLayersMenus(); MainWindowBase::layerRemoved(layer); } void MainWindow::layerInAView(Layer *layer, bool inAView) { setupExistingLayersMenus(); MainWindowBase::layerInAView(layer, inAView); } void MainWindow::modelAdded(Model *model) { MainWindowBase::modelAdded(model); if (dynamic_cast(model)) { setupPaneAndLayerMenus(); } } void MainWindow::mainModelChanged(WaveFileModel *model) { m_panLayer->setModel(model); MainWindowBase::mainModelChanged(model); if (m_playTarget) { connect(m_fader, SIGNAL(valueChanged(float)), m_playTarget, SLOT(setOutputGain(float))); } } void MainWindow::setInstantsNumbering() { QAction *a = dynamic_cast(sender()); if (!a) return; int type = m_numberingActions[a]; if (m_labeller) m_labeller->setType(Labeller::ValueType(type)); QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("labellertype", type); settings.endGroup(); } void MainWindow::setInstantsCounterCycle() { QAction *a = dynamic_cast(sender()); if (!a) return; int cycle = a->text().toInt(); if (cycle == 0) return; if (m_labeller) m_labeller->setCounterCycleSize(cycle); QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("labellercycle", cycle); settings.endGroup(); } void MainWindow::setInstantsCounters() { LabelCounterInputDialog dialog(m_labeller, this); dialog.setWindowTitle(tr("Reset Counters")); dialog.exec(); } void MainWindow::resetInstantsCounters() { if (m_labeller) m_labeller->resetCounters(); } void MainWindow::modelGenerationFailed(QString transformName, QString message) { emit hideSplash(); if (message != "") { QMessageBox::warning (this, tr("Failed to generate layer"), tr("Layer generation failed

Failed to generate derived layer.

The layer transform \"%1\" failed:

%2") .arg(transformName).arg(message), QMessageBox::Ok); } else { QMessageBox::warning (this, tr("Failed to generate layer"), tr("Layer generation failed

Failed to generate a derived layer.

The layer transform \"%1\" failed.

No error information is available.") .arg(transformName), QMessageBox::Ok); } } void MainWindow::modelGenerationWarning(QString transformName, QString message) { emit hideSplash(); QMessageBox::warning (this, tr("Warning"), message, QMessageBox::Ok); } void MainWindow::modelRegenerationFailed(QString layerName, QString transformName, QString message) { emit hideSplash(); if (message != "") { QMessageBox::warning (this, tr("Failed to regenerate layer"), tr("Layer generation failed

Failed to regenerate derived layer \"%1\" using new data model as input.

The layer transform \"%2\" failed:

%3") .arg(layerName).arg(transformName).arg(message), QMessageBox::Ok); } else { QMessageBox::warning (this, tr("Failed to regenerate layer"), tr("Layer generation failed

Failed to regenerate derived layer \"%1\" using new data model as input.

The layer transform \"%2\" failed.

No error information is available.") .arg(layerName).arg(transformName), QMessageBox::Ok); } } void MainWindow::modelRegenerationWarning(QString layerName, QString transformName, QString message) { emit hideSplash(); QMessageBox::warning (this, tr("Warning"), tr("Warning when regenerating layer

When regenerating the derived layer \"%1\" using new data model as input:

%2").arg(layerName).arg(message), QMessageBox::Ok); } void MainWindow::alignmentFailed(QString transformName, QString message) { emit hideSplash(); QMessageBox::warning (this, tr("Failed to calculate alignment"), tr("Alignment calculation failed

Failed to calculate an audio alignment using transform \"%1\":

%2") .arg(transformName).arg(message), QMessageBox::Ok); } void MainWindow::rightButtonMenuRequested(Pane *pane, QPoint position) { // SVDEBUG << "MainWindow::rightButtonMenuRequested(" << pane << ", " << position.x() << ", " << position.y() << ")" << endl; m_paneStack->setCurrentPane(pane); m_rightButtonMenu->popup(position); } void MainWindow::showLayerTree() { if (!m_layerTreeDialog.isNull()) { m_layerTreeDialog->show(); m_layerTreeDialog->raise(); return; } m_layerTreeDialog = new LayerTreeDialog(m_paneStack); m_layerTreeDialog->setAttribute(Qt::WA_DeleteOnClose); // see below m_layerTreeDialog->show(); } void MainWindow::showActivityLog() { m_activityLog->show(); m_activityLog->raise(); m_activityLog->scrollToEnd(); } void MainWindow::preferences() { bool goToTemplateTab = (sender() && sender()->objectName() == "set_default_template"); if (!m_preferencesDialog.isNull()) { m_preferencesDialog->show(); m_preferencesDialog->raise(); if (goToTemplateTab) { m_preferencesDialog->switchToTab(PreferencesDialog::TemplateTab); } return; } m_preferencesDialog = new PreferencesDialog(this); // DeleteOnClose is safe here, because m_preferencesDialog is a // QPointer that will be zeroed when the dialog is deleted. We // use it in preference to leaving the dialog lying around because // if you Cancel the dialog, it resets the preferences state // without resetting its own widgets, so its state will be // incorrect when next shown unless we construct it afresh m_preferencesDialog->setAttribute(Qt::WA_DeleteOnClose); m_preferencesDialog->show(); if (goToTemplateTab) { m_preferencesDialog->switchToTab(PreferencesDialog::TemplateTab); } } void MainWindow::mouseEnteredWidget() { QWidget *w = dynamic_cast(sender()); if (!w) return; if (w == m_fader) { contextHelpChanged(tr("Adjust the master playback level")); } else if (w == m_playSpeed) { contextHelpChanged(tr("Adjust the master playback speed")); } } void MainWindow::mouseLeftWidget() { contextHelpChanged(""); } void MainWindow::website() { openHelpUrl(tr("http://www.sonicvisualiser.org/")); } void MainWindow::help() { openHelpUrl(tr("http://www.sonicvisualiser.org/doc/reference/%1/en/").arg(SV_VERSION)); } void MainWindow::about() { bool debug = false; QString version = "(unknown version)"; #ifdef BUILD_DEBUG debug = true; #endif // BUILD_DEBUG #ifdef SV_VERSION #ifdef SVNREV version = tr("Release %1 : Revision %2").arg(SV_VERSION).arg(SVNREV); #else // !SVNREV version = tr("Release %1").arg(SV_VERSION); #endif // SVNREV #else // !SV_VERSION #ifdef SVNREV version = tr("Unreleased : Revision %1").arg(SVNREV); #endif // SVNREV #endif // SV_VERSION QString aboutText; aboutText += tr("

About Sonic Visualiser

"); aboutText += tr("

Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.
http://www.sonicvisualiser.org/

"); aboutText += tr("

%1 : %2 configuration

") .arg(version) .arg(debug ? tr("Debug") : tr("Release")); aboutText += ""; aboutText += tr("With Qt v%1 © Nokia Corporation").arg(QT_VERSION_STR); #ifdef HAVE_JACK #ifdef JACK_VERSION aboutText += tr("
With JACK audio output library v%1 © Paul Davis and Jack O'Quin").arg(JACK_VERSION); #else // !JACK_VERSION aboutText += tr("
With JACK audio output library © Paul Davis and Jack O'Quin"); #endif // JACK_VERSION #endif // HAVE_JACK #ifdef HAVE_PORTAUDIO aboutText += tr("
With PortAudio audio output library © Ross Bencina and Phil Burk"); #endif // HAVE_PORTAUDIO #ifdef HAVE_LIBPULSE #ifdef LIBPULSE_VERSION aboutText += tr("
With PulseAudio audio output library v%1 © Lennart Poettering and Pierre Ossman").arg(LIBPULSE_VERSION); #else // !LIBPULSE_VERSION aboutText += tr("
With PulseAudio audio output library © Lennart Poettering and Pierre Ossman"); #endif // LIBPULSE_VERSION #endif // HAVE_LIBPULSE #ifdef HAVE_OGGZ #ifdef OGGZ_VERSION aboutText += tr("
With Ogg file decoder (oggz v%1, fishsound v%2) © CSIRO Australia").arg(OGGZ_VERSION).arg(FISHSOUND_VERSION); #else // !OGGZ_VERSION aboutText += tr("
With Ogg file decoder © CSIRO Australia"); #endif // OGGZ_VERSION #endif // HAVE_OGGZ #ifdef HAVE_MAD #ifdef MAD_VERSION aboutText += tr("
With MAD mp3 decoder v%1 © Underbit Technologies Inc").arg(MAD_VERSION); #else // !MAD_VERSION aboutText += tr("
With MAD mp3 decoder © Underbit Technologies Inc"); #endif // MAD_VERSION #endif // HAVE_MAD #ifdef HAVE_SAMPLERATE #ifdef SAMPLERATE_VERSION aboutText += tr("
With libsamplerate v%1 © Erik de Castro Lopo").arg(SAMPLERATE_VERSION); #else // !SAMPLERATE_VERSION aboutText += tr("
With libsamplerate © Erik de Castro Lopo"); #endif // SAMPLERATE_VERSION #endif // HAVE_SAMPLERATE #ifdef HAVE_SNDFILE #ifdef SNDFILE_VERSION aboutText += tr("
With libsndfile v%1 © Erik de Castro Lopo").arg(SNDFILE_VERSION); #else // !SNDFILE_VERSION aboutText += tr("
With libsndfile © Erik de Castro Lopo"); #endif // SNDFILE_VERSION #endif // HAVE_SNDFILE #ifdef HAVE_FFTW3F #ifdef FFTW3_VERSION aboutText += tr("
With FFTW3 v%1 © Matteo Frigo and MIT").arg(FFTW3_VERSION); #else // !FFTW3_VERSION aboutText += tr("
With FFTW3 © Matteo Frigo and MIT"); #endif // FFTW3_VERSION #endif // HAVE_FFTW3F #ifdef HAVE_RUBBERBAND #ifdef RUBBERBAND_VERSION aboutText += tr("
With Rubber Band v%1 © Chris Cannam").arg(RUBBERBAND_VERSION); #else // !RUBBERBAND_VERSION aboutText += tr("
With Rubber Band © Chris Cannam"); #endif // RUBBERBAND_VERSION #endif // HAVE_RUBBERBAND #ifdef HAVE_VAMP aboutText += tr("
With Vamp plugin support (API v%1, host SDK v%2) © Chris Cannam").arg(VAMP_API_VERSION).arg(VAMP_SDK_VERSION); #endif // !HAVE_VAMP aboutText += tr("
With LADSPA plugin support (API v%1) © Richard Furse, Paul Davis, Stefan Westerfeld").arg(LADSPA_VERSION); aboutText += tr("
With DSSI plugin support (API v%1) © Chris Cannam, Steve Harris, Sean Bolton").arg(DSSI_VERSION); #ifdef REDLAND_VERSION aboutText += tr("
With Redland RDF datastore v%1 © Dave Beckett and the University of Bristol").arg(REDLAND_VERSION); #else // !REDLAND_VERSION aboutText += tr("
With Redland RDF datastore © Dave Beckett and the University of Bristol"); #endif // REDLAND_VERSION aboutText += tr("
With Serd and Sord RDF parser and store © David Robillard"); aboutText += tr("
With Dataquay Qt/RDF library © Chris Cannam"); aboutText += tr("
With RtMidi © Gary P. Scavone"); #ifdef HAVE_LIBLO #ifdef LIBLO_VERSION aboutText += tr("
With liblo Lite OSC library v%1 © Steve Harris").arg(LIBLO_VERSION); #else // !LIBLO_VERSION aboutText += tr("
With liblo Lite OSC library © Steve Harris"); #endif // LIBLO_VERSION if (m_oscQueue && m_oscQueue->isOK()) { aboutText += tr("

The OSC URL for this instance is: \"%1\"").arg(m_oscQueue->getOSCURL()); } aboutText += "

"; #endif // HAVE_LIBLO #ifndef BUILD_STATIC aboutText.replace(tr("With "), tr("Using ")); #endif aboutText += "

Sonic Visualiser Copyright © 2005–2013 Chris Cannam and " "Queen Mary, University of London.

" "

This program is free software; you can redistribute it and/or " "modify it under the terms of the GNU General Public License as " "published by the Free Software Foundation; either version 2 of the " "License, or (at your option) any later version.
See the file " "COPYING included with this distribution for more information.

"; QMessageBox::about(this, tr("About Sonic Visualiser"), aboutText); } void MainWindow::keyReference() { m_keyReference->show(); } void MainWindow::newerVersionAvailable(QString version) { QSettings settings; settings.beginGroup("NewerVersionWarning"); QString tag = QString("version-%1-available-show").arg(version); if (settings.value(tag, true).toBool()) { QString title(tr("Newer version available")); QString text(tr("

Newer version available

You are using version %1 of Sonic Visualiser, but version %2 is now available.

Please see the Sonic Visualiser website for more information.

").arg(SV_VERSION).arg(version)); QMessageBox::information(this, title, text); settings.setValue(tag, false); } settings.endGroup(); } sonic-visualiser-2.3~repack1.orig/main/PreferencesDialog.h0000644000175000017500000000517612252354725022421 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PREFERENCES_DIALOG_H_ #define _PREFERENCES_DIALOG_H_ #include #include #include "base/Window.h" class WindowTypeSelector; class QPushButton; class QLineEdit; class QTabWidget; class PreferencesDialog : public QDialog { Q_OBJECT public: PreferencesDialog(QWidget *parent = 0); virtual ~PreferencesDialog(); enum Tab { GeneralTab, AppearanceTab, AnalysisTab, TemplateTab }; void switchToTab(Tab tab); public slots: void applicationClosing(bool quickly); protected slots: void windowTypeChanged(WindowType type); void spectrogramSmoothingChanged(int state); void spectrogramXSmoothingChanged(int state); void propertyLayoutChanged(int layout); void tuningFrequencyChanged(double freq); void audioDeviceChanged(int device); void resampleQualityChanged(int quality); void resampleOnLoadChanged(int state); void tempDirRootChanged(QString root); void backgroundModeChanged(int mode); void timeToTextModeChanged(int mode); void viewFontSizeChanged(int sz); void showSplashChanged(int state); void defaultTemplateChanged(int); void localeChanged(int); void networkPermissionChanged(int state); void tempDirButtonClicked(); void okClicked(); void applyClicked(); void cancelClicked(); protected: WindowTypeSelector *m_windowTypeSelector; QPushButton *m_applyButton; QTabWidget *m_tabs; QMap m_tabOrdering; QLineEdit *m_tempDirRootEdit; QString m_currentTemplate; QStringList m_templates; QString m_currentLocale; QStringList m_locales; WindowType m_windowType; int m_spectrogramSmoothing; int m_spectrogramXSmoothing; int m_propertyLayout; float m_tuningFrequency; int m_audioDevice; int m_resampleQuality; bool m_resampleOnLoad; bool m_networkPermission; QString m_tempDirRoot; int m_backgroundMode; int m_timeToTextMode; int m_viewFontSize; bool m_showSplash; bool m_changesOnRestart; }; #endif sonic-visualiser-2.3~repack1.orig/install-sh0000755000175000017500000003246412252354725017747 0ustar miramira#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sonic-visualiser-2.3~repack1.orig/sonic-visualiser.qrc0000644000175000017500000001077112252354725021746 0ustar miramira icons/waveform.png icons/spectrum.png icons/spectrogram.png icons/timeruler.png icons/pane.png icons/instants.png icons/notes.png icons/image.png icons/values.png icons/regions.png icons/colour3d.png icons/playpause.png icons/playpause-on.png icons/ffwd.png icons/ffwd-end.png icons/rewind.png icons/rewind-start.png icons/playselection.png icons/playselection-on.png icons/playloop.png icons/playloop-on.png icons/playfollow.png icons/playfollow-on.png icons/solo.png icons/solo-on.png icons/align.png icons/align-on.png icons/fader_background.png icons/fader_knob.png icons/fader_knob_red.png icons/fader_leds.png icons/faders.png icons/select.png icons/text.png icons/draw.png icons/draw-curve.png icons/erase.png icons/measure.png icons/measure1cursor.xbm icons/measure1mask.xbm icons/measure2cursor.xbm icons/measure2mask.xbm icons/move.png icons/navigate.png icons/zoom.png icons/zoom-in.png icons/zoom-out.png icons/zoom-fit.png icons/zoom-reset.png icons/undo.png icons/redo.png icons/new.png icons/exit.png icons/speaker.png icons/annotation.png icons/info.png icons/fileopen.png icons/fileopensession.png icons/fileopenaudio.png icons/fileopen-22.png icons/fileclose.png icons/filenew.png icons/filenew-22.png icons/filesave.png icons/filesave-22.png icons/filesaveas.png icons/filesaveas-22.png icons/editdelete.png icons/editcut.png icons/editcopy.png icons/editpaste.png icons/datadelete.png icons/dataedit.png icons/datainsert.png icons/mono.png icons/stereo.png icons/sharpen.png icons/help.png icons/emptypage.png icons/cross.png icons/normalise.png icons/normalise-columns.png icons/invert-vertical.png icons/show-peaks.png icons/opaque.png icons/smooth.png icons/lines.png icons/derivative.png icons/sv-16x16.png icons/sv-22x22.png icons/sv-24x24.png icons/sv-32x32.png icons/sv-48x48.png icons/sv-64x64.png icons/sv-128x128.png icons/sv-splash.png icons/qm-logo-larger.png icons/qm-logo-smaller.png samples/bass.wav samples/beep.wav samples/bounce.wav samples/clap.wav samples/click.wav samples/cowbell.wav samples/hihat.wav samples/kick.wav samples/organ.wav samples/piano.wav samples/silent.wav samples/snare.wav samples/stick.wav samples/strike.wav samples/tap.wav templates/default.svt templates/Scrolling Waveforms.svt templates/Spectrograms.svt templates/Waveform and Melodic Range Spectrogram.svt i18n/sonic-visualiser_ru.qm i18n/sonic-visualiser_en_GB.qm i18n/sonic-visualiser_en_US.qm i18n/sonic-visualiser_cs_CZ.qm i18n/tips_en.xml sonic-visualiser-2.3~repack1.orig/svgui/0000755000175000017500000000000012264464201017061 5ustar miramirasonic-visualiser-2.3~repack1.orig/svgui/.hgignore0000644000175000017500000000016712252354725020676 0ustar miramirasyntax: glob Makefile */Makefile o/* */o/* */tmp_obj/* */tmp_moc/* doc/html/ *.o *.so *.so.* *.a *.wav *~ *.orig *.rej sonic-visualiser-2.3~repack1.orig/svgui/INSTALL.txt0000644000175000017500000000412112252354725020734 0ustar miramira To compile from source ---------------------- This file provides various instructions useful when compiling the SV libraries from source, but it doesn't have a complete recipe for any one platform -- there are too many variables. However, you can find a recipe for one platform (Ubuntu Linux) in the file INSTALL.ubuntu. To build, run $ ./configure && make The following additional libraries are required or optional when building the SV core libraries: REQUIRED Qt v4.4 or newer http://qt.nokia.com/ REQUIRED Vamp Plugin SDK v2.x http://www.vamp-plugins.org/ REQUIRED Rubber Band Library http://www.breakfastquay.com/rubberband/ REQUIRED libsndfile http://www.mega-nerd.com/libsndfile/ REQUIRED libsamplerate http://www.mega-nerd.com/SRC/ REQUIRED FFTW3 http://www.fftw.org/ REQUIRED bzip2 library http://www.bzip.org/ REQUIRED Redland RDF libraries http://librdf.org/ Optional MAD mp3 decoder http://www.underbit.com/products/mad/ Optional Oggz and fishsound http://www.annodex.net/software/libraries.html Optional liblo OSC library http://www.plugin.org.uk/liblo/ The Redland RDF libraries include the Raptor RDF parser library, Rasqal RDF query library, and librdf, the Redland RDF datastore (which depends on both of those). The SV libraries require all of these. If you are going to build the rest of the SV libraries, you will also need one or more of: Optional JACK http://www.jackaudio.org/ Optional PortAudio v19 http://www.portaudio.com/ Optional PulseAudio http://www.pulseaudio.org/ Although JACK, PortAudio, and PulseAudio are individually optional, you will need to have one or the other of them in order to get any audio playback. Usually JACK is preferred on Linux, with PulseAudio as a backup, and PortAudio is used elsewhere. On Linux, you will need the ALSA libraries (used for MIDI). If you happen to be using a Debian-based Linux, you probably want to apt-get install the following packages: libqt4-dev libsndfile1-dev libsamplerate0-dev fftw3-dev libbz2-dev libjack-dev libmad0-dev liboggz1-dev libfishsound1-dev libasound2-dev liblo0-dev liblrdf0-dev librdf0-dev . sonic-visualiser-2.3~repack1.orig/svgui/layer/0000755000175000017500000000000012264464201020175 5ustar miramirasonic-visualiser-2.3~repack1.orig/svgui/layer/SpectrogramLayer.h0000644000175000017500000003500412252354725023641 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SPECTROGRAM_LAYER_H_ #define _SPECTROGRAM_LAYER_H_ #include "SliceableLayer.h" #include "base/Window.h" #include "base/RealTime.h" #include "base/Thread.h" #include "base/PropertyContainer.h" #include "data/model/PowerOfSqrtTwoZoomConstraint.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/FFTModel.h" #include #include #include #include class View; class QPainter; class QImage; class QPixmap; class QTimer; class FFTModel; class Dense3DModelPeakCache; /** * SpectrogramLayer represents waveform data (obtained from a * DenseTimeValueModel) in spectrogram form. */ class SpectrogramLayer : public SliceableLayer, public PowerOfSqrtTwoZoomConstraint { Q_OBJECT public: enum Configuration { FullRangeDb, MelodicRange, MelodicPeaks }; SpectrogramLayer(Configuration = FullRangeDb); ~SpectrogramLayer(); virtual const ZoomConstraint *getZoomConstraint() const { return this; } virtual const Model *getModel() const { return m_model; } virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual void setSynchronousPainting(bool synchronous); virtual int getVerticalScaleWidth(View *v, bool detailed, QPainter &) const; virtual void paintVerticalScale(View *v, bool detailed, QPainter &paint, QRect rect) const; virtual bool getCrosshairExtents(View *, QPainter &, QPoint cursorPos, std::vector &extents) const; virtual void paintCrosshairs(View *, QPainter &, QPoint) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual bool snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual void measureDoubleClick(View *, QMouseEvent *); virtual bool hasLightBackground() const; void setModel(const DenseTimeValueModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); /** * Specify the channel to use from the source model. * A value of -1 means to mix all available channels. * The default is channel 0. */ void setChannel(int); int getChannel() const; void setWindowSize(size_t); size_t getWindowSize() const; void setWindowHopLevel(size_t level); size_t getWindowHopLevel() const; void setWindowType(WindowType type); WindowType getWindowType() const; void setZeroPadLevel(size_t level); size_t getZeroPadLevel() const; /** * Set the gain multiplier for sample values in this view. * The default is 1.0. */ void setGain(float gain); float getGain() const; /** * Set the threshold for sample values to qualify for being shown * in the FFT, in voltage units. * * The default is 0.0. */ void setThreshold(float threshold); float getThreshold() const; void setMinFrequency(size_t); size_t getMinFrequency() const; void setMaxFrequency(size_t); // 0 -> no maximum size_t getMaxFrequency() const; enum ColourScale { LinearColourScale, MeterColourScale, dBSquaredColourScale, dBColourScale, PhaseColourScale }; /** * Specify the scale for sample levels. See WaveformLayer for * details of meter and dB scaling. The default is dBColourScale. */ void setColourScale(ColourScale); ColourScale getColourScale() const; enum FrequencyScale { LinearFrequencyScale, LogFrequencyScale }; /** * Specify the scale for the y axis. */ void setFrequencyScale(FrequencyScale); FrequencyScale getFrequencyScale() const; enum BinDisplay { AllBins, PeakBins, PeakFrequencies }; /** * Specify the processing of frequency bins for the y axis. */ void setBinDisplay(BinDisplay); BinDisplay getBinDisplay() const; void setNormalizeColumns(bool n); bool getNormalizeColumns() const; void setNormalizeVisibleArea(bool n); bool getNormalizeVisibleArea() const; void setColourMap(int map); int getColourMap() const; /** * Specify the colourmap rotation for the colour scale. */ void setColourRotation(int); int getColourRotation() const; virtual VerticalPosition getPreferredFrameCountPosition() const { return PositionTop; } virtual bool isLayerOpaque() const { return true; } virtual ColourSignificance getLayerColourSignificance() const { return ColourHasMeaningfulValue; } float getYForFrequency(const View *v, float frequency) const; float getFrequencyForY(const View *v, int y) const; virtual int getCompletion(View *v) const; virtual QString getError(View *v) const; virtual bool getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const; virtual bool getDisplayExtents(float &min, float &max) const; virtual bool setDisplayExtents(float min, float max); virtual bool getYScaleValue(const View *, int, float &, QString &) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); virtual void setLayerDormant(const View *v, bool dormant); virtual bool isLayerScrollable(const View *) const { return false; } virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; virtual const Model *getSliceableModel() const; protected slots: void cacheInvalid(); void cacheInvalid(size_t startFrame, size_t endFrame); void preferenceChanged(PropertyContainer::PropertyName name); void fillTimerTimedOut(); protected: const DenseTimeValueModel *m_model; // I do not own this int m_channel; size_t m_windowSize; WindowType m_windowType; size_t m_windowHopLevel; size_t m_zeroPadLevel; size_t m_fftSize; float m_gain; float m_initialGain; float m_threshold; float m_initialThreshold; int m_colourRotation; int m_initialRotation; size_t m_minFrequency; size_t m_maxFrequency; size_t m_initialMaxFrequency; ColourScale m_colourScale; int m_colourMap; QColor m_crosshairColour; FrequencyScale m_frequencyScale; BinDisplay m_binDisplay; bool m_normalizeColumns; bool m_normalizeVisibleArea; int m_lastEmittedZoomStep; bool m_synchronous; mutable bool m_haveDetailedScale; mutable int m_lastPaintBlockWidth; mutable RealTime m_lastPaintTime; enum { NO_VALUE = 0 }; // colour index for unused pixels class Palette { public: QColor getColour(unsigned char index) const { return m_colours[index]; } void setColour(unsigned char index, QColor colour) { m_colours[index] = colour; } private: QColor m_colours[256]; }; Palette m_palette; /** * ImageCache covers the area of the view, at view resolution. * Not all of it is necessarily valid at once (it is refreshed * in parts when scrolling, for example). */ struct ImageCache { QImage image; QRect validArea; long startFrame; size_t zoomLevel; }; typedef std::map ViewImageCache; void invalidateImageCaches(); void invalidateImageCaches(size_t startFrame, size_t endFrame); mutable ViewImageCache m_imageCaches; /** * When painting, we draw directly onto the draw buffer and then * copy this to the part of the image cache that needed refreshing * before copying the image cache onto the window. (Remind me why * we don't draw directly onto the cache?) */ mutable QImage m_drawBuffer; mutable QTimer *m_updateTimer; mutable size_t m_candidateFillStartFrame; bool m_exiting; void initialisePalette(); void rotatePalette(int distance); unsigned char getDisplayValue(View *v, float input) const; float getInputForDisplayValue(unsigned char uc) const; int getColourScaleWidth(QPainter &) const; void illuminateLocalFeatures(View *v, QPainter &painter) const; float getEffectiveMinFrequency() const; float getEffectiveMaxFrequency() const; struct LayerRange { long startFrame; int zoomLevel; size_t modelStart; size_t modelEnd; }; // Note that the getYBin... methods return the nominal bin in the // un-smoothed spectrogram. This is not necessarily the same bin // as is pulled from the spectrogram and drawn at the given // position, if the spectrogram has oversampling smoothing. Use // getSmoothedYBinRange to obtain that. bool getXBinRange(View *v, int x, float &windowMin, float &windowMax) const; bool getYBinRange(View *v, int y, float &freqBinMin, float &freqBinMax) const; bool getSmoothedYBinRange(View *v, int y, float &freqBinMin, float &freqBinMax) const; bool getYBinSourceRange(View *v, int y, float &freqMin, float &freqMax) const; bool getAdjustedYBinSourceRange(View *v, int x, int y, float &freqMin, float &freqMax, float &adjFreqMin, float &adjFreqMax) const; bool getXBinSourceRange(View *v, int x, RealTime &timeMin, RealTime &timeMax) const; bool getXYBinSourceRange(View *v, int x, int y, float &min, float &max, float &phaseMin, float &phaseMax) const; size_t getWindowIncrement() const { if (m_windowHopLevel == 0) return m_windowSize; else if (m_windowHopLevel == 1) return (m_windowSize * 3) / 4; else return m_windowSize / (1 << (m_windowHopLevel - 1)); } size_t getZeroPadLevel(const View *v) const; size_t getFFTSize(const View *v) const; FFTModel *getFFTModel(const View *v) const; Dense3DModelPeakCache *getPeakCache(const View *v) const; void invalidateFFTModels(); typedef std::pair FFTFillPair; // model, last fill typedef std::map ViewFFTMap; typedef std::map PeakCacheMap; mutable ViewFFTMap m_fftModels; mutable PeakCacheMap m_peakCaches; mutable Model *m_sliceableModel; class MagnitudeRange { public: MagnitudeRange() : m_min(0), m_max(0) { } bool operator==(const MagnitudeRange &r) { return r.m_min == m_min && r.m_max == m_max; } bool isSet() const { return (m_min != 0 || m_max != 0); } void set(float min, float max) { m_min = convert(min); m_max = convert(max); if (m_max < m_min) m_max = m_min; } bool sample(float f) { unsigned int ui = convert(f); bool changed = false; if (isSet()) { if (ui < m_min) { m_min = ui; changed = true; } if (ui > m_max) { m_max = ui; changed = true; } } else { m_max = m_min = ui; changed = true; } return changed; } bool sample(const MagnitudeRange &r) { bool changed = false; if (isSet()) { if (r.m_min < m_min) { m_min = r.m_min; changed = true; } if (r.m_max > m_max) { m_max = r.m_max; changed = true; } } else { m_min = r.m_min; m_max = r.m_max; changed = true; } return changed; } float getMin() const { return float(m_min) / UINT_MAX; } float getMax() const { return float(m_max) / UINT_MAX; } private: unsigned int m_min; unsigned int m_max; unsigned int convert(float f) { if (f < 0.f) f = 0.f; if (f > 1.f) f = 1.f; return (unsigned int)(f * UINT_MAX); } }; typedef std::map ViewMagMap; mutable ViewMagMap m_viewMags; mutable std::vector m_columnMags; void invalidateMagnitudes(); bool updateViewMagnitudes(View *v) const; bool paintDrawBuffer(View *v, int w, int h, int *binforx, float *binfory, bool usePeaksCache, MagnitudeRange &overallMag, bool &overallMagChanged) const; bool paintDrawBufferPeakFrequencies(View *v, int w, int h, int *binforx, int minbin, int maxbin, float displayMinFreq, float displayMaxFreq, bool logarithmic, MagnitudeRange &overallMag, bool &overallMagChanged) const; virtual void updateMeasureRectYCoords(View *v, const MeasureRect &r) const; virtual void setMeasureRectYCoord(View *v, MeasureRect &r, bool start, int y) const; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/TimeInstantLayer.cpp0000644000175000017500000005246412252354725024156 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "TimeInstantLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "view/View.h" #include "base/Profiler.h" #include "base/Clipboard.h" #include "ColourDatabase.h" #include "data/model/SparseOneDimensionalModel.h" #include "widgets/ItemEditDialog.h" #include "widgets/ListInputDialog.h" #include #include #include #include #include #include //#define DEBUG_TIME_INSTANT_LAYER 1 TimeInstantLayer::TimeInstantLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_editingPoint(0, tr("New Point")), m_editingCommand(0), m_plotStyle(PlotInstants) { } TimeInstantLayer::~TimeInstantLayer() { } void TimeInstantLayer::setModel(SparseOneDimensionalModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::setModel(" << model << ")" << endl; #endif if (m_model && m_model->getRDFTypeURI().endsWith("Segment")) { setPlotStyle(PlotSegmentation); } emit modelReplaced(); } Layer::PropertyList TimeInstantLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Plot Type"); return list; } QString TimeInstantLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Plot Type") return tr("Plot Type"); return SingleColourLayer::getPropertyLabel(name); } Layer::PropertyType TimeInstantLayer::getPropertyType(const PropertyName &name) const { if (name == "Plot Type") return ValueProperty; return SingleColourLayer::getPropertyType(name); } int TimeInstantLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; if (name == "Plot Type") { if (min) *min = 0; if (max) *max = 1; if (deflt) *deflt = 0; val = int(m_plotStyle); } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString TimeInstantLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Plot Type") { switch (value) { default: case 0: return tr("Instants"); case 1: return tr("Segmentation"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } void TimeInstantLayer::setProperty(const PropertyName &name, int value) { if (name == "Plot Type") { setPlotStyle(PlotStyle(value)); } else { SingleColourLayer::setProperty(name, value); } } void TimeInstantLayer::setPlotStyle(PlotStyle style) { if (m_plotStyle == style) return; m_plotStyle = style; emit layerParametersChanged(); } bool TimeInstantLayer::isLayerScrollable(const View *v) const { QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } SparseOneDimensionalModel::PointList TimeInstantLayer::getLocalPoints(View *v, int x) const { // Return a set of points that all have the same frame number, the // nearest to the given x coordinate, and that are within a // certain fuzz distance of that x coordinate. if (!m_model) return SparseOneDimensionalModel::PointList(); long frame = v->getFrameForX(x); SparseOneDimensionalModel::PointList onPoints = m_model->getPoints(frame); if (!onPoints.empty()) { return onPoints; } SparseOneDimensionalModel::PointList prevPoints = m_model->getPreviousPoints(frame); SparseOneDimensionalModel::PointList nextPoints = m_model->getNextPoints(frame); SparseOneDimensionalModel::PointList usePoints = prevPoints; if (prevPoints.empty()) { usePoints = nextPoints; } else if (long(prevPoints.begin()->frame) < v->getStartFrame() && !(nextPoints.begin()->frame > v->getEndFrame())) { usePoints = nextPoints; } else if (nextPoints.begin()->frame - frame < frame - prevPoints.begin()->frame) { usePoints = nextPoints; } if (!usePoints.empty()) { int fuzz = 2; int px = v->getXForFrame(usePoints.begin()->frame); if ((px > x && px - x > fuzz) || (px < x && x - px > fuzz + 1)) { usePoints.clear(); } } return usePoints; } QString TimeInstantLayer::getLabelPreceding(size_t frame) const { if (!m_model) return ""; SparseOneDimensionalModel::PointList points = m_model->getPreviousPoints(frame); for (SparseOneDimensionalModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (i->label != "") return i->label; } return ""; } QString TimeInstantLayer::getFeatureDescription(View *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; SparseOneDimensionalModel::PointList points = getLocalPoints(v, x); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return tr("No local points"); } } long useFrame = points.begin()->frame; RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate()); QString text; if (points.begin()->label == "") { text = QString(tr("Time:\t%1\nNo label")) .arg(rt.toText(true).c_str()); } else { text = QString(tr("Time:\t%1\nLabel:\t%2")) .arg(rt.toText(true).c_str()) .arg(points.begin()->label); } pos = QPoint(v->getXForFrame(useFrame), pos.y()); return text; } bool TimeInstantLayer::snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); SparseOneDimensionalModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame)); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); int snapped = frame; bool found = false; for (SparseOneDimensionalModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame >= frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest SparseOneDimensionalModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } void TimeInstantLayer::paint(View *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; // Profiler profiler("TimeInstantLayer::paint", true); int x0 = rect.left(), x1 = rect.right(); long frame0 = v->getFrameForX(x0); long frame1 = v->getFrameForX(x1); SparseOneDimensionalModel::PointList points(m_model->getPoints (frame0, frame1)); bool odd = false; if (m_plotStyle == PlotSegmentation && !points.empty()) { int index = m_model->getIndexOf(*points.begin()); odd = ((index % 2) == 1); } paint.setPen(getBaseQColor()); QColor brushColour(getBaseQColor()); brushColour.setAlpha(100); paint.setBrush(brushColour); QColor oddBrushColour(brushColour); if (m_plotStyle == PlotSegmentation) { if (getBaseQColor() == Qt::black) { oddBrushColour = Qt::gray; } else if (getBaseQColor() == Qt::darkRed) { oddBrushColour = Qt::red; } else if (getBaseQColor() == Qt::darkBlue) { oddBrushColour = Qt::blue; } else if (getBaseQColor() == Qt::darkGreen) { oddBrushColour = Qt::green; } else { oddBrushColour = oddBrushColour.light(150); } oddBrushColour.setAlpha(100); } // SVDEBUG << "TimeInstantLayer::paint: resolution is " // << m_model->getResolution() << " frames" << endl; QPoint localPos; long illuminateFrame = -1; if (v->shouldIlluminateLocalFeatures(this, localPos)) { SparseOneDimensionalModel::PointList localPoints = getLocalPoints(v, localPos.x()); if (!localPoints.empty()) illuminateFrame = localPoints.begin()->frame; } int prevX = -1; int textY = v->getTextLabelHeight(this, paint); for (SparseOneDimensionalModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const SparseOneDimensionalModel::Point &p(*i); SparseOneDimensionalModel::PointList::const_iterator j = i; ++j; int x = v->getXForFrame(p.frame); if (x == prevX && m_plotStyle == PlotInstants && p.frame != illuminateFrame) continue; int iw = v->getXForFrame(p.frame + m_model->getResolution()) - x; if (iw < 2) { if (iw < 1) { iw = 2; if (j != points.end()) { int nx = v->getXForFrame(j->frame); if (nx < x + 3) iw = 1; } } else { iw = 2; } } if (p.frame == illuminateFrame) { paint.setPen(getForegroundQColor(v)); } else { paint.setPen(brushColour); } if (m_plotStyle == PlotInstants) { if (iw > 1) { paint.drawRect(x, 0, iw - 1, v->height() - 1); } else { paint.drawLine(x, 0, x, v->height() - 1); } } else { if (odd) paint.setBrush(oddBrushColour); else paint.setBrush(brushColour); int nx; if (j != points.end()) { const SparseOneDimensionalModel::Point &q(*j); nx = v->getXForFrame(q.frame); } else { nx = v->getXForFrame(m_model->getEndFrame()); } if (nx >= x) { if (illuminateFrame != p.frame && (nx < x + 5 || x >= v->width() - 1)) { paint.setPen(Qt::NoPen); } paint.drawRect(x, -1, nx - x, v->height() + 1); } odd = !odd; } paint.setPen(getBaseQColor()); if (p.label != "") { // only draw if there's enough room from here to the next point int lw = paint.fontMetrics().width(p.label); bool good = true; if (j != points.end()) { int nx = v->getXForFrame(j->frame); if (nx >= x && nx - x - iw - 3 <= lw) good = false; } if (good) { v->drawVisibleText(paint, x + iw + 2, textY, p.label, View::OutlinedText); // paint.drawText(x + iw + 2, textY, p.label); } } prevX = x; } } void TimeInstantLayer::drawStart(View *v, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::drawStart(" << e->x() << ")" << endl; #endif if (!m_model) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); m_editingPoint = SparseOneDimensionalModel::Point(frame, tr("New Point")); if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new SparseOneDimensionalModel::EditCommand(m_model, tr("Draw Point")); m_editingCommand->addPoint(m_editingPoint); m_editing = true; } void TimeInstantLayer::drawDrag(View *v, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::drawDrag(" << e->x() << ")" << endl; #endif if (!m_model || !m_editing) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingCommand->addPoint(m_editingPoint); } void TimeInstantLayer::drawEnd(View *, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::drawEnd(" << e->x() << ")" << endl; #endif if (!m_model || !m_editing) return; QString newName = tr("Add Point at %1 s") .arg(RealTime::frame2RealTime(m_editingPoint.frame, m_model->getSampleRate()) .toText(false).c_str()); m_editingCommand->setName(newName); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TimeInstantLayer::eraseStart(View *v, QMouseEvent *e) { if (!m_model) return; SparseOneDimensionalModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; m_editingPoint = *points.begin(); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TimeInstantLayer::eraseDrag(View *v, QMouseEvent *e) { } void TimeInstantLayer::eraseEnd(View *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; SparseOneDimensionalModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; if (points.begin()->frame != m_editingPoint.frame) return; m_editingCommand = new SparseOneDimensionalModel::EditCommand (m_model, tr("Erase Point")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TimeInstantLayer::editStart(View *v, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::editStart(" << e->x() << ")" << endl; #endif if (!m_model) return; SparseOneDimensionalModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; m_editingPoint = *points.begin(); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TimeInstantLayer::editDrag(View *v, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::editDrag(" << e->x() << ")" << endl; #endif if (!m_model || !m_editing) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); if (!m_editingCommand) { m_editingCommand = new SparseOneDimensionalModel::EditCommand(m_model, tr("Drag Point")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingCommand->addPoint(m_editingPoint); } void TimeInstantLayer::editEnd(View *, QMouseEvent *e) { #ifdef DEBUG_TIME_INSTANT_LAYER cerr << "TimeInstantLayer::editEnd(" << e->x() << ")" << endl; #endif if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = tr("Move Point to %1 s") .arg(RealTime::frame2RealTime(m_editingPoint.frame, m_model->getSampleRate()) .toText(false).c_str()); m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool TimeInstantLayer::editOpen(View *v, QMouseEvent *e) { if (!m_model) return false; SparseOneDimensionalModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return false; SparseOneDimensionalModel::Point point = *points.begin(); ItemEditDialog *dialog = new ItemEditDialog (m_model->getSampleRate(), ItemEditDialog::ShowTime | ItemEditDialog::ShowText); dialog->setFrameTime(point.frame); dialog->setText(point.label); if (dialog->exec() == QDialog::Accepted) { SparseOneDimensionalModel::Point newPoint = point; newPoint.frame = dialog->getFrameTime(); newPoint.label = dialog->getText(); SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Edit Point")); command->deletePoint(point); command->addPoint(newPoint); finish(command); } delete dialog; return true; } void TimeInstantLayer::moveSelection(Selection s, size_t newStartFrame) { if (!m_model) return; SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Drag Selection")); SparseOneDimensionalModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseOneDimensionalModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { SparseOneDimensionalModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TimeInstantLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Resize Selection")); SparseOneDimensionalModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (SparseOneDimensionalModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double target = i->frame; target = newSize.getStartFrame() + double(target - s.getStartFrame()) * ratio; SparseOneDimensionalModel::Point newPoint(*i); newPoint.frame = lrint(target); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TimeInstantLayer::deleteSelection(Selection s) { if (!m_model) return; SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Delete Selection")); SparseOneDimensionalModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseOneDimensionalModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) command->deletePoint(*i); } finish(command); } void TimeInstantLayer::copy(View *v, Selection s, Clipboard &to) { if (!m_model) return; SparseOneDimensionalModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseOneDimensionalModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool TimeInstantLayer::paste(View *v, const Clipboard &from, int frameOffset, bool) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v, tr("Re-align pasted instants?"), tr("The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(m_model, tr("Paste")); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; size_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } if (frameOffset > 0) frame += frameOffset; else if (frameOffset < 0) { if (frame > -frameOffset) frame += frameOffset; else frame = 0; } SparseOneDimensionalModel::Point newPoint(frame); if (i->haveLabel()) { newPoint.label = i->getLabel(); } else if (i->haveValue()) { newPoint.label = QString("%1").arg(i->getValue()); } command->addPoint(newPoint); } finish(command); return true; } int TimeInstantLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Purple" : "Purple")); } void TimeInstantLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes + QString(" plotStyle=\"%1\"") .arg(m_plotStyle)); } void TimeInstantLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); bool ok; PlotStyle style = (PlotStyle) attributes.value("plotStyle").toInt(&ok); if (ok) setPlotStyle(style); } sonic-visualiser-2.3~repack1.orig/svgui/layer/ImageLayer.cpp0000644000175000017500000005775612252354725022752 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ImageLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "view/View.h" #include "data/model/ImageModel.h" #include "data/fileio/FileSource.h" #include "widgets/ImageDialog.h" #include "widgets/ProgressDialog.h" #include #include #include #include #include #include #include #include ImageLayer::ImageMap ImageLayer::m_images; QMutex ImageLayer::m_imageMapMutex; ImageLayer::ImageLayer() : Layer(), m_model(0), m_editing(false), m_originalPoint(0, "", ""), m_editingPoint(0, "", ""), m_editingCommand(0) { } ImageLayer::~ImageLayer() { for (FileSourceMap::iterator i = m_fileSources.begin(); i != m_fileSources.end(); ++i) { delete i->second; } } void ImageLayer::setModel(ImageModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); emit modelReplaced(); } Layer::PropertyList ImageLayer::getProperties() const { return Layer::getProperties(); } QString ImageLayer::getPropertyLabel(const PropertyName &name) const { return ""; } Layer::PropertyType ImageLayer::getPropertyType(const PropertyName &name) const { return Layer::getPropertyType(name); } int ImageLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { return Layer::getPropertyRangeAndValue(name, min, max, deflt); } QString ImageLayer::getPropertyValueLabel(const PropertyName &name, int value) const { return Layer::getPropertyValueLabel(name, value); } void ImageLayer::setProperty(const PropertyName &name, int value) { Layer::setProperty(name, value); } bool ImageLayer::getValueExtents(float &, float &, bool &, QString &) const { return false; } bool ImageLayer::isLayerScrollable(const View *v) const { return true; } ImageModel::PointList ImageLayer::getLocalPoints(View *v, int x, int y) const { if (!m_model) return ImageModel::PointList(); // SVDEBUG << "ImageLayer::getLocalPoints(" << x << "," << y << "):"; const ImageModel::PointList &points(m_model->getPoints()); ImageModel::PointList rv; for (ImageModel::PointList::const_iterator i = points.begin(); i != points.end(); ) { const ImageModel::Point &p(*i); int px = v->getXForFrame(p.frame); if (px > x) break; ++i; if (i != points.end()) { int nx = v->getXForFrame((*i).frame); if (nx < x) { // as we aim not to overlap the images, if the following // image begins to the left of a point then the current // one may be assumed to end to the left of it as well. continue; } } // this image is a candidate, test it properly int width = 32; if (m_scaled[v].find(p.image) != m_scaled[v].end()) { width = m_scaled[v][p.image].width(); // SVDEBUG << "scaled width = " << width << endl; } if (x >= px && x < px + width) { rv.insert(p); } } // cerr << rv.size() << " point(s)" << endl; return rv; } QString ImageLayer::getFeatureDescription(View *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; ImageModel::PointList points = getLocalPoints(v, x, pos.y()); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return ""; } } long useFrame = points.begin()->frame; RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate()); QString text; /* if (points.begin()->label == "") { text = QString(tr("Time:\t%1\nHeight:\t%2\nLabel:\t%3")) .arg(rt.toText(true).c_str()) .arg(points.begin()->height) .arg(points.begin()->label); } pos = QPoint(v->getXForFrame(useFrame), getYForHeight(v, points.begin()->height)); */ return text; } //!!! too much overlap with TimeValueLayer/TimeInstantLayer/TextLayer bool ImageLayer::snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); ImageModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame), -1); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); int snapped = frame; bool found = false; for (ImageModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame > frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest ImageModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } void ImageLayer::paint(View *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; int sampleRate = m_model->getSampleRate(); if (!sampleRate) return; // Profiler profiler("ImageLayer::paint", true); // int x0 = rect.left(), x1 = rect.right(); int x0 = 0, x1 = v->width(); long frame0 = v->getFrameForX(x0); long frame1 = v->getFrameForX(x1); ImageModel::PointList points(m_model->getPoints(frame0, frame1)); if (points.empty()) return; paint.save(); paint.setClipRect(rect.x(), 0, rect.width(), v->height()); QColor penColour; penColour = v->getForeground(); QColor brushColour; brushColour = v->getBackground(); int h, s, val; brushColour.getHsv(&h, &s, &val); brushColour.setHsv(h, s, 255, 240); paint.setPen(penColour); paint.setBrush(brushColour); paint.setRenderHint(QPainter::Antialiasing, true); for (ImageModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const ImageModel::Point &p(*i); int x = v->getXForFrame(p.frame); int nx = x + 2000; ImageModel::PointList::const_iterator j = i; ++j; if (j != points.end()) { int jx = v->getXForFrame(j->frame); if (jx < nx) nx = jx; } drawImage(v, paint, p, x, nx); } paint.setRenderHint(QPainter::Antialiasing, false); paint.restore(); } void ImageLayer::drawImage(View *v, QPainter &paint, const ImageModel::Point &p, int x, int nx) const { QString label = p.label; QString imageName = p.image; QImage image; QString additionalText; QSize imageSize; if (!getImageOriginalSize(imageName, imageSize)) { image = QImage(":icons/emptypage.png"); imageSize = image.size(); additionalText = imageName; } int topMargin = 10; int bottomMargin = 10; int spacing = 5; if (v->height() < 100) { topMargin = 5; bottomMargin = 5; } int maxBoxHeight = v->height() - topMargin - bottomMargin; int availableWidth = nx - x - 3; if (availableWidth < 20) availableWidth = 20; QRect labelRect; if (label != "") { int likelyHeight = v->height() / 4; int likelyWidth = // available height times image aspect ((maxBoxHeight - likelyHeight) * imageSize.width()) / imageSize.height(); if (likelyWidth > imageSize.width()) { likelyWidth = imageSize.width(); } if (likelyWidth > availableWidth) { likelyWidth = availableWidth; } int singleWidth = paint.fontMetrics().width(label); if (singleWidth < availableWidth && singleWidth < likelyWidth * 2) { likelyWidth = singleWidth + 4; } labelRect = paint.fontMetrics().boundingRect (QRect(0, 0, likelyWidth, likelyHeight), Qt::AlignCenter | Qt::TextWordWrap, label); labelRect.setWidth(labelRect.width() + 6); } if (image.isNull()) { image = getImage(v, imageName, QSize(availableWidth, maxBoxHeight - labelRect.height())); } int boxWidth = image.width(); if (boxWidth < labelRect.width()) { boxWidth = labelRect.width(); } int boxHeight = image.height(); if (label != "") { boxHeight += labelRect.height() + spacing; } int division = image.height(); if (additionalText != "") { paint.save(); QFont font(paint.font()); font.setItalic(true); paint.setFont(font); int tw = paint.fontMetrics().width(additionalText); if (tw > availableWidth) { tw = availableWidth; } if (boxWidth < tw) { boxWidth = tw; } boxHeight += paint.fontMetrics().height(); division += paint.fontMetrics().height(); } bottomMargin = v->height() - topMargin - boxHeight; if (bottomMargin > topMargin + v->height()/7) { topMargin += v->height()/8; bottomMargin -= v->height()/8; } paint.drawRect(x - 1, topMargin - 1, boxWidth + 2, boxHeight + 2); int imageY; if (label != "") { imageY = topMargin + labelRect.height() + spacing; } else { imageY = topMargin; } paint.drawImage(x + (boxWidth - image.width())/2, imageY, image); if (additionalText != "") { paint.drawText(x, imageY + image.height() + paint.fontMetrics().ascent(), additionalText); paint.restore(); } if (label != "") { paint.drawLine(x, topMargin + labelRect.height() + spacing, x + boxWidth, topMargin + labelRect.height() + spacing); paint.drawText(QRect(x, topMargin, boxWidth, labelRect.height()), Qt::AlignCenter | Qt::TextWordWrap, label); } } void ImageLayer::setLayerDormant(const View *v, bool dormant) { if (dormant) { // Delete the images named in the view's scaled map from the // general image map as well. They can always be re-loaded // if it turns out another view still needs them. QMutexLocker locker(&m_imageMapMutex); for (ImageMap::iterator i = m_scaled[v].begin(); i != m_scaled[v].end(); ++i) { m_images.erase(i->first); } m_scaled.erase(v); } } //!!! how to reap no-longer-used images? bool ImageLayer::getImageOriginalSize(QString name, QSize &size) const { // cerr << "getImageOriginalSize: \"" << name << "\"" << endl; QMutexLocker locker(&m_imageMapMutex); if (m_images.find(name) == m_images.end()) { // cerr << "don't have, trying to open local" << endl; m_images[name] = QImage(getLocalFilename(name)); } if (m_images[name].isNull()) { // cerr << "null image" << endl; return false; } else { size = m_images[name].size(); return true; } } QImage ImageLayer::getImage(View *v, QString name, QSize maxSize) const { bool need = false; // SVDEBUG << "ImageLayer::getImage(" << v << ", " << name << ", (" // << maxSize.width() << "x" << maxSize.height() << "))" << endl; if (!m_scaled[v][name].isNull() && ((m_scaled[v][name].width() == maxSize.width() && m_scaled[v][name].height() <= maxSize.height()) || (m_scaled[v][name].width() <= maxSize.width() && m_scaled[v][name].height() == maxSize.height()))) { // cerr << "cache hit" << endl; return m_scaled[v][name]; } QMutexLocker locker(&m_imageMapMutex); if (m_images.find(name) == m_images.end()) { m_images[name] = QImage(getLocalFilename(name)); } if (m_images[name].isNull()) { // cerr << "null image" << endl; m_scaled[v][name] = QImage(); } else if (m_images[name].width() <= maxSize.width() && m_images[name].height() <= maxSize.height()) { m_scaled[v][name] = m_images[name]; } else { m_scaled[v][name] = m_images[name].scaled(maxSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); } return m_scaled[v][name]; } void ImageLayer::drawStart(View *v, QMouseEvent *e) { // SVDEBUG << "ImageLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) { SVDEBUG << "ImageLayer::drawStart: no model" << endl; return; } long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); m_editingPoint = ImageModel::Point(frame, "", ""); m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new ImageModel::EditCommand(m_model, "Add Image"); m_editingCommand->addPoint(m_editingPoint); m_editing = true; } void ImageLayer::drawDrag(View *v, QMouseEvent *e) { // SVDEBUG << "ImageLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingCommand->addPoint(m_editingPoint); } void ImageLayer::drawEnd(View *v, QMouseEvent *) { // SVDEBUG << "ImageLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; bool ok = false; ImageDialog dialog(tr("Select image"), "", ""); if (dialog.exec() == QDialog::Accepted) { checkAddSource(dialog.getImage()); ImageModel::ChangeImageCommand *command = new ImageModel::ChangeImageCommand (m_model, m_editingPoint, dialog.getImage(), dialog.getLabel()); m_editingCommand->addCommand(command); } else { m_editingCommand->deletePoint(m_editingPoint); } finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } bool ImageLayer::addImage(long frame, QString url) { QImage image(getLocalFilename(url)); if (image.isNull()) { cerr << "Failed to open image from url \"" << url << "\" (local filename \"" << getLocalFilename(url) << "\"" << endl; delete m_fileSources[url]; m_fileSources.erase(url); return false; } ImageModel::Point point(frame, url, ""); ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, "Add Image"); command->addPoint(point); finish(command); return true; } void ImageLayer::editStart(View *v, QMouseEvent *e) { // SVDEBUG << "ImageLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) return; ImageModel::PointList points = getLocalPoints(v, e->x(), e->y()); if (points.empty()) return; m_editOrigin = e->pos(); m_editingPoint = *points.begin(); m_originalPoint = m_editingPoint; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void ImageLayer::editDrag(View *v, QMouseEvent *e) { if (!m_model || !m_editing) return; long frameDiff = v->getFrameForX(e->x()) - v->getFrameForX(m_editOrigin.x()); long frame = m_originalPoint.frame + frameDiff; if (frame < 0) frame = 0; frame = (frame / m_model->getResolution()) * m_model->getResolution(); if (!m_editingCommand) { m_editingCommand = new ImageModel::EditCommand(m_model, tr("Move Image")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingCommand->addPoint(m_editingPoint); } void ImageLayer::editEnd(View *, QMouseEvent *) { // SVDEBUG << "ImageLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; if (m_editingCommand) { finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool ImageLayer::editOpen(View *v, QMouseEvent *e) { if (!m_model) return false; ImageModel::PointList points = getLocalPoints(v, e->x(), e->y()); if (points.empty()) return false; QString image = points.begin()->image; QString label = points.begin()->label; ImageDialog dialog(tr("Select image"), image, label); if (dialog.exec() == QDialog::Accepted) { checkAddSource(dialog.getImage()); ImageModel::ChangeImageCommand *command = new ImageModel::ChangeImageCommand (m_model, *points.begin(), dialog.getImage(), dialog.getLabel()); CommandHistory::getInstance()->addCommand(command); } return true; } void ImageLayer::moveSelection(Selection s, size_t newStartFrame) { if (!m_model) return; ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, tr("Drag Selection")); ImageModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (ImageModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { ImageModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void ImageLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, tr("Resize Selection")); ImageModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (ImageModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double target = i->frame; target = newSize.getStartFrame() + double(target - s.getStartFrame()) * ratio; ImageModel::Point newPoint(*i); newPoint.frame = lrint(target); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void ImageLayer::deleteSelection(Selection s) { if (!m_model) return; ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, tr("Delete Selection")); ImageModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (ImageModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) command->deletePoint(*i); } finish(command); } void ImageLayer::copy(View *v, Selection s, Clipboard &to) { if (!m_model) return; ImageModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (ImageModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool ImageLayer::paste(View *v, const Clipboard &from, int frameOffset, bool /* interactive */) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v, tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } ImageModel::EditCommand *command = new ImageModel::EditCommand(m_model, tr("Paste")); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; size_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } ImageModel::Point newPoint(frame); //!!! inadequate if (i->haveLabel()) { newPoint.label = i->getLabel(); } else if (i->haveValue()) { newPoint.label = QString("%1").arg(i->getValue()); } else { newPoint.label = tr("New Point"); } command->addPoint(newPoint); } finish(command); return true; } QString ImageLayer::getLocalFilename(QString img) const { if (m_fileSources.find(img) == m_fileSources.end()) { checkAddSource(img); if (m_fileSources.find(img) == m_fileSources.end()) { return img; } } return m_fileSources[img]->getLocalFilename(); } void ImageLayer::checkAddSource(QString img) const { SVDEBUG << "ImageLayer::checkAddSource(" << img << "): yes, trying..." << endl; if (m_fileSources.find(img) != m_fileSources.end()) { return; } ProgressDialog dialog(tr("Opening image URL..."), true, 2000); FileSource *rf = new FileSource(img, &dialog); if (rf->isOK()) { cerr << "ok, adding it (local filename = " << rf->getLocalFilename() << ")" << endl; m_fileSources[img] = rf; connect(rf, SIGNAL(ready()), this, SLOT(fileSourceReady())); } else { delete rf; } } void ImageLayer::checkAddSources() { const ImageModel::PointList &points(m_model->getPoints()); for (ImageModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { checkAddSource((*i).image); } } void ImageLayer::fileSourceReady() { // SVDEBUG << "ImageLayer::fileSourceReady" << endl; FileSource *rf = dynamic_cast(sender()); if (!rf) return; QString img; for (FileSourceMap::const_iterator i = m_fileSources.begin(); i != m_fileSources.end(); ++i) { if (i->second == rf) { img = i->first; // cerr << "it's image \"" << img << "\"" << endl; break; } } if (img == "") return; QMutexLocker locker(&m_imageMapMutex); m_images.erase(img); for (ViewImageMap::iterator i = m_scaled.begin(); i != m_scaled.end(); ++i) { i->second.erase(img); emit modelChanged(); } } void ImageLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { Layer::toXml(stream, indent, extraAttributes); } void ImageLayer::setProperties(const QXmlAttributes &attributes) { } sonic-visualiser-2.3~repack1.orig/svgui/layer/PianoScale.cpp0000644000175000017500000000370212252354725022727 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PianoScale.h" #include #include #include "base/Pitch.h" #include "view/View.h" void PianoScale::paintPianoVertical(View *v, QPainter &paint, QRect r, float minf, float maxf) { int x0 = r.x(), y0 = r.y(), x1 = r.x() + r.width(), y1 = r.y() + r.height(); paint.drawLine(x0, y0, x0, y1); int py = y1, ppy = y1; paint.setBrush(paint.pen().color()); for (int i = 0; i < 128; ++i) { float f = Pitch::getFrequencyForPitch(i); int y = lrintf(v->getYForFrequency(f, minf, maxf, true)); if (y < y0 - 2) break; if (y > y1 + 2) { continue; } int n = (i % 12); if (n == 1) { // C# -- fill the C from here QColor col = Qt::gray; if (i == 61) { // filling middle C col = Qt::blue; col = col.light(150); } if (ppy - y > 2) { paint.fillRect(x0 + 1, y, x1 - x0, (py + ppy) / 2 - y, col); } } if (n == 1 || n == 3 || n == 6 || n == 8 || n == 10) { // black notes paint.drawLine(x0 + 1, y, x1, y); int rh = ((py - y) / 4) * 2; if (rh < 2) rh = 2; paint.drawRect(x0 + 1, y - (py-y)/4, (x1 - x0) / 2, rh); } else if (n == 0 || n == 5) { // C, F if (py < y1) { paint.drawLine(x0 + 1, (y + py) / 2, x1, (y + py) / 2); } } ppy = py; py = y; } } sonic-visualiser-2.3~repack1.orig/svgui/layer/Layer.cpp0000644000175000017500000004377412252354725022002 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Layer.h" #include "view/View.h" #include "data/model/Model.h" #include "widgets/CommandHistory.h" #include #include #include #include #include #include #include #include #include "LayerFactory.h" #include "base/PlayParameterRepository.h" #include Layer::Layer() : m_haveDraggingRect(false), m_haveCurrentMeasureRect(false) { } Layer::~Layer() { // SVDEBUG << "Layer::~Layer(" << this << ")" << endl; } void Layer::connectSignals(const Model *model) { connect(model, SIGNAL(modelChanged()), this, SIGNAL(modelChanged())); connect(model, SIGNAL(modelChanged(size_t, size_t)), this, SIGNAL(modelChanged(size_t, size_t))); connect(model, SIGNAL(completionChanged()), this, SIGNAL(modelCompletionChanged())); connect(model, SIGNAL(alignmentCompletionChanged()), this, SIGNAL(modelAlignmentCompletionChanged())); } QString Layer::getPropertyContainerIconName() const { return LayerFactory::getInstance()->getLayerIconName (LayerFactory::getInstance()->getLayerType(this)); } void Layer::setPresentationName(QString name) { m_presentationName = name; } QString Layer::getLayerPresentationName() const { if (m_presentationName != "") return m_presentationName; LayerFactory *factory = LayerFactory::getInstance(); QString layerName = factory->getLayerPresentationName (factory->getLayerType(this)); QString modelName; if (getModel()) modelName = getModel()->objectName(); QString text; if (modelName != "") { text = QString("%1: %2").arg(modelName).arg(layerName); } else { text = layerName; } return text; } void Layer::setObjectName(const QString &name) { QObject::setObjectName(name); emit layerNameChanged(); } PlayParameters * Layer::getPlayParameters() { // cerr << "Layer (" << this << ", " << objectName() << ")::getPlayParameters: model is "<< getModel() << endl; const Model *model = getModel(); if (model) { return PlayParameterRepository::getInstance()->getPlayParameters(model); } return 0; } void Layer::setLayerDormant(const View *v, bool dormant) { const void *vv = (const void *)v; QMutexLocker locker(&m_dormancyMutex); m_dormancy[vv] = dormant; } bool Layer::isLayerDormant(const View *v) const { const void *vv = (const void *)v; QMutexLocker locker(&m_dormancyMutex); if (m_dormancy.find(vv) == m_dormancy.end()) return false; return m_dormancy.find(vv)->second; } void Layer::showLayer(View *view, bool show) { setLayerDormant(view, !show); emit layerParametersChanged(); } bool Layer::getXScaleValue(const View *v, int x, float &value, QString &unit) const { if (!hasTimeXAxis()) return false; const Model *m = getModel(); if (!m) return false; value = float(v->getFrameForX(x)) / m->getSampleRate(); unit = "s"; return true; } bool Layer::getYScaleDifference(const View *v, int y0, int y1, float &diff, QString &unit) const { float v0, v1; if (!getYScaleValue(v, y0, v0, unit) || !getYScaleValue(v, y1, v1, unit)) { diff = 0.f; return false; } diff = fabsf(v1 - v0); return true; } size_t Layer::alignToReference(View *v, size_t frame) const { const Model *m = getModel(); SVDEBUG << "Layer::alignToReference(" << frame << "): model = " << m << ", alignment reference = " << (m ? m->getAlignmentReference() : 0) << endl; if (m && m->getAlignmentReference()) { return m->alignToReference(frame); } else { return v->alignToReference(frame); } } size_t Layer::alignFromReference(View *v, size_t frame) const { const Model *m = getModel(); SVDEBUG << "Layer::alignFromReference(" << frame << "): model = " << m << ", alignment reference = " << (m ? m->getAlignmentReference() : 0) << endl; if (m && m->getAlignmentReference()) { return m->alignFromReference(frame); } else { return v->alignFromReference(frame); } } bool Layer::clipboardHasDifferentAlignment(View *v, const Clipboard &clip) const { // Notes on pasting to an aligned layer: // // Each point may have a reference frame that may differ from the // point's given frame (in its source model). If it has no // reference frame, we have to assume the source model was not // aligned or was the reference model: when cutting or copying // points from a layer, we must always set their reference frame // correctly if we are aligned. // // When pasting: // - if point's reference and aligned frames differ: // - if this layer is aligned: // - if point's aligned frame matches this layer's aligned version // of point's reference frame: // - we can paste at reference frame or our frame // - else // - we can paste at reference frame, result of aligning reference // frame in our model, or literal source frame // - else // - we can paste at reference (our) frame, or literal source frame // - else // - if this layer is aligned: // - we can paste at reference (point's only available) frame, // or result of aligning reference frame in our model // - else // - we can only paste at reference frame // // Which of these alternatives are useful? // // Example: we paste between two tracks that are aligned to the // same reference, and the points are at 10s and 20s in the source // track, corresponding to 5s and 10s in the reference but 20s and // 30s in the target track. // // The obvious default is to paste at 20s and 30s; if we aren't // doing that, would it be better to paste at 5s and 10s or at 10s // and 20s? We probably don't ever want to do the former, do we? // We either want to be literal all the way through, or aligned // all the way through. for (Clipboard::PointList::const_iterator i = clip.getPoints().begin(); i != clip.getPoints().end(); ++i) { // In principle, we want to know whether the aligned version // of the reference frame in our layer is the same as the // source frame contained in the clipboard point. However, // because of rounding during alignment, that won't // necessarily be the case even if the clipboard point came // from our layer! What we need to check is whether, if we // aligned the clipboard point's frame back to the reference // using this layer's alignment, we would obtain the same // reference frame as that for the clipboard point. // What if the clipboard point has no reference frame? Then // we have to treat it as having its own frame as the // reference (i.e. having been copied from the reference // model). long sourceFrame = i->getFrame(); long referenceFrame = sourceFrame; if (i->haveReferenceFrame()) { referenceFrame = i->getReferenceFrame(); } long myMappedFrame = alignToReference(v, sourceFrame); // cerr << "sourceFrame = " << sourceFrame << ", referenceFrame = " << referenceFrame << " (have = " << i->haveReferenceFrame() << "), myMappedFrame = " << myMappedFrame << endl; if (myMappedFrame != referenceFrame) return true; } return false; } bool Layer::MeasureRect::operator<(const MeasureRect &mr) const { if (haveFrames) { if (startFrame == mr.startFrame) { if (endFrame != mr.endFrame) { return endFrame < mr.endFrame; } } else { return startFrame < mr.startFrame; } } else { if (pixrect.x() == mr.pixrect.x()) { if (pixrect.width() != mr.pixrect.width()) { return pixrect.width() < mr.pixrect.width(); } } else { return pixrect.x() < mr.pixrect.x(); } } // the two rects are equal in x and width if (pixrect.y() == mr.pixrect.y()) { return pixrect.height() < mr.pixrect.height(); } else { return pixrect.y() < mr.pixrect.y(); } } void Layer::MeasureRect::toXml(QTextStream &stream, QString indent) const { stream << indent; stream << QString("\n") .arg(startY).arg(endY); } void Layer::addMeasurementRect(const QXmlAttributes &attributes) { MeasureRect rect; QString fs = attributes.value("startFrame"); int x0 = 0, x1 = 0; if (fs != "") { rect.startFrame = fs.toLong(); rect.endFrame = attributes.value("endFrame").toLong(); rect.haveFrames = true; } else { x0 = attributes.value("startX").toInt(); x1 = attributes.value("endX").toInt(); rect.haveFrames = false; } rect.startY = attributes.value("startY").toDouble(); rect.endY = attributes.value("endY").toDouble(); rect.pixrect = QRect(x0, 0, x1 - x0, 0); addMeasureRectToSet(rect); } QString Layer::AddMeasurementRectCommand::getName() const { return tr("Make Measurement"); } void Layer::AddMeasurementRectCommand::execute() { m_layer->addMeasureRectToSet(m_rect); } void Layer::AddMeasurementRectCommand::unexecute() { m_layer->deleteMeasureRectFromSet(m_rect); } QString Layer::DeleteMeasurementRectCommand::getName() const { return tr("Delete Measurement"); } void Layer::DeleteMeasurementRectCommand::execute() { m_layer->deleteMeasureRectFromSet(m_rect); } void Layer::DeleteMeasurementRectCommand::unexecute() { m_layer->addMeasureRectToSet(m_rect); } void Layer::measureStart(View *v, QMouseEvent *e) { setMeasureRectFromPixrect(v, m_draggingRect, QRect(e->x(), e->y(), 0, 0)); m_haveDraggingRect = true; } void Layer::measureDrag(View *v, QMouseEvent *e) { if (!m_haveDraggingRect) return; setMeasureRectFromPixrect(v, m_draggingRect, QRect(m_draggingRect.pixrect.x(), m_draggingRect.pixrect.y(), e->x() - m_draggingRect.pixrect.x(), e->y() - m_draggingRect.pixrect.y())); } void Layer::measureEnd(View *v, QMouseEvent *e) { if (!m_haveDraggingRect) return; measureDrag(v, e); if (!m_draggingRect.pixrect.isNull()) { CommandHistory::getInstance()->addCommand (new AddMeasurementRectCommand(this, m_draggingRect)); } m_haveDraggingRect = false; } void Layer::measureDoubleClick(View *v, QMouseEvent *e) { // nothing, in the base class } void Layer::deleteCurrentMeasureRect() { if (!m_haveCurrentMeasureRect) return; MeasureRectSet::const_iterator focusRectItr = findFocusedMeasureRect(m_currentMeasureRectPoint); if (focusRectItr == m_measureRects.end()) return; CommandHistory::getInstance()->addCommand (new DeleteMeasurementRectCommand(this, *focusRectItr)); } void Layer::paintMeasurementRects(View *v, QPainter &paint, bool showFocus, QPoint focusPoint) const { updateMeasurePixrects(v); MeasureRectSet::const_iterator focusRectItr = m_measureRects.end(); if (m_haveDraggingRect) { paintMeasurementRect(v, paint, m_draggingRect, true); } else if (showFocus) { focusRectItr = findFocusedMeasureRect(focusPoint); } m_haveCurrentMeasureRect = false; for (MeasureRectSet::const_iterator i = m_measureRects.begin(); i != m_measureRects.end(); ++i) { bool focused = (i == focusRectItr); paintMeasurementRect(v, paint, *i, focused); if (focused) { m_haveCurrentMeasureRect = true; m_currentMeasureRectPoint = focusPoint; } } } bool Layer::nearestMeasurementRectChanged(View *v, QPoint prev, QPoint now) const { updateMeasurePixrects(v); MeasureRectSet::const_iterator i0 = findFocusedMeasureRect(prev); MeasureRectSet::const_iterator i1 = findFocusedMeasureRect(now); return (i0 != i1); } void Layer::updateMeasurePixrects(View *v) const { long sf = v->getStartFrame(); long ef = v->getEndFrame(); for (MeasureRectSet::const_iterator i = m_measureRects.begin(); i != m_measureRects.end(); ++i) { // This logic depends on the fact that if one measure rect in // a layer has frame values, they all will. That is in fact // the case, because haveFrames is based on whether the layer // hasTimeXAxis() or not. Measure rect ordering in the rect // set wouldn't work correctly either, if haveFrames could // vary. if (i->haveFrames) { if (i->startFrame >= ef) break; if (i->endFrame <= sf) continue; } int x0 = i->pixrect.x(); int x1 = x0 + i->pixrect.width(); if (i->haveFrames) { if (i->startFrame >= v->getStartFrame()) { x0 = v->getXForFrame(i->startFrame); } if (i->endFrame <= long(v->getEndFrame())) { x1 = v->getXForFrame(i->endFrame); } } i->pixrect = QRect(x0, i->pixrect.y(), x1 - x0, i->pixrect.height()); updateMeasureRectYCoords(v, *i); } } void Layer::updateMeasureRectYCoords(View *v, const MeasureRect &r) const { int y0 = lrint(r.startY * v->height()); int y1 = lrint(r.endY * v->height()); r.pixrect = QRect(r.pixrect.x(), y0, r.pixrect.width(), y1 - y0); } void Layer::setMeasureRectYCoord(View *v, MeasureRect &r, bool start, int y) const { if (start) { r.startY = double(y) / double(v->height()); r.endY = r.startY; } else { r.endY = double(y) / double(v->height()); } } void Layer::setMeasureRectFromPixrect(View *v, MeasureRect &r, QRect pixrect) const { r.pixrect = pixrect; r.haveFrames = hasTimeXAxis(); if (r.haveFrames) { r.startFrame = v->getFrameForX(pixrect.x()); r.endFrame = v->getFrameForX(pixrect.x() + pixrect.width()); } setMeasureRectYCoord(v, r, true, pixrect.y()); setMeasureRectYCoord(v, r, false, pixrect.y() + pixrect.height()); } Layer::MeasureRectSet::const_iterator Layer::findFocusedMeasureRect(QPoint focusPoint) const { float frDist = 0; MeasureRectSet::const_iterator focusRectItr = m_measureRects.end(); for (MeasureRectSet::const_iterator i = m_measureRects.begin(); i != m_measureRects.end(); ++i) { if (!i->pixrect.adjusted(-2, -2, 2, 2).contains(focusPoint)) continue; int cx = i->pixrect.x() + i->pixrect.width()/2; int cy = i->pixrect.y() + i->pixrect.height()/2; int xd = focusPoint.x() - cx; int yd = focusPoint.y() - cy; float d = sqrt(float(xd * xd + yd * yd)); if (focusRectItr == m_measureRects.end() || d < frDist) { focusRectItr = i; frDist = d; } } return focusRectItr; } void Layer::paintMeasurementRect(View *v, QPainter &paint, const MeasureRect &r, bool focus) const { if (r.haveFrames) { int x0 = -1; int x1 = v->width() + 1; if (r.startFrame >= v->getStartFrame()) { x0 = v->getXForFrame(r.startFrame); } if (r.endFrame <= long(v->getEndFrame())) { x1 = v->getXForFrame(r.endFrame); } QRect pr = QRect(x0, r.pixrect.y(), x1 - x0, r.pixrect.height()); r.pixrect = pr; } v->drawMeasurementRect(paint, this, r.pixrect.normalized(), focus); } void Layer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; if (m_presentationName != "") { extraAttributes = QString("%1 presentationName=\"%2\"") .arg(extraAttributes).arg(encodeEntities(m_presentationName)); } stream << QString("getLayerTypeName (LayerFactory::getInstance()->getLayerType(this)))) .arg(getObjectExportId(this)) .arg(encodeEntities(objectName())) .arg(getObjectExportId(getModel())) .arg(extraAttributes); if (m_measureRects.empty()) { stream << QString("/>\n"); return; } stream << QString(">\n"); for (MeasureRectSet::const_iterator i = m_measureRects.begin(); i != m_measureRects.end(); ++i) { i->toXml(stream, indent + " "); } stream << QString("\n"); } void Layer::toBriefXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; if (m_presentationName != "") { extraAttributes = QString("%1 presentationName=\"%2\"") .arg(extraAttributes).arg(encodeEntities(m_presentationName)); } stream << QString("\n") .arg(encodeEntities(LayerFactory::getInstance()->getLayerTypeName (LayerFactory::getInstance()->getLayerType(this)))) .arg(getObjectExportId(this)) .arg(encodeEntities(objectName())) .arg(getObjectExportId(getModel())) .arg(extraAttributes); } sonic-visualiser-2.3~repack1.orig/svgui/layer/WaveformLayer.cpp0000644000175000017500000011323712252354725023501 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "WaveformLayer.h" #include "base/AudioLevel.h" #include "view/View.h" #include "base/Profiler.h" #include "base/RangeMapper.h" #include "ColourDatabase.h" #include #include #include #include #include //#define DEBUG_WAVEFORM_PAINT 1 WaveformLayer::WaveformLayer() : SingleColourLayer(), m_model(0), m_gain(1.0f), m_autoNormalize(false), m_showMeans(true), m_greyscale(true), m_channelMode(SeparateChannels), m_channel(-1), m_scale(LinearScale), m_aggressive(false), m_cache(0), m_cacheValid(false) { } WaveformLayer::~WaveformLayer() { delete m_cache; } void WaveformLayer::setModel(const RangeSummarisableTimeValueModel *model) { bool channelsChanged = false; if (m_channel == -1) { if (!m_model) { if (model) { channelsChanged = true; } } else { if (model && m_model->getChannelCount() != model->getChannelCount()) { channelsChanged = true; } } } m_model = model; m_cacheValid = false; if (!m_model || !m_model->isOK()) return; connectSignals(m_model); emit modelReplaced(); if (channelsChanged) emit layerParametersChanged(); } Layer::PropertyList WaveformLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Scale"); list.push_back("Gain"); list.push_back("Normalize Visible Area"); if (m_model && m_model->getChannelCount() > 1 && m_channel == -1) { list.push_back("Channels"); } return list; } QString WaveformLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Scale") return tr("Scale"); if (name == "Gain") return tr("Gain"); if (name == "Normalize Visible Area") return tr("Normalize Visible Area"); if (name == "Channels") return tr("Channels"); return SingleColourLayer::getPropertyLabel(name); } QString WaveformLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Normalize Visible Area") return "normalise"; return ""; } Layer::PropertyType WaveformLayer::getPropertyType(const PropertyName &name) const { if (name == "Gain") return RangeProperty; if (name == "Normalize Visible Area") return ToggleProperty; if (name == "Channels") return ValueProperty; if (name == "Scale") return ValueProperty; return SingleColourLayer::getPropertyType(name); } QString WaveformLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Gain" || name == "Normalize Visible Area" || name == "Scale") return tr("Scale"); return QString(); } int WaveformLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Gain") { *min = -50; *max = 50; *deflt = 0; val = lrint(log10(m_gain) * 20.0); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Normalize Visible Area") { val = (m_autoNormalize ? 1 : 0); *deflt = 0; } else if (name == "Channels") { *min = 0; *max = 2; *deflt = 0; if (m_channelMode == MixChannels) val = 1; else if (m_channelMode == MergeChannels) val = 2; else val = 0; } else if (name == "Scale") { *min = 0; *max = 2; *deflt = 0; val = (int)m_scale; } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString WaveformLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Meter"); case 2: return tr("dB"); } } if (name == "Channels") { switch (value) { default: case 0: return tr("Separate"); case 1: return tr("Mean"); case 2: return tr("Butterfly"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } RangeMapper * WaveformLayer::getNewPropertyRangeMapper(const PropertyName &name) const { if (name == "Gain") { return new LinearRangeMapper(-50, 50, -25, 25, tr("dB")); } return 0; } void WaveformLayer::setProperty(const PropertyName &name, int value) { if (name == "Gain") { setGain(pow(10, float(value)/20.0)); } else if (name == "Normalize Visible Area") { setAutoNormalize(value ? true : false); } else if (name == "Channels") { if (value == 1) setChannelMode(MixChannels); else if (value == 2) setChannelMode(MergeChannels); else setChannelMode(SeparateChannels); } else if (name == "Scale") { switch (value) { default: case 0: setScale(LinearScale); break; case 1: setScale(MeterScale); break; case 2: setScale(dBScale); break; } } else { SingleColourLayer::setProperty(name, value); } } void WaveformLayer::setGain(float gain) { if (m_gain == gain) return; m_gain = gain; m_cacheValid = false; emit layerParametersChanged(); emit verticalZoomChanged(); } void WaveformLayer::setAutoNormalize(bool autoNormalize) { if (m_autoNormalize == autoNormalize) return; m_autoNormalize = autoNormalize; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setShowMeans(bool showMeans) { if (m_showMeans == showMeans) return; m_showMeans = showMeans; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setUseGreyscale(bool useGreyscale) { if (m_greyscale == useGreyscale) return; m_greyscale = useGreyscale; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setChannelMode(ChannelMode channelMode) { if (m_channelMode == channelMode) return; m_channelMode = channelMode; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setChannel(int channel) { // SVDEBUG << "WaveformLayer::setChannel(" << channel << ")" << endl; if (m_channel == channel) return; m_channel = channel; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setScale(Scale scale) { if (m_scale == scale) return; m_scale = scale; m_cacheValid = false; emit layerParametersChanged(); } void WaveformLayer::setAggressiveCacheing(bool aggressive) { if (m_aggressive == aggressive) return; m_aggressive = aggressive; m_cacheValid = false; emit layerParametersChanged(); } int WaveformLayer::getCompletion(View *) const { int completion = 100; if (!m_model || !m_model->isOK()) return completion; if (m_model->isReady(&completion)) return 100; return completion; } bool WaveformLayer::getValueExtents(float &min, float &max, bool &, QString &unit) const { if (m_scale == LinearScale) { min = 0.0; max = 1.0; unit = "V"; } else if (m_scale == MeterScale) { return false; //!!! } else { min = AudioLevel::multiplier_to_dB(0.0); max = AudioLevel::multiplier_to_dB(1.0); unit = "dB"; } return true; } int WaveformLayer::dBscale(float sample, int m) const { if (sample < 0.0) return dBscale(-sample, m); float dB = AudioLevel::multiplier_to_dB(sample); if (dB < -50.0) return 0; if (dB > 0.0) return m; return int(((dB + 50.0) * m) / 50.0 + 0.1); } size_t WaveformLayer::getChannelArrangement(size_t &min, size_t &max, bool &merging, bool &mixing) const { if (!m_model || !m_model->isOK()) return 0; size_t channels = m_model->getChannelCount(); if (channels == 0) return 0; size_t rawChannels = channels; if (m_channel == -1) { min = 0; if (m_channelMode == MergeChannels || m_channelMode == MixChannels) { max = 0; channels = 1; } else { max = channels - 1; } } else { min = m_channel; max = m_channel; rawChannels = 1; channels = 1; } merging = (m_channelMode == MergeChannels && rawChannels > 1); mixing = (m_channelMode == MixChannels && rawChannels > 1); // SVDEBUG << "WaveformLayer::getChannelArrangement: min " << min << ", max " << max << ", merging " << merging << ", channels " << channels << endl; return channels; } bool WaveformLayer::isLayerScrollable(const View *) const { return !m_autoNormalize; } static float meterdbs[] = { -40, -30, -20, -15, -10, -5, -3, -2, -1, -0.5, 0 }; bool WaveformLayer::getSourceFramesForX(View *v, int x, size_t modelZoomLevel, size_t &f0, size_t &f1) const { long viewFrame = v->getFrameForX(x); if (viewFrame < 0) { f0 = 0; f1 = 0; return false; } f0 = viewFrame; f0 = f0 / modelZoomLevel; f0 = f0 * modelZoomLevel; viewFrame = v->getFrameForX(x + 1); f1 = viewFrame; f1 = f1 / modelZoomLevel; f1 = f1 * modelZoomLevel; return (f0 < m_model->getEndFrame()); } float WaveformLayer::getNormalizeGain(View *v, int channel) const { long startFrame = v->getStartFrame(); long endFrame = v->getEndFrame(); // Although a long for purposes of comparison against the view // start and end frames, these are known to be non-negative long modelStart = long(m_model->getStartFrame()); long modelEnd = long(m_model->getEndFrame()); size_t rangeStart, rangeEnd; if (startFrame < modelStart) rangeStart = modelStart; else rangeStart = startFrame; if (endFrame < 0) rangeEnd = 0; else if (endFrame > modelEnd) rangeEnd = modelEnd; else rangeEnd = endFrame; if (rangeEnd < rangeStart) rangeEnd = rangeStart; RangeSummarisableTimeValueModel::Range range = m_model->getSummary(channel, rangeStart, rangeEnd - rangeStart); size_t minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (mergingChannels || mixingChannels) { RangeSummarisableTimeValueModel::Range otherRange = m_model->getSummary(1, rangeStart, rangeEnd - rangeStart); range.setMax(std::max(range.max(), otherRange.max())); range.setMin(std::min(range.min(), otherRange.min())); range.setAbsmean(std::min(range.absmean(), otherRange.absmean())); } return 1.0 / std::max(fabsf(range.max()), fabsf(range.min())); } void WaveformLayer::paint(View *v, QPainter &viewPainter, QRect rect) const { if (!m_model || !m_model->isOK()) { return; } int zoomLevel = v->getZoomLevel(); #ifdef DEBUG_WAVEFORM_PAINT Profiler profiler("WaveformLayer::paint", true); cerr << "WaveformLayer::paint (" << rect.x() << "," << rect.y() << ") [" << rect.width() << "x" << rect.height() << "]: zoom " << zoomLevel << endl; #endif size_t channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (channels == 0) return; int w = v->width(); int h = v->height(); bool ready = m_model->isReady(); QPainter *paint; if (m_aggressive) { #ifdef DEBUG_WAVEFORM_PAINT cerr << "WaveformLayer::paint: aggressive is true" << endl; #endif if (m_cacheValid && (zoomLevel != m_cacheZoomLevel)) { m_cacheValid = false; } if (!m_cache || m_cache->width() != w || m_cache->height() != h) { #ifdef DEBUG_WAVEFORM_PAINT if (m_cache) { cerr << "WaveformLayer::paint: cache size " << m_cache->width() << "x" << m_cache->height() << " differs from view size " << w << "x" << h << ": regenerating aggressive cache" << endl; } #endif delete m_cache; m_cache = new QPixmap(w, h); m_cacheValid = false; } if (m_cacheValid) { viewPainter.drawPixmap(rect, *m_cache, rect); return; } paint = new QPainter(m_cache); paint->setPen(Qt::NoPen); paint->setBrush(getBackgroundQColor(v)); paint->drawRect(rect); paint->setPen(getForegroundQColor(v)); paint->setBrush(Qt::NoBrush); } else { paint = &viewPainter; } paint->setRenderHint(QPainter::Antialiasing, false); int x0 = 0, x1 = w - 1; int y0 = 0, y1 = h - 1; x0 = rect.left(); x1 = rect.right(); y0 = rect.top(); y1 = rect.bottom(); if (x0 > 0) --x0; if (x1 < v->width()) ++x1; // Our zoom level may differ from that at which the underlying // model has its blocks. // Each pixel within our visible range must always draw from // exactly the same set of underlying audio frames, no matter what // the range being drawn is. And that set of underlying frames // must remain the same when we scroll one or more pixels left or // right. size_t modelZoomLevel = m_model->getSummaryBlockSize(zoomLevel); size_t frame0; size_t frame1; size_t spare; getSourceFramesForX(v, x0, modelZoomLevel, frame0, spare); getSourceFramesForX(v, x1, modelZoomLevel, spare, frame1); #ifdef DEBUG_WAVEFORM_PAINT cerr << "Painting waveform from " << frame0 << " to " << frame1 << " (" << (x1-x0+1) << " pixels at zoom " << zoomLevel << " and model zoom " << modelZoomLevel << ")" << endl; #endif RangeSummarisableTimeValueModel::RangeBlock *ranges = new RangeSummarisableTimeValueModel::RangeBlock; RangeSummarisableTimeValueModel::RangeBlock *otherChannelRanges = 0; RangeSummarisableTimeValueModel::Range range; QColor baseColour = getBaseQColor(); std::vector greys = getPartialShades(v); QColor midColour = baseColour; if (midColour == Qt::black) { midColour = Qt::gray; } else if (v->hasLightBackground()) { midColour = midColour.light(150); } else { midColour = midColour.light(50); } while (m_effectiveGains.size() <= maxChannel) { m_effectiveGains.push_back(m_gain); } for (size_t ch = minChannel; ch <= maxChannel; ++ch) { int prevRangeBottom = -1, prevRangeTop = -1; QColor prevRangeBottomColour = baseColour, prevRangeTopColour = baseColour; m_effectiveGains[ch] = m_gain; if (m_autoNormalize) { m_effectiveGains[ch] = getNormalizeGain(v, ch); } float gain = m_effectiveGains[ch]; int m = (h / channels) / 2; int my = m + (((ch - minChannel) * h) / channels); #ifdef DEBUG_WAVEFORM_PAINT cerr << "ch = " << ch << ", channels = " << channels << ", m = " << m << ", my = " << my << ", h = " << h << endl; #endif if (my - m > y1 || my + m < y0) continue; if ((m_scale == dBScale || m_scale == MeterScale) && m_channelMode != MergeChannels) { m = (h / channels); my = m + (((ch - minChannel) * h) / channels); } paint->setPen(greys[1]); paint->drawLine(x0, my, x1, my); int n = 10; int py = -1; if (v->hasLightBackground() && v->getViewManager() && v->getViewManager()->shouldShowScaleGuides()) { paint->setPen(QColor(240, 240, 240)); for (int i = 1; i < n; ++i) { float val = 0.0, nval = 0.0; switch (m_scale) { case LinearScale: val = (i * gain) / n; if (i > 0) nval = -val; break; case MeterScale: val = AudioLevel::dB_to_multiplier(meterdbs[i]) * gain; break; case dBScale: val = AudioLevel::dB_to_multiplier(-(10*n) + i * 10) * gain; break; } if (val < -1.0 || val > 1.0) continue; int y = getYForValue(v, val, ch); if (py >= 0 && abs(y - py) < 10) continue; else py = y; int ny = y; if (nval != 0.0) { ny = getYForValue(v, nval, ch); } paint->drawLine(x0, y, x1, y); if (ny != y) { paint->drawLine(x0, ny, x1, ny); } } } m_model->getSummaries(ch, frame0, frame1 - frame0, *ranges, modelZoomLevel); #ifdef DEBUG_WAVEFORM_PAINT cerr << "channel " << ch << ": " << ranges->size() << " ranges from " << frame0 << " to " << frame1 << " at zoom level " << modelZoomLevel << endl; #endif if (mergingChannels || mixingChannels) { if (m_model->getChannelCount() > 1) { if (!otherChannelRanges) { otherChannelRanges = new RangeSummarisableTimeValueModel::RangeBlock; } m_model->getSummaries (1, frame0, frame1 - frame0, *otherChannelRanges, modelZoomLevel); } else { if (otherChannelRanges != ranges) delete otherChannelRanges; otherChannelRanges = ranges; } } for (int x = x0; x <= x1; ++x) { range = RangeSummarisableTimeValueModel::Range(); size_t f0, f1; if (!getSourceFramesForX(v, x, modelZoomLevel, f0, f1)) continue; f1 = f1 - 1; if (f0 < frame0) { cerr << "ERROR: WaveformLayer::paint: pixel " << x << " has f0 = " << f0 << " which is less than range frame0 " << frame0 << " for x0 = " << x0 << endl; continue; } size_t i0 = (f0 - frame0) / modelZoomLevel; size_t i1 = (f1 - frame0) / modelZoomLevel; #ifdef DEBUG_WAVEFORM_PAINT cerr << "WaveformLayer::paint: pixel " << x << ": i0 " << i0 << " (f " << f0 << "), i1 " << i1 << " (f " << f1 << ")" << endl; #endif if (i1 > i0 + 1) { cerr << "WaveformLayer::paint: ERROR: i1 " << i1 << " > i0 " << i0 << " plus one (zoom = " << zoomLevel << ", model zoom = " << modelZoomLevel << ")" << endl; } if (ranges && i0 < ranges->size()) { range = (*ranges)[i0]; if (i1 > i0 && i1 < ranges->size()) { range.setMax(std::max(range.max(), (*ranges)[i1].max())); range.setMin(std::min(range.min(), (*ranges)[i1].min())); range.setAbsmean((range.absmean() + (*ranges)[i1].absmean()) / 2); } } else { #ifdef DEBUG_WAVEFORM_PAINT cerr << "No (or not enough) ranges for i0 = " << i0 << endl; #endif continue; } int rangeBottom = 0, rangeTop = 0, meanBottom = 0, meanTop = 0; if (mergingChannels) { if (otherChannelRanges && i0 < otherChannelRanges->size()) { range.setMax(fabsf(range.max())); range.setMin(-fabsf((*otherChannelRanges)[i0].max())); range.setAbsmean ((range.absmean() + (*otherChannelRanges)[i0].absmean()) / 2); if (i1 > i0 && i1 < otherChannelRanges->size()) { // let's not concern ourselves about the mean range.setMin (std::min (range.min(), -fabsf((*otherChannelRanges)[i1].max()))); } } } else if (mixingChannels) { if (otherChannelRanges && i0 < otherChannelRanges->size()) { range.setMax((range.max() + (*otherChannelRanges)[i0].max()) / 2); range.setMin((range.min() + (*otherChannelRanges)[i0].min()) / 2); range.setAbsmean((range.absmean() + (*otherChannelRanges)[i0].absmean()) / 2); } } int greyLevels = 1; if (m_greyscale && (m_scale == LinearScale)) greyLevels = 4; switch (m_scale) { case LinearScale: rangeBottom = int( m * greyLevels * range.min() * gain); rangeTop = int( m * greyLevels * range.max() * gain); meanBottom = int(-m * range.absmean() * gain); meanTop = int( m * range.absmean() * gain); break; case dBScale: if (!mergingChannels) { int db0 = dBscale(range.min() * gain, m); int db1 = dBscale(range.max() * gain, m); rangeTop = std::max(db0, db1); meanTop = std::min(db0, db1); if (mixingChannels) rangeBottom = meanTop; else rangeBottom = dBscale(range.absmean() * gain, m); meanBottom = rangeBottom; } else { rangeBottom = -dBscale(range.min() * gain, m * greyLevels); rangeTop = dBscale(range.max() * gain, m * greyLevels); meanBottom = -dBscale(range.absmean() * gain, m); meanTop = dBscale(range.absmean() * gain, m); } break; case MeterScale: if (!mergingChannels) { int r0 = abs(AudioLevel::multiplier_to_preview(range.min() * gain, m)); int r1 = abs(AudioLevel::multiplier_to_preview(range.max() * gain, m)); rangeTop = std::max(r0, r1); meanTop = std::min(r0, r1); if (mixingChannels) rangeBottom = meanTop; else rangeBottom = AudioLevel::multiplier_to_preview(range.absmean() * gain, m); meanBottom = rangeBottom; } else { rangeBottom = -AudioLevel::multiplier_to_preview(range.min() * gain, m * greyLevels); rangeTop = AudioLevel::multiplier_to_preview(range.max() * gain, m * greyLevels); meanBottom = -AudioLevel::multiplier_to_preview(range.absmean() * gain, m); meanTop = AudioLevel::multiplier_to_preview(range.absmean() * gain, m); } break; } rangeBottom = my * greyLevels - rangeBottom; rangeTop = my * greyLevels - rangeTop; meanBottom = my - meanBottom; meanTop = my - meanTop; int topFill = (rangeTop % greyLevels); if (topFill > 0) topFill = greyLevels - topFill; int bottomFill = (rangeBottom % greyLevels); rangeTop = rangeTop / greyLevels; rangeBottom = rangeBottom / greyLevels; bool clipped = false; if (rangeTop < my - m) { rangeTop = my - m; } if (rangeTop > my + m) { rangeTop = my + m; } if (rangeBottom < my - m) { rangeBottom = my - m; } if (rangeBottom > my + m) { rangeBottom = my + m; } if (range.max() <= -1.0 || range.max() >= 1.0) clipped = true; if (meanBottom > rangeBottom) meanBottom = rangeBottom; if (meanTop < rangeTop) meanTop = rangeTop; bool drawMean = m_showMeans; if (meanTop == rangeTop) { if (meanTop < meanBottom) ++meanTop; else drawMean = false; } if (meanBottom == rangeBottom && m_scale == LinearScale) { if (meanBottom > meanTop) --meanBottom; else drawMean = false; } if (x != x0 && prevRangeBottom != -1) { if (prevRangeBottom > rangeBottom + 1 && prevRangeTop > rangeBottom + 1) { // paint->setPen(midColour); paint->setPen(baseColour); paint->drawLine(x-1, prevRangeTop, x, rangeBottom + 1); paint->setPen(prevRangeTopColour); paint->drawPoint(x-1, prevRangeTop); } else if (prevRangeBottom < rangeTop - 1 && prevRangeTop < rangeTop - 1) { // paint->setPen(midColour); paint->setPen(baseColour); paint->drawLine(x-1, prevRangeBottom, x, rangeTop - 1); paint->setPen(prevRangeBottomColour); paint->drawPoint(x-1, prevRangeBottom); } } if (ready) { if (clipped /*!!! || range.min() * gain <= -1.0 || range.max() * gain >= 1.0 */) { paint->setPen(Qt::red); //!!! getContrastingColour } else { paint->setPen(baseColour); } } else { paint->setPen(midColour); } #ifdef DEBUG_WAVEFORM_PAINT cerr << "range " << rangeBottom << " -> " << rangeTop << ", means " << meanBottom << " -> " << meanTop << ", raw range " << range.min() << " -> " << range.max() << endl; #endif if (rangeTop == rangeBottom) { paint->drawPoint(x, rangeTop); } else { paint->drawLine(x, rangeBottom, x, rangeTop); } prevRangeTopColour = baseColour; prevRangeBottomColour = baseColour; if (m_greyscale && (m_scale == LinearScale) && ready) { if (!clipped) { if (rangeTop < rangeBottom) { if (topFill > 0 && (!drawMean || (rangeTop < meanTop - 1))) { paint->setPen(greys[topFill - 1]); paint->drawPoint(x, rangeTop); prevRangeTopColour = greys[topFill - 1]; } if (bottomFill > 0 && (!drawMean || (rangeBottom > meanBottom + 1))) { paint->setPen(greys[bottomFill - 1]); paint->drawPoint(x, rangeBottom); prevRangeBottomColour = greys[bottomFill - 1]; } } } } if (drawMean) { paint->setPen(midColour); paint->drawLine(x, meanBottom, x, meanTop); } prevRangeBottom = rangeBottom; prevRangeTop = rangeTop; } } if (m_aggressive) { if (ready && rect == v->rect()) { m_cacheValid = true; m_cacheZoomLevel = zoomLevel; } paint->end(); delete paint; viewPainter.drawPixmap(rect, *m_cache, rect); } if (otherChannelRanges != ranges) delete otherChannelRanges; delete ranges; } QString WaveformLayer::getFeatureDescription(View *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->isOK()) return ""; int zoomLevel = v->getZoomLevel(); size_t modelZoomLevel = m_model->getSummaryBlockSize(zoomLevel); size_t f0, f1; if (!getSourceFramesForX(v, x, modelZoomLevel, f0, f1)) return ""; QString text; RealTime rt0 = RealTime::frame2RealTime(f0, m_model->getSampleRate()); RealTime rt1 = RealTime::frame2RealTime(f1, m_model->getSampleRate()); if (f1 != f0 + 1 && (rt0.sec != rt1.sec || rt0.msec() != rt1.msec())) { text += tr("Time:\t%1 - %2") .arg(rt0.toText(true).c_str()) .arg(rt1.toText(true).c_str()); } else { text += tr("Time:\t%1") .arg(rt0.toText(true).c_str()); } size_t channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (channels == 0) return ""; for (size_t ch = minChannel; ch <= maxChannel; ++ch) { size_t blockSize = v->getZoomLevel(); RangeSummarisableTimeValueModel::RangeBlock ranges; m_model->getSummaries(ch, f0, f1 - f0, ranges, blockSize); if (ranges.empty()) continue; RangeSummarisableTimeValueModel::Range range = ranges[0]; QString label = tr("Level:"); if (minChannel != maxChannel) { if (ch == 0) label = tr("Left:"); else if (ch == 1) label = tr("Right:"); else label = tr("Channel %1").arg(ch + 1); } bool singleValue = false; float min, max; if (fabs(range.min()) < 0.01) { min = range.min(); max = range.max(); singleValue = (min == max); } else { int imin = lrint(range.min() * 10000); int imax = lrint(range.max() * 10000); singleValue = (imin == imax); min = float(imin)/10000; max = float(imax)/10000; } int db = int(AudioLevel::multiplier_to_dB(std::max(fabsf(range.min()), fabsf(range.max()))) * 100); if (!singleValue) { text += tr("\n%1\t%2 - %3 (%4 dB peak)") .arg(label).arg(min).arg(max).arg(float(db)/100); } else { text += tr("\n%1\t%2 (%3 dB peak)") .arg(label).arg(min).arg(float(db)/100); } } return text; } int WaveformLayer::getYForValue(const View *v, float value, size_t channel) const { size_t channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (maxChannel < minChannel || channel < minChannel) return 0; int h = v->height(); int m = (h / channels) / 2; if ((m_scale == dBScale || m_scale == MeterScale) && m_channelMode != MergeChannels) { m = (h / channels); } int my = m + (((channel - minChannel) * h) / channels); int vy = 0; switch (m_scale) { case LinearScale: vy = int(m * value); break; case MeterScale: vy = AudioLevel::multiplier_to_preview(value, m); break; case dBScale: vy = dBscale(value, m); break; } // cerr << "mergingChannels= " << mergingChannels << ", channel = " << channel << ", value = " << value << ", vy = " << vy << endl; return my - vy; } float WaveformLayer::getValueForY(const View *v, int y, size_t &channel) const { size_t channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (maxChannel < minChannel) return 0; int h = v->height(); int m = (h / channels) / 2; if ((m_scale == dBScale || m_scale == MeterScale) && m_channelMode != MergeChannels) { m = (h / channels); } channel = (y * channels) / h + minChannel; int my = m + (((channel - minChannel) * h) / channels); int vy = my - y; float value = 0; float thresh = -50.f; switch (m_scale) { case LinearScale: value = float(vy) / m; break; case MeterScale: value = AudioLevel::preview_to_multiplier(vy, m); break; case dBScale: value = (-thresh * float(vy)) / m + thresh; value = AudioLevel::dB_to_multiplier(value); break; } return value / m_gain; } bool WaveformLayer::getYScaleValue(const View *v, int y, float &value, QString &unit) const { size_t channel; value = getValueForY(v, y, channel); if (m_scale == dBScale || m_scale == MeterScale) { float thresh = -50.f; if (value > 0.f) { value = 10.f * log10f(value); if (value < thresh) value = thresh; } else value = thresh; unit = "dBV"; } else { unit = "V"; } return true; } bool WaveformLayer::getYScaleDifference(const View *v, int y0, int y1, float &diff, QString &unit) const { size_t c0, c1; float v0 = getValueForY(v, y0, c0); float v1 = getValueForY(v, y1, c1); if (c0 != c1) { // different channels, not comparable diff = 0.f; unit = ""; return false; } if (m_scale == dBScale || m_scale == MeterScale) { float thresh = -50.f; if (v1 == v0) diff = thresh; else { if (v1 > v0) diff = v0 / v1; else diff = v1 / v0; diff = 10.f * log10f(diff); if (diff < thresh) diff = thresh; } unit = "dBV"; } else { diff = fabsf(v1 - v0); unit = "V"; } return true; } int WaveformLayer::getVerticalScaleWidth(View *, bool, QPainter &paint) const { if (m_scale == LinearScale) { return paint.fontMetrics().width("0.0") + 13; } else { return std::max(paint.fontMetrics().width(tr("0dB")), paint.fontMetrics().width(tr("-Inf"))) + 13; } } void WaveformLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) { return; } size_t channels = 0, minChannel = 0, maxChannel = 0; bool mergingChannels = false, mixingChannels = false; channels = getChannelArrangement(minChannel, maxChannel, mergingChannels, mixingChannels); if (channels == 0) return; int h = rect.height(), w = rect.width(); int textHeight = paint.fontMetrics().height(); int toff = -textHeight/2 + paint.fontMetrics().ascent() + 1; float gain = m_gain; for (size_t ch = minChannel; ch <= maxChannel; ++ch) { int lastLabelledY = -1; if (ch < m_effectiveGains.size()) gain = m_effectiveGains[ch]; int n = 10; for (int i = 0; i <= n; ++i) { float val = 0.0, nval = 0.0; QString text = ""; switch (m_scale) { case LinearScale: val = (i * gain) / n; text = QString("%1").arg(float(i) / n); if (i == 0) text = "0.0"; else { nval = -val; if (i == n) text = "1.0"; } break; case MeterScale: val = AudioLevel::dB_to_multiplier(meterdbs[i]) * gain; text = QString("%1").arg(meterdbs[i]); if (i == n) text = tr("0dB"); if (i == 0) { text = tr("-Inf"); val = 0.0; } break; case dBScale: val = AudioLevel::dB_to_multiplier(-(10*n) + i * 10) * gain; text = QString("%1").arg(-(10*n) + i * 10); if (i == n) text = tr("0dB"); if (i == 0) { text = tr("-Inf"); val = 0.0; } break; } if (val < -1.0 || val > 1.0) continue; int y = getYForValue(v, val, ch); int ny = y; if (nval != 0.0) { ny = getYForValue(v, nval, ch); } bool spaceForLabel = (i == 0 || abs(y - lastLabelledY) >= textHeight - 1); if (spaceForLabel) { int tx = 3; if (m_scale != LinearScale) { tx = w - 10 - paint.fontMetrics().width(text); } int ty = y; if (ty < paint.fontMetrics().ascent()) { ty = paint.fontMetrics().ascent(); } else if (ty > h - paint.fontMetrics().descent()) { ty = h - paint.fontMetrics().descent(); } else { ty += toff; } paint.drawText(tx, ty, text); lastLabelledY = ty - toff; if (ny != y) { ty = ny; if (ty < paint.fontMetrics().ascent()) { ty = paint.fontMetrics().ascent(); } else if (ty > h - paint.fontMetrics().descent()) { ty = h - paint.fontMetrics().descent(); } else { ty += toff; } paint.drawText(tx, ty, text); } paint.drawLine(w - 7, y, w, y); if (ny != y) paint.drawLine(w - 7, ny, w, ny); } else { paint.drawLine(w - 4, y, w, y); if (ny != y) paint.drawLine(w - 4, ny, w, ny); } } } } void WaveformLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s; QString colourName, colourSpec, darkbg; ColourDatabase::getInstance()->getStringValues (m_colour, colourName, colourSpec, darkbg); s += QString("gain=\"%1\" " "showMeans=\"%2\" " "greyscale=\"%3\" " "channelMode=\"%4\" " "channel=\"%5\" " "scale=\"%6\" " "aggressive=\"%7\" " "autoNormalize=\"%8\"") .arg(m_gain) .arg(m_showMeans) .arg(m_greyscale) .arg(m_channelMode) .arg(m_channel) .arg(m_scale) .arg(m_aggressive) .arg(m_autoNormalize); SingleColourLayer::toXml(stream, indent, extraAttributes + " " + s); } void WaveformLayer::setProperties(const QXmlAttributes &attributes) { bool ok = false; SingleColourLayer::setProperties(attributes); float gain = attributes.value("gain").toFloat(&ok); if (ok) setGain(gain); bool showMeans = (attributes.value("showMeans") == "1" || attributes.value("showMeans") == "true"); setShowMeans(showMeans); bool greyscale = (attributes.value("greyscale") == "1" || attributes.value("greyscale") == "true"); setUseGreyscale(greyscale); ChannelMode channelMode = (ChannelMode) attributes.value("channelMode").toInt(&ok); if (ok) setChannelMode(channelMode); int channel = attributes.value("channel").toInt(&ok); if (ok) setChannel(channel); Scale scale = (Scale) attributes.value("scale").toInt(&ok); if (ok) setScale(scale); bool aggressive = (attributes.value("aggressive") == "1" || attributes.value("aggressive") == "true"); setUseGreyscale(aggressive); bool autoNormalize = (attributes.value("autoNormalize") == "1" || attributes.value("autoNormalize") == "true"); setAutoNormalize(autoNormalize); } int WaveformLayer::getVerticalZoomSteps(int &defaultStep) const { defaultStep = 50; return 100; } int WaveformLayer::getCurrentVerticalZoomStep() const { int val = lrint(log10(m_gain) * 20.0) + 50; if (val < 0) val = 0; if (val > 100) val = 100; return val; } void WaveformLayer::setVerticalZoomStep(int step) { setGain(pow(10, float(step - 50) / 20.0)); } sonic-visualiser-2.3~repack1.orig/svgui/layer/NoteLayer.cpp0000644000175000017500000010350512252354725022615 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "NoteLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "base/Pitch.h" #include "base/LogRange.h" #include "base/RangeMapper.h" #include "ColourDatabase.h" #include "view/View.h" #include "PianoScale.h" #include "LinearNumericalScale.h" #include "LogNumericalScale.h" #include "data/model/NoteModel.h" #include "widgets/ItemEditDialog.h" #include "widgets/TextAbbrev.h" #include #include #include #include #include #include #include #include //#define DEBUG_NOTE_LAYER 1 NoteLayer::NoteLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_originalPoint(0, 0.0, 0, 1.f, tr("New Point")), m_editingPoint(0, 0.0, 0, 1.f, tr("New Point")), m_editingCommand(0), m_verticalScale(AutoAlignScale), m_scaleMinimum(0), m_scaleMaximum(0) { } void NoteLayer::setModel(NoteModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); // SVDEBUG << "NoteLayer::setModel(" << model << ")" << endl; m_scaleMinimum = 0; m_scaleMaximum = 0; emit modelReplaced(); } Layer::PropertyList NoteLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Vertical Scale"); list.push_back("Scale Units"); return list; } QString NoteLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Vertical Scale") return tr("Vertical Scale"); if (name == "Scale Units") return tr("Scale Units"); return SingleColourLayer::getPropertyLabel(name); } Layer::PropertyType NoteLayer::getPropertyType(const PropertyName &name) const { if (name == "Scale Units") return UnitsProperty; if (name == "Vertical Scale") return ValueProperty; return SingleColourLayer::getPropertyType(name); } QString NoteLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Vertical Scale" || name == "Scale Units") { return tr("Scale"); } return SingleColourLayer::getPropertyGroupName(name); } QString NoteLayer::getScaleUnits() const { if (m_model) return m_model->getScaleUnits(); else return ""; } int NoteLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; if (name == "Vertical Scale") { if (min) *min = 0; if (max) *max = 3; if (deflt) *deflt = int(AutoAlignScale); val = int(m_verticalScale); } else if (name == "Scale Units") { if (deflt) *deflt = 0; if (m_model) { val = UnitDatabase::getInstance()->getUnitId (getScaleUnits()); } } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString NoteLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Vertical Scale") { switch (value) { default: case 0: return tr("Auto-Align"); case 1: return tr("Linear"); case 2: return tr("Log"); case 3: return tr("MIDI Notes"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } void NoteLayer::setProperty(const PropertyName &name, int value) { if (name == "Vertical Scale") { setVerticalScale(VerticalScale(value)); } else if (name == "Scale Units") { if (m_model) { m_model->setScaleUnits (UnitDatabase::getInstance()->getUnitById(value)); emit modelChanged(); } } else { return SingleColourLayer::setProperty(name, value); } } void NoteLayer::setVerticalScale(VerticalScale scale) { if (m_verticalScale == scale) return; m_verticalScale = scale; emit layerParametersChanged(); } bool NoteLayer::isLayerScrollable(const View *v) const { QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } bool NoteLayer::shouldConvertMIDIToHz() const { QString unit = getScaleUnits(); return (unit != "Hz"); // if (unit == "" || // unit.startsWith("MIDI") || // unit.startsWith("midi")) return true; // return false; } bool NoteLayer::getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); if (shouldConvertMIDIToHz()) { unit = "Hz"; min = Pitch::getFrequencyForPitch(lrintf(min)); max = Pitch::getFrequencyForPitch(lrintf(max + 1)); } else unit = getScaleUnits(); if (m_verticalScale == MIDIRangeScale || m_verticalScale == LogScale) logarithmic = true; return true; } bool NoteLayer::getDisplayExtents(float &min, float &max) const { if (!m_model || shouldAutoAlign()) return false; if (m_verticalScale == MIDIRangeScale) { min = Pitch::getFrequencyForPitch(0); max = Pitch::getFrequencyForPitch(127); return true; } if (m_scaleMinimum == m_scaleMaximum) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); } else { min = m_scaleMinimum; max = m_scaleMaximum; } if (shouldConvertMIDIToHz()) { min = Pitch::getFrequencyForPitch(lrintf(min)); max = Pitch::getFrequencyForPitch(lrintf(max + 1)); } #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer::getDisplayExtents: min = " << min << ", max = " << max << " (m_scaleMinimum = " << m_scaleMinimum << ", m_scaleMaximum = " << m_scaleMaximum << ")" << endl; #endif return true; } bool NoteLayer::setDisplayExtents(float min, float max) { if (!m_model) return false; if (min == max) { if (min == 0.f) { max = 1.f; } else { max = min * 1.0001; } } m_scaleMinimum = min; m_scaleMaximum = max; #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer::setDisplayExtents: min = " << min << ", max = " << max << endl; #endif emit layerParametersChanged(); return true; } int NoteLayer::getVerticalZoomSteps(int &defaultStep) const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; defaultStep = 0; return 100; } int NoteLayer::getCurrentVerticalZoomStep() const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return 0; float dmin, dmax; getDisplayExtents(dmin, dmax); int nr = mapper->getPositionForValue(dmax - dmin); delete mapper; return 100 - nr; } //!!! lots of duplication with TimeValueLayer void NoteLayer::setVerticalZoomStep(int step) { if (shouldAutoAlign()) return; if (!m_model) return; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return; float min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); float dmin, dmax; getDisplayExtents(dmin, dmax); float newdist = mapper->getValueForPosition(100 - step); float newmin, newmax; if (logarithmic) { // see SpectrogramLayer::setVerticalZoomStep newmax = (newdist + sqrtf(newdist*newdist + 4*dmin*dmax)) / 2; newmin = newmax - newdist; // cerr << "newmin = " << newmin << ", newmax = " << newmax << endl; } else { float dmid = (dmax + dmin) / 2; newmin = dmid - newdist / 2; newmax = dmid + newdist / 2; } if (newmin < min) { newmax += (min - newmin); newmin = min; } if (newmax > max) { newmax = max; } #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer::setVerticalZoomStep: " << step << ": " << newmin << " -> " << newmax << " (range " << newdist << ")" << endl; #endif setDisplayExtents(newmin, newmax); } RangeMapper * NoteLayer::getNewVerticalZoomRangeMapper() const { if (!m_model) return 0; RangeMapper *mapper; float min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); if (min == max) return 0; if (logarithmic) { mapper = new LogRangeMapper(0, 100, min, max, unit); } else { mapper = new LinearRangeMapper(0, 100, min, max, unit); } return mapper; } NoteModel::PointList NoteLayer::getLocalPoints(View *v, int x) const { if (!m_model) return NoteModel::PointList(); long frame = v->getFrameForX(x); NoteModel::PointList onPoints = m_model->getPoints(frame); if (!onPoints.empty()) { return onPoints; } NoteModel::PointList prevPoints = m_model->getPreviousPoints(frame); NoteModel::PointList nextPoints = m_model->getNextPoints(frame); NoteModel::PointList usePoints = prevPoints; if (prevPoints.empty()) { usePoints = nextPoints; } else if (long(prevPoints.begin()->frame) < v->getStartFrame() && !(nextPoints.begin()->frame > v->getEndFrame())) { usePoints = nextPoints; } else if (long(nextPoints.begin()->frame) - frame < frame - long(prevPoints.begin()->frame)) { usePoints = nextPoints; } if (!usePoints.empty()) { int fuzz = 2; int px = v->getXForFrame(usePoints.begin()->frame); if ((px > x && px - x > fuzz) || (px < x && x - px > fuzz + 1)) { usePoints.clear(); } } return usePoints; } bool NoteLayer::getPointToDrag(View *v, int x, int y, NoteModel::Point &p) const { if (!m_model) return false; long frame = v->getFrameForX(x); NoteModel::PointList onPoints = m_model->getPoints(frame); if (onPoints.empty()) return false; // cerr << "frame " << frame << ": " << onPoints.size() << " candidate points" << endl; int nearestDistance = -1; for (NoteModel::PointList::const_iterator i = onPoints.begin(); i != onPoints.end(); ++i) { int distance = getYForValue(v, (*i).value) - y; if (distance < 0) distance = -distance; if (nearestDistance == -1 || distance < nearestDistance) { nearestDistance = distance; p = *i; } } return true; } QString NoteLayer::getFeatureDescription(View *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; NoteModel::PointList points = getLocalPoints(v, x); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return tr("No local points"); } } Note note(0); NoteModel::PointList::iterator i; for (i = points.begin(); i != points.end(); ++i) { int y = getYForValue(v, i->value); int h = 3; if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, i->value + m_model->getValueQuantization()); if (h < 3) h = 3; } if (pos.y() >= y - h && pos.y() <= y) { note = *i; break; } } if (i == points.end()) return tr("No local points"); RealTime rt = RealTime::frame2RealTime(note.frame, m_model->getSampleRate()); RealTime rd = RealTime::frame2RealTime(note.duration, m_model->getSampleRate()); QString pitchText; if (shouldConvertMIDIToHz()) { int mnote = lrintf(note.value); int cents = lrintf((note.value - mnote) * 100); float freq = Pitch::getFrequencyForPitch(mnote, cents); pitchText = tr("%1 (%2, %3 Hz)") .arg(Pitch::getPitchLabel(mnote, cents)) .arg(mnote) .arg(freq); } else if (getScaleUnits() == "Hz") { pitchText = tr("%1 Hz (%2, %3)") .arg(note.value) .arg(Pitch::getPitchLabelForFrequency(note.value)) .arg(Pitch::getPitchForFrequency(note.value)); } else { pitchText = tr("%1 %2") .arg(note.value).arg(getScaleUnits()); } QString text; if (note.label == "") { text = QString(tr("Time:\t%1\nPitch:\t%2\nDuration:\t%3\nNo label")) .arg(rt.toText(true).c_str()) .arg(pitchText) .arg(rd.toText(true).c_str()); } else { text = QString(tr("Time:\t%1\nPitch:\t%2\nDuration:\t%3\nLabel:\t%4")) .arg(rt.toText(true).c_str()) .arg(pitchText) .arg(rd.toText(true).c_str()) .arg(note.label); } pos = QPoint(v->getXForFrame(note.frame), getYForValue(v, note.value)); return text; } bool NoteLayer::snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); NoteModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame)); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); int snapped = frame; bool found = false; for (NoteModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame > frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest NoteModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } void NoteLayer::getScaleExtents(View *v, float &min, float &max, bool &log) const { min = 0.0; max = 0.0; log = false; QString queryUnits; if (shouldConvertMIDIToHz()) queryUnits = "Hz"; else queryUnits = getScaleUnits(); if (shouldAutoAlign()) { if (!v->getValueExtents(queryUnits, min, max, log)) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); if (shouldConvertMIDIToHz()) { min = Pitch::getFrequencyForPitch(lrintf(min)); max = Pitch::getFrequencyForPitch(lrintf(max + 1)); } #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; #endif } else if (log) { LogRange::mapRange(min, max); #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; #endif } } else { getDisplayExtents(min, max); if (m_verticalScale == MIDIRangeScale) { min = Pitch::getFrequencyForPitch(0); max = Pitch::getFrequencyForPitch(127); } else if (shouldConvertMIDIToHz()) { min = Pitch::getFrequencyForPitch(lrintf(min)); max = Pitch::getFrequencyForPitch(lrintf(max + 1)); } if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) { LogRange::mapRange(min, max); log = true; } } if (max == min) max = min + 1.0; } int NoteLayer::getYForValue(View *v, float val) const { float min = 0.0, max = 0.0; bool logarithmic = false; int h = v->height(); getScaleExtents(v, min, max, logarithmic); #ifdef DEBUG_NOTE_LAYER cerr << "NoteLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << endl; #endif if (shouldConvertMIDIToHz()) { val = Pitch::getFrequencyForPitch(lrintf(val), lrintf((val - lrintf(val)) * 100)); #ifdef DEBUG_NOTE_LAYER cerr << "shouldConvertMIDIToHz true, val now = " << val << endl; #endif } if (logarithmic) { val = LogRange::map(val); #ifdef DEBUG_NOTE_LAYER cerr << "logarithmic true, val now = " << val << endl; #endif } int y = int(h - ((val - min) * h) / (max - min)) - 1; #ifdef DEBUG_NOTE_LAYER cerr << "y = " << y << endl; #endif return y; } float NoteLayer::getValueForY(View *v, int y) const { float min = 0.0, max = 0.0; bool logarithmic = false; int h = v->height(); getScaleExtents(v, min, max, logarithmic); float val = min + (float(h - y) * float(max - min)) / h; if (logarithmic) { val = powf(10.f, val); } if (shouldConvertMIDIToHz()) { val = Pitch::getPitchForFrequency(val); } return val; } bool NoteLayer::shouldAutoAlign() const { if (!m_model) return false; return (m_verticalScale == AutoAlignScale); } void NoteLayer::paint(View *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; int sampleRate = m_model->getSampleRate(); if (!sampleRate) return; // Profiler profiler("NoteLayer::paint", true); int x0 = rect.left(), x1 = rect.right(); long frame0 = v->getFrameForX(x0); long frame1 = v->getFrameForX(x1); NoteModel::PointList points(m_model->getPoints(frame0, frame1)); if (points.empty()) return; paint.setPen(getBaseQColor()); QColor brushColour(getBaseQColor()); brushColour.setAlpha(80); // SVDEBUG << "NoteLayer::paint: resolution is " // << m_model->getResolution() << " frames" << endl; float min = m_model->getValueMinimum(); float max = m_model->getValueMaximum(); if (max == min) max = min + 1.0; QPoint localPos; NoteModel::Point illuminatePoint(0); bool shouldIlluminate = false; if (v->shouldIlluminateLocalFeatures(this, localPos)) { shouldIlluminate = getPointToDrag(v, localPos.x(), localPos.y(), illuminatePoint); } paint.save(); paint.setRenderHint(QPainter::Antialiasing, false); for (NoteModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const NoteModel::Point &p(*i); int x = v->getXForFrame(p.frame); int y = getYForValue(v, p.value); int w = v->getXForFrame(p.frame + p.duration) - x; int h = 3; if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, p.value + m_model->getValueQuantization()); if (h < 3) h = 3; } if (w < 1) w = 1; paint.setPen(getBaseQColor()); paint.setBrush(brushColour); if (shouldIlluminate && // "illuminatePoint == p" !NoteModel::Point::Comparator()(illuminatePoint, p) && !NoteModel::Point::Comparator()(p, illuminatePoint)) { paint.setPen(v->getForeground()); paint.setBrush(v->getForeground()); QString vlabel = QString("%1%2").arg(p.value).arg(getScaleUnits()); v->drawVisibleText(paint, x - paint.fontMetrics().width(vlabel) - 2, y + paint.fontMetrics().height()/2 - paint.fontMetrics().descent(), vlabel, View::OutlinedText); QString hlabel = RealTime::frame2RealTime (p.frame, m_model->getSampleRate()).toText(true).c_str(); v->drawVisibleText(paint, x, y - h/2 - paint.fontMetrics().descent() - 2, hlabel, View::OutlinedText); } paint.drawRect(x, y - h/2, w, h); } paint.restore(); } int NoteLayer::getVerticalScaleWidth(View *v, bool, QPainter &paint) const { if (!m_model || shouldAutoAlign()) { return 0; } else { if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) { return LogNumericalScale().getWidth(v, paint) + 10; // for piano } else { return LinearNumericalScale().getWidth(v, paint); } } } void NoteLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const { if (!m_model) return; QString unit; float min, max; bool logarithmic; int w = getVerticalScaleWidth(v, false, paint); int h = v->height(); getScaleExtents(v, min, max, logarithmic); if (logarithmic) { LogNumericalScale().paintVertical(v, this, paint, 0, min, max); } else { LinearNumericalScale().paintVertical(v, this, paint, 0, min, max); } if (logarithmic && (getScaleUnits() == "Hz")) { PianoScale().paintPianoVertical (v, paint, QRect(w - 10, 0, 10, h), LogRange::unmap(min), LogRange::unmap(max)); paint.drawLine(w, 0, w, h); } if (getScaleUnits() != "") { int mw = w - 5; paint.drawText(5, 5 + paint.fontMetrics().ascent(), TextAbbrev::abbreviate(getScaleUnits(), paint.fontMetrics(), mw)); } } void NoteLayer::drawStart(View *v, QMouseEvent *e) { // SVDEBUG << "NoteLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); float value = getValueForY(v, e->y()); m_editingPoint = NoteModel::Point(frame, value, 0, 0.8, tr("New Point")); m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new NoteModel::EditCommand(m_model, tr("Draw Point")); m_editingCommand->addPoint(m_editingPoint); m_editing = true; } void NoteLayer::drawDrag(View *v, QMouseEvent *e) { // SVDEBUG << "NoteLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); float newValue = getValueForY(v, e->y()); long newFrame = m_editingPoint.frame; long newDuration = frame - newFrame; if (newDuration < 0) { newFrame = frame; newDuration = -newDuration; } else if (newDuration == 0) { newDuration = 1; } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = newFrame; m_editingPoint.value = newValue; m_editingPoint.duration = newDuration; m_editingCommand->addPoint(m_editingPoint); } void NoteLayer::drawEnd(View *, QMouseEvent *) { // SVDEBUG << "NoteLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void NoteLayer::eraseStart(View *v, QMouseEvent *e) { if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void NoteLayer::eraseDrag(View *v, QMouseEvent *e) { } void NoteLayer::eraseEnd(View *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; NoteModel::Point p(0); if (!getPointToDrag(v, e->x(), e->y(), p)) return; if (p.frame != m_editingPoint.frame || p.value != m_editingPoint.value) return; m_editingCommand = new NoteModel::EditCommand(m_model, tr("Erase Point")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void NoteLayer::editStart(View *v, QMouseEvent *e) { // SVDEBUG << "NoteLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; m_originalPoint = m_editingPoint; m_dragPointX = v->getXForFrame(m_editingPoint.frame); m_dragPointY = getYForValue(v, m_editingPoint.value); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; m_dragStartX = e->x(); m_dragStartY = e->y(); } void NoteLayer::editDrag(View *v, QMouseEvent *e) { // SVDEBUG << "NoteLayer::editDrag(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; int xdist = e->x() - m_dragStartX; int ydist = e->y() - m_dragStartY; int newx = m_dragPointX + xdist; int newy = m_dragPointY + ydist; long frame = v->getFrameForX(newx); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); float value = getValueForY(v, newy); if (!m_editingCommand) { m_editingCommand = new NoteModel::EditCommand(m_model, tr("Drag Point")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.value = value; m_editingCommand->addPoint(m_editingPoint); } void NoteLayer::editEnd(View *, QMouseEvent *) { // SVDEBUG << "NoteLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = m_editingCommand->getName(); if (m_editingPoint.frame != m_originalPoint.frame) { if (m_editingPoint.value != m_originalPoint.value) { newName = tr("Edit Point"); } else { newName = tr("Relocate Point"); } } else { newName = tr("Change Point Value"); } m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool NoteLayer::editOpen(View *v, QMouseEvent *e) { if (!m_model) return false; NoteModel::Point note(0); if (!getPointToDrag(v, e->x(), e->y(), note)) return false; // NoteModel::Point note = *points.begin(); ItemEditDialog *dialog = new ItemEditDialog (m_model->getSampleRate(), ItemEditDialog::ShowTime | ItemEditDialog::ShowDuration | ItemEditDialog::ShowValue | ItemEditDialog::ShowText, getScaleUnits()); dialog->setFrameTime(note.frame); dialog->setValue(note.value); dialog->setFrameDuration(note.duration); dialog->setText(note.label); if (dialog->exec() == QDialog::Accepted) { NoteModel::Point newNote = note; newNote.frame = dialog->getFrameTime(); newNote.value = dialog->getValue(); newNote.duration = dialog->getFrameDuration(); newNote.label = dialog->getText(); NoteModel::EditCommand *command = new NoteModel::EditCommand (m_model, tr("Edit Point")); command->deletePoint(note); command->addPoint(newNote); finish(command); } delete dialog; return true; } void NoteLayer::moveSelection(Selection s, size_t newStartFrame) { if (!m_model) return; NoteModel::EditCommand *command = new NoteModel::EditCommand(m_model, tr("Drag Selection")); NoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (NoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { NoteModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void NoteLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; NoteModel::EditCommand *command = new NoteModel::EditCommand(m_model, tr("Resize Selection")); NoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (NoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double targetStart = i->frame; targetStart = newSize.getStartFrame() + double(targetStart - s.getStartFrame()) * ratio; double targetEnd = i->frame + i->duration; targetEnd = newSize.getStartFrame() + double(targetEnd - s.getStartFrame()) * ratio; NoteModel::Point newPoint(*i); newPoint.frame = lrint(targetStart); newPoint.duration = lrint(targetEnd - targetStart); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void NoteLayer::deleteSelection(Selection s) { if (!m_model) return; NoteModel::EditCommand *command = new NoteModel::EditCommand(m_model, tr("Delete Selected Points")); NoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (NoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { command->deletePoint(*i); } } finish(command); } void NoteLayer::copy(View *v, Selection s, Clipboard &to) { if (!m_model) return; NoteModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (NoteModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->value, i->duration, i->level, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool NoteLayer::paste(View *v, const Clipboard &from, int frameOffset, bool /* interactive */) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v, tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } NoteModel::EditCommand *command = new NoteModel::EditCommand(m_model, tr("Paste")); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; size_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } NoteModel::Point newPoint(frame); if (i->haveLabel()) newPoint.label = i->getLabel(); if (i->haveValue()) newPoint.value = i->getValue(); else newPoint.value = (m_model->getValueMinimum() + m_model->getValueMaximum()) / 2; if (i->haveLevel()) newPoint.level = i->getLevel(); if (i->haveDuration()) newPoint.duration = i->getDuration(); else { size_t nextFrame = frame; Clipboard::PointList::const_iterator j = i; for (; j != points.end(); ++j) { if (!j->haveFrame()) continue; if (j != i) break; } if (j != points.end()) { nextFrame = j->getFrame(); } if (nextFrame == frame) { newPoint.duration = m_model->getResolution(); } else { newPoint.duration = nextFrame - frame; } } command->addPoint(newPoint); } finish(command); return true; } void NoteLayer::addNoteOn(long frame, int pitch, int velocity) { m_pendingNoteOns.insert(Note(frame, pitch, 0, float(velocity) / 127.0, "")); } void NoteLayer::addNoteOff(long frame, int pitch) { for (NoteSet::iterator i = m_pendingNoteOns.begin(); i != m_pendingNoteOns.end(); ++i) { if (lrintf((*i).value) == pitch) { Note note(*i); m_pendingNoteOns.erase(i); note.duration = frame - note.frame; if (m_model) { NoteModel::AddPointCommand *c = new NoteModel::AddPointCommand (m_model, note, tr("Record Note")); // execute and bundle: CommandHistory::getInstance()->addCommand(c, true, true); } break; } } } void NoteLayer::abandonNoteOns() { m_pendingNoteOns.clear(); } int NoteLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "White" : "Black")); } void NoteLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes + QString(" verticalScale=\"%1\" scaleMinimum=\"%2\" scaleMaximum=\"%3\" ") .arg(m_verticalScale) .arg(m_scaleMinimum) .arg(m_scaleMaximum)); } void NoteLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); bool ok, alsoOk; VerticalScale scale = (VerticalScale) attributes.value("verticalScale").toInt(&ok); if (ok) setVerticalScale(scale); float min = attributes.value("scaleMinimum").toFloat(&ok); float max = attributes.value("scaleMaximum").toFloat(&alsoOk); if (ok && alsoOk && min != max) setDisplayExtents(min, max); } sonic-visualiser-2.3~repack1.orig/svgui/layer/ImageLayer.h0000644000175000017500000001076312252354725022402 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _IMAGE_LAYER_H_ #define _IMAGE_LAYER_H_ #include "Layer.h" #include "data/model/ImageModel.h" #include #include #include #include #include class View; class QPainter; class FileSource; class ImageLayer : public Layer { Q_OBJECT public: ImageLayer(); virtual ~ImageLayer(); virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual bool snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual void drawStart(View *v, QMouseEvent *); virtual void drawDrag(View *v, QMouseEvent *); virtual void drawEnd(View *v, QMouseEvent *); virtual void editStart(View *v, QMouseEvent *); virtual void editDrag(View *v, QMouseEvent *); virtual void editEnd(View *v, QMouseEvent *); virtual void moveSelection(Selection s, size_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(View *v, Selection s, Clipboard &to); virtual bool paste(View *v, const Clipboard &from, int frameOffset, bool interactive); virtual bool editOpen(View *, QMouseEvent *); // on double-click virtual const Model *getModel() const { return m_model; } void setModel(ImageModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); virtual ColourSignificance getLayerColourSignificance() const { return ColourAbsent; } virtual bool isLayerScrollable(const View *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(View *) const { return m_model->getCompletion(); } virtual bool getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; virtual int getVerticalScaleWidth(View *, bool, QPainter &) const { return 0; } virtual void setLayerDormant(const View *v, bool dormant); void setProperties(const QXmlAttributes &attributes); virtual bool addImage(long frame, QString url); // using a command protected slots: void checkAddSources(); void fileSourceReady(); protected: ImageModel::PointList getLocalPoints(View *v, int x, int y) const; bool getImageOriginalSize(QString name, QSize &size) const; QImage getImage(View *v, QString name, QSize maxSize) const; void drawImage(View *v, QPainter &paint, const ImageModel::Point &p, int x, int nx) const; //!!! how to reap no-longer-used images? typedef std::map ImageMap; typedef std::map ViewImageMap; typedef std::map FileSourceMap; static ImageMap m_images; static QMutex m_imageMapMutex; mutable ViewImageMap m_scaled; mutable FileSourceMap m_fileSources; QString getLocalFilename(QString img) const; void checkAddSource(QString img) const; ImageModel *m_model; bool m_editing; QPoint m_editOrigin; ImageModel::Point m_originalPoint; ImageModel::Point m_editingPoint; ImageModel::EditCommand *m_editingCommand; void finish(ImageModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/TimeInstantLayer.h0000644000175000017500000001045712252354725023617 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TIME_INSTANT_LAYER_H_ #define _TIME_INSTANT_LAYER_H_ #include "SingleColourLayer.h" #include "data/model/SparseOneDimensionalModel.h" #include #include class View; class QPainter; class TimeInstantLayer : public SingleColourLayer { Q_OBJECT public: TimeInstantLayer(); virtual ~TimeInstantLayer(); virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual QString getLabelPreceding(size_t) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual bool snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual void drawStart(View *v, QMouseEvent *); virtual void drawDrag(View *v, QMouseEvent *); virtual void drawEnd(View *v, QMouseEvent *); virtual void eraseStart(View *v, QMouseEvent *); virtual void eraseDrag(View *v, QMouseEvent *); virtual void eraseEnd(View *v, QMouseEvent *); virtual void editStart(View *v, QMouseEvent *); virtual void editDrag(View *v, QMouseEvent *); virtual void editEnd(View *v, QMouseEvent *); virtual bool editOpen(View *, QMouseEvent *); virtual void moveSelection(Selection s, size_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(View *v, Selection s, Clipboard &to); virtual bool paste(View *v, const Clipboard &from, int frameOffset, bool interactive); virtual const Model *getModel() const { return m_model; } void setModel(SparseOneDimensionalModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); enum PlotStyle { PlotInstants, PlotSegmentation }; void setPlotStyle(PlotStyle style); PlotStyle getPlotStyle() const { return m_plotStyle; } virtual bool isLayerScrollable(const View *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(View *) const { return m_model->getCompletion(); } virtual bool needsTextLabelHeight() const { return m_model->hasTextLabels(); } virtual bool getValueExtents(float &, float &, bool &, QString &) const { return false; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); virtual ColourSignificance getLayerColourSignificance() const { if (m_plotStyle == PlotSegmentation) { return ColourHasMeaningfulValue; } else { return ColourDistinguishes; } } virtual int getVerticalScaleWidth(View *, bool, QPainter &) const { return 0; } protected: SparseOneDimensionalModel::PointList getLocalPoints(View *v, int) const; virtual int getDefaultColourHint(bool dark, bool &impose); bool clipboardAlignmentDiffers(View *v, const Clipboard &) const; SparseOneDimensionalModel *m_model; bool m_editing; SparseOneDimensionalModel::Point m_editingPoint; SparseOneDimensionalModel::EditCommand *m_editingCommand; PlotStyle m_plotStyle; void finish(SparseOneDimensionalModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/TextLayer.h0000644000175000017500000000745412252354725022307 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TEXT_LAYER_H_ #define _TEXT_LAYER_H_ #include "SingleColourLayer.h" #include "data/model/TextModel.h" #include #include class View; class QPainter; class TextLayer : public SingleColourLayer { Q_OBJECT public: TextLayer(); virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual bool snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual void drawStart(View *v, QMouseEvent *); virtual void drawDrag(View *v, QMouseEvent *); virtual void drawEnd(View *v, QMouseEvent *); virtual void eraseStart(View *v, QMouseEvent *); virtual void eraseDrag(View *v, QMouseEvent *); virtual void eraseEnd(View *v, QMouseEvent *); virtual void editStart(View *v, QMouseEvent *); virtual void editDrag(View *v, QMouseEvent *); virtual void editEnd(View *v, QMouseEvent *); virtual void moveSelection(Selection s, size_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(View *v, Selection s, Clipboard &to); virtual bool paste(View *v, const Clipboard &from, int frameOffset, bool interactive); virtual bool editOpen(View *, QMouseEvent *); // on double-click virtual const Model *getModel() const { return m_model; } void setModel(TextModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); virtual bool isLayerScrollable(const View *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(View *) const { return m_model->getCompletion(); } virtual bool getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const; virtual int getVerticalScaleWidth(View *, bool, QPainter &) const { return 0; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); protected: int getYForHeight(View *v, float height) const; float getHeightForY(View *v, int y) const; virtual int getDefaultColourHint(bool dark, bool &impose); TextModel::PointList getLocalPoints(View *v, int x, int y) const; bool getPointToDrag(View *v, int x, int y, TextModel::Point &) const; TextModel *m_model; bool m_editing; QPoint m_editOrigin; TextModel::Point m_originalPoint; TextModel::Point m_editingPoint; TextModel::EditCommand *m_editingCommand; void finish(TextModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/RegionLayer.h0000644000175000017500000001320412252354725022574 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2008 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _REGION_LAYER_H_ #define _REGION_LAYER_H_ #include "SingleColourLayer.h" #include "VerticalScaleLayer.h" #include "ColourScaleLayer.h" #include "data/model/RegionModel.h" #include #include #include class View; class QPainter; class RegionLayer : public SingleColourLayer, public VerticalScaleLayer, public ColourScaleLayer { Q_OBJECT public: RegionLayer(); virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual int getVerticalScaleWidth(View *v, bool, QPainter &) const; virtual void paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual QString getLabelPreceding(size_t) const; virtual bool snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual bool snapToSimilarFeature(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual void drawStart(View *v, QMouseEvent *); virtual void drawDrag(View *v, QMouseEvent *); virtual void drawEnd(View *v, QMouseEvent *); virtual void eraseStart(View *v, QMouseEvent *); virtual void eraseDrag(View *v, QMouseEvent *); virtual void eraseEnd(View *v, QMouseEvent *); virtual void editStart(View *v, QMouseEvent *); virtual void editDrag(View *v, QMouseEvent *); virtual void editEnd(View *v, QMouseEvent *); virtual bool editOpen(View *v, QMouseEvent *); virtual void moveSelection(Selection s, size_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(View *v, Selection s, Clipboard &to); virtual bool paste(View *v, const Clipboard &from, int frameOffset, bool interactive); virtual const Model *getModel() const { return m_model; } void setModel(RegionModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); void setFillColourMap(int); int getFillColourMap() const { return m_colourMap; } enum VerticalScale { AutoAlignScale, EqualSpaced, LinearScale, LogScale, }; void setVerticalScale(VerticalScale scale); VerticalScale getVerticalScale() const { return m_verticalScale; } enum PlotStyle { PlotLines, PlotSegmentation }; void setPlotStyle(PlotStyle style); PlotStyle getPlotStyle() const { return m_plotStyle; } virtual bool isLayerScrollable(const View *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(View *) const { return m_model->getCompletion(); } virtual bool getValueExtents(float &min, float &max, bool &log, QString &unit) const; virtual bool getDisplayExtents(float &min, float &max) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); /// VerticalScaleLayer and ColourScaleLayer methods int getYForValue(View *v, float value) const; float getValueForY(View *v, int y) const; virtual QString getScaleUnits() const; QColor getColourForValue(View *v, float value) const; protected slots: void recalcSpacing(); protected: float getValueForY(View *v, int y, int avoid) const; void getScaleExtents(View *, float &min, float &max, bool &log) const; virtual int getDefaultColourHint(bool dark, bool &impose); RegionModel::PointList getLocalPoints(View *v, int x) const; bool getPointToDrag(View *v, int x, int y, RegionModel::Point &) const; RegionModel *m_model; bool m_editing; int m_dragPointX; int m_dragPointY; int m_dragStartX; int m_dragStartY; RegionModel::Point m_originalPoint; RegionModel::Point m_editingPoint; RegionModel::EditCommand *m_editingCommand; VerticalScale m_verticalScale; int m_colourMap; PlotStyle m_plotStyle; typedef std::map SpacingMap; // region value -> ordering SpacingMap m_spacingMap; // region value -> number of regions with this value SpacingMap m_distributionMap; int spacingIndexToY(View *v, int i) const; float yToSpacingIndex(View *v, int y) const; void finish(RegionModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/LinearColourScale.cpp0000644000175000017500000000446012252354725024261 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "LinearColourScale.h" #include "ColourScaleLayer.h" #include #include #include "view/View.h" int LinearColourScale::getWidth(View *v, QPainter &paint) { return paint.fontMetrics().width("-000.00") + 15; } void LinearColourScale::paintVertical(View *v, const ColourScaleLayer *layer, QPainter &paint, int x0, float min, float max) { int h = v->height(); int n = 10; float val = min; float inc = (max - val) / n; char buffer[40]; int w = getWidth(v, paint) + x0; int boxx = 5, boxy = 5; if (layer->getScaleUnits() != "") { boxy += paint.fontMetrics().height(); } int boxw = 10, boxh = h - boxy - 5; int tx = 5 + boxx + boxw; paint.drawRect(boxx, boxy, boxw, boxh); paint.save(); for (int y = 0; y < boxh; ++y) { float val = ((boxh - y) * (max - min)) / boxh + min; paint.setPen(layer->getColourForValue(v, val)); paint.drawLine(boxx + 1, y + boxy + 1, boxx + boxw, y + boxy + 1); } paint.restore(); float round = 1.f; int dp = 0; if (inc > 0) { int prec = trunc(log10f(inc)); prec -= 1; if (prec < 0) dp = -prec; round = powf(10.f, prec); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "inc = " << inc << ", round = " << round << ", dp = " << dp << endl; #endif } for (int i = 0; i < n; ++i) { int y, ty; y = boxy + int(boxh - ((val - min) * boxh) / (max - min)); ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; sprintf(buffer, "%.*f", dp, val); QString label = QString(buffer); paint.drawLine(boxx + boxw - boxw/3, y, boxx + boxw, y); paint.drawText(tx, ty, label); val += inc; } } sonic-visualiser-2.3~repack1.orig/svgui/layer/SpectrumLayer.h0000644000175000017500000001122012252354725023147 0ustar miramira /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SPECTRUM_LAYER_H_ #define _SPECTRUM_LAYER_H_ #include "SliceLayer.h" #include "base/Window.h" #include "data/model/DenseTimeValueModel.h" #include #include class FFTModel; class SpectrumLayer : public SliceLayer { Q_OBJECT public: SpectrumLayer(); ~SpectrumLayer(); void setModel(DenseTimeValueModel *model); virtual const Model *getModel() const { return m_originModel; } virtual bool getCrosshairExtents(View *, QPainter &, QPoint cursorPos, std::vector &extents) const; virtual void paintCrosshairs(View *, QPainter &, QPoint) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual VerticalPosition getPreferredFrameCountPosition() const { return PositionTop; } virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); virtual void setProperties(const QXmlAttributes &); virtual bool getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const; virtual bool getXScaleValue(const View *v, int x, float &value, QString &unit) const; virtual bool getYScaleValue(const View *, int y, float &value, QString &unit) const; virtual bool getYScaleDifference(const View *, int y0, int y1, float &diff, QString &unit) const; virtual bool isLayerScrollable(const View *) const { return false; } void setChannel(int); int getChannel() const { return m_channel; } void setWindowSize(size_t); size_t getWindowSize() const { return m_windowSize; } void setWindowHopLevel(size_t level); size_t getWindowHopLevel() const { return m_windowHopLevel; } void setWindowType(WindowType type); WindowType getWindowType() const { return m_windowType; } void setShowPeaks(bool); bool getShowPeaks() const { return m_showPeaks; } virtual int getVerticalScaleWidth(View *, bool, QPainter &) const { return 0; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; protected slots: void preferenceChanged(PropertyContainer::PropertyName name); protected: // make this SliceLayer method unavailable to the general public // virtual void setModel(DenseThreeDimensionalModel *model) { // SliceLayer::setModel(model); // } DenseTimeValueModel *m_originModel; int m_channel; bool m_channelSet; size_t m_windowSize; WindowType m_windowType; size_t m_windowHopLevel; bool m_showPeaks; mutable bool m_newFFTNeeded; mutable QMutex m_fftMutex; void setupFFT(); virtual void getBiasCurve(BiasCurve &) const; BiasCurve m_biasCurve; virtual float getXForBin(int bin, int totalBins, float w) const; virtual int getBinForX(float x, int totalBins, float w) const; float getFrequencyForX(float x, float w) const; float getXForFrequency(float freq, float w) const; size_t getWindowIncrement() const { if (m_windowHopLevel == 0) return m_windowSize; else if (m_windowHopLevel == 1) return (m_windowSize * 3) / 4; else return m_windowSize / (1 << (m_windowHopLevel - 1)); } }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/RegionLayer.cpp0000644000175000017500000012213512252354725023133 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2008 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "RegionLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "base/LogRange.h" #include "ColourDatabase.h" #include "ColourMapper.h" #include "LinearNumericalScale.h" #include "LogNumericalScale.h" #include "LinearColourScale.h" #include "LogColourScale.h" #include "view/View.h" #include "data/model/RegionModel.h" #include "widgets/ItemEditDialog.h" #include "widgets/TextAbbrev.h" #include #include #include #include #include #include #include RegionLayer::RegionLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_originalPoint(0, 0.0, 0, tr("New Region")), m_editingPoint(0, 0.0, 0, tr("New Region")), m_editingCommand(0), m_verticalScale(EqualSpaced), m_colourMap(0), m_plotStyle(PlotLines) { } void RegionLayer::setModel(RegionModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); connect(m_model, SIGNAL(modelChanged()), this, SLOT(recalcSpacing())); recalcSpacing(); // SVDEBUG << "RegionLayer::setModel(" << model << ")" << endl; if (m_model && m_model->getRDFTypeURI().endsWith("Segment")) { setPlotStyle(PlotSegmentation); } if (m_model && m_model->getRDFTypeURI().endsWith("Change")) { setPlotStyle(PlotSegmentation); } emit modelReplaced(); } Layer::PropertyList RegionLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Vertical Scale"); list.push_back("Scale Units"); list.push_back("Plot Type"); return list; } QString RegionLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Vertical Scale") return tr("Vertical Scale"); if (name == "Scale Units") return tr("Scale Units"); if (name == "Plot Type") return tr("Plot Type"); return SingleColourLayer::getPropertyLabel(name); } Layer::PropertyType RegionLayer::getPropertyType(const PropertyName &name) const { if (name == "Scale Units") return UnitsProperty; if (name == "Vertical Scale") return ValueProperty; if (name == "Plot Type") return ValueProperty; if (name == "Colour" && m_plotStyle == PlotSegmentation) return ValueProperty; return SingleColourLayer::getPropertyType(name); } QString RegionLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Vertical Scale" || name == "Scale Units") { return tr("Scale"); } return SingleColourLayer::getPropertyGroupName(name); } int RegionLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; if (name == "Colour" && m_plotStyle == PlotSegmentation) { if (min) *min = 0; if (max) *max = ColourMapper::getColourMapCount() - 1; if (deflt) *deflt = 0; val = m_colourMap; } else if (name == "Plot Type") { if (min) *min = 0; if (max) *max = 1; if (deflt) *deflt = 0; val = int(m_plotStyle); } else if (name == "Vertical Scale") { if (min) *min = 0; if (max) *max = 3; if (deflt) *deflt = int(EqualSpaced); val = int(m_verticalScale); } else if (name == "Scale Units") { if (deflt) *deflt = 0; if (m_model) { val = UnitDatabase::getInstance()->getUnitId (getScaleUnits()); } } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString RegionLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour" && m_plotStyle == PlotSegmentation) { return ColourMapper::getColourMapName(value); } else if (name == "Plot Type") { switch (value) { default: case 0: return tr("Bars"); case 1: return tr("Segmentation"); } } else if (name == "Vertical Scale") { switch (value) { default: case 0: return tr("Auto-Align"); case 1: return tr("Equal Spaced"); case 2: return tr("Linear"); case 3: return tr("Log"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } void RegionLayer::setProperty(const PropertyName &name, int value) { if (name == "Colour" && m_plotStyle == PlotSegmentation) { setFillColourMap(value); } else if (name == "Plot Type") { setPlotStyle(PlotStyle(value)); } else if (name == "Vertical Scale") { setVerticalScale(VerticalScale(value)); } else if (name == "Scale Units") { if (m_model) { m_model->setScaleUnits (UnitDatabase::getInstance()->getUnitById(value)); emit modelChanged(); } } else { return SingleColourLayer::setProperty(name, value); } } void RegionLayer::setFillColourMap(int map) { if (m_colourMap == map) return; m_colourMap = map; emit layerParametersChanged(); } void RegionLayer::setPlotStyle(PlotStyle style) { if (m_plotStyle == style) return; bool colourTypeChanged = (style == PlotSegmentation || m_plotStyle == PlotSegmentation); m_plotStyle = style; if (colourTypeChanged) { emit layerParameterRangesChanged(); } emit layerParametersChanged(); } void RegionLayer::setVerticalScale(VerticalScale scale) { if (m_verticalScale == scale) return; m_verticalScale = scale; emit layerParametersChanged(); } bool RegionLayer::isLayerScrollable(const View *v) const { QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } void RegionLayer::recalcSpacing() { m_spacingMap.clear(); m_distributionMap.clear(); if (!m_model) return; // SVDEBUG << "RegionLayer::recalcSpacing" << endl; for (RegionModel::PointList::const_iterator i = m_model->getPoints().begin(); i != m_model->getPoints().end(); ++i) { m_distributionMap[i->value]++; // SVDEBUG << "RegionLayer::recalcSpacing: value found: " << i->value << " (now have " << m_distributionMap[i->value] << " of this value)" << endl; } int n = 0; for (SpacingMap::const_iterator i = m_distributionMap.begin(); i != m_distributionMap.end(); ++i) { m_spacingMap[i->first] = n++; // SVDEBUG << "RegionLayer::recalcSpacing: " << i->first << " -> " << m_spacingMap[i->first] << endl; } } bool RegionLayer::getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); unit = getScaleUnits(); if (m_verticalScale == LogScale) logarithmic = true; return true; } bool RegionLayer::getDisplayExtents(float &min, float &max) const { if (!m_model || m_verticalScale == AutoAlignScale || m_verticalScale == EqualSpaced) return false; min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); return true; } RegionModel::PointList RegionLayer::getLocalPoints(View *v, int x) const { if (!m_model) return RegionModel::PointList(); long frame = v->getFrameForX(x); RegionModel::PointList onPoints = m_model->getPoints(frame); if (!onPoints.empty()) { return onPoints; } RegionModel::PointList prevPoints = m_model->getPreviousPoints(frame); RegionModel::PointList nextPoints = m_model->getNextPoints(frame); RegionModel::PointList usePoints = prevPoints; if (prevPoints.empty()) { usePoints = nextPoints; } else if (long(prevPoints.begin()->frame) < v->getStartFrame() && !(nextPoints.begin()->frame > v->getEndFrame())) { usePoints = nextPoints; } else if (long(nextPoints.begin()->frame) - frame < frame - long(prevPoints.begin()->frame)) { usePoints = nextPoints; } if (!usePoints.empty()) { int fuzz = 2; int px = v->getXForFrame(usePoints.begin()->frame); if ((px > x && px - x > fuzz) || (px < x && x - px > fuzz + 1)) { usePoints.clear(); } } return usePoints; } bool RegionLayer::getPointToDrag(View *v, int x, int y, RegionModel::Point &p) const { if (!m_model) return false; long frame = v->getFrameForX(x); RegionModel::PointList onPoints = m_model->getPoints(frame); if (onPoints.empty()) return false; int nearestDistance = -1; for (RegionModel::PointList::const_iterator i = onPoints.begin(); i != onPoints.end(); ++i) { int distance = getYForValue(v, (*i).value) - y; if (distance < 0) distance = -distance; if (nearestDistance == -1 || distance < nearestDistance) { nearestDistance = distance; p = *i; } } return true; } QString RegionLayer::getLabelPreceding(size_t frame) const { if (!m_model) return ""; RegionModel::PointList points = m_model->getPreviousPoints(frame); for (RegionModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (i->label != "") return i->label; } return ""; } QString RegionLayer::getFeatureDescription(View *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; RegionModel::PointList points = getLocalPoints(v, x); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return tr("No local points"); } } RegionRec region(0); RegionModel::PointList::iterator i; //!!! harmonise with whatever decision is made about point y //!!! coords in paint method for (i = points.begin(); i != points.end(); ++i) { int y = getYForValue(v, i->value); int h = 3; if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, i->value + m_model->getValueQuantization()); if (h < 3) h = 3; } if (pos.y() >= y - h && pos.y() <= y) { region = *i; break; } } if (i == points.end()) return tr("No local points"); RealTime rt = RealTime::frame2RealTime(region.frame, m_model->getSampleRate()); RealTime rd = RealTime::frame2RealTime(region.duration, m_model->getSampleRate()); QString valueText; valueText = tr("%1 %2").arg(region.value).arg(getScaleUnits()); QString text; if (region.label == "") { text = QString(tr("Time:\t%1\nValue:\t%2\nDuration:\t%3\nNo label")) .arg(rt.toText(true).c_str()) .arg(valueText) .arg(rd.toText(true).c_str()); } else { text = QString(tr("Time:\t%1\nValue:\t%2\nDuration:\t%3\nLabel:\t%4")) .arg(rt.toText(true).c_str()) .arg(valueText) .arg(rd.toText(true).c_str()) .arg(region.label); } pos = QPoint(v->getXForFrame(region.frame), getYForValue(v, region.value)); return text; } bool RegionLayer::snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); RegionModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame)); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); int snapped = frame; bool found = false; for (RegionModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { // The best frame to snap to is the end frame of whichever // feature we would have snapped to the start frame of if // we had been snapping left. if (i->frame <= frame) { if (i->frame + i->duration > frame) { snapped = i->frame + i->duration; found = true; // don't break, as the next may be better } } else { if (!found) { snapped = i->frame; found = true; } break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest RegionModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } bool RegionLayer::snapToSimilarFeature(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToSimilarFeature(v, frame, resolution, snap); } resolution = m_model->getResolution(); const RegionModel::PointList &points = m_model->getPoints(); RegionModel::PointList close = m_model->getPoints(frame, frame); RegionModel::PointList::const_iterator i; int matchframe = frame; float matchvalue = 0.f; for (i = close.begin(); i != close.end(); ++i) { if (i->frame > frame) break; matchvalue = i->value; matchframe = i->frame; } int snapped = frame; bool found = false; bool distant = false; float epsilon = 0.0001; i = close.begin(); // Scan through the close points first, then the more distant ones // if no suitable close one is found while (i != points.end()) { if (i == close.end()) { i = points.begin(); distant = true; } if (snap == SnapRight) { if (i->frame > matchframe && fabsf(i->value - matchvalue) < epsilon) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame < matchframe) { if (fabsf(i->value - matchvalue) < epsilon) { snapped = i->frame; found = true; // don't break, as the next may be better } } else if (found || distant) { break; } } else { // no other snap types supported } ++i; } frame = snapped; return found; } QString RegionLayer::getScaleUnits() const { if (m_model) return m_model->getScaleUnits(); else return ""; } void RegionLayer::getScaleExtents(View *v, float &min, float &max, bool &log) const { min = 0.0; max = 0.0; log = false; QString queryUnits; queryUnits = getScaleUnits(); if (m_verticalScale == AutoAlignScale) { if (!v->getValueExtents(queryUnits, min, max, log)) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); // cerr << "RegionLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; } else if (log) { LogRange::mapRange(min, max); // cerr << "RegionLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; } } else if (m_verticalScale == EqualSpaced) { if (!m_spacingMap.empty()) { SpacingMap::const_iterator i = m_spacingMap.begin(); min = i->second; i = m_spacingMap.end(); --i; max = i->second; // cerr << "RegionLayer[" << this << "]::getScaleExtents: equal spaced; min = " << min << ", max = " << max << ", log = " << log << endl; } } else { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); if (m_verticalScale == LogScale) { LogRange::mapRange(min, max); log = true; } } if (max == min) max = min + 1.0; } int RegionLayer::spacingIndexToY(View *v, int i) const { int h = v->height(); int n = m_spacingMap.size(); // this maps from i (spacing of the value from the spacing // map) and n (number of region types) to y int y = h - (((h * i) / n) + (h / (2 * n))); return y; } float RegionLayer::yToSpacingIndex(View *v, int y) const { // we return an inexact result here (float rather than int) int h = v->height(); int n = m_spacingMap.size(); // from y = h - ((h * i) / n) + (h / (2 * n)) as above (vh taking place of i) float vh = float(2*h*n - h - 2*n*y) / float(2*h); return vh; } int RegionLayer::getYForValue(View *v, float val) const { float min = 0.0, max = 0.0; bool logarithmic = false; int h = v->height(); if (m_verticalScale == EqualSpaced) { if (m_spacingMap.empty()) return h/2; SpacingMap::const_iterator i = m_spacingMap.lower_bound(val); //!!! what now, if i->first != v? int y = spacingIndexToY(v, i->second); // SVDEBUG << "RegionLayer::getYForValue: value " << val << " -> i->second " << i->second << " -> y " << y << endl; return y; } else { getScaleExtents(v, min, max, logarithmic); // cerr << "RegionLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << endl; // cerr << "h = " << h << ", margin = " << margin << endl; if (logarithmic) { val = LogRange::map(val); } return int(h - ((val - min) * h) / (max - min)); } } float RegionLayer::getValueForY(View *v, int y) const { return getValueForY(v, y, -1); } float RegionLayer::getValueForY(View *v, int y, int avoid) const { float min = 0.0, max = 0.0; bool logarithmic = false; int h = v->height(); if (m_verticalScale == EqualSpaced) { // if we're equal spaced, we probably want to snap to the // nearest item when close to it, and give some notification // that we're doing so if (m_spacingMap.empty()) return 1.f; // n is the number of distinct regions. if we are close to // one of the m/n divisions in the y scale, we should snap to // the value of the mth region. float vh = yToSpacingIndex(v, y); // spacings in the map are integral, so find the closest one, // map it back to its y coordinate, and see how far we are // from it int n = m_spacingMap.size(); int ivh = lrintf(vh); if (ivh < 0) ivh = 0; if (ivh > n-1) ivh = n-1; int iy = spacingIndexToY(v, ivh); int dist = iy - y; int gap = h / n; // between region lines // cerr << "getValueForY: y = " << y << ", vh = " << vh << ", ivh = " << ivh << " of " << n << ", iy = " << iy << ", dist = " << dist << ", gap = " << gap << endl; SpacingMap::const_iterator i = m_spacingMap.begin(); while (i != m_spacingMap.end()) { if (i->second == ivh) break; ++i; } if (i == m_spacingMap.end()) i = m_spacingMap.begin(); // cerr << "nearest existing value = " << i->first << " at " << iy << endl; float val = 0; // cerr << "note: avoid = " << avoid << ", i->second = " << i->second << endl; if (dist < -gap/3 && ((avoid == -1) || (avoid != i->second && avoid != i->second - 1))) { // bisect gap to prior if (i == m_spacingMap.begin()) { val = i->first - 1.f; // cerr << "extended down to " << val << endl; } else { SpacingMap::const_iterator j = i; --j; val = (i->first + j->first) / 2; // cerr << "bisected down to " << val << endl; } } else if (dist > gap/3 && ((avoid == -1) || (avoid != i->second && avoid != i->second + 1))) { // bisect gap to following SpacingMap::const_iterator j = i; ++j; if (j == m_spacingMap.end()) { val = i->first + 1.f; // cerr << "extended up to " << val << endl; } else { val = (i->first + j->first) / 2; // cerr << "bisected up to " << val << endl; } } else { // snap val = i->first; // cerr << "snapped to " << val << endl; } return val; } else { getScaleExtents(v, min, max, logarithmic); float val = min + (float(h - y) * float(max - min)) / h; if (logarithmic) { val = powf(10.f, val); } return val; } } QColor RegionLayer::getColourForValue(View *v, float val) const { float min, max; bool log; getScaleExtents(v, min, max, log); if (min > max) std::swap(min, max); if (max == min) max = min + 1; if (log) { LogRange::mapRange(min, max); val = LogRange::map(val); } // SVDEBUG << "RegionLayer::getColourForValue: min " << min << ", max " // << max << ", log " << log << ", value " << val << endl; QColor solid = ColourMapper(m_colourMap, min, max).map(val); return QColor(solid.red(), solid.green(), solid.blue(), 120); } int RegionLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Blue" : "Blue")); } void RegionLayer::paint(View *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; int sampleRate = m_model->getSampleRate(); if (!sampleRate) return; // Profiler profiler("RegionLayer::paint", true); int x0 = rect.left() - 40, x1 = rect.right(); long frame0 = v->getFrameForX(x0); long frame1 = v->getFrameForX(x1); RegionModel::PointList points(m_model->getPoints(frame0, frame1)); if (points.empty()) return; paint.setPen(getBaseQColor()); QColor brushColour(getBaseQColor()); brushColour.setAlpha(80); // SVDEBUG << "RegionLayer::paint: resolution is " // << m_model->getResolution() << " frames" << endl; float min = m_model->getValueMinimum(); float max = m_model->getValueMaximum(); if (max == min) max = min + 1.0; QPoint localPos; RegionModel::Point illuminatePoint(0); bool shouldIlluminate = false; if (v->shouldIlluminateLocalFeatures(this, localPos)) { shouldIlluminate = getPointToDrag(v, localPos.x(), localPos.y(), illuminatePoint); } paint.save(); paint.setRenderHint(QPainter::Antialiasing, false); //!!! point y coords if model does not haveDistinctValues() should //!!! be assigned to avoid overlaps //!!! if it does have distinct values, we should still ensure y //!!! coord is never completely flat on the top or bottom int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); for (RegionModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const RegionModel::Point &p(*i); int x = v->getXForFrame(p.frame); int y = getYForValue(v, p.value); int w = v->getXForFrame(p.frame + p.duration) - x; int h = 9; int ex = x + w; RegionModel::PointList::const_iterator j = i; ++j; if (j != points.end()) { const RegionModel::Point &q(*j); int nx = v->getXForFrame(q.frame); if (nx < ex) ex = nx; } if (m_model->getValueQuantization() != 0.0) { h = y - getYForValue(v, p.value + m_model->getValueQuantization()); if (h < 3) h = 3; } if (w < 1) w = 1; if (m_plotStyle == PlotSegmentation) { paint.setPen(getForegroundQColor(v)); paint.setBrush(getColourForValue(v, p.value)); } else { paint.setPen(getBaseQColor()); paint.setBrush(brushColour); } if (m_plotStyle == PlotSegmentation) { if (ex <= x) continue; if (!shouldIlluminate || // "illuminatePoint != p" RegionModel::Point::Comparator()(illuminatePoint, p) || RegionModel::Point::Comparator()(p, illuminatePoint)) { paint.setPen(QPen(getForegroundQColor(v), 1)); paint.drawLine(x, 0, x, v->height()); paint.setPen(Qt::NoPen); } else { paint.setPen(QPen(getForegroundQColor(v), 2)); } paint.drawRect(x, -1, ex - x, v->height() + 2); } else { if (shouldIlluminate && // "illuminatePoint == p" !RegionModel::Point::Comparator()(illuminatePoint, p) && !RegionModel::Point::Comparator()(p, illuminatePoint)) { paint.setPen(v->getForeground()); paint.setBrush(v->getForeground()); QString vlabel = QString("%1%2").arg(p.value).arg(getScaleUnits()); v->drawVisibleText(paint, x - paint.fontMetrics().width(vlabel) - 2, y + paint.fontMetrics().height()/2 - paint.fontMetrics().descent(), vlabel, View::OutlinedText); QString hlabel = RealTime::frame2RealTime (p.frame, m_model->getSampleRate()).toText(true).c_str(); v->drawVisibleText(paint, x, y - h/2 - paint.fontMetrics().descent() - 2, hlabel, View::OutlinedText); } paint.drawLine(x, y-1, x + w, y-1); paint.drawLine(x, y+1, x + w, y+1); paint.drawLine(x, y - h/2, x, y + h/2); paint.drawLine(x+w, y - h/2, x + w, y + h/2); } } int nextLabelMinX = -100; int lastLabelY = 0; for (RegionModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const RegionModel::Point &p(*i); int x = v->getXForFrame(p.frame); int y = getYForValue(v, p.value); bool illuminated = false; if (m_plotStyle != PlotSegmentation) { if (shouldIlluminate && // "illuminatePoint == p" !RegionModel::Point::Comparator()(illuminatePoint, p) && !RegionModel::Point::Comparator()(p, illuminatePoint)) { illuminated = true; } } if (!illuminated) { QString label = p.label; if (label == "") { label = QString("%1%2").arg(p.value).arg(getScaleUnits()); } int labelX, labelY; if (m_plotStyle != PlotSegmentation) { labelX = x - paint.fontMetrics().width(label) - 2; labelY = y + paint.fontMetrics().height()/2 - paint.fontMetrics().descent(); } else { labelX = x + 5; labelY = v->getTextLabelHeight(this, paint); if (labelX < nextLabelMinX) { if (lastLabelY < v->height()/2) { labelY = lastLabelY + fontHeight; } } lastLabelY = labelY; nextLabelMinX = labelX + paint.fontMetrics().width(label); } v->drawVisibleText(paint, labelX, labelY, label, View::OutlinedText); } } paint.restore(); } int RegionLayer::getVerticalScaleWidth(View *v, bool, QPainter &paint) const { if (!m_model || m_verticalScale == AutoAlignScale || m_verticalScale == EqualSpaced) { return 0; } else if (m_plotStyle == PlotSegmentation) { if (m_verticalScale == LogScale) { return LogColourScale().getWidth(v, paint); } else { return LinearColourScale().getWidth(v, paint); } } else { if (m_verticalScale == LogScale) { return LogNumericalScale().getWidth(v, paint); } else { return LinearNumericalScale().getWidth(v, paint); } } } void RegionLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const { if (!m_model) return; QString unit; float min, max; bool logarithmic; int w = getVerticalScaleWidth(v, false, paint); int h = v->height(); if (m_plotStyle == PlotSegmentation) { getValueExtents(min, max, logarithmic, unit); if (logarithmic) { LogRange::mapRange(min, max); LogColourScale().paintVertical(v, this, paint, 0, min, max); } else { LinearColourScale().paintVertical(v, this, paint, 0, min, max); } } else { getScaleExtents(v, min, max, logarithmic); if (logarithmic) { LogNumericalScale().paintVertical(v, this, paint, 0, min, max); } else { LinearNumericalScale().paintVertical(v, this, paint, 0, min, max); } } if (getScaleUnits() != "") { int mw = w - 5; paint.drawText(5, 5 + paint.fontMetrics().ascent(), TextAbbrev::abbreviate(getScaleUnits(), paint.fontMetrics(), mw)); } } void RegionLayer::drawStart(View *v, QMouseEvent *e) { if (!m_model) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); float value = getValueForY(v, e->y()); m_editingPoint = RegionModel::Point(frame, value, 0, ""); m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new RegionModel::EditCommand(m_model, tr("Draw Region")); m_editingCommand->addPoint(m_editingPoint); recalcSpacing(); m_editing = true; } void RegionLayer::drawDrag(View *v, QMouseEvent *e) { if (!m_model || !m_editing) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); float newValue = m_editingPoint.value; if (m_verticalScale != EqualSpaced) newValue = getValueForY(v, e->y()); long newFrame = m_editingPoint.frame; long newDuration = frame - newFrame; if (newDuration < 0) { newFrame = frame; newDuration = -newDuration; } else if (newDuration == 0) { newDuration = 1; } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = newFrame; m_editingPoint.value = newValue; m_editingPoint.duration = newDuration; m_editingCommand->addPoint(m_editingPoint); recalcSpacing(); } void RegionLayer::drawEnd(View *, QMouseEvent *) { if (!m_model || !m_editing) return; finish(m_editingCommand); m_editingCommand = 0; m_editing = false; recalcSpacing(); } void RegionLayer::eraseStart(View *v, QMouseEvent *e) { if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; recalcSpacing(); } void RegionLayer::eraseDrag(View *v, QMouseEvent *e) { } void RegionLayer::eraseEnd(View *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; RegionModel::Point p(0); if (!getPointToDrag(v, e->x(), e->y(), p)) return; if (p.frame != m_editingPoint.frame || p.value != m_editingPoint.value) return; m_editingCommand = new RegionModel::EditCommand (m_model, tr("Erase Region")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; recalcSpacing(); } void RegionLayer::editStart(View *v, QMouseEvent *e) { if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) { return; } m_dragPointX = v->getXForFrame(m_editingPoint.frame); m_dragPointY = getYForValue(v, m_editingPoint.value); m_originalPoint = m_editingPoint; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; m_dragStartX = e->x(); m_dragStartY = e->y(); recalcSpacing(); } void RegionLayer::editDrag(View *v, QMouseEvent *e) { if (!m_model || !m_editing) return; int xdist = e->x() - m_dragStartX; int ydist = e->y() - m_dragStartY; int newx = m_dragPointX + xdist; int newy = m_dragPointY + ydist; long frame = v->getFrameForX(newx); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); // Do not bisect between two values, if one of those values is // that of the point we're actually moving ... int avoid = m_spacingMap[m_editingPoint.value]; // ... unless there are other points with the same value if (m_distributionMap[m_editingPoint.value] > 1) avoid = -1; float value = getValueForY(v, newy, avoid); if (!m_editingCommand) { m_editingCommand = new RegionModel::EditCommand(m_model, tr("Drag Region")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.value = value; m_editingCommand->addPoint(m_editingPoint); recalcSpacing(); } void RegionLayer::editEnd(View *, QMouseEvent *e) { if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = m_editingCommand->getName(); if (m_editingPoint.frame != m_originalPoint.frame) { if (m_editingPoint.value != m_originalPoint.value) { newName = tr("Edit Region"); } else { newName = tr("Relocate Region"); } } else { newName = tr("Change Point Value"); } m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; recalcSpacing(); } bool RegionLayer::editOpen(View *v, QMouseEvent *e) { if (!m_model) return false; RegionModel::Point region(0); if (!getPointToDrag(v, e->x(), e->y(), region)) return false; ItemEditDialog *dialog = new ItemEditDialog (m_model->getSampleRate(), ItemEditDialog::ShowTime | ItemEditDialog::ShowDuration | ItemEditDialog::ShowValue | ItemEditDialog::ShowText, getScaleUnits()); dialog->setFrameTime(region.frame); dialog->setValue(region.value); dialog->setFrameDuration(region.duration); dialog->setText(region.label); if (dialog->exec() == QDialog::Accepted) { RegionModel::Point newRegion = region; newRegion.frame = dialog->getFrameTime(); newRegion.value = dialog->getValue(); newRegion.duration = dialog->getFrameDuration(); newRegion.label = dialog->getText(); RegionModel::EditCommand *command = new RegionModel::EditCommand (m_model, tr("Edit Region")); command->deletePoint(region); command->addPoint(newRegion); finish(command); } delete dialog; recalcSpacing(); return true; } void RegionLayer::moveSelection(Selection s, size_t newStartFrame) { if (!m_model) return; RegionModel::EditCommand *command = new RegionModel::EditCommand(m_model, tr("Drag Selection")); RegionModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (RegionModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { RegionModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); recalcSpacing(); } void RegionLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; RegionModel::EditCommand *command = new RegionModel::EditCommand(m_model, tr("Resize Selection")); RegionModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (RegionModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double targetStart = i->frame; targetStart = newSize.getStartFrame() + double(targetStart - s.getStartFrame()) * ratio; double targetEnd = i->frame + i->duration; targetEnd = newSize.getStartFrame() + double(targetEnd - s.getStartFrame()) * ratio; RegionModel::Point newPoint(*i); newPoint.frame = lrint(targetStart); newPoint.duration = lrint(targetEnd - targetStart); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); recalcSpacing(); } void RegionLayer::deleteSelection(Selection s) { if (!m_model) return; RegionModel::EditCommand *command = new RegionModel::EditCommand(m_model, tr("Delete Selected Points")); RegionModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (RegionModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { command->deletePoint(*i); } } finish(command); recalcSpacing(); } void RegionLayer::copy(View *v, Selection s, Clipboard &to) { if (!m_model) return; RegionModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (RegionModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->value, i->duration, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool RegionLayer::paste(View *v, const Clipboard &from, int frameOffset, bool /* interactive */) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v, tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } RegionModel::EditCommand *command = new RegionModel::EditCommand(m_model, tr("Paste")); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; size_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } RegionModel::Point newPoint(frame); if (i->haveLabel()) newPoint.label = i->getLabel(); if (i->haveValue()) newPoint.value = i->getValue(); else newPoint.value = (m_model->getValueMinimum() + m_model->getValueMaximum()) / 2; if (i->haveDuration()) newPoint.duration = i->getDuration(); else { size_t nextFrame = frame; Clipboard::PointList::const_iterator j = i; for (; j != points.end(); ++j) { if (!j->haveFrame()) continue; if (j != i) break; } if (j != points.end()) { nextFrame = j->getFrame(); } if (nextFrame == frame) { newPoint.duration = m_model->getResolution(); } else { newPoint.duration = nextFrame - frame; } } command->addPoint(newPoint); } finish(command); recalcSpacing(); return true; } void RegionLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes + QString(" verticalScale=\"%1\" plotStyle=\"%2\"") .arg(m_verticalScale) .arg(m_plotStyle)); } void RegionLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); bool ok; VerticalScale scale = (VerticalScale) attributes.value("verticalScale").toInt(&ok); if (ok) setVerticalScale(scale); PlotStyle style = (PlotStyle) attributes.value("plotStyle").toInt(&ok); if (ok) setPlotStyle(style); } sonic-visualiser-2.3~repack1.orig/svgui/layer/LinearNumericalScale.cpp0000644000175000017500000000460412252354725024735 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "LinearNumericalScale.h" #include "VerticalScaleLayer.h" #include #include #include "view/View.h" int LinearNumericalScale::getWidth(View *v, QPainter &paint) { return paint.fontMetrics().width("-000.00") + 10; } void LinearNumericalScale::paintVertical(View *v, const VerticalScaleLayer *layer, QPainter &paint, int x0, float minf, float maxf) { int h = v->height(); int n = 10; float val = minf; float inc = (maxf - val) / n; char buffer[40]; int w = getWidth(v, paint) + x0; float round = 1.f; int dp = 0; if (inc > 0) { int prec = trunc(log10f(inc)); prec -= 1; if (prec < 0) dp = -prec; round = powf(10.f, prec); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "inc = " << inc << ", round = " << round << ", dp = " << dp << endl; #endif } int prevy = -1; for (int i = 0; i < n; ++i) { int y, ty; bool drawText = true; float dispval = val; if (i == n-1 && v->height() < paint.fontMetrics().height() * (n*2)) { if (layer->getScaleUnits() != "") drawText = false; } dispval = lrintf(val / round) * round; #ifdef DEBUG_TIME_VALUE_LAYER cerr << "val = " << val << ", dispval = " << dispval << endl; #endif y = layer->getYForValue(v, dispval); ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) { val += inc; continue; } sprintf(buffer, "%.*f", dp, dispval); QString label = QString(buffer); paint.drawLine(w - 5, y, w, y); if (drawText) { paint.drawText(w - paint.fontMetrics().width(label) - 6, ty, label); } prevy = y; val += inc; } } sonic-visualiser-2.3~repack1.orig/svgui/layer/PaintAssistant.cpp0000644000175000017500000001416712252354725023665 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PaintAssistant.h" #include "base/AudioLevel.h" #include #include #include #include void PaintAssistant::paintVerticalLevelScale(QPainter &paint, QRect rect, float minVal, float maxVal, Scale scale, int &mult, std::vector *vy) { static float meterdbs[] = { -40, -30, -20, -15, -10, -5, -3, -2, -1, -0.5, 0 }; int h = rect.height(), w = rect.width(); int textHeight = paint.fontMetrics().height(); int toff = -textHeight/2 + paint.fontMetrics().ascent() + 1; int lastLabelledY = -1; int n = 10; if (vy) vy->clear(); float step = 0; mult = 1; if (scale == LinearScale) { step = (maxVal - minVal) / n; int round = 0, limit = 10000000; do { round = int(minVal + step * mult); mult *= 10; } while (!round && mult < limit); if (round) { mult /= 10; // cerr << "\n\nstep goes from " << step; step = float(round) / mult; n = lrintf((maxVal - minVal) / step); if (mult > 1) { mult /= 10; } // cerr << " to " << step << " (n = " << n << ")" << endl; } } for (int i = 0; i <= n; ++i) { float val = 0.0, nval = 0.0; QString text = ""; switch (scale) { case LinearScale: val = (minVal + (i * step)); text = QString("%1").arg(mult * val); break; case MeterScale: // ... min, max val = AudioLevel::dB_to_multiplier(meterdbs[i]); text = QString("%1").arg(meterdbs[i]); if (i == n) text = "0dB"; if (i == 0) { text = "-Inf"; val = 0.0; } break; case dBScale: // ... min, max val = AudioLevel::dB_to_multiplier(-(10*n) + i * 10); text = QString("%1").arg(-(10*n) + i * 10); if (i == n) text = "0dB"; if (i == 0) { text = "-Inf"; val = 0.0; } break; } if (val < minVal || val > maxVal) continue; int y = getYForValue(scale, val, minVal, maxVal, rect.y(), h); int ny = y; if (nval != 0.0) { ny = getYForValue(scale, nval, minVal, maxVal, rect.y(), h); } // SVDEBUG << "PaintAssistant::paintVerticalLevelScale: val = " // << val << ", y = " << y << ", h = " << h << endl; bool spaceForLabel = (i == 0 || abs(y - lastLabelledY) >= textHeight - 1); if (spaceForLabel) { int tx = 3; // if (scale != LinearScale) { if (paint.fontMetrics().width(text) < w - 10) { tx = w - 10 - paint.fontMetrics().width(text); } int ty = y; if (ty < paint.fontMetrics().ascent()) { ty = paint.fontMetrics().ascent(); // } else if (ty > rect.y() + h - paint.fontMetrics().descent()) { // ty = rect.y() + h - paint.fontMetrics().descent(); } else { ty += toff; } paint.drawText(tx, ty, text); lastLabelledY = ty - toff; /* if (ny != y) { ty = ny; if (ty < paint.fontMetrics().ascent()) { ty = paint.fontMetrics().ascent(); } else if (ty > h - paint.fontMetrics().descent()) { ty = h - paint.fontMetrics().descent(); } else { ty += toff; } paint.drawText(tx, ty, text); } */ paint.drawLine(w - 7, y, w, y); if (vy) vy->push_back(y); if (ny != y) { paint.drawLine(w - 7, ny, w, ny); if (vy) vy->push_back(ny); } } else { paint.drawLine(w - 4, y, w, y); if (vy) vy->push_back(y); if (ny != y) { paint.drawLine(w - 4, ny, w, ny); if (vy) vy->push_back(ny); } } } } static int dBscale(float sample, int m, float maxVal, float minVal) { if (sample < 0.0) return dBscale(-sample, m, maxVal, minVal); float dB = AudioLevel::multiplier_to_dB(sample); float mindB = AudioLevel::multiplier_to_dB(minVal); float maxdB = AudioLevel::multiplier_to_dB(maxVal); if (dB < mindB) return 0; if (dB > 0.0) return m; return int(((dB - mindB) * m) / (maxdB - mindB) + 0.1); } int PaintAssistant::getYForValue(Scale scale, float value, float minVal, float maxVal, int minY, int height) { int vy = 0; // int m = height/2; // int my = minY + m; switch (scale) { case LinearScale: // vy = my - int(m * value); vy = minY + height - int(((value - minVal) / (maxVal - minVal)) * height); break; case MeterScale: // vy = my - AudioLevel::multiplier_to_preview(value, m); vy = minY + height - AudioLevel::multiplier_to_preview ((value - minVal) / (maxVal - minVal), height); break; case dBScale: vy = minY + height - dBscale(value, height, maxVal, minVal); break; } return vy; } sonic-visualiser-2.3~repack1.orig/svgui/layer/WaveformLayer.h0000644000175000017500000001765612252354725023156 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _WAVEFORM_LAYER_H_ #define _WAVEFORM_LAYER_H_ #include #include "SingleColourLayer.h" #include "data/model/RangeSummarisableTimeValueModel.h" class View; class QPainter; class QPixmap; class WaveformLayer : public SingleColourLayer { Q_OBJECT public: WaveformLayer(); ~WaveformLayer(); virtual const ZoomConstraint *getZoomConstraint() const { return m_model ? m_model->getZoomConstraint() : 0; } virtual const Model *getModel() const { return m_model; } virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual ColourSignificance getLayerColourSignificance() const { return ColourAndBackgroundSignificant; } virtual int getVerticalScaleWidth(View *v, bool detailed, QPainter &) const; virtual void paintVerticalScale(View *v, bool detailed, QPainter &paint, QRect rect) const; void setModel(const RangeSummarisableTimeValueModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); /** * Set the gain multiplier for sample values in this view. * * The default is 1.0. */ void setGain(float gain); float getGain() const { return m_gain; } /** * Toggle automatic normalization of the currently visible waveform. */ void setAutoNormalize(bool); bool getAutoNormalize() const { return m_autoNormalize; } /** * Set whether to display mean values as a lighter-coloured area * beneath the peaks. Rendering will be slightly faster without * but arguably prettier with. * * The default is to display means. */ void setShowMeans(bool); bool getShowMeans() const { return m_showMeans; } /** * Set whether to use shades of grey (or of the base colour) to * provide additional perceived vertical resolution (i.e. using * half-filled pixels to represent levels that only just meet the * pixel unit boundary). This provides a small improvement in * waveform quality at a small cost in rendering speed. * * The default is to use greyscale. */ void setUseGreyscale(bool); bool getUseGreyscale() const { return m_greyscale; } enum ChannelMode { SeparateChannels, MixChannels, MergeChannels }; /** * Specify whether multi-channel audio data should be displayed * with a separate axis per channel (SeparateChannels), with a * single synthetic axis showing channel 0 above the axis and * channel 1 below (MergeChannels), or with a single axis showing * the average of the channels (MixChannels). * * MergeChannels does not work for files with more than 2 * channels. * * The default is SeparateChannels. */ void setChannelMode(ChannelMode); ChannelMode getChannelMode() const { return m_channelMode; } /** * Specify the channel to use from the source model. A value of * -1 means to show all available channels (laid out to the * channel mode). The default is -1. */ void setChannel(int); int getChannel() const { return m_channel; } enum Scale { LinearScale, MeterScale, dBScale }; /** * Specify the vertical scale for sample levels. With LinearScale, * the scale is directly proportional to the raw [-1, +1) * floating-point audio sample values. With dBScale the * vertical scale is proportional to dB level (truncated at * -50dB). MeterScale provides a hybrid variable scale based on * IEC meter scale, intended to provide a clear overview at * relatively small heights. * * Note that the effective gain (see setGain()) is applied before * vertical scaling. * * The default is LinearScale. */ void setScale(Scale); Scale getScale() const { return m_scale; } /** * Enable or disable aggressive pixmap cacheing. If enabled, * waveforms will be rendered to an off-screen pixmap and * refreshed from there instead of being redrawn from the peak * data each time. This may be faster if the data and zoom level * do not change often, but it may be slower for frequently zoomed * data and it will only work if the waveform is the "bottom" * layer on the displayed widget, as each refresh will erase * anything beneath the waveform. * * This is intended specifically for a panner widget display in * which the waveform never moves, zooms, or changes, but some * graphic such as a panner outline is frequently redrawn over the * waveform. This situation would necessitate a lot of waveform * refresh if the default cacheing strategy was used. * * The default is not to use aggressive cacheing. */ void setAggressiveCacheing(bool); bool getAggressiveCacheing() const { return m_aggressive; } virtual bool isLayerScrollable(const View *) const; virtual int getCompletion(View *) const; virtual bool getValueExtents(float &min, float &max, bool &log, QString &unit) const; virtual bool getYScaleValue(const View *v, int y, float &value, QString &unit) const; virtual bool getYScaleDifference(const View *v, int y0, int y1, float &diff, QString &unit) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; virtual void setProperties(const QXmlAttributes &attributes); virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); protected: int dBscale(float sample, int m) const; const RangeSummarisableTimeValueModel *m_model; // I do not own this /// Return value is number of channels displayed size_t getChannelArrangement(size_t &min, size_t &max, bool &merging, bool &mixing) const; int getYForValue(const View *v, float value, size_t channel) const; float getValueForY(const View *v, int y, size_t &channel) const; bool getSourceFramesForX(View *v, int x, size_t modelZoomLevel, size_t &f0, size_t &f1) const; float getNormalizeGain(View *v, int channel) const; virtual void flagBaseColourChanged() { m_cacheValid = false; } float m_gain; bool m_autoNormalize; bool m_showMeans; bool m_greyscale; ChannelMode m_channelMode; int m_channel; Scale m_scale; bool m_aggressive; mutable std::vector m_effectiveGains; mutable QPixmap *m_cache; mutable bool m_cacheValid; mutable int m_cacheZoomLevel; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/TextLayer.cpp0000644000175000017500000004763012252354725022642 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "TextLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "ColourDatabase.h" #include "view/View.h" #include "data/model/TextModel.h" #include #include #include #include #include #include #include TextLayer::TextLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_originalPoint(0, 0.0, tr("Empty Label")), m_editingPoint(0, 0.0, tr("Empty Label")), m_editingCommand(0) { } void TextLayer::setModel(TextModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); // SVDEBUG << "TextLayer::setModel(" << model << ")" << endl; emit modelReplaced(); } Layer::PropertyList TextLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); return list; } QString TextLayer::getPropertyLabel(const PropertyName &name) const { return SingleColourLayer::getPropertyLabel(name); } Layer::PropertyType TextLayer::getPropertyType(const PropertyName &name) const { return SingleColourLayer::getPropertyType(name); } int TextLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { return SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } QString TextLayer::getPropertyValueLabel(const PropertyName &name, int value) const { return SingleColourLayer::getPropertyValueLabel(name, value); } void TextLayer::setProperty(const PropertyName &name, int value) { SingleColourLayer::setProperty(name, value); } bool TextLayer::getValueExtents(float &, float &, bool &, QString &) const { return false; } bool TextLayer::isLayerScrollable(const View *v) const { QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } TextModel::PointList TextLayer::getLocalPoints(View *v, int x, int y) const { if (!m_model) return TextModel::PointList(); long frame0 = v->getFrameForX(-150); long frame1 = v->getFrameForX(v->width() + 150); TextModel::PointList points(m_model->getPoints(frame0, frame1)); TextModel::PointList rv; QFontMetrics metrics = QFontMetrics(QFont()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { const TextModel::Point &p(*i); int px = v->getXForFrame(p.frame); int py = getYForHeight(v, p.height); QString label = p.label; if (label == "") { label = tr(""); } QRect rect = metrics.boundingRect (QRect(0, 0, 150, 200), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, label); if (py + rect.height() > v->height()) { if (rect.height() > v->height()) py = 0; else py = v->height() - rect.height() - 1; } if (x >= px && x < px + rect.width() && y >= py && y < py + rect.height()) { rv.insert(p); } } return rv; } bool TextLayer::getPointToDrag(View *v, int x, int y, TextModel::Point &p) const { if (!m_model) return false; long a = v->getFrameForX(x - 120); long b = v->getFrameForX(x + 10); TextModel::PointList onPoints = m_model->getPoints(a, b); if (onPoints.empty()) return false; float nearestDistance = -1; for (TextModel::PointList::const_iterator i = onPoints.begin(); i != onPoints.end(); ++i) { int yd = getYForHeight(v, (*i).height) - y; int xd = v->getXForFrame((*i).frame) - x; float distance = sqrtf(yd*yd + xd*xd); if (nearestDistance == -1 || distance < nearestDistance) { nearestDistance = distance; p = *i; } } return true; } QString TextLayer::getFeatureDescription(View *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; TextModel::PointList points = getLocalPoints(v, x, pos.y()); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return ""; } } long useFrame = points.begin()->frame; RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate()); QString text; if (points.begin()->label == "") { text = QString(tr("Time:\t%1\nHeight:\t%2\nLabel:\t%3")) .arg(rt.toText(true).c_str()) .arg(points.begin()->height) .arg(points.begin()->label); } pos = QPoint(v->getXForFrame(useFrame), getYForHeight(v, points.begin()->height)); return text; } //!!! too much overlap with TimeValueLayer/TimeInstantLayer bool TextLayer::snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); TextModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame), -1); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); int snapped = frame; bool found = false; for (TextModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame > frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest TextModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } int TextLayer::getYForHeight(View *v, float height) const { int h = v->height(); return h - int(height * h); } float TextLayer::getHeightForY(View *v, int y) const { int h = v->height(); return float(h - y) / h; } void TextLayer::paint(View *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; int sampleRate = m_model->getSampleRate(); if (!sampleRate) return; // Profiler profiler("TextLayer::paint", true); int x0 = rect.left(), x1 = rect.right(); long frame0 = v->getFrameForX(x0); long frame1 = v->getFrameForX(x1); TextModel::PointList points(m_model->getPoints(frame0, frame1)); if (points.empty()) return; QColor brushColour(getBaseQColor()); int h, s, val; brushColour.getHsv(&h, &s, &val); brushColour.setHsv(h, s, 255, 100); QColor penColour; penColour = v->getForeground(); // SVDEBUG << "TextLayer::paint: resolution is " // << m_model->getResolution() << " frames" << endl; QPoint localPos; TextModel::Point illuminatePoint(0); bool shouldIlluminate; if (v->shouldIlluminateLocalFeatures(this, localPos)) { shouldIlluminate = getPointToDrag(v, localPos.x(), localPos.y(), illuminatePoint); } int boxMaxWidth = 150; int boxMaxHeight = 200; paint.save(); paint.setClipRect(rect.x(), 0, rect.width() + boxMaxWidth, v->height()); for (TextModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { const TextModel::Point &p(*i); int x = v->getXForFrame(p.frame); int y = getYForHeight(v, p.height); if (!shouldIlluminate || // "illuminatePoint != p" TextModel::Point::Comparator()(illuminatePoint, p) || TextModel::Point::Comparator()(p, illuminatePoint)) { paint.setPen(penColour); paint.setBrush(brushColour); } else { paint.setBrush(penColour); paint.setPen(v->getBackground()); } QString label = p.label; if (label == "") { label = tr(""); } QRect boxRect = paint.fontMetrics().boundingRect (QRect(0, 0, boxMaxWidth, boxMaxHeight), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, label); QRect textRect = QRect(3, 2, boxRect.width(), boxRect.height()); boxRect = QRect(0, 0, boxRect.width() + 6, boxRect.height() + 2); if (y + boxRect.height() > v->height()) { if (boxRect.height() > v->height()) y = 0; else y = v->height() - boxRect.height() - 1; } boxRect = QRect(x, y, boxRect.width(), boxRect.height()); textRect = QRect(x + 3, y + 2, textRect.width(), textRect.height()); // boxRect = QRect(x, y, boxRect.width(), boxRect.height()); // textRect = QRect(x + 3, y + 2, textRect.width(), textRect.height()); paint.setRenderHint(QPainter::Antialiasing, false); paint.drawRect(boxRect); paint.setRenderHint(QPainter::Antialiasing, true); paint.drawText(textRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, label); /// if (p.label != "") { /// paint.drawText(x + 5, y - paint.fontMetrics().height() + paint.fontMetrics().ascent(), p.label); /// } } paint.restore(); // looks like save/restore doesn't deal with this: paint.setRenderHint(QPainter::Antialiasing, false); } void TextLayer::drawStart(View *v, QMouseEvent *e) { // SVDEBUG << "TextLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) { SVDEBUG << "TextLayer::drawStart: no model" << endl; return; } long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); float height = getHeightForY(v, e->y()); m_editingPoint = TextModel::Point(frame, height, ""); m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new TextModel::EditCommand(m_model, "Add Label"); m_editingCommand->addPoint(m_editingPoint); m_editing = true; } void TextLayer::drawDrag(View *v, QMouseEvent *e) { // SVDEBUG << "TextLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); float height = getHeightForY(v, e->y()); m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.height = height; m_editingCommand->addPoint(m_editingPoint); } void TextLayer::drawEnd(View *v, QMouseEvent *) { // SVDEBUG << "TextLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; bool ok = false; QString label = QInputDialog::getText(v, tr("Enter label"), tr("Please enter a new label:"), QLineEdit::Normal, "", &ok); if (ok) { TextModel::RelabelCommand *command = new TextModel::RelabelCommand(m_model, m_editingPoint, label); m_editingCommand->addCommand(command); } else { m_editingCommand->deletePoint(m_editingPoint); } finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TextLayer::eraseStart(View *v, QMouseEvent *e) { if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TextLayer::eraseDrag(View *v, QMouseEvent *e) { } void TextLayer::eraseEnd(View *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; TextModel::Point p(0); if (!getPointToDrag(v, e->x(), e->y(), p)) return; if (p.frame != m_editingPoint.frame || p.height != m_editingPoint.height) return; m_editingCommand = new TextModel::EditCommand (m_model, tr("Erase Point")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TextLayer::editStart(View *v, QMouseEvent *e) { // SVDEBUG << "TextLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; if (!m_model) return; if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) { return; } m_editOrigin = e->pos(); m_originalPoint = m_editingPoint; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TextLayer::editDrag(View *v, QMouseEvent *e) { if (!m_model || !m_editing) return; long frameDiff = v->getFrameForX(e->x()) - v->getFrameForX(m_editOrigin.x()); float heightDiff = getHeightForY(v, e->y()) - getHeightForY(v, m_editOrigin.y()); long frame = m_originalPoint.frame + frameDiff; float height = m_originalPoint.height + heightDiff; // long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = (frame / m_model->getResolution()) * m_model->getResolution(); // float height = getHeightForY(v, e->y()); if (!m_editingCommand) { m_editingCommand = new TextModel::EditCommand(m_model, tr("Drag Label")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.height = height; m_editingCommand->addPoint(m_editingPoint); } void TextLayer::editEnd(View *, QMouseEvent *) { // SVDEBUG << "TextLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = m_editingCommand->getName(); if (m_editingPoint.frame != m_originalPoint.frame) { if (m_editingPoint.height != m_originalPoint.height) { newName = tr("Move Label"); } else { newName = tr("Move Label Horizontally"); } } else { newName = tr("Move Label Vertically"); } m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool TextLayer::editOpen(View *v, QMouseEvent *e) { if (!m_model) return false; TextModel::Point text(0); if (!getPointToDrag(v, e->x(), e->y(), text)) return false; QString label = text.label; bool ok = false; label = QInputDialog::getText(v, tr("Enter label"), tr("Please enter a new label:"), QLineEdit::Normal, label, &ok); if (ok && label != text.label) { TextModel::RelabelCommand *command = new TextModel::RelabelCommand(m_model, text, label); CommandHistory::getInstance()->addCommand(command); } return true; } void TextLayer::moveSelection(Selection s, size_t newStartFrame) { if (!m_model) return; TextModel::EditCommand *command = new TextModel::EditCommand(m_model, tr("Drag Selection")); TextModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { TextModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TextLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; TextModel::EditCommand *command = new TextModel::EditCommand(m_model, tr("Resize Selection")); TextModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double target = i->frame; target = newSize.getStartFrame() + double(target - s.getStartFrame()) * ratio; TextModel::Point newPoint(*i); newPoint.frame = lrint(target); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TextLayer::deleteSelection(Selection s) { if (!m_model) return; TextModel::EditCommand *command = new TextModel::EditCommand(m_model, tr("Delete Selection")); TextModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) command->deletePoint(*i); } finish(command); } void TextLayer::copy(View *v, Selection s, Clipboard &to) { if (!m_model) return; TextModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (TextModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->height, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool TextLayer::paste(View *v, const Clipboard &from, int frameOffset, bool /* interactive */) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v, tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } TextModel::EditCommand *command = new TextModel::EditCommand(m_model, tr("Paste")); float valueMin = 0.0, valueMax = 1.0; for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (i->haveValue()) { if (i->getValue() < valueMin) valueMin = i->getValue(); if (i->getValue() > valueMax) valueMax = i->getValue(); } } if (valueMax < valueMin + 1.0) valueMax = valueMin + 1.0; for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; size_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } TextModel::Point newPoint(frame); if (i->haveValue()) { newPoint.height = (i->getValue() - valueMin) / (valueMax - valueMin); } else { newPoint.height = 0.5; } if (i->haveLabel()) { newPoint.label = i->getLabel(); } else if (i->haveValue()) { newPoint.label = QString("%1").arg(i->getValue()); } else { newPoint.label = tr("New Point"); } command->addPoint(newPoint); } finish(command); return true; } int TextLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Orange" : "Orange")); } void TextLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes); } void TextLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); } sonic-visualiser-2.3~repack1.orig/svgui/layer/layer.pro0000644000175000017500000000253312252354725022044 0ustar miramiraTEMPLATE = lib SV_UNIT_PACKAGES = fftw3f load(../prf/sv.prf) CONFIG += sv staticlib qt thread warn_on stl rtti exceptions QT += xml TARGET = svlayer DEPENDPATH += . .. INCLUDEPATH += . .. OBJECTS_DIR = tmp_obj MOC_DIR = tmp_moc # Input HEADERS += Colour3DPlotLayer.h \ ColourDatabase.h \ ColourMapper.h \ ImageLayer.h \ ImageRegionFinder.h \ Layer.h \ LayerFactory.h \ NoteLayer.h \ PaintAssistant.h \ RegionLayer.h \ SingleColourLayer.h \ SliceableLayer.h \ SliceLayer.h \ SpectrogramLayer.h \ SpectrumLayer.h \ TextLayer.h \ TimeInstantLayer.h \ TimeRulerLayer.h \ TimeValueLayer.h \ WaveformLayer.h SOURCES += Colour3DPlotLayer.cpp \ ColourDatabase.cpp \ ColourMapper.cpp \ ImageLayer.cpp \ ImageRegionFinder.cpp \ Layer.cpp \ LayerFactory.cpp \ NoteLayer.cpp \ PaintAssistant.cpp \ RegionLayer.cpp \ SingleColourLayer.cpp \ SliceLayer.cpp \ SpectrogramLayer.cpp \ SpectrumLayer.cpp \ TextLayer.cpp \ TimeInstantLayer.cpp \ TimeRulerLayer.cpp \ TimeValueLayer.cpp \ WaveformLayer.cpp sonic-visualiser-2.3~repack1.orig/svgui/layer/LogColourScale.h0000644000175000017500000000167312252354725023240 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef LOG_COLOUR_SCALE_H #define LOG_COLOUR_SCALE_H #include class QPainter; class View; class ColourScaleLayer; class LogColourScale { public: int getWidth(View *v, QPainter &paint); void paintVertical (View *v, const ColourScaleLayer *layer, QPainter &paint, int x0, float minf, float maxf); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/VerticalScaleLayer.h0000644000175000017500000000157512252354725024102 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef VERTICAL_SCALE_LAYER_H #define VERTICAL_SCALE_LAYER_H class VerticalScaleLayer { public: virtual int getYForValue(View *, float value) const = 0; virtual float getValueForY(View *, int y) const = 0; virtual QString getScaleUnits() const = 0; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/SingleColourLayer.h0000644000175000017500000000605212252354725023761 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SINGLE_COLOUR_LAYER_H_ #define _SINGLE_COLOUR_LAYER_H_ #include "Layer.h" #include #include #include class SingleColourLayer : public Layer { Q_OBJECT public: /** * Set the colour used to draw primary items in the layer. The * colour value is a colour database index as returned by * ColourDatabase::getColourIndex(). */ virtual void setBaseColour(int); /** * Retrieve the current primary drawing colour, as a * ColourDatabase index value. */ virtual int getBaseColour() const; /** * Return true if the layer currently has a dark colour on a light * background, false if it has a light colour on a dark * background. */ virtual bool hasLightBackground() const; /** * Implements Layer::getLayerColourSignificance() */ virtual ColourSignificance getLayerColourSignificance() const { return ColourDistinguishes; } virtual QPixmap getLayerPresentationPixmap(QSize size) const; virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; virtual void setProperties(const QXmlAttributes &attributes); virtual void setDefaultColourFor(View *v); protected: SingleColourLayer(); virtual QColor getBaseQColor() const; virtual QColor getBackgroundQColor(View *v) const; virtual QColor getForegroundQColor(View *v) const; std::vector getPartialShades(View *v) const; virtual void flagBaseColourChanged() { } virtual int getDefaultColourHint(bool /* darkBackground */, bool & /* impose */) { return -1; } typedef std::map ColourRefCount; static ColourRefCount m_colourRefCount; int m_colour; bool m_colourExplicitlySet; bool m_defaultColourSet; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/TimeValueLayer.cpp0000644000175000017500000014332312252354725023605 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "TimeValueLayer.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "base/LogRange.h" #include "base/RangeMapper.h" #include "ColourDatabase.h" #include "view/View.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/Labeller.h" #include "widgets/ItemEditDialog.h" #include "widgets/ListInputDialog.h" #include "widgets/TextAbbrev.h" #include "ColourMapper.h" #include "PianoScale.h" #include "LinearNumericalScale.h" #include "LogNumericalScale.h" #include "LinearColourScale.h" #include "LogColourScale.h" #include #include #include #include #include #include #include #include #include //#define DEBUG_TIME_VALUE_LAYER 1 TimeValueLayer::TimeValueLayer() : SingleColourLayer(), m_model(0), m_editing(false), m_originalPoint(0, 0.0, tr("New Point")), m_editingPoint(0, 0.0, tr("New Point")), m_editingCommand(0), m_colourMap(0), m_plotStyle(PlotConnectedPoints), m_verticalScale(AutoAlignScale), m_drawSegmentDivisions(true), m_derivative(false), m_scaleMinimum(0), m_scaleMaximum(0) { } void TimeValueLayer::setModel(SparseTimeValueModel *model) { if (m_model == model) return; m_model = model; connectSignals(m_model); m_scaleMinimum = 0; m_scaleMaximum = 0; if (m_model && m_model->getRDFTypeURI().endsWith("Segment")) { setPlotStyle(PlotSegmentation); } if (m_model && m_model->getRDFTypeURI().endsWith("Change")) { setPlotStyle(PlotSegmentation); } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::setModel(" << model << ")" << endl; #endif emit modelReplaced(); } Layer::PropertyList TimeValueLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Plot Type"); list.push_back("Vertical Scale"); list.push_back("Scale Units"); list.push_back("Draw Segment Division Lines"); list.push_back("Show Derivative"); return list; } QString TimeValueLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Plot Type") return tr("Plot Type"); if (name == "Vertical Scale") return tr("Vertical Scale"); if (name == "Scale Units") return tr("Scale Units"); if (name == "Draw Segment Division Lines") return tr("Draw Segment Division Lines"); if (name == "Show Derivative") return tr("Show Derivative"); return SingleColourLayer::getPropertyLabel(name); } QString TimeValueLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Draw Segment Division Lines") return "lines"; if (name == "Show Derivative") return "derivative"; return ""; } Layer::PropertyType TimeValueLayer::getPropertyType(const PropertyName &name) const { if (name == "Plot Type") return ValueProperty; if (name == "Vertical Scale") return ValueProperty; if (name == "Scale Units") return UnitsProperty; if (name == "Colour" && m_plotStyle == PlotSegmentation) return ValueProperty; if (name == "Draw Segment Division Lines") return ToggleProperty; if (name == "Show Derivative") return ToggleProperty; return SingleColourLayer::getPropertyType(name); } QString TimeValueLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Vertical Scale" || name == "Scale Units") { return tr("Scale"); } if (name == "Plot Type" || name == "Draw Segment Division Lines" || name == "Show Derivative") { return tr("Plot Type"); } return SingleColourLayer::getPropertyGroupName(name); } QString TimeValueLayer::getScaleUnits() const { if (m_model) return m_model->getScaleUnits(); else return ""; } int TimeValueLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; if (name == "Colour" && m_plotStyle == PlotSegmentation) { if (min) *min = 0; if (max) *max = ColourMapper::getColourMapCount() - 1; if (deflt) *deflt = 0; val = m_colourMap; } else if (name == "Plot Type") { if (min) *min = 0; if (max) *max = 6; if (deflt) *deflt = int(PlotConnectedPoints); val = int(m_plotStyle); } else if (name == "Vertical Scale") { if (min) *min = 0; if (max) *max = 3; if (deflt) *deflt = int(AutoAlignScale); val = int(m_verticalScale); } else if (name == "Scale Units") { if (deflt) *deflt = 0; if (m_model) { val = UnitDatabase::getInstance()->getUnitId (getScaleUnits()); } } else if (name == "Draw Segment Division Lines") { if (min) *min = 0; if (max) *max = 0; if (deflt) *deflt = 1; val = (m_drawSegmentDivisions ? 1.0 : 0.0); } else if (name == "Show Derivative") { if (min) *min = 0; if (max) *max = 0; if (deflt) *deflt = 0; val = (m_derivative ? 1.0 : 0.0); } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString TimeValueLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour" && m_plotStyle == PlotSegmentation) { return ColourMapper::getColourMapName(value); } else if (name == "Plot Type") { switch (value) { default: case 0: return tr("Points"); case 1: return tr("Stems"); case 2: return tr("Connected Points"); case 3: return tr("Lines"); case 4: return tr("Curve"); case 5: return tr("Segmentation"); case 6: return tr("Discrete Curves"); } } else if (name == "Vertical Scale") { switch (value) { default: case 0: return tr("Auto-Align"); case 1: return tr("Linear"); case 2: return tr("Log"); case 3: return tr("+/-1"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } void TimeValueLayer::setProperty(const PropertyName &name, int value) { if (name == "Colour" && m_plotStyle == PlotSegmentation) { setFillColourMap(value); } else if (name == "Plot Type") { setPlotStyle(PlotStyle(value)); } else if (name == "Vertical Scale") { setVerticalScale(VerticalScale(value)); } else if (name == "Scale Units") { if (m_model) { m_model->setScaleUnits (UnitDatabase::getInstance()->getUnitById(value)); emit modelChanged(); } } else if (name == "Draw Segment Division Lines") { setDrawSegmentDivisions(value > 0.5); } else if (name == "Show Derivative") { setShowDerivative(value > 0.5); } else { SingleColourLayer::setProperty(name, value); } } void TimeValueLayer::setFillColourMap(int map) { if (m_colourMap == map) return; m_colourMap = map; emit layerParametersChanged(); } void TimeValueLayer::setPlotStyle(PlotStyle style) { if (m_plotStyle == style) return; bool colourTypeChanged = (style == PlotSegmentation || m_plotStyle == PlotSegmentation); m_plotStyle = style; if (colourTypeChanged) { emit layerParameterRangesChanged(); } emit layerParametersChanged(); } void TimeValueLayer::setVerticalScale(VerticalScale scale) { if (m_verticalScale == scale) return; m_verticalScale = scale; emit layerParametersChanged(); } void TimeValueLayer::setDrawSegmentDivisions(bool draw) { if (m_drawSegmentDivisions == draw) return; m_drawSegmentDivisions = draw; emit layerParametersChanged(); } void TimeValueLayer::setShowDerivative(bool show) { if (m_derivative == show) return; m_derivative = show; emit layerParametersChanged(); } bool TimeValueLayer::isLayerScrollable(const View *v) const { // We don't illuminate sections in the line or curve modes, so // they're always scrollable if (m_plotStyle == PlotLines || m_plotStyle == PlotCurve || m_plotStyle == PlotDiscreteCurves) return true; QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } bool TimeValueLayer::getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); logarithmic = (m_verticalScale == LogScale); unit = getScaleUnits(); if (m_derivative) { max = std::max(fabsf(min), fabsf(max)); min = -max; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getValueExtents: min = " << min << ", max = " << max << endl; #endif if (!shouldAutoAlign() && !logarithmic && !m_derivative) { if (max == min) { max = max + 0.5; min = min - 0.5; } else { float margin = (max - min) / 10.0; max = max + margin; min = min - margin; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getValueExtents: min = " << min << ", max = " << max << " (after adjustment)" << endl; #endif } return true; } bool TimeValueLayer::getDisplayExtents(float &min, float &max) const { if (!m_model || shouldAutoAlign()) return false; if (m_scaleMinimum == m_scaleMaximum) { bool log; QString unit; getValueExtents(min, max, log, unit); } else { min = m_scaleMinimum; max = m_scaleMaximum; } if (m_derivative) { max = std::max(fabsf(min), fabsf(max)); min = -max; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getDisplayExtents: min = " << min << ", max = " << max << endl; #endif return true; } bool TimeValueLayer::setDisplayExtents(float min, float max) { if (!m_model) return false; if (min == max) { if (min == 0.f) { max = 1.f; } else { max = min * 1.0001; } } m_scaleMinimum = min; m_scaleMaximum = max; #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::setDisplayExtents: min = " << min << ", max = " << max << endl; #endif emit layerParametersChanged(); return true; } int TimeValueLayer::getVerticalZoomSteps(int &defaultStep) const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; defaultStep = 0; return 100; } int TimeValueLayer::getCurrentVerticalZoomStep() const { if (shouldAutoAlign()) return 0; if (!m_model) return 0; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return 0; float dmin, dmax; getDisplayExtents(dmin, dmax); int nr = mapper->getPositionForValue(dmax - dmin); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getCurrentVerticalZoomStep: dmin = " << dmin << ", dmax = " << dmax << ", nr = " << nr << endl; #endif delete mapper; return 100 - nr; } void TimeValueLayer::setVerticalZoomStep(int step) { if (shouldAutoAlign()) return; if (!m_model) return; RangeMapper *mapper = getNewVerticalZoomRangeMapper(); if (!mapper) return; float min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); float dmin, dmax; getDisplayExtents(dmin, dmax); float newdist = mapper->getValueForPosition(100 - step); float newmin, newmax; if (logarithmic) { // see SpectrogramLayer::setVerticalZoomStep newmax = (newdist + sqrtf(newdist*newdist + 4*dmin*dmax)) / 2; newmin = newmax - newdist; #ifdef DEBUG_TIME_VALUE_LAYER cerr << "newmin = " << newmin << ", newmax = " << newmax << endl; #endif } else { float dmid = (dmax + dmin) / 2; newmin = dmid - newdist / 2; newmax = dmid + newdist / 2; } if (newmin < min) { newmax += (min - newmin); newmin = min; } if (newmax > max) { newmax = max; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::setVerticalZoomStep: " << step << ": " << newmin << " -> " << newmax << " (range " << newdist << ")" << endl; #endif setDisplayExtents(newmin, newmax); } RangeMapper * TimeValueLayer::getNewVerticalZoomRangeMapper() const { if (!m_model) return 0; RangeMapper *mapper; float min, max; bool logarithmic; QString unit; getValueExtents(min, max, logarithmic, unit); if (min == max) return 0; if (logarithmic) { mapper = new LogRangeMapper(0, 100, min, max, unit); } else { mapper = new LinearRangeMapper(0, 100, min, max, unit); } return mapper; } SparseTimeValueModel::PointList TimeValueLayer::getLocalPoints(View *v, int x) const { if (!m_model) return SparseTimeValueModel::PointList(); long frame = v->getFrameForX(x); SparseTimeValueModel::PointList onPoints = m_model->getPoints(frame); if (!onPoints.empty()) { return onPoints; } SparseTimeValueModel::PointList prevPoints = m_model->getPreviousPoints(frame); SparseTimeValueModel::PointList nextPoints = m_model->getNextPoints(frame); SparseTimeValueModel::PointList usePoints = prevPoints; if (prevPoints.empty()) { usePoints = nextPoints; } else if (nextPoints.empty()) { // stick with prevPoints } else if (long(prevPoints.begin()->frame) < v->getStartFrame() && !(nextPoints.begin()->frame > v->getEndFrame())) { usePoints = nextPoints; } else if (nextPoints.begin()->frame - frame < frame - prevPoints.begin()->frame) { usePoints = nextPoints; } if (!usePoints.empty()) { int fuzz = 2; int px = v->getXForFrame(usePoints.begin()->frame); if ((px > x && px - x > fuzz) || (px < x && x - px > fuzz + 3)) { usePoints.clear(); } } return usePoints; } QString TimeValueLayer::getLabelPreceding(size_t frame) const { if (!m_model) return ""; SparseTimeValueModel::PointList points = m_model->getPreviousPoints(frame); for (SparseTimeValueModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (i->label != "") return i->label; } return ""; } QString TimeValueLayer::getFeatureDescription(View *v, QPoint &pos) const { int x = pos.x(); if (!m_model || !m_model->getSampleRate()) return ""; SparseTimeValueModel::PointList points = getLocalPoints(v, x); if (points.empty()) { if (!m_model->isReady()) { return tr("In progress"); } else { return tr("No local points"); } } long useFrame = points.begin()->frame; RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate()); QString text; QString unit = getScaleUnits(); if (unit != "") unit = " " + unit; if (points.begin()->label == "") { text = QString(tr("Time:\t%1\nValue:\t%2%3\nNo label")) .arg(rt.toText(true).c_str()) .arg(points.begin()->value) .arg(unit); } else { text = QString(tr("Time:\t%1\nValue:\t%2%3\nLabel:\t%4")) .arg(rt.toText(true).c_str()) .arg(points.begin()->value) .arg(unit) .arg(points.begin()->label); } pos = QPoint(v->getXForFrame(useFrame), getYForValue(v, points.begin()->value)); return text; } bool TimeValueLayer::snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); SparseTimeValueModel::PointList points; if (snap == SnapNeighbouring) { points = getLocalPoints(v, v->getXForFrame(frame)); if (points.empty()) return false; frame = points.begin()->frame; return true; } points = m_model->getPoints(frame, frame); int snapped = frame; bool found = false; for (SparseTimeValueModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (snap == SnapRight) { if (i->frame > frame) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame <= frame) { snapped = i->frame; found = true; // don't break, as the next may be better } else { break; } } else { // nearest SparseTimeValueModel::PointList::const_iterator j = i; ++j; if (j == points.end()) { snapped = i->frame; found = true; break; } else if (j->frame >= frame) { if (j->frame - frame < frame - i->frame) { snapped = j->frame; } else { snapped = i->frame; } found = true; break; } } } frame = snapped; return found; } bool TimeValueLayer::snapToSimilarFeature(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToSimilarFeature(v, frame, resolution, snap); } resolution = m_model->getResolution(); const SparseTimeValueModel::PointList &points = m_model->getPoints(); SparseTimeValueModel::PointList close = m_model->getPoints(frame, frame); SparseTimeValueModel::PointList::const_iterator i; int matchframe = frame; float matchvalue = 0.f; for (i = close.begin(); i != close.end(); ++i) { if (i->frame > frame) break; matchvalue = i->value; matchframe = i->frame; } int snapped = frame; bool found = false; bool distant = false; float epsilon = 0.0001; i = close.begin(); // Scan through the close points first, then the more distant ones // if no suitable close one is found while (i != points.end()) { if (i == close.end()) { i = points.begin(); distant = true; } if (snap == SnapRight) { if (i->frame > matchframe && fabsf(i->value - matchvalue) < epsilon) { snapped = i->frame; found = true; break; } } else if (snap == SnapLeft) { if (i->frame < matchframe) { if (fabsf(i->value - matchvalue) < epsilon) { snapped = i->frame; found = true; // don't break, as the next may be better } } else if (found || distant) { break; } } else { // no other snap types supported } ++i; } frame = snapped; return found; } void TimeValueLayer::getScaleExtents(View *v, float &min, float &max, bool &log) const { min = 0.0; max = 0.0; log = false; if (shouldAutoAlign()) { if (!v->getValueExtents(getScaleUnits(), min, max, log)) { min = m_model->getValueMinimum(); max = m_model->getValueMaximum(); } else if (log) { LogRange::mapRange(min, max); } } else if (m_verticalScale == PlusMinusOneScale) { min = -1.0; max = 1.0; } else { getDisplayExtents(min, max); if (m_verticalScale == LogScale) { LogRange::mapRange(min, max); log = true; } } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getScaleExtents: min = " << min << ", max = " << max << endl; #endif } int TimeValueLayer::getYForValue(View *v, float val) const { float min = 0.0, max = 0.0; bool logarithmic = false; int h = v->height(); getScaleExtents(v, min, max, logarithmic); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "getYForValue(" << val << "): min " << min << ", max " << max << ", log " << logarithmic << endl; #endif if (logarithmic) { val = LogRange::map(val); } return int(h - ((val - min) * h) / (max - min)); } float TimeValueLayer::getValueForY(View *v, int y) const { float min = 0.0, max = 0.0; bool logarithmic = false; int h = v->height(); getScaleExtents(v, min, max, logarithmic); float val = min + (float(h - y) * float(max - min)) / h; if (logarithmic) { val = LogRange::map(val); } return val; } bool TimeValueLayer::shouldAutoAlign() const { if (!m_model) return false; QString unit = getScaleUnits(); return (m_verticalScale == AutoAlignScale && unit != ""); } QColor TimeValueLayer::getColourForValue(View *v, float val) const { float min, max; bool log; getScaleExtents(v, min, max, log); if (min > max) std::swap(min, max); if (max == min) max = min + 1; if (log) { val = LogRange::map(val); } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::getColourForValue: min " << min << ", max " << max << ", log " << log << ", value " << val << endl; #endif QColor solid = ColourMapper(m_colourMap, min, max).map(val); return QColor(solid.red(), solid.green(), solid.blue(), 120); } int TimeValueLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Green" : "Green")); } void TimeValueLayer::paint(View *v, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) return; int sampleRate = m_model->getSampleRate(); if (!sampleRate) return; paint.setRenderHint(QPainter::Antialiasing, false); // Profiler profiler("TimeValueLayer::paint", true); int x0 = rect.left(), x1 = rect.right(); long frame0 = v->getFrameForX(x0); long frame1 = v->getFrameForX(x1); if (m_derivative) --frame0; SparseTimeValueModel::PointList points(m_model->getPoints (frame0, frame1)); if (points.empty()) return; paint.setPen(getBaseQColor()); QColor brushColour(getBaseQColor()); brushColour.setAlpha(80); paint.setBrush(brushColour); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::paint: resolution is " << m_model->getResolution() << " frames" << endl; #endif float min = m_model->getValueMinimum(); float max = m_model->getValueMaximum(); if (max == min) max = min + 1.0; int origin = int(nearbyint(v->height() - (-min * v->height()) / (max - min))); QPoint localPos; long illuminateFrame = -1; if (v->shouldIlluminateLocalFeatures(this, localPos)) { SparseTimeValueModel::PointList localPoints = getLocalPoints(v, localPos.x()); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer: " << localPoints.size() << " local points" << endl; #endif if (!localPoints.empty()) illuminateFrame = localPoints.begin()->frame; } int w = v->getXForFrame(frame0 + m_model->getResolution()) - v->getXForFrame(frame0); if (m_plotStyle == PlotStems) { if (w < 2) w = 2; } else { if (w < 1) w = 1; } paint.save(); QPainterPath path; int pointCount = 0; int textY = 0; if (m_plotStyle == PlotSegmentation) { textY = v->getTextLabelHeight(this, paint); } else { int originY = getYForValue(v, 0.f); if (originY > 0 && originY < v->height()) { paint.save(); paint.setPen(getPartialShades(v)[1]); paint.drawLine(x0, originY, x1, originY); paint.restore(); } } int prevFrame = 0; for (SparseTimeValueModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (m_derivative && i == points.begin()) continue; const SparseTimeValueModel::Point &p(*i); float value = p.value; if (m_derivative) { SparseTimeValueModel::PointList::const_iterator j = i; --j; value -= j->value; } int x = v->getXForFrame(p.frame); int y = getYForValue(v, value); bool gap = false; if (m_plotStyle == PlotDiscreteCurves) { gap = (p.frame > prevFrame && (p.frame - prevFrame >= m_model->getResolution() * 2)); } if (m_plotStyle != PlotSegmentation) { textY = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() - 1; if (textY < paint.fontMetrics().ascent() + 1) { textY = paint.fontMetrics().ascent() + 1; } } bool haveNext = false; int nf = v->getModelsEndFrame(); int nx = v->getXForFrame(nf); int ny = y; SparseTimeValueModel::PointList::const_iterator j = i; ++j; if (j != points.end()) { const SparseTimeValueModel::Point &q(*j); float nvalue = q.value; if (m_derivative) nvalue -= p.value; nf = q.frame; nx = v->getXForFrame(nf); ny = getYForValue(v, nvalue); haveNext = true; } // cout << "frame = " << p.frame << ", x = " << x << ", haveNext = " << haveNext // << ", nx = " << nx << endl; if (m_plotStyle == PlotDiscreteCurves) { paint.setPen(QPen(getBaseQColor(), 3)); paint.setBrush(Qt::NoBrush); } else if (m_plotStyle == PlotSegmentation) { paint.setPen(getForegroundQColor(v)); paint.setBrush(getColourForValue(v, value)); } else if (m_plotStyle == PlotLines || m_plotStyle == PlotCurve) { paint.setPen(getBaseQColor()); paint.setBrush(Qt::NoBrush); } else { paint.setPen(getBaseQColor()); paint.setBrush(brushColour); } if (m_plotStyle == PlotStems) { /* paint.setPen(brushColour); if (y < origin - 1) { paint.drawRect(x + w/2, y + 1, 1, origin - y); } else if (y > origin + 1) { paint.drawRect(x + w/2, origin, 1, y - origin - 1); } */ paint.setPen(getBaseQColor()); if (y < origin - 1) { paint.drawLine(x + w/2, y + 1, x + w/2, origin); } else if (y > origin + 1) { paint.drawLine(x + w/2, origin, x + w/2, y - 1); } } bool illuminate = false; if (illuminateFrame == p.frame) { // not equipped to illuminate the right section in line // or curve mode if (m_plotStyle != PlotCurve && m_plotStyle != PlotDiscreteCurves && m_plotStyle != PlotLines) { illuminate = true; } } if (m_plotStyle != PlotLines && m_plotStyle != PlotCurve && m_plotStyle != PlotDiscreteCurves && m_plotStyle != PlotSegmentation) { if (illuminate) { paint.save(); paint.setPen(getForegroundQColor(v)); paint.setBrush(getForegroundQColor(v)); } if (m_plotStyle != PlotStems || w > 1) { paint.drawRect(x, y - 1, w, 2); } if (illuminate) { paint.restore(); } } if (m_plotStyle == PlotConnectedPoints || m_plotStyle == PlotLines || m_plotStyle == PlotDiscreteCurves || m_plotStyle == PlotCurve) { if (haveNext) { if (m_plotStyle == PlotConnectedPoints) { paint.save(); paint.setPen(brushColour); paint.drawLine(x + w, y, nx, ny); paint.restore(); } else if (m_plotStyle == PlotLines) { if (pointCount == 0) { path.moveTo(x + w/2, y); } // paint.drawLine(x + w/2, y, nx + w/2, ny); path.lineTo(nx + w/2, ny); } else { float x0 = x + float(w)/2; float x1 = nx + float(w)/2; float y0 = y; float y1 = ny; if (m_plotStyle == PlotDiscreteCurves) { bool nextGap = nf - p.frame >= m_model->getResolution() * 2; if (nextGap) { x1 = x0; y1 = y0; } } if (pointCount == 0 || gap) { path.moveTo((x0 + x1) / 2, (y0 + y1) / 2); } if (nx - x > 5) { path.cubicTo(x0, y0, x0, y0, (x0 + x1) / 2, (y0 + y1) / 2); // // or // path.quadTo(x0, y0, (x0 + x1) / 2, (y0 + y1) / 2); } else { path.lineTo((x0 + x1) / 2, (y0 + y1) / 2); } } } } if (m_plotStyle == PlotSegmentation) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "drawing rect" << endl; #endif if (nx <= x) continue; paint.setPen(QPen(getForegroundQColor(v), 2)); if (!illuminate) { if (!m_drawSegmentDivisions || nx < x + 5 || x >= v->width() - 1) { paint.setPen(Qt::NoPen); } } paint.drawRect(x, -1, nx - x, v->height() + 1); } QString label = p.label; bool italic = false; if (label == "" && (m_plotStyle == PlotPoints || m_plotStyle == PlotSegmentation || m_plotStyle == PlotConnectedPoints)) { char lc[20]; snprintf(lc, 20, "%.3g", p.value); label = lc; italic = true; } if (label != "") { bool haveRoom = nx > x + 6 + paint.fontMetrics().width(label); if (haveRoom || (!haveNext && (pointCount == 0 || !italic))) { v->drawVisibleText(paint, x + 5, textY, label, italic ? View::OutlinedItalicText : View::OutlinedText); } } prevFrame = p.frame; ++pointCount; } if (m_plotStyle == PlotDiscreteCurves) { paint.setRenderHint(QPainter::Antialiasing, true); paint.drawPath(path); } else if ((m_plotStyle == PlotCurve || m_plotStyle == PlotLines) && !path.isEmpty()) { paint.setRenderHint(QPainter::Antialiasing, pointCount <= v->width()); paint.drawPath(path); } paint.restore(); // looks like save/restore doesn't deal with this: paint.setRenderHint(QPainter::Antialiasing, false); } int TimeValueLayer::getVerticalScaleWidth(View *v, bool, QPainter &paint) const { if (!m_model || shouldAutoAlign()) { return 0; } else if (m_plotStyle == PlotSegmentation) { if (m_verticalScale == LogScale) { return LogColourScale().getWidth(v, paint); } else { return LinearColourScale().getWidth(v, paint); } } else { if (m_verticalScale == LogScale) { return LogNumericalScale().getWidth(v, paint) + 10; // for piano } else { return LinearNumericalScale().getWidth(v, paint); } } } void TimeValueLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const { if (!m_model) return; QString unit; float min, max; bool logarithmic; int w = getVerticalScaleWidth(v, false, paint); int h = v->height(); if (m_plotStyle == PlotSegmentation) { getValueExtents(min, max, logarithmic, unit); if (logarithmic) { LogRange::mapRange(min, max); LogColourScale().paintVertical(v, this, paint, 0, min, max); } else { LinearColourScale().paintVertical(v, this, paint, 0, min, max); } } else { getScaleExtents(v, min, max, logarithmic); if (logarithmic) { LogNumericalScale().paintVertical(v, this, paint, 0, min, max); } else { LinearNumericalScale().paintVertical(v, this, paint, 0, min, max); } if (logarithmic && (getScaleUnits() == "Hz")) { PianoScale().paintPianoVertical (v, paint, QRect(w - 10, 0, 10, h), LogRange::unmap(min), LogRange::unmap(max)); paint.drawLine(w, 0, w, h); } } if (getScaleUnits() != "") { int mw = w - 5; paint.drawText(5, 5 + paint.fontMetrics().ascent(), TextAbbrev::abbreviate(getScaleUnits(), paint.fontMetrics(), mw)); } } void TimeValueLayer::drawStart(View *v, QMouseEvent *e) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; #endif if (!m_model) return; long frame = v->getFrameForX(e->x()); long resolution = m_model->getResolution(); if (frame < 0) frame = 0; frame = (frame / resolution) * resolution; float value = getValueForY(v, e->y()); bool havePoint = false; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (!points.empty()) { for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (((i->frame / resolution) * resolution) != frame) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "ignoring out-of-range frame at " << i->frame << endl; #endif continue; } m_editingPoint = *i; havePoint = true; } } if (!havePoint) { m_editingPoint = SparseTimeValueModel::Point (frame, value, tr("New Point")); } m_originalPoint = m_editingPoint; if (m_editingCommand) finish(m_editingCommand); m_editingCommand = new SparseTimeValueModel::EditCommand(m_model, tr("Draw Point")); if (!havePoint) { m_editingCommand->addPoint(m_editingPoint); } m_editing = true; } void TimeValueLayer::drawDrag(View *v, QMouseEvent *e) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; #endif if (!m_model || !m_editing) return; long frame = v->getFrameForX(e->x()); long resolution = m_model->getResolution(); if (frame < 0) frame = 0; frame = (frame / resolution) * resolution; float value = getValueForY(v, e->y()); SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); #ifdef DEBUG_TIME_VALUE_LAYER cerr << points.size() << " points" << endl; #endif bool havePoint = false; if (!points.empty()) { for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (i->frame == m_editingPoint.frame && i->value == m_editingPoint.value) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "ignoring current editing point at " << i->frame << ", " << i->value << endl; #endif continue; } if (((i->frame / resolution) * resolution) != frame) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "ignoring out-of-range frame at " << i->frame << endl; #endif continue; } #ifdef DEBUG_TIME_VALUE_LAYER cerr << "adjusting to new point at " << i->frame << ", " << i->value << endl; #endif m_editingPoint = *i; m_originalPoint = m_editingPoint; m_editingCommand->deletePoint(m_editingPoint); havePoint = true; } } if (!havePoint) { if (frame == m_editingPoint.frame) { m_editingCommand->deletePoint(m_editingPoint); } } // m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.value = value; m_editingCommand->addPoint(m_editingPoint); } void TimeValueLayer::drawEnd(View *, QMouseEvent *) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::drawEnd" << endl; #endif if (!m_model || !m_editing) return; finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TimeValueLayer::eraseStart(View *v, QMouseEvent *e) { if (!m_model) return; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; m_editingPoint = *points.begin(); if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TimeValueLayer::eraseDrag(View *v, QMouseEvent *e) { } void TimeValueLayer::eraseEnd(View *v, QMouseEvent *e) { if (!m_model || !m_editing) return; m_editing = false; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; if (points.begin()->frame != m_editingPoint.frame || points.begin()->value != m_editingPoint.value) return; m_editingCommand = new SparseTimeValueModel::EditCommand (m_model, tr("Erase Point")); m_editingCommand->deletePoint(m_editingPoint); finish(m_editingCommand); m_editingCommand = 0; m_editing = false; } void TimeValueLayer::editStart(View *v, QMouseEvent *e) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; #endif if (!m_model) return; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return; m_editingPoint = *points.begin(); m_originalPoint = m_editingPoint; if (m_editingCommand) { finish(m_editingCommand); m_editingCommand = 0; } m_editing = true; } void TimeValueLayer::editDrag(View *v, QMouseEvent *e) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::editDrag(" << e->x() << "," << e->y() << ")" << endl; #endif if (!m_model || !m_editing) return; long frame = v->getFrameForX(e->x()); if (frame < 0) frame = 0; frame = frame / m_model->getResolution() * m_model->getResolution(); float value = getValueForY(v, e->y()); if (!m_editingCommand) { m_editingCommand = new SparseTimeValueModel::EditCommand(m_model, tr("Drag Point")); } m_editingCommand->deletePoint(m_editingPoint); m_editingPoint.frame = frame; m_editingPoint.value = value; m_editingCommand->addPoint(m_editingPoint); } void TimeValueLayer::editEnd(View *, QMouseEvent *) { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "TimeValueLayer::editEnd" << endl; #endif if (!m_model || !m_editing) return; if (m_editingCommand) { QString newName = m_editingCommand->getName(); if (m_editingPoint.frame != m_originalPoint.frame) { if (m_editingPoint.value != m_originalPoint.value) { newName = tr("Edit Point"); } else { newName = tr("Relocate Point"); } } else { newName = tr("Change Point Value"); } m_editingCommand->setName(newName); finish(m_editingCommand); } m_editingCommand = 0; m_editing = false; } bool TimeValueLayer::editOpen(View *v, QMouseEvent *e) { if (!m_model) return false; SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); if (points.empty()) return false; SparseTimeValueModel::Point point = *points.begin(); ItemEditDialog *dialog = new ItemEditDialog (m_model->getSampleRate(), ItemEditDialog::ShowTime | ItemEditDialog::ShowValue | ItemEditDialog::ShowText, getScaleUnits()); dialog->setFrameTime(point.frame); dialog->setValue(point.value); dialog->setText(point.label); if (dialog->exec() == QDialog::Accepted) { SparseTimeValueModel::Point newPoint = point; newPoint.frame = dialog->getFrameTime(); newPoint.value = dialog->getValue(); newPoint.label = dialog->getText(); SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Edit Point")); command->deletePoint(point); command->addPoint(newPoint); finish(command); } delete dialog; return true; } void TimeValueLayer::moveSelection(Selection s, size_t newStartFrame) { if (!m_model) return; SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Drag Selection")); SparseTimeValueModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { SparseTimeValueModel::Point newPoint(*i); newPoint.frame = i->frame + newStartFrame - s.getStartFrame(); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TimeValueLayer::resizeSelection(Selection s, Selection newSize) { if (!m_model) return; SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Resize Selection")); SparseTimeValueModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); double ratio = double(newSize.getEndFrame() - newSize.getStartFrame()) / double(s.getEndFrame() - s.getStartFrame()); for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { double target = i->frame; target = newSize.getStartFrame() + double(target - s.getStartFrame()) * ratio; SparseTimeValueModel::Point newPoint(*i); newPoint.frame = lrint(target); command->deletePoint(*i); command->addPoint(newPoint); } } finish(command); } void TimeValueLayer::deleteSelection(Selection s) { if (!m_model) return; SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Delete Selected Points")); SparseTimeValueModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { command->deletePoint(*i); } } finish(command); } void TimeValueLayer::copy(View *v, Selection s, Clipboard &to) { if (!m_model) return; SparseTimeValueModel::PointList points = m_model->getPoints(s.getStartFrame(), s.getEndFrame()); for (SparseTimeValueModel::PointList::iterator i = points.begin(); i != points.end(); ++i) { if (s.contains(i->frame)) { Clipboard::Point point(i->frame, i->value, i->label); point.setReferenceFrame(alignToReference(v, i->frame)); to.addPoint(point); } } } bool TimeValueLayer::paste(View *v, const Clipboard &from, int frameOffset, bool interactive) { if (!m_model) return false; const Clipboard::PointList &points = from.getPoints(); bool realign = false; if (clipboardHasDifferentAlignment(v, from)) { QMessageBox::StandardButton button = QMessageBox::question(v, tr("Re-align pasted items?"), tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); if (button == QMessageBox::Cancel) { return false; } if (button == QMessageBox::Yes) { realign = true; } } SparseTimeValueModel::EditCommand *command = new SparseTimeValueModel::EditCommand(m_model, tr("Paste")); enum ValueAvailability { UnknownAvailability, NoValues, SomeValues, AllValues }; Labeller::ValueType generation = Labeller::ValueNone; bool haveUsableLabels = false; bool haveExistingItems = !(m_model->isEmpty()); Labeller labeller; labeller.setSampleRate(m_model->getSampleRate()); if (interactive) { ValueAvailability availability = UnknownAvailability; for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; if (availability == UnknownAvailability) { if (i->haveValue()) availability = AllValues; else availability = NoValues; continue; } if (i->haveValue()) { if (availability == NoValues) { availability = SomeValues; } } else { if (availability == AllValues) { availability = SomeValues; } } if (!haveUsableLabels) { if (i->haveLabel()) { if (i->getLabel().contains(QRegExp("[0-9]"))) { haveUsableLabels = true; } } } if (availability == SomeValues && haveUsableLabels) break; } if (availability == NoValues || availability == SomeValues) { QString text; if (availability == NoValues) { text = tr("The items you are pasting do not have values.\nWhat values do you want to use for these items?"); } else { text = tr("Some of the items you are pasting do not have values.\nWhat values do you want to use for these items?"); } Labeller::TypeNameMap names = labeller.getTypeNames(); QStringList options; std::vector genopts; for (Labeller::TypeNameMap::const_iterator i = names.begin(); i != names.end(); ++i) { if (i->first == Labeller::ValueNone) options << tr("Zero for all items"); else options << i->second; genopts.push_back(i->first); } static int prevSelection = 0; bool ok = false; QString selected = ListInputDialog::getItem (0, tr("Choose value calculation"), text, options, prevSelection, &ok); if (!ok) return false; int selection = 0; generation = Labeller::ValueNone; for (QStringList::const_iterator i = options.begin(); i != options.end(); ++i) { if (selected == *i) { generation = genopts[selection]; break; } ++selection; } labeller.setType(generation); if (generation == Labeller::ValueFromCyclicalCounter || generation == Labeller::ValueFromTwoLevelCounter) { int cycleSize = QInputDialog::getInt (0, tr("Select cycle size"), tr("Cycle size:"), 4, 2, 16, 1); labeller.setCounterCycleSize(cycleSize); } prevSelection = selection; } } SparseTimeValueModel::Point prevPoint(0); for (Clipboard::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { if (!i->haveFrame()) continue; size_t frame = 0; if (!realign) { frame = i->getFrame(); } else { if (i->haveReferenceFrame()) { frame = i->getReferenceFrame(); frame = alignFromReference(v, frame); } else { frame = i->getFrame(); } } SparseTimeValueModel::Point newPoint(frame); if (i->haveLabel()) { newPoint.label = i->getLabel(); } else if (i->haveValue()) { newPoint.label = QString("%1").arg(i->getValue()); } bool usePrev = false; SparseTimeValueModel::Point formerPrevPoint = prevPoint; if (i->haveValue()) { newPoint.value = i->getValue(); } else { #ifdef DEBUG_TIME_VALUE_LAYER cerr << "Setting value on point at " << newPoint.frame << " from labeller"; if (i == points.begin()) { cerr << ", no prev point" << endl; } else { cerr << ", prev point is at " << prevPoint.frame << endl; } #endif labeller.setValue (newPoint, (i == points.begin()) ? 0 : &prevPoint); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "New point value = " << newPoint.value << endl; #endif if (labeller.actingOnPrevPoint() && i != points.begin()) { usePrev = true; } } if (usePrev) { command->deletePoint(formerPrevPoint); command->addPoint(prevPoint); } prevPoint = newPoint; command->addPoint(newPoint); } finish(command); return true; } void TimeValueLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes + QString(" colourMap=\"%1\" plotStyle=\"%2\" verticalScale=\"%3\" scaleMinimum=\"%4\" scaleMaximum=\"%5\" drawDivisions=\"%6\" derivative=\"%7\" ") .arg(m_colourMap) .arg(m_plotStyle) .arg(m_verticalScale) .arg(m_scaleMinimum) .arg(m_scaleMaximum) .arg(m_drawSegmentDivisions ? "true" : "false") .arg(m_derivative ? "true" : "false")); } void TimeValueLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); bool ok, alsoOk; int cmap = attributes.value("colourMap").toInt(&ok); if (ok) setFillColourMap(cmap); PlotStyle style = (PlotStyle) attributes.value("plotStyle").toInt(&ok); if (ok) setPlotStyle(style); VerticalScale scale = (VerticalScale) attributes.value("verticalScale").toInt(&ok); if (ok) setVerticalScale(scale); bool draw = (attributes.value("drawDivisions").trimmed() == "true"); setDrawSegmentDivisions(draw); bool derivative = (attributes.value("derivative").trimmed() == "true"); setShowDerivative(derivative); float min = attributes.value("scaleMinimum").toFloat(&ok); float max = attributes.value("scaleMaximum").toFloat(&alsoOk); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "from properties: min = " << min << ", max = " << max << endl; #endif if (ok && alsoOk && min != max) setDisplayExtents(min, max); } sonic-visualiser-2.3~repack1.orig/svgui/layer/ColourDatabase.cpp0000644000175000017500000001156012252354725023602 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ColourDatabase.h" #include "base/XmlExportable.h" #include ColourDatabase ColourDatabase::m_instance; ColourDatabase * ColourDatabase::getInstance() { return &m_instance; } ColourDatabase::ColourDatabase() { } int ColourDatabase::getColourCount() const { return m_colours.size(); } QString ColourDatabase::getColourName(int c) const { if (c < 0 || size_t(c) >= m_colours.size()) return ""; return m_colours[c].name; } QColor ColourDatabase::getColour(int c) const { if (c < 0 || size_t(c) >= m_colours.size()) return Qt::black; return m_colours[c].colour; } QColor ColourDatabase::getColour(QString name) const { for (ColourList::const_iterator i = m_colours.begin(); i != m_colours.end(); ++i) { if (i->name == name) return i->colour; } return Qt::black; } int ColourDatabase::getColourIndex(QString name) const { int index = 0; for (ColourList::const_iterator i = m_colours.begin(); i != m_colours.end(); ++i) { if (i->name == name) return index; ++index; } return -1; } int ColourDatabase::getColourIndex(QColor c) const { int index = 0; for (ColourList::const_iterator i = m_colours.begin(); i != m_colours.end(); ++i) { if (i->colour == c) return index; ++index; } return -1; } bool ColourDatabase::useDarkBackground(int c) const { if (c < 0 || size_t(c) >= m_colours.size()) return false; return m_colours[c].darkbg; } void ColourDatabase::setUseDarkBackground(int c, bool dark) { if (c < 0 || size_t(c) >= m_colours.size()) return; if (m_colours[c].darkbg != dark) { m_colours[c].darkbg = dark; emit colourDatabaseChanged(); } } int ColourDatabase::addColour(QColor c, QString name) { int index = 0; for (ColourList::iterator i = m_colours.begin(); i != m_colours.end(); ++i) { if (i->name == name) { i->colour = c; return index; } ++index; } ColourRec rec; rec.colour = c; rec.name = name; rec.darkbg = false; m_colours.push_back(rec); emit colourDatabaseChanged(); return index; } void ColourDatabase::removeColour(QString name) { for (ColourList::iterator i = m_colours.begin(); i != m_colours.end(); ++i) { if (i->name == name) { m_colours.erase(i); return; } } } void ColourDatabase::getStringValues(int index, QString &colourName, QString &colourSpec, QString &darkbg) const { colourName = ""; colourSpec = ""; if (index < 0 || size_t(index) >= m_colours.size()) return; colourName = getColourName(index); QColor c = getColour(index); colourSpec = XmlExportable::encodeColour(c.red(), c.green(), c.blue()); darkbg = useDarkBackground(index) ? "true" : "false"; } int ColourDatabase::putStringValues(QString colourName, QString colourSpec, QString darkbg) { int index = -1; if (colourSpec != "") { QColor colour(colourSpec); index = getColourIndex(colour); if (index < 0) { index = addColour(colour, colourName == "" ? colourSpec : colourName); } } else if (colourName != "") { index = getColourIndex(colourName); } if (index >= 0) { setUseDarkBackground(index, darkbg == "true"); } return index; } void ColourDatabase::getColourPropertyRange(int *min, int *max) const { ColourDatabase *db = getInstance(); if (min) *min = 0; if (max) { *max = 0; if (db->getColourCount() > 0) *max = db->getColourCount()-1; } } QPixmap ColourDatabase::getExamplePixmap(int index, QSize size) const { QPixmap pmap(size); pmap.fill(useDarkBackground(index) ? Qt::black : Qt::white); QPainter paint(&pmap); QColor colour(getColour(index)); paint.setPen(colour); paint.setBrush(colour); int margin = 2; if (size.width() < 4 || size.height() < 4) margin = 0; else if (size.width() < 8 || size.height() < 8) margin = 1; paint.drawRect(margin, margin, size.width() - margin*2 - 1, size.height() - margin*2 - 1); return pmap; } sonic-visualiser-2.3~repack1.orig/svgui/layer/SliceLayer.cpp0000644000175000017500000005757012252354725022761 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "SliceLayer.h" #include "view/View.h" #include "base/AudioLevel.h" #include "base/RangeMapper.h" #include "base/RealTime.h" #include "ColourMapper.h" #include "ColourDatabase.h" #include "PaintAssistant.h" #include #include #include SliceLayer::SliceLayer() : m_sliceableModel(0), m_colourMap(0), m_energyScale(dBScale), m_samplingMode(SampleMean), m_plotStyle(PlotSteps), m_binScale(LinearBins), m_normalize(false), m_threshold(0.0), m_initialThreshold(0.0), m_gain(1.0), m_currentf0(0), m_currentf1(0) { } SliceLayer::~SliceLayer() { } void SliceLayer::setSliceableModel(const Model *model) { const DenseThreeDimensionalModel *sliceable = dynamic_cast(model); if (model && !sliceable) { cerr << "WARNING: SliceLayer::setSliceableModel(" << model << "): model is not a DenseThreeDimensionalModel" << endl; } if (m_sliceableModel == sliceable) return; m_sliceableModel = sliceable; connectSignals(m_sliceableModel); emit modelReplaced(); } void SliceLayer::sliceableModelReplaced(const Model *orig, const Model *replacement) { SVDEBUG << "SliceLayer::sliceableModelReplaced(" << orig << ", " << replacement << ")" << endl; if (orig == m_sliceableModel) { setSliceableModel (dynamic_cast(replacement)); } } void SliceLayer::modelAboutToBeDeleted(Model *m) { SVDEBUG << "SliceLayer::modelAboutToBeDeleted(" << m << ")" << endl; if (m == m_sliceableModel) { setSliceableModel(0); } } QString SliceLayer::getFeatureDescription(View *v, QPoint &p) const { int minbin, maxbin, range; return getFeatureDescription(v, p, true, minbin, maxbin, range); } QString SliceLayer::getFeatureDescription(View *v, QPoint &p, bool includeBinDescription, int &minbin, int &maxbin, int &range) const { minbin = 0; maxbin = 0; if (!m_sliceableModel) return ""; int xorigin = m_xorigins[v]; int w = v->width() - xorigin - 1; int mh = m_sliceableModel->getHeight(); minbin = getBinForX(p.x() - xorigin, mh, w); maxbin = getBinForX(p.x() - xorigin + 1, mh, w); if (minbin >= mh) minbin = mh - 1; if (maxbin >= mh) maxbin = mh - 1; if (minbin < 0) minbin = 0; if (maxbin < 0) maxbin = 0; int sampleRate = m_sliceableModel->getSampleRate(); size_t f0 = m_currentf0; size_t f1 = m_currentf1; RealTime rt0 = RealTime::frame2RealTime(f0, sampleRate); RealTime rt1 = RealTime::frame2RealTime(f1, sampleRate); range = f1 - f0 + 1; QString rtrangestr = QString("%1 s").arg((rt1 - rt0).toText().c_str()); if (includeBinDescription) { float minvalue = 0.f; if (minbin < int(m_values.size())) minvalue = m_values[minbin]; float maxvalue = minvalue; if (maxbin < int(m_values.size())) maxvalue = m_values[maxbin]; if (minvalue > maxvalue) std::swap(minvalue, maxvalue); QString binstr; if (maxbin != minbin) { binstr = tr("%1 - %2").arg(minbin+1).arg(maxbin+1); } else { binstr = QString("%1").arg(minbin+1); } QString valuestr; if (maxvalue != minvalue) { valuestr = tr("%1 - %2").arg(minvalue).arg(maxvalue); } else { valuestr = QString("%1").arg(minvalue); } QString description = tr("Time:\t%1 - %2\nRange:\t%3 samples (%4)\nBin:\t%5\n%6 value:\t%7") .arg(QString::fromStdString(rt0.toText(true))) .arg(QString::fromStdString(rt1.toText(true))) .arg(range) .arg(rtrangestr) .arg(binstr) .arg(m_samplingMode == NearestSample ? tr("First") : m_samplingMode == SampleMean ? tr("Mean") : tr("Peak")) .arg(valuestr); return description; } else { QString description = tr("Time:\t%1 - %2\nRange:\t%3 samples (%4)") .arg(QString::fromStdString(rt0.toText(true))) .arg(QString::fromStdString(rt1.toText(true))) .arg(range) .arg(rtrangestr); return description; } } float SliceLayer::getXForBin(int bin, int count, float w) const { float x = 0; switch (m_binScale) { case LinearBins: x = (float(w) * bin) / count; break; case LogBins: x = (float(w) * log10f(bin + 1)) / log10f(count + 1); break; case InvertedLogBins: x = w - (float(w) * log10f(count - bin - 1)) / log10f(count); break; } return x; } int SliceLayer::getBinForX(float x, int count, float w) const { int bin = 0; switch (m_binScale) { case LinearBins: bin = int((x * count) / w + 0.0001); break; case LogBins: bin = int(powf(10.f, (x * log10f(count + 1)) / w) - 1 + 0.0001); break; case InvertedLogBins: bin = count + 1 - int(powf(10.f, (log10f(count) * (w - x)) / float(w)) + 0.0001); break; } return bin; } float SliceLayer::getYForValue(float value, const View *v, float &norm) const { norm = 0.f; if (m_yorigins.find(v) == m_yorigins.end()) return 0; value *= m_gain; int yorigin = m_yorigins[v]; int h = m_heights[v]; float thresh = getThresholdDb(); float y = 0.f; if (h <= 0) return y; switch (m_energyScale) { case dBScale: { float db = thresh; if (value > 0.f) db = 10.f * log10f(fabsf(value)); if (db < thresh) db = thresh; norm = (db - thresh) / -thresh; y = yorigin - (float(h) * norm); break; } case MeterScale: y = AudioLevel::multiplier_to_preview(value, h); norm = float(y) / float(h); y = yorigin - y; break; case AbsoluteScale: value = fabsf(value); // and fall through default: norm = (value - m_threshold); if (norm < 0) norm = 0; y = yorigin - (float(h) * norm); break; } return y; } float SliceLayer::getValueForY(float y, const View *v) const { float value = 0.f; if (m_yorigins.find(v) == m_yorigins.end()) return value; int yorigin = m_yorigins[v]; int h = m_heights[v]; float thresh = getThresholdDb(); if (h <= 0) return value; y = yorigin - y; switch (m_energyScale) { case dBScale: { float db = ((y / h) * -thresh) + thresh; value = powf(10.f, db/10.f); break; } case MeterScale: value = AudioLevel::preview_to_multiplier(lrintf(y), h); break; default: value = y / h + m_threshold; } return value / m_gain; } void SliceLayer::paint(View *v, QPainter &paint, QRect rect) const { if (!m_sliceableModel || !m_sliceableModel->isOK() || !m_sliceableModel->isReady()) return; paint.save(); paint.setRenderHint(QPainter::Antialiasing, false); paint.setBrush(Qt::NoBrush); if (v->getViewManager() && v->getViewManager()->shouldShowScaleGuides()) { if (!m_scalePoints.empty()) { paint.setPen(QColor(240, 240, 240)); //!!! and dark background? for (size_t i = 0; i < m_scalePoints.size(); ++i) { paint.drawLine(0, m_scalePoints[i], rect.width(), m_scalePoints[i]); } } } paint.setPen(getBaseQColor()); int xorigin = getVerticalScaleWidth(v, true, paint) + 1; int w = v->width() - xorigin - 1; m_xorigins[v] = xorigin; // for use in getFeatureDescription int yorigin = v->height() - 20 - paint.fontMetrics().height() - 7; int h = yorigin - paint.fontMetrics().height() - 8; m_yorigins[v] = yorigin; // for getYForValue etc m_heights[v] = h; if (h <= 0) return; QPainterPath path; size_t mh = m_sliceableModel->getHeight(); int divisor = 0; m_values.clear(); for (size_t bin = 0; bin < mh; ++bin) { m_values.push_back(0.f); } size_t f0 = v->getCentreFrame(); int f0x = v->getXForFrame(f0); f0 = v->getFrameForX(f0x); size_t f1 = v->getFrameForX(f0x + 1); if (f1 > f0) --f1; // cerr << "centre frame " << v->getCentreFrame() << ", x " << f0x << ", f0 " << f0 << ", f1 " << f1 << endl; size_t res = m_sliceableModel->getResolution(); size_t col0 = f0 / res; size_t col1 = col0; if (m_samplingMode != NearestSample) col1 = f1 / res; f0 = col0 * res; f1 = (col1 + 1) * res - 1; // cerr << "resolution " << res << ", col0 " << col0 << ", col1 " << col1 << ", f0 " << f0 << ", f1 " << f1 << endl; m_currentf0 = f0; m_currentf1 = f1; BiasCurve curve; getBiasCurve(curve); size_t cs = curve.size(); for (size_t col = col0; col <= col1; ++col) { for (size_t bin = 0; bin < mh; ++bin) { float value = m_sliceableModel->getValueAt(col, bin); if (bin < cs) value *= curve[bin]; if (m_samplingMode == SamplePeak) { if (value > m_values[bin]) m_values[bin] = value; } else { m_values[bin] += value; } } ++divisor; } float max = 0.f; for (size_t bin = 0; bin < mh; ++bin) { if (m_samplingMode == SampleMean) m_values[bin] /= divisor; if (m_values[bin] > max) max = m_values[bin]; } if (max != 0.f && m_normalize) { for (size_t bin = 0; bin < mh; ++bin) { m_values[bin] /= max; } } float py = 0; float nx = xorigin; ColourMapper mapper(m_colourMap, 0, 1); for (size_t bin = 0; bin < mh; ++bin) { float x = nx; nx = xorigin + getXForBin(bin + 1, mh, w); float value = m_values[bin]; float norm = 0.f; float y = getYForValue(value, v, norm); if (m_plotStyle == PlotLines) { if (bin == 0) { path.moveTo(x, y); } else { path.lineTo(x, y); } } else if (m_plotStyle == PlotSteps) { if (bin == 0) { path.moveTo(x, y); } else { path.lineTo(x, y); } path.lineTo(nx, y); } else if (m_plotStyle == PlotBlocks) { path.moveTo(x, yorigin); path.lineTo(x, y); path.lineTo(nx, y); path.lineTo(nx, yorigin); path.lineTo(x, yorigin); } else if (m_plotStyle == PlotFilledBlocks) { paint.fillRect(QRectF(x, y, nx - x, yorigin - y), mapper.map(norm)); } py = y; } if (m_plotStyle != PlotFilledBlocks) { paint.drawPath(path); } paint.restore(); /* QPoint discard; if (v->getViewManager() && v->getViewManager()->shouldShowFrameCount() && v->shouldIlluminateLocalFeatures(this, discard)) { int sampleRate = m_sliceableModel->getSampleRate(); QString startText = QString("%1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime (f0, sampleRate).toText(true))) .arg(f0); QString endText = QString(" %1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime (f1, sampleRate).toText(true))) .arg(f1); QString durationText = QString("(%1 / %2) ") .arg(QString::fromStdString (RealTime::frame2RealTime (f1 - f0 + 1, sampleRate).toText(true))) .arg(f1 - f0 + 1); v->drawVisibleText (paint, xorigin + 5, paint.fontMetrics().ascent() + 5, startText, View::OutlinedText); v->drawVisibleText (paint, xorigin + 5, paint.fontMetrics().ascent() + paint.fontMetrics().height() + 10, endText, View::OutlinedText); v->drawVisibleText (paint, xorigin + 5, paint.fontMetrics().ascent() + 2*paint.fontMetrics().height() + 15, durationText, View::OutlinedText); } */ } int SliceLayer::getVerticalScaleWidth(View *, bool, QPainter &paint) const { if (m_energyScale == LinearScale || m_energyScale == AbsoluteScale) { return std::max(paint.fontMetrics().width("0.0") + 13, paint.fontMetrics().width("x10-10")); } else { return std::max(paint.fontMetrics().width(tr("0dB")), paint.fontMetrics().width(tr("-Inf"))) + 13; } } void SliceLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const { float thresh = m_threshold; if (m_energyScale != LinearScale && m_energyScale != AbsoluteScale) { thresh = AudioLevel::dB_to_multiplier(getThresholdDb()); } // int h = (rect.height() * 3) / 4; // int y = (rect.height() / 2) - (h / 2); int yorigin = v->height() - 20 - paint.fontMetrics().height() - 6; int h = yorigin - paint.fontMetrics().height() - 8; if (h < 0) return; QRect actual(rect.x(), rect.y() + yorigin - h, rect.width(), h); int mult = 1; PaintAssistant::paintVerticalLevelScale (paint, actual, thresh, 1.0 / m_gain, PaintAssistant::Scale(m_energyScale), mult, const_cast *>(&m_scalePoints)); if (mult != 1 && mult != 0) { int log = lrintf(log10f(mult)); QString a = tr("x10"); QString b = QString("%1").arg(-log); paint.drawText(3, 8 + paint.fontMetrics().ascent(), a); paint.drawText(3 + paint.fontMetrics().width(a), 3 + paint.fontMetrics().ascent(), b); } } Layer::PropertyList SliceLayer::getProperties() const { PropertyList list = SingleColourLayer::getProperties(); list.push_back("Bin Scale"); list.push_back("Plot Type"); list.push_back("Scale"); list.push_back("Normalize"); list.push_back("Threshold"); list.push_back("Gain"); return list; } QString SliceLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Plot Type") return tr("Plot Type"); if (name == "Scale") return tr("Scale"); if (name == "Normalize") return tr("Normalize"); if (name == "Threshold") return tr("Threshold"); if (name == "Gain") return tr("Gain"); if (name == "Sampling Mode") return tr("Sampling Mode"); if (name == "Bin Scale") return tr("Bin Scale"); return SingleColourLayer::getPropertyLabel(name); } QString SliceLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Normalize") return "normalise"; return ""; } Layer::PropertyType SliceLayer::getPropertyType(const PropertyName &name) const { if (name == "Gain") return RangeProperty; if (name == "Normalize") return ToggleProperty; if (name == "Threshold") return RangeProperty; if (name == "Plot Type") return ValueProperty; if (name == "Scale") return ValueProperty; if (name == "Sampling Mode") return ValueProperty; if (name == "Bin Scale") return ValueProperty; if (name == "Colour" && m_plotStyle == PlotFilledBlocks) return ValueProperty; return SingleColourLayer::getPropertyType(name); } QString SliceLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Scale" || name == "Normalize" || name == "Sampling Mode" || name == "Threshold" || name == "Gain") return tr("Scale"); if (name == "Plot Type" || name == "Bin Scale") return tr("Bins"); return SingleColourLayer::getPropertyGroupName(name); } int SliceLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Gain") { *min = -50; *max = 50; *deflt = 0; cerr << "gain is " << m_gain << ", mode is " << m_samplingMode << endl; val = lrint(log10(m_gain) * 20.0); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Threshold") { *min = -80; *max = 0; *deflt = lrintf(AudioLevel::multiplier_to_dB(m_initialThreshold)); if (*deflt < *min) *deflt = *min; if (*deflt > *max) *deflt = *max; val = lrintf(AudioLevel::multiplier_to_dB(m_threshold)); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Normalize") { val = (m_normalize ? 1 : 0); *deflt = 0; } else if (name == "Colour" && m_plotStyle == PlotFilledBlocks) { *min = 0; *max = ColourMapper::getColourMapCount() - 1; *deflt = 0; val = m_colourMap; } else if (name == "Scale") { *min = 0; *max = 3; *deflt = (int)dBScale; val = (int)m_energyScale; } else if (name == "Sampling Mode") { *min = 0; *max = 2; *deflt = (int)SampleMean; val = (int)m_samplingMode; } else if (name == "Plot Type") { *min = 0; *max = 3; *deflt = (int)PlotSteps; val = (int)m_plotStyle; } else if (name == "Bin Scale") { *min = 0; *max = 2; *deflt = (int)LinearBins; // *max = 1; // I don't think we really do want to offer inverted log val = (int)m_binScale; } else { val = SingleColourLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString SliceLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour" && m_plotStyle == PlotFilledBlocks) { return ColourMapper::getColourMapName(value); } if (name == "Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Meter"); case 2: return tr("Log"); case 3: return tr("Absolute"); } } if (name == "Sampling Mode") { switch (value) { default: case 0: return tr("Any"); case 1: return tr("Mean"); case 2: return tr("Peak"); } } if (name == "Plot Type") { switch (value) { default: case 0: return tr("Lines"); case 1: return tr("Steps"); case 2: return tr("Blocks"); case 3: return tr("Colours"); } } if (name == "Bin Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Log"); case 2: return tr("Rev Log"); } } return SingleColourLayer::getPropertyValueLabel(name, value); } RangeMapper * SliceLayer::getNewPropertyRangeMapper(const PropertyName &name) const { if (name == "Gain") { return new LinearRangeMapper(-50, 50, -25, 25, tr("dB")); } if (name == "Threshold") { return new LinearRangeMapper(-80, 0, -80, 0, tr("dB")); } return SingleColourLayer::getNewPropertyRangeMapper(name); } void SliceLayer::setProperty(const PropertyName &name, int value) { if (name == "Gain") { setGain(pow(10, float(value)/20.0)); } else if (name == "Threshold") { if (value == -80) setThreshold(0.0); else setThreshold(AudioLevel::dB_to_multiplier(value)); } else if (name == "Colour" && m_plotStyle == PlotFilledBlocks) { setFillColourMap(value); } else if (name == "Scale") { switch (value) { default: case 0: setEnergyScale(LinearScale); break; case 1: setEnergyScale(MeterScale); break; case 2: setEnergyScale(dBScale); break; case 3: setEnergyScale(AbsoluteScale); break; } } else if (name == "Plot Type") { setPlotStyle(PlotStyle(value)); } else if (name == "Sampling Mode") { switch (value) { default: case 0: setSamplingMode(NearestSample); break; case 1: setSamplingMode(SampleMean); break; case 2: setSamplingMode(SamplePeak); break; } } else if (name == "Bin Scale") { switch (value) { default: case 0: setBinScale(LinearBins); break; case 1: setBinScale(LogBins); break; case 2: setBinScale(InvertedLogBins); break; } } else if (name == "Normalize") { setNormalize(value ? true : false); } else { SingleColourLayer::setProperty(name, value); } } void SliceLayer::setFillColourMap(int map) { if (m_colourMap == map) return; m_colourMap = map; emit layerParametersChanged(); } void SliceLayer::setEnergyScale(EnergyScale scale) { if (m_energyScale == scale) return; m_energyScale = scale; emit layerParametersChanged(); } void SliceLayer::setSamplingMode(SamplingMode mode) { if (m_samplingMode == mode) return; m_samplingMode = mode; emit layerParametersChanged(); } void SliceLayer::setPlotStyle(PlotStyle style) { if (m_plotStyle == style) return; bool colourTypeChanged = (style == PlotFilledBlocks || m_plotStyle == PlotFilledBlocks); m_plotStyle = style; if (colourTypeChanged) { emit layerParameterRangesChanged(); } emit layerParametersChanged(); } void SliceLayer::setBinScale(BinScale scale) { if (m_binScale == scale) return; m_binScale = scale; emit layerParametersChanged(); } void SliceLayer::setNormalize(bool n) { if (m_normalize == n) return; m_normalize = n; emit layerParametersChanged(); } void SliceLayer::setThreshold(float thresh) { if (m_threshold == thresh) return; m_threshold = thresh; emit layerParametersChanged(); } void SliceLayer::setGain(float gain) { if (m_gain == gain) return; m_gain = gain; emit layerParametersChanged(); } float SliceLayer::getThresholdDb() const { if (m_threshold == 0.0) return -80.f; float db = AudioLevel::multiplier_to_dB(m_threshold); return db; } int SliceLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = false; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "Bright Blue" : "Blue")); } void SliceLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s; s += QString("colourScheme=\"%1\" " "energyScale=\"%2\" " "samplingMode=\"%3\" " "plotStyle=\"%4\" " "binScale=\"%5\" " "gain=\"%6\" " "threshold=\"%7\" " "normalize=\"%8\"") .arg(m_colourMap) .arg(m_energyScale) .arg(m_samplingMode) .arg(m_plotStyle) .arg(m_binScale) .arg(m_gain) .arg(m_threshold) .arg(m_normalize ? "true" : "false"); SingleColourLayer::toXml(stream, indent, extraAttributes + " " + s); } void SliceLayer::setProperties(const QXmlAttributes &attributes) { bool ok = false; SingleColourLayer::setProperties(attributes); EnergyScale scale = (EnergyScale) attributes.value("energyScale").toInt(&ok); if (ok) setEnergyScale(scale); SamplingMode mode = (SamplingMode) attributes.value("samplingMode").toInt(&ok); if (ok) setSamplingMode(mode); int colourMap = attributes.value("colourScheme").toInt(&ok); if (ok) setFillColourMap(colourMap); PlotStyle s = (PlotStyle) attributes.value("plotStyle").toInt(&ok); if (ok) setPlotStyle(s); BinScale b = (BinScale) attributes.value("binScale").toInt(&ok); if (ok) setBinScale(b); float gain = attributes.value("gain").toFloat(&ok); if (ok) setGain(gain); float threshold = attributes.value("threshold").toFloat(&ok); if (ok) setThreshold(threshold); bool normalize = (attributes.value("normalize").trimmed() == "true"); setNormalize(normalize); } bool SliceLayer::getValueExtents(float &, float &, bool &, QString &) const { return false; } sonic-visualiser-2.3~repack1.orig/svgui/layer/SpectrogramLayer.cpp0000644000175000017500000032035312252354725024200 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2009 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "SpectrogramLayer.h" #include "view/View.h" #include "base/Profiler.h" #include "base/AudioLevel.h" #include "base/Window.h" #include "base/Pitch.h" #include "base/Preferences.h" #include "base/RangeMapper.h" #include "base/LogRange.h" #include "widgets/CommandHistory.h" #include "ColourMapper.h" #include "ImageRegionFinder.h" #include "data/model/Dense3DModelPeakCache.h" #include "PianoScale.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifndef __GNUC__ #include #endif //#define DEBUG_SPECTROGRAM_REPAINT 1 SpectrogramLayer::SpectrogramLayer(Configuration config) : m_model(0), m_channel(0), m_windowSize(1024), m_windowType(HanningWindow), m_windowHopLevel(2), m_zeroPadLevel(0), m_fftSize(1024), m_gain(1.0), m_initialGain(1.0), m_threshold(0.0), m_initialThreshold(0.0), m_colourRotation(0), m_initialRotation(0), m_minFrequency(10), m_maxFrequency(8000), m_initialMaxFrequency(8000), m_colourScale(dBColourScale), m_colourMap(0), m_frequencyScale(LinearFrequencyScale), m_binDisplay(AllBins), m_normalizeColumns(false), m_normalizeVisibleArea(false), m_lastEmittedZoomStep(-1), m_synchronous(false), m_haveDetailedScale(false), m_lastPaintBlockWidth(0), m_updateTimer(0), m_candidateFillStartFrame(0), m_exiting(false), m_sliceableModel(0) { if (config == FullRangeDb) { m_initialMaxFrequency = 0; setMaxFrequency(0); } else if (config == MelodicRange) { setWindowSize(8192); setWindowHopLevel(4); m_initialMaxFrequency = 1500; setMaxFrequency(1500); setMinFrequency(40); setColourScale(LinearColourScale); setColourMap(ColourMapper::Sunset); setFrequencyScale(LogFrequencyScale); // setGain(20); } else if (config == MelodicPeaks) { setWindowSize(4096); setWindowHopLevel(5); m_initialMaxFrequency = 2000; setMaxFrequency(2000); setMinFrequency(40); setFrequencyScale(LogFrequencyScale); setColourScale(LinearColourScale); setBinDisplay(PeakFrequencies); setNormalizeColumns(true); } Preferences *prefs = Preferences::getInstance(); connect(prefs, SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); setWindowType(prefs->getWindowType()); initialisePalette(); } SpectrogramLayer::~SpectrogramLayer() { delete m_updateTimer; m_updateTimer = 0; invalidateFFTModels(); } void SpectrogramLayer::setModel(const DenseTimeValueModel *model) { // cerr << "SpectrogramLayer(" << this << "): setModel(" << model << ")" << endl; if (model == m_model) return; m_model = model; invalidateFFTModels(); if (!m_model || !m_model->isOK()) return; connectSignals(m_model); connect(m_model, SIGNAL(modelChanged()), this, SLOT(cacheInvalid())); connect(m_model, SIGNAL(modelChanged(size_t, size_t)), this, SLOT(cacheInvalid(size_t, size_t))); emit modelReplaced(); } Layer::PropertyList SpectrogramLayer::getProperties() const { PropertyList list; list.push_back("Colour"); list.push_back("Colour Scale"); list.push_back("Window Size"); list.push_back("Window Increment"); list.push_back("Normalize Columns"); list.push_back("Normalize Visible Area"); list.push_back("Bin Display"); list.push_back("Threshold"); list.push_back("Gain"); list.push_back("Colour Rotation"); // list.push_back("Min Frequency"); // list.push_back("Max Frequency"); list.push_back("Frequency Scale"); //// list.push_back("Zero Padding"); return list; } QString SpectrogramLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Colour") return tr("Colour"); if (name == "Colour Scale") return tr("Colour Scale"); if (name == "Window Size") return tr("Window Size"); if (name == "Window Increment") return tr("Window Overlap"); if (name == "Normalize Columns") return tr("Normalize Columns"); if (name == "Normalize Visible Area") return tr("Normalize Visible Area"); if (name == "Bin Display") return tr("Bin Display"); if (name == "Threshold") return tr("Threshold"); if (name == "Gain") return tr("Gain"); if (name == "Colour Rotation") return tr("Colour Rotation"); if (name == "Min Frequency") return tr("Min Frequency"); if (name == "Max Frequency") return tr("Max Frequency"); if (name == "Frequency Scale") return tr("Frequency Scale"); if (name == "Zero Padding") return tr("Smoothing"); return ""; } QString SpectrogramLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Normalize Columns") return "normalise-columns"; if (name == "Normalize Visible Area") return "normalise"; return ""; } Layer::PropertyType SpectrogramLayer::getPropertyType(const PropertyName &name) const { if (name == "Gain") return RangeProperty; if (name == "Colour Rotation") return RangeProperty; if (name == "Normalize Columns") return ToggleProperty; if (name == "Normalize Visible Area") return ToggleProperty; if (name == "Threshold") return RangeProperty; if (name == "Zero Padding") return ToggleProperty; return ValueProperty; } QString SpectrogramLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Bin Display" || name == "Frequency Scale") return tr("Bins"); if (name == "Window Size" || name == "Window Increment" || name == "Zero Padding") return tr("Window"); if (name == "Colour" || name == "Threshold" || name == "Colour Rotation") return tr("Colour"); if (name == "Normalize Columns" || name == "Normalize Visible Area" || name == "Gain" || name == "Colour Scale") return tr("Scale"); return QString(); } int SpectrogramLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Gain") { *min = -50; *max = 50; *deflt = lrintf(log10(m_initialGain) * 20.0);; if (*deflt < *min) *deflt = *min; if (*deflt > *max) *deflt = *max; val = lrintf(log10(m_gain) * 20.0); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Threshold") { *min = -50; *max = 0; *deflt = lrintf(AudioLevel::multiplier_to_dB(m_initialThreshold)); if (*deflt < *min) *deflt = *min; if (*deflt > *max) *deflt = *max; val = lrintf(AudioLevel::multiplier_to_dB(m_threshold)); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Colour Rotation") { *min = 0; *max = 256; *deflt = m_initialRotation; val = m_colourRotation; } else if (name == "Colour Scale") { *min = 0; *max = 4; *deflt = int(dBColourScale); val = (int)m_colourScale; } else if (name == "Colour") { *min = 0; *max = ColourMapper::getColourMapCount() - 1; *deflt = 0; val = m_colourMap; } else if (name == "Window Size") { *min = 0; *max = 10; *deflt = 5; val = 0; int ws = m_windowSize; while (ws > 32) { ws >>= 1; val ++; } } else if (name == "Window Increment") { *min = 0; *max = 5; *deflt = 2; val = m_windowHopLevel; } else if (name == "Zero Padding") { *min = 0; *max = 1; *deflt = 0; val = m_zeroPadLevel > 0 ? 1 : 0; } else if (name == "Min Frequency") { *min = 0; *max = 9; *deflt = 1; switch (m_minFrequency) { case 0: default: val = 0; break; case 10: val = 1; break; case 20: val = 2; break; case 40: val = 3; break; case 100: val = 4; break; case 250: val = 5; break; case 500: val = 6; break; case 1000: val = 7; break; case 4000: val = 8; break; case 10000: val = 9; break; } } else if (name == "Max Frequency") { *min = 0; *max = 9; *deflt = 6; switch (m_maxFrequency) { case 500: val = 0; break; case 1000: val = 1; break; case 1500: val = 2; break; case 2000: val = 3; break; case 4000: val = 4; break; case 6000: val = 5; break; case 8000: val = 6; break; case 12000: val = 7; break; case 16000: val = 8; break; default: val = 9; break; } } else if (name == "Frequency Scale") { *min = 0; *max = 1; *deflt = int(LinearFrequencyScale); val = (int)m_frequencyScale; } else if (name == "Bin Display") { *min = 0; *max = 2; *deflt = int(AllBins); val = (int)m_binDisplay; } else if (name == "Normalize Columns") { *deflt = 0; val = (m_normalizeColumns ? 1 : 0); } else if (name == "Normalize Visible Area") { *deflt = 0; val = (m_normalizeVisibleArea ? 1 : 0); } else { val = Layer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString SpectrogramLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour") { return ColourMapper::getColourMapName(value); } if (name == "Colour Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Meter"); case 2: return tr("dBV^2"); case 3: return tr("dBV"); case 4: return tr("Phase"); } } if (name == "Window Size") { return QString("%1").arg(32 << value); } if (name == "Window Increment") { switch (value) { default: case 0: return tr("None"); case 1: return tr("25 %"); case 2: return tr("50 %"); case 3: return tr("75 %"); case 4: return tr("87.5 %"); case 5: return tr("93.75 %"); } } if (name == "Zero Padding") { if (value == 0) return tr("None"); return QString("%1x").arg(value + 1); } if (name == "Min Frequency") { switch (value) { default: case 0: return tr("No min"); case 1: return tr("10 Hz"); case 2: return tr("20 Hz"); case 3: return tr("40 Hz"); case 4: return tr("100 Hz"); case 5: return tr("250 Hz"); case 6: return tr("500 Hz"); case 7: return tr("1 KHz"); case 8: return tr("4 KHz"); case 9: return tr("10 KHz"); } } if (name == "Max Frequency") { switch (value) { default: case 0: return tr("500 Hz"); case 1: return tr("1 KHz"); case 2: return tr("1.5 KHz"); case 3: return tr("2 KHz"); case 4: return tr("4 KHz"); case 5: return tr("6 KHz"); case 6: return tr("8 KHz"); case 7: return tr("12 KHz"); case 8: return tr("16 KHz"); case 9: return tr("No max"); } } if (name == "Frequency Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Log"); } } if (name == "Bin Display") { switch (value) { default: case 0: return tr("All Bins"); case 1: return tr("Peak Bins"); case 2: return tr("Frequencies"); } } return tr(""); } RangeMapper * SpectrogramLayer::getNewPropertyRangeMapper(const PropertyName &name) const { if (name == "Gain") { return new LinearRangeMapper(-50, 50, -25, 25, tr("dB")); } if (name == "Threshold") { return new LinearRangeMapper(-50, 0, -50, 0, tr("dB")); } return 0; } void SpectrogramLayer::setProperty(const PropertyName &name, int value) { if (name == "Gain") { setGain(pow(10, float(value)/20.0)); } else if (name == "Threshold") { if (value == -50) setThreshold(0.0); else setThreshold(AudioLevel::dB_to_multiplier(value)); } else if (name == "Colour Rotation") { setColourRotation(value); } else if (name == "Colour") { setColourMap(value); } else if (name == "Window Size") { setWindowSize(32 << value); } else if (name == "Window Increment") { setWindowHopLevel(value); } else if (name == "Zero Padding") { setZeroPadLevel(value > 0.1 ? 3 : 0); } else if (name == "Min Frequency") { switch (value) { default: case 0: setMinFrequency(0); break; case 1: setMinFrequency(10); break; case 2: setMinFrequency(20); break; case 3: setMinFrequency(40); break; case 4: setMinFrequency(100); break; case 5: setMinFrequency(250); break; case 6: setMinFrequency(500); break; case 7: setMinFrequency(1000); break; case 8: setMinFrequency(4000); break; case 9: setMinFrequency(10000); break; } int vs = getCurrentVerticalZoomStep(); if (vs != m_lastEmittedZoomStep) { emit verticalZoomChanged(); m_lastEmittedZoomStep = vs; } } else if (name == "Max Frequency") { switch (value) { case 0: setMaxFrequency(500); break; case 1: setMaxFrequency(1000); break; case 2: setMaxFrequency(1500); break; case 3: setMaxFrequency(2000); break; case 4: setMaxFrequency(4000); break; case 5: setMaxFrequency(6000); break; case 6: setMaxFrequency(8000); break; case 7: setMaxFrequency(12000); break; case 8: setMaxFrequency(16000); break; default: case 9: setMaxFrequency(0); break; } int vs = getCurrentVerticalZoomStep(); if (vs != m_lastEmittedZoomStep) { emit verticalZoomChanged(); m_lastEmittedZoomStep = vs; } } else if (name == "Colour Scale") { switch (value) { default: case 0: setColourScale(LinearColourScale); break; case 1: setColourScale(MeterColourScale); break; case 2: setColourScale(dBSquaredColourScale); break; case 3: setColourScale(dBColourScale); break; case 4: setColourScale(PhaseColourScale); break; } } else if (name == "Frequency Scale") { switch (value) { default: case 0: setFrequencyScale(LinearFrequencyScale); break; case 1: setFrequencyScale(LogFrequencyScale); break; } } else if (name == "Bin Display") { switch (value) { default: case 0: setBinDisplay(AllBins); break; case 1: setBinDisplay(PeakBins); break; case 2: setBinDisplay(PeakFrequencies); break; } } else if (name == "Normalize Columns") { setNormalizeColumns(value ? true : false); } else if (name == "Normalize Visible Area") { setNormalizeVisibleArea(value ? true : false); } } void SpectrogramLayer::invalidateImageCaches() { for (ViewImageCache::iterator i = m_imageCaches.begin(); i != m_imageCaches.end(); ++i) { i->second.validArea = QRect(); } } void SpectrogramLayer::invalidateImageCaches(size_t startFrame, size_t endFrame) { for (ViewImageCache::iterator i = m_imageCaches.begin(); i != m_imageCaches.end(); ++i) { //!!! when are views removed from the map? on setLayerDormant? const View *v = i->first; #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::invalidateImageCaches(" << startFrame << ", " << endFrame << "): view range is " << v->getStartFrame() << ", " << v->getEndFrame() << endl; cerr << "Valid area was: " << i->second.validArea.x() << ", " << i->second.validArea.y() << " " << i->second.validArea.width() << "x" << i->second.validArea.height() << endl; #endif if (long(startFrame) > v->getStartFrame()) { if (startFrame >= v->getEndFrame()) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Modified start frame is off right of view" << endl; #endif return; } int x = v->getXForFrame(startFrame); #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "clipping from 0 to " << x-1 << endl; #endif if (x > 1) { i->second.validArea &= QRect(0, 0, x-1, v->height()); } else { i->second.validArea = QRect(); } } else { if (long(endFrame) < v->getStartFrame()) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Modified end frame is off left of view" << endl; #endif return; } int x = v->getXForFrame(endFrame); #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "clipping from " << x+1 << " to " << v->width() << endl; #endif if (x < v->width()) { i->second.validArea &= QRect(x+1, 0, v->width()-(x+1), v->height()); } else { i->second.validArea = QRect(); } } #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Valid area is now: " << i->second.validArea.x() << ", " << i->second.validArea.y() << " " << i->second.validArea.width() << "x" << i->second.validArea.height() << endl; #endif } } void SpectrogramLayer::preferenceChanged(PropertyContainer::PropertyName name) { SVDEBUG << "SpectrogramLayer::preferenceChanged(" << name << ")" << endl; if (name == "Window Type") { setWindowType(Preferences::getInstance()->getWindowType()); return; } if (name == "Spectrogram Y Smoothing") { invalidateImageCaches(); invalidateMagnitudes(); emit layerParametersChanged(); } if (name == "Spectrogram X Smoothing") { invalidateImageCaches(); invalidateMagnitudes(); emit layerParametersChanged(); } if (name == "Tuning Frequency") { emit layerParametersChanged(); } } void SpectrogramLayer::setChannel(int ch) { if (m_channel == ch) return; invalidateImageCaches(); m_channel = ch; invalidateFFTModels(); emit layerParametersChanged(); } int SpectrogramLayer::getChannel() const { return m_channel; } void SpectrogramLayer::setWindowSize(size_t ws) { if (m_windowSize == ws) return; invalidateImageCaches(); m_windowSize = ws; m_fftSize = ws * (m_zeroPadLevel + 1); invalidateFFTModels(); emit layerParametersChanged(); } size_t SpectrogramLayer::getWindowSize() const { return m_windowSize; } void SpectrogramLayer::setWindowHopLevel(size_t v) { if (m_windowHopLevel == v) return; invalidateImageCaches(); m_windowHopLevel = v; invalidateFFTModels(); emit layerParametersChanged(); // fillCache(); } size_t SpectrogramLayer::getWindowHopLevel() const { return m_windowHopLevel; } void SpectrogramLayer::setZeroPadLevel(size_t v) { if (m_zeroPadLevel == v) return; invalidateImageCaches(); m_zeroPadLevel = v; m_fftSize = m_windowSize * (v + 1); invalidateFFTModels(); emit layerParametersChanged(); } size_t SpectrogramLayer::getZeroPadLevel() const { return m_zeroPadLevel; } void SpectrogramLayer::setWindowType(WindowType w) { if (m_windowType == w) return; invalidateImageCaches(); m_windowType = w; invalidateFFTModels(); emit layerParametersChanged(); } WindowType SpectrogramLayer::getWindowType() const { return m_windowType; } void SpectrogramLayer::setGain(float gain) { // SVDEBUG << "SpectrogramLayer::setGain(" << gain << ") (my gain is now " // << m_gain << ")" << endl; if (m_gain == gain) return; invalidateImageCaches(); m_gain = gain; emit layerParametersChanged(); } float SpectrogramLayer::getGain() const { return m_gain; } void SpectrogramLayer::setThreshold(float threshold) { if (m_threshold == threshold) return; invalidateImageCaches(); m_threshold = threshold; emit layerParametersChanged(); } float SpectrogramLayer::getThreshold() const { return m_threshold; } void SpectrogramLayer::setMinFrequency(size_t mf) { if (m_minFrequency == mf) return; // SVDEBUG << "SpectrogramLayer::setMinFrequency: " << mf << endl; invalidateImageCaches(); invalidateMagnitudes(); m_minFrequency = mf; emit layerParametersChanged(); } size_t SpectrogramLayer::getMinFrequency() const { return m_minFrequency; } void SpectrogramLayer::setMaxFrequency(size_t mf) { if (m_maxFrequency == mf) return; // SVDEBUG << "SpectrogramLayer::setMaxFrequency: " << mf << endl; invalidateImageCaches(); invalidateMagnitudes(); m_maxFrequency = mf; emit layerParametersChanged(); } size_t SpectrogramLayer::getMaxFrequency() const { return m_maxFrequency; } void SpectrogramLayer::setColourRotation(int r) { invalidateImageCaches(); if (r < 0) r = 0; if (r > 256) r = 256; int distance = r - m_colourRotation; if (distance != 0) { rotatePalette(-distance); m_colourRotation = r; } emit layerParametersChanged(); } void SpectrogramLayer::setColourScale(ColourScale colourScale) { if (m_colourScale == colourScale) return; invalidateImageCaches(); m_colourScale = colourScale; emit layerParametersChanged(); } SpectrogramLayer::ColourScale SpectrogramLayer::getColourScale() const { return m_colourScale; } void SpectrogramLayer::setColourMap(int map) { if (m_colourMap == map) return; invalidateImageCaches(); m_colourMap = map; initialisePalette(); emit layerParametersChanged(); } int SpectrogramLayer::getColourMap() const { return m_colourMap; } void SpectrogramLayer::setFrequencyScale(FrequencyScale frequencyScale) { if (m_frequencyScale == frequencyScale) return; invalidateImageCaches(); m_frequencyScale = frequencyScale; emit layerParametersChanged(); } SpectrogramLayer::FrequencyScale SpectrogramLayer::getFrequencyScale() const { return m_frequencyScale; } void SpectrogramLayer::setBinDisplay(BinDisplay binDisplay) { if (m_binDisplay == binDisplay) return; invalidateImageCaches(); m_binDisplay = binDisplay; emit layerParametersChanged(); } SpectrogramLayer::BinDisplay SpectrogramLayer::getBinDisplay() const { return m_binDisplay; } void SpectrogramLayer::setNormalizeColumns(bool n) { if (m_normalizeColumns == n) return; invalidateImageCaches(); invalidateMagnitudes(); m_normalizeColumns = n; emit layerParametersChanged(); } bool SpectrogramLayer::getNormalizeColumns() const { return m_normalizeColumns; } void SpectrogramLayer::setNormalizeVisibleArea(bool n) { SVDEBUG << "SpectrogramLayer::setNormalizeVisibleArea(" << n << ") (from " << m_normalizeVisibleArea << ")" << endl; if (m_normalizeVisibleArea == n) return; invalidateImageCaches(); invalidateMagnitudes(); m_normalizeVisibleArea = n; emit layerParametersChanged(); } bool SpectrogramLayer::getNormalizeVisibleArea() const { return m_normalizeVisibleArea; } void SpectrogramLayer::setLayerDormant(const View *v, bool dormant) { if (dormant) { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::setLayerDormant(" << dormant << ")" << endl; #endif if (isLayerDormant(v)) { return; } Layer::setLayerDormant(v, true); invalidateImageCaches(); m_imageCaches.erase(v); if (m_fftModels.find(v) != m_fftModels.end()) { if (m_sliceableModel == m_fftModels[v].first) { bool replaced = false; for (ViewFFTMap::iterator i = m_fftModels.begin(); i != m_fftModels.end(); ++i) { if (i->second.first != m_sliceableModel) { emit sliceableModelReplaced(m_sliceableModel, i->second.first); replaced = true; break; } } if (!replaced) emit sliceableModelReplaced(m_sliceableModel, 0); } delete m_fftModels[v].first; m_fftModels.erase(v); delete m_peakCaches[v]; m_peakCaches.erase(v); } } else { Layer::setLayerDormant(v, false); } } void SpectrogramLayer::cacheInvalid() { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::cacheInvalid()" << endl; #endif invalidateImageCaches(); invalidateMagnitudes(); } void SpectrogramLayer::cacheInvalid(size_t from, size_t to) { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::cacheInvalid(" << from << ", " << to << ")" << endl; #endif invalidateImageCaches(from, to); invalidateMagnitudes(); } void SpectrogramLayer::fillTimerTimedOut() { if (!m_model) return; bool allDone = true; #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::fillTimerTimedOut: have " << m_fftModels.size() << " FFT models associated with views" << endl; #endif for (ViewFFTMap::iterator i = m_fftModels.begin(); i != m_fftModels.end(); ++i) { const FFTModel *model = i->second.first; size_t lastFill = i->second.second; if (model) { size_t fill = model->getFillExtent(); #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::fillTimerTimedOut: extent for " << model << ": " << fill << ", last " << lastFill << ", total " << m_model->getEndFrame() << endl; #endif if (fill >= lastFill) { if (fill >= m_model->getEndFrame() && lastFill > 0) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "complete!" << endl; #endif invalidateImageCaches(); i->second.second = -1; emit modelChanged(); } else if (fill > lastFill) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: emitting modelChanged(" << lastFill << "," << fill << ")" << endl; #endif invalidateImageCaches(lastFill, fill); i->second.second = fill; emit modelChanged(lastFill, fill); } } else { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: going backwards, emitting modelChanged(" << m_model->getStartFrame() << "," << m_model->getEndFrame() << ")" << endl; #endif invalidateImageCaches(); i->second.second = fill; emit modelChanged(m_model->getStartFrame(), m_model->getEndFrame()); } if (i->second.second >= 0) { allDone = false; } } } if (allDone) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: all complete!" << endl; #endif delete m_updateTimer; m_updateTimer = 0; } } bool SpectrogramLayer::hasLightBackground() const { return ColourMapper(m_colourMap, 1.f, 255.f).hasLightBackground(); } void SpectrogramLayer::initialisePalette() { int formerRotation = m_colourRotation; if (m_colourMap == (int)ColourMapper::BlackOnWhite) { m_palette.setColour(NO_VALUE, Qt::white); } else { m_palette.setColour(NO_VALUE, Qt::black); } ColourMapper mapper(m_colourMap, 1.f, 255.f); for (int pixel = 1; pixel < 256; ++pixel) { m_palette.setColour(pixel, mapper.map(pixel)); } m_crosshairColour = mapper.getContrastingColour(); m_colourRotation = 0; rotatePalette(m_colourRotation - formerRotation); m_colourRotation = formerRotation; m_drawBuffer = QImage(); } void SpectrogramLayer::rotatePalette(int distance) { QColor newPixels[256]; newPixels[NO_VALUE] = m_palette.getColour(NO_VALUE); for (int pixel = 1; pixel < 256; ++pixel) { int target = pixel + distance; while (target < 1) target += 255; while (target > 255) target -= 255; newPixels[target] = m_palette.getColour(pixel); } for (int pixel = 0; pixel < 256; ++pixel) { m_palette.setColour(pixel, newPixels[pixel]); } m_drawBuffer = QImage(); } unsigned char SpectrogramLayer::getDisplayValue(View *v, float input) const { int value; float min = 0.f; float max = 1.f; if (m_normalizeVisibleArea) { min = m_viewMags[v].getMin(); max = m_viewMags[v].getMax(); } else if (!m_normalizeColumns) { if (m_colourScale == LinearColourScale //|| // m_colourScale == MeterColourScale) { ) { max = 0.1f; } } float thresh = -80.f; if (max == 0.f) max = 1.f; if (max == min) min = max - 0.0001f; switch (m_colourScale) { default: case LinearColourScale: value = int(((input - min) / (max - min)) * 255.f) + 1; break; case MeterColourScale: value = AudioLevel::multiplier_to_preview ((input - min) / (max - min), 254) + 1; break; case dBSquaredColourScale: input = ((input - min) * (input - min)) / ((max - min) * (max - min)); if (input > 0.f) { input = 10.f * log10f(input); } else { input = thresh; } if (min > 0.f) { thresh = 10.f * log10f(min * min); if (thresh < -80.f) thresh = -80.f; } input = (input - thresh) / (-thresh); if (input < 0.f) input = 0.f; if (input > 1.f) input = 1.f; value = int(input * 255.f) + 1; break; case dBColourScale: //!!! experiment with normalizing the visible area this way. //In any case, we need to have some indication of what the dB //scale is relative to. input = (input - min) / (max - min); if (input > 0.f) { input = 10.f * log10f(input); } else { input = thresh; } if (min > 0.f) { thresh = 10.f * log10f(min); if (thresh < -80.f) thresh = -80.f; } input = (input - thresh) / (-thresh); if (input < 0.f) input = 0.f; if (input > 1.f) input = 1.f; value = int(input * 255.f) + 1; break; case PhaseColourScale: value = int((input * 127.0 / M_PI) + 128); break; } if (value > UCHAR_MAX) value = UCHAR_MAX; if (value < 0) value = 0; return value; } float SpectrogramLayer::getInputForDisplayValue(unsigned char uc) const { //!!! unused int value = uc; float input; //!!! incorrect for normalizing visible area (and also out of date) switch (m_colourScale) { default: case LinearColourScale: input = float(value - 1) / 255.0 / (m_normalizeColumns ? 1 : 50); break; case MeterColourScale: input = AudioLevel::preview_to_multiplier(value - 1, 255) / (m_normalizeColumns ? 1.0 : 50.0); break; case dBSquaredColourScale: input = float(value - 1) / 255.0; input = (input * 80.0) - 80.0; input = powf(10.0, input) / 20.0; value = int(input); break; case dBColourScale: input = float(value - 1) / 255.0; input = (input * 80.0) - 80.0; input = powf(10.0, input) / 20.0; value = int(input); break; case PhaseColourScale: input = float(value - 128) * M_PI / 127.0; break; } return input; } float SpectrogramLayer::getEffectiveMinFrequency() const { int sr = m_model->getSampleRate(); float minf = float(sr) / m_fftSize; if (m_minFrequency > 0.0) { size_t minbin = size_t((double(m_minFrequency) * m_fftSize) / sr + 0.01); if (minbin < 1) minbin = 1; minf = minbin * sr / m_fftSize; } return minf; } float SpectrogramLayer::getEffectiveMaxFrequency() const { int sr = m_model->getSampleRate(); float maxf = float(sr) / 2; if (m_maxFrequency > 0.0) { size_t maxbin = size_t((double(m_maxFrequency) * m_fftSize) / sr + 0.1); if (maxbin > m_fftSize / 2) maxbin = m_fftSize / 2; maxf = maxbin * sr / m_fftSize; } return maxf; } bool SpectrogramLayer::getYBinRange(View *v, int y, float &q0, float &q1) const { Profiler profiler("SpectrogramLayer::getYBinRange"); int h = v->height(); if (y < 0 || y >= h) return false; int sr = m_model->getSampleRate(); float minf = getEffectiveMinFrequency(); float maxf = getEffectiveMaxFrequency(); bool logarithmic = (m_frequencyScale == LogFrequencyScale); q0 = v->getFrequencyForY(y, minf, maxf, logarithmic); q1 = v->getFrequencyForY(y - 1, minf, maxf, logarithmic); // Now map these on to ("proportions of") actual bins, using raw // FFT size (unsmoothed) q0 = (q0 * m_fftSize) / sr; q1 = (q1 * m_fftSize) / sr; return true; } bool SpectrogramLayer::getSmoothedYBinRange(View *v, int y, float &q0, float &q1) const { Profiler profiler("SpectrogramLayer::getSmoothedYBinRange"); int h = v->height(); if (y < 0 || y >= h) return false; int sr = m_model->getSampleRate(); float minf = getEffectiveMinFrequency(); float maxf = getEffectiveMaxFrequency(); bool logarithmic = (m_frequencyScale == LogFrequencyScale); q0 = v->getFrequencyForY(y, minf, maxf, logarithmic); q1 = v->getFrequencyForY(y - 1, minf, maxf, logarithmic); // Now map these on to ("proportions of") actual bins, using raw // FFT size (unsmoothed) q0 = (q0 * getFFTSize(v)) / sr; q1 = (q1 * getFFTSize(v)) / sr; return true; } bool SpectrogramLayer::getXBinRange(View *v, int x, float &s0, float &s1) const { size_t modelStart = m_model->getStartFrame(); size_t modelEnd = m_model->getEndFrame(); // Each pixel column covers an exact range of sample frames: int f0 = v->getFrameForX(x) - modelStart; int f1 = v->getFrameForX(x + 1) - modelStart - 1; if (f1 < int(modelStart) || f0 > int(modelEnd)) { return false; } // And that range may be drawn from a possibly non-integral // range of spectrogram windows: size_t windowIncrement = getWindowIncrement(); s0 = float(f0) / windowIncrement; s1 = float(f1) / windowIncrement; return true; } bool SpectrogramLayer::getXBinSourceRange(View *v, int x, RealTime &min, RealTime &max) const { float s0 = 0, s1 = 0; if (!getXBinRange(v, x, s0, s1)) return false; int s0i = int(s0 + 0.001); int s1i = int(s1); int windowIncrement = getWindowIncrement(); int w0 = s0i * windowIncrement - (m_windowSize - windowIncrement)/2; int w1 = s1i * windowIncrement + windowIncrement + (m_windowSize - windowIncrement)/2 - 1; min = RealTime::frame2RealTime(w0, m_model->getSampleRate()); max = RealTime::frame2RealTime(w1, m_model->getSampleRate()); return true; } bool SpectrogramLayer::getYBinSourceRange(View *v, int y, float &freqMin, float &freqMax) const { float q0 = 0, q1 = 0; if (!getYBinRange(v, y, q0, q1)) return false; int q0i = int(q0 + 0.001); int q1i = int(q1); int sr = m_model->getSampleRate(); for (int q = q0i; q <= q1i; ++q) { if (q == q0i) freqMin = (sr * q) / m_fftSize; if (q == q1i) freqMax = (sr * (q+1)) / m_fftSize; } return true; } bool SpectrogramLayer::getAdjustedYBinSourceRange(View *v, int x, int y, float &freqMin, float &freqMax, float &adjFreqMin, float &adjFreqMax) const { if (!m_model || !m_model->isOK() || !m_model->isReady()) { return false; } FFTModel *fft = getFFTModel(v); if (!fft) return false; float s0 = 0, s1 = 0; if (!getXBinRange(v, x, s0, s1)) return false; float q0 = 0, q1 = 0; if (!getYBinRange(v, y, q0, q1)) return false; int s0i = int(s0 + 0.001); int s1i = int(s1); int q0i = int(q0 + 0.001); int q1i = int(q1); int sr = m_model->getSampleRate(); size_t windowSize = m_windowSize; size_t windowIncrement = getWindowIncrement(); bool haveAdj = false; bool peaksOnly = (m_binDisplay == PeakBins || m_binDisplay == PeakFrequencies); for (int q = q0i; q <= q1i; ++q) { for (int s = s0i; s <= s1i; ++s) { if (!fft->isColumnAvailable(s)) continue; float binfreq = (sr * q) / m_windowSize; if (q == q0i) freqMin = binfreq; if (q == q1i) freqMax = binfreq; if (peaksOnly && !fft->isLocalPeak(s, q)) continue; if (!fft->isOverThreshold(s, q, m_threshold * (m_fftSize/2))) continue; float freq = binfreq; bool steady = false; if (s < int(fft->getWidth()) - 1) { fft->estimateStableFrequency(s, q, freq); if (!haveAdj || freq < adjFreqMin) adjFreqMin = freq; if (!haveAdj || freq > adjFreqMax) adjFreqMax = freq; haveAdj = true; } } } if (!haveAdj) { adjFreqMin = adjFreqMax = 0.0; } return haveAdj; } bool SpectrogramLayer::getXYBinSourceRange(View *v, int x, int y, float &min, float &max, float &phaseMin, float &phaseMax) const { if (!m_model || !m_model->isOK() || !m_model->isReady()) { return false; } float q0 = 0, q1 = 0; if (!getYBinRange(v, y, q0, q1)) return false; float s0 = 0, s1 = 0; if (!getXBinRange(v, x, s0, s1)) return false; int q0i = int(q0 + 0.001); int q1i = int(q1); int s0i = int(s0 + 0.001); int s1i = int(s1); bool rv = false; size_t zp = getZeroPadLevel(v); q0i *= zp + 1; q1i *= zp + 1; FFTModel *fft = getFFTModel(v); if (fft) { int cw = fft->getWidth(); int ch = fft->getHeight(); min = 0.0; max = 0.0; phaseMin = 0.0; phaseMax = 0.0; bool have = false; for (int q = q0i; q <= q1i; ++q) { for (int s = s0i; s <= s1i; ++s) { if (s >= 0 && q >= 0 && s < cw && q < ch) { if (!fft->isColumnAvailable(s)) continue; float value; value = fft->getPhaseAt(s, q); if (!have || value < phaseMin) { phaseMin = value; } if (!have || value > phaseMax) { phaseMax = value; } value = fft->getMagnitudeAt(s, q) / (m_fftSize/2); if (!have || value < min) { min = value; } if (!have || value > max) { max = value; } have = true; } } } if (have) { rv = true; } } return rv; } size_t SpectrogramLayer::getZeroPadLevel(const View *v) const { //!!! tidy all this stuff if (m_binDisplay != AllBins) return 0; Preferences::SpectrogramSmoothing smoothing = Preferences::getInstance()->getSpectrogramSmoothing(); if (smoothing == Preferences::NoSpectrogramSmoothing || smoothing == Preferences::SpectrogramInterpolated) return 0; if (m_frequencyScale == LogFrequencyScale) return 3; int sr = m_model->getSampleRate(); size_t maxbin = m_fftSize / 2; if (m_maxFrequency > 0) { maxbin = int((double(m_maxFrequency) * m_fftSize) / sr + 0.1); if (maxbin > m_fftSize / 2) maxbin = m_fftSize / 2; } size_t minbin = 1; if (m_minFrequency > 0) { minbin = int((double(m_minFrequency) * m_fftSize) / sr + 0.1); if (minbin < 1) minbin = 1; if (minbin >= maxbin) minbin = maxbin - 1; } float perPixel = float(v->height()) / float((maxbin - minbin) / (m_zeroPadLevel + 1)); if (perPixel > 2.8) { return 3; // 4x oversampling } else if (perPixel > 1.5) { return 1; // 2x } else { return 0; // 1x } } size_t SpectrogramLayer::getFFTSize(const View *v) const { return m_fftSize * (getZeroPadLevel(v) + 1); } FFTModel * SpectrogramLayer::getFFTModel(const View *v) const { if (!m_model) return 0; size_t fftSize = getFFTSize(v); if (m_fftModels.find(v) != m_fftModels.end()) { if (m_fftModels[v].first == 0) { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::getFFTModel(" << v << "): Found null model" << endl; #endif return 0; } if (m_fftModels[v].first->getHeight() != fftSize / 2 + 1) { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::getFFTModel(" << v << "): Found a model with the wrong height (" << m_fftModels[v].first->getHeight() << ", wanted " << (fftSize / 2 + 1) << ")" << endl; #endif delete m_fftModels[v].first; m_fftModels.erase(v); delete m_peakCaches[v]; m_peakCaches.erase(v); } else { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::getFFTModel(" << v << "): Found a good model of height " << m_fftModels[v].first->getHeight() << endl; #endif return m_fftModels[v].first; } } if (m_fftModels.find(v) == m_fftModels.end()) { FFTModel *model = new FFTModel(m_model, m_channel, m_windowType, m_windowSize, getWindowIncrement(), fftSize, true, // polar StorageAdviser::SpeedCritical, m_candidateFillStartFrame); if (!model->isOK()) { QMessageBox::critical (0, tr("FFT cache failed"), tr("Failed to create the FFT model for this spectrogram.\n" "There may be insufficient memory or disc space to continue.")); delete model; m_fftModels[v] = FFTFillPair(0, 0); return 0; } if (!m_sliceableModel) { #ifdef DEBUG_SPECTROGRAM cerr << "SpectrogramLayer: emitting sliceableModelReplaced(0, " << model << ")" << endl; #endif ((SpectrogramLayer *)this)->sliceableModelReplaced(0, model); m_sliceableModel = model; } m_fftModels[v] = FFTFillPair(model, 0); model->resume(); delete m_updateTimer; m_updateTimer = new QTimer((SpectrogramLayer *)this); connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(fillTimerTimedOut())); m_updateTimer->start(200); } return m_fftModels[v].first; } Dense3DModelPeakCache * SpectrogramLayer::getPeakCache(const View *v) const { if (!m_peakCaches[v]) { FFTModel *f = getFFTModel(v); if (!f) return 0; m_peakCaches[v] = new Dense3DModelPeakCache(f, 8); } return m_peakCaches[v]; } const Model * SpectrogramLayer::getSliceableModel() const { if (m_sliceableModel) return m_sliceableModel; if (m_fftModels.empty()) return 0; m_sliceableModel = m_fftModels.begin()->second.first; return m_sliceableModel; } void SpectrogramLayer::invalidateFFTModels() { for (ViewFFTMap::iterator i = m_fftModels.begin(); i != m_fftModels.end(); ++i) { delete i->second.first; } for (PeakCacheMap::iterator i = m_peakCaches.begin(); i != m_peakCaches.end(); ++i) { delete i->second; } m_fftModels.clear(); m_peakCaches.clear(); if (m_sliceableModel) { cerr << "SpectrogramLayer: emitting sliceableModelReplaced(" << m_sliceableModel << ", 0)" << endl; emit sliceableModelReplaced(m_sliceableModel, 0); m_sliceableModel = 0; } } void SpectrogramLayer::invalidateMagnitudes() { m_viewMags.clear(); for (std::vector::iterator i = m_columnMags.begin(); i != m_columnMags.end(); ++i) { *i = MagnitudeRange(); } } bool SpectrogramLayer::updateViewMagnitudes(View *v) const { MagnitudeRange mag; int x0 = 0, x1 = v->width(); float s00 = 0, s01 = 0, s10 = 0, s11 = 0; if (!getXBinRange(v, x0, s00, s01)) { s00 = s01 = m_model->getStartFrame() / getWindowIncrement(); } if (!getXBinRange(v, x1, s10, s11)) { s10 = s11 = m_model->getEndFrame() / getWindowIncrement(); } int s0 = int(std::min(s00, s10) + 0.0001); int s1 = int(std::max(s01, s11) + 0.0001); // SVDEBUG << "SpectrogramLayer::updateViewMagnitudes: x0 = " << x0 << ", x1 = " << x1 << ", s00 = " << s00 << ", s11 = " << s11 << " s0 = " << s0 << ", s1 = " << s1 << endl; if (int(m_columnMags.size()) <= s1) { m_columnMags.resize(s1 + 1); } for (int s = s0; s <= s1; ++s) { if (m_columnMags[s].isSet()) { mag.sample(m_columnMags[s]); } } #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::updateViewMagnitudes returning from cols " << s0 << " -> " << s1 << " inclusive" << endl; #endif if (!mag.isSet()) return false; if (mag == m_viewMags[v]) return false; m_viewMags[v] = mag; return true; } void SpectrogramLayer::setSynchronousPainting(bool synchronous) { m_synchronous = synchronous; } void SpectrogramLayer::paint(View *v, QPainter &paint, QRect rect) const { // What a lovely, old-fashioned function this is. // It's practically FORTRAN 77 in its clarity and linearity. Profiler profiler("SpectrogramLayer::paint", false); #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::paint(): m_model is " << m_model << ", zoom level is " << v->getZoomLevel() << ", m_updateTimer " << m_updateTimer << endl; cerr << "rect is " << rect.x() << "," << rect.y() << " " << rect.width() << "x" << rect.height() << endl; #endif long startFrame = v->getStartFrame(); if (startFrame < 0) m_candidateFillStartFrame = 0; else m_candidateFillStartFrame = startFrame; if (!m_model || !m_model->isOK() || !m_model->isReady()) { return; } if (isLayerDormant(v)) { SVDEBUG << "SpectrogramLayer::paint(): Layer is dormant, making it undormant again" << endl; } // Need to do this even if !isLayerDormant, as that could mean v // is not in the dormancy map at all -- we need it to be present // and accountable for when determining whether we need the cache // in the cache-fill thread above. //!!! no longer use cache-fill thread const_cast(this)->Layer::setLayerDormant(v, false); size_t fftSize = getFFTSize(v); /* FFTModel *fft = getFFTModel(v); if (!fft) { cerr << "ERROR: SpectrogramLayer::paint(): No FFT model, returning" << endl; return; } */ ImageCache &cache = m_imageCaches[v]; #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::paint(): image cache valid area " << cache. validArea.x() << ", " << cache.validArea.y() << ", " << cache.validArea.width() << "x" << cache.validArea.height() << endl; #endif #ifdef DEBUG_SPECTROGRAM_REPAINT bool stillCacheing = (m_updateTimer != 0); SVDEBUG << "SpectrogramLayer::paint(): Still cacheing = " << stillCacheing << endl; #endif int zoomLevel = v->getZoomLevel(); int x0 = 0; int x1 = v->width(); bool recreateWholeImageCache = true; x0 = rect.left(); x1 = rect.right() + 1; /* float xPixelRatio = float(fft->getResolution()) / float(zoomLevel); cerr << "xPixelRatio = " << xPixelRatio << endl; if (xPixelRatio < 1.f) xPixelRatio = 1.f; */ if (cache.validArea.width() > 0) { int cw = cache.image.width(); int ch = cache.image.height(); if (int(cache.zoomLevel) == zoomLevel && cw == v->width() && ch == v->height()) { if (v->getXForFrame(cache.startFrame) == v->getXForFrame(startFrame) && cache.validArea.x() <= x0 && cache.validArea.x() + cache.validArea.width() >= x1) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: image cache good" << endl; #endif paint.drawImage(rect, cache.image, rect); //!!! // paint.drawImage(v->rect(), cache.image, // QRect(QPoint(0, 0), cache.image.size())); illuminateLocalFeatures(v, paint); return; } else { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: image cache partially OK" << endl; #endif recreateWholeImageCache = false; int dx = v->getXForFrame(cache.startFrame) - v->getXForFrame(startFrame); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: dx = " << dx << " (image cache " << cw << "x" << ch << ")" << endl; #endif if (dx != 0 && dx > -cw && dx < cw) { int dxp = dx; if (dxp < 0) dxp = -dxp; int copy = (cw - dxp) * sizeof(QRgb); for (int y = 0; y < ch; ++y) { QRgb *line = (QRgb *)cache.image.scanLine(y); if (dx < 0) { memmove(line, line + dxp, copy); } else { memmove(line + dxp, line, copy); } } int px = cache.validArea.x(); int pw = cache.validArea.width(); if (dx < 0) { x0 = cw + dx; x1 = cw; px += dx; if (px < 0) { pw += px; px = 0; if (pw < 0) pw = 0; } } else { x0 = 0; x1 = dx; px += dx; if (px + pw > cw) { pw = int(cw) - px; if (pw < 0) pw = 0; } } cache.validArea = QRect(px, cache.validArea.y(), pw, cache.validArea.height()); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "valid area now " << px << "," << cache.validArea.y() << " " << pw << "x" << cache.validArea.height() << endl; #endif /* paint.drawImage(rect & cache.validArea, cache.image, rect & cache.validArea); */ } else if (dx != 0) { // we scrolled too far to be of use #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "dx == " << dx << ": scrolled too far for cache to be useful" << endl; #endif cache.validArea = QRect(); recreateWholeImageCache = true; } } } else { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: image cache useless" << endl; if (int(cache.zoomLevel) != zoomLevel) { cerr << "(cache zoomLevel " << cache.zoomLevel << " != " << zoomLevel << ")" << endl; } if (cw != v->width()) { cerr << "(cache width " << cw << " != " << v->width(); } if (ch != v->height()) { cerr << "(cache height " << ch << " != " << v->height(); } #endif cache.validArea = QRect(); // recreateWholeImageCache = true; } } if (updateViewMagnitudes(v)) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "SpectrogramLayer: magnitude range changed to [" << m_viewMags[v].getMin() << "->" << m_viewMags[v].getMax() << "]" << endl; #endif if (m_normalizeVisibleArea) { cache.validArea = QRect(); recreateWholeImageCache = true; } } else { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "No change in magnitude range [" << m_viewMags[v].getMin() << "->" << m_viewMags[v].getMax() << "]" << endl; #endif } if (recreateWholeImageCache) { x0 = 0; x1 = v->width(); } struct timeval tv; (void)gettimeofday(&tv, 0); RealTime mainPaintStart = RealTime::fromTimeval(tv); int paintBlockWidth = m_lastPaintBlockWidth; if (m_synchronous) { if (paintBlockWidth < x1 - x0) { // always paint full width paintBlockWidth = x1 - x0; } } else { if (paintBlockWidth == 0) { paintBlockWidth = (300000 / zoomLevel); } else { RealTime lastTime = m_lastPaintTime; while (lastTime > RealTime::fromMilliseconds(200) && paintBlockWidth > 50) { paintBlockWidth /= 2; lastTime = lastTime / 2; } while (lastTime < RealTime::fromMilliseconds(90) && paintBlockWidth < 1500) { paintBlockWidth *= 2; lastTime = lastTime * 2; } } if (paintBlockWidth < 20) paintBlockWidth = 20; } #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "[" << this << "]: last paint width: " << m_lastPaintBlockWidth << ", last paint time: " << m_lastPaintTime << ", new paint width: " << paintBlockWidth << endl; #endif // We always paint the full height when refreshing the cache. // Smaller heights can be used when painting direct from cache // (further up in this function), but we want to ensure the cache // is coherent without having to worry about vertical matching of // required and valid areas as well as horizontal. int h = v->height(); if (cache.validArea.width() > 0) { // If part of the cache is known to be valid, select a strip // immediately to left or right of the valid part //!!! this really needs to be coordinated with the selection //!!! of m_drawBuffer boundaries in the bufferBinResolution //!!! case below int vx0 = 0, vx1 = 0; vx0 = cache.validArea.x(); vx1 = cache.validArea.x() + cache.validArea.width(); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "x0 " << x0 << ", x1 " << x1 << ", vx0 " << vx0 << ", vx1 " << vx1 << ", paintBlockWidth " << paintBlockWidth << endl; #endif if (x0 < vx0) { if (x0 + paintBlockWidth < vx0) { x0 = vx0 - paintBlockWidth; } x1 = vx0; } else if (x0 >= vx1) { x0 = vx1; if (x1 > x0 + paintBlockWidth) { x1 = x0 + paintBlockWidth; } } else { // x0 is within the valid area if (x1 > vx1) { x0 = vx1; if (x0 + paintBlockWidth < x1) { x1 = x0 + paintBlockWidth; } } else { x1 = x0; // it's all valid, paint nothing } } cache.validArea = QRect (std::min(vx0, x0), cache.validArea.y(), std::max(vx1 - std::min(vx0, x0), x1 - std::min(vx0, x0)), cache.validArea.height()); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Valid area becomes " << cache.validArea.x() << ", " << cache.validArea.y() << ", " << cache.validArea.width() << "x" << cache.validArea.height() << endl; #endif } else { if (x1 > x0 + paintBlockWidth) { int sfx = x1; if (startFrame < 0) sfx = v->getXForFrame(0); if (sfx >= x0 && sfx + paintBlockWidth <= x1) { x0 = sfx; x1 = x0 + paintBlockWidth; } else { int mid = (x1 + x0) / 2; x0 = mid - paintBlockWidth/2; x1 = x0 + paintBlockWidth; } } #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Valid area becomes " << x0 << ", 0, " << (x1-x0) << "x" << h << endl; #endif cache.validArea = QRect(x0, 0, x1 - x0, h); } /* if (xPixelRatio != 1.f) { x0 = int((int(x0 / xPixelRatio) - 4) * xPixelRatio + 0.0001); x1 = int((int(x1 / xPixelRatio) + 4) * xPixelRatio + 0.0001); } */ int w = x1 - x0; #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "x0 " << x0 << ", x1 " << x1 << ", w " << w << ", h " << h << endl; #endif int sr = m_model->getSampleRate(); // Set minFreq and maxFreq to the frequency extents of the possibly // zero-padded visible bin range, and displayMinFreq and displayMaxFreq // to the actual scale frequency extents (presumably not zero padded). // If we are zero padding, we want to use the zero-padded // equivalents of the bins that we would be using if not zero // padded, to avoid spaces at the top and bottom of the display. // Note fftSize is the actual zero-padded fft size, m_fftSize the // nominal fft size. size_t maxbin = m_fftSize / 2; if (m_maxFrequency > 0) { maxbin = int((double(m_maxFrequency) * m_fftSize) / sr + 0.001); if (maxbin > m_fftSize / 2) maxbin = m_fftSize / 2; } size_t minbin = 1; if (m_minFrequency > 0) { minbin = int((double(m_minFrequency) * m_fftSize) / sr + 0.001); // cerr << "m_minFrequency = " << m_minFrequency << " -> minbin = " << minbin << endl; if (minbin < 1) minbin = 1; if (minbin >= maxbin) minbin = maxbin - 1; } int zpl = getZeroPadLevel(v) + 1; minbin = minbin * zpl; maxbin = (maxbin + 1) * zpl - 1; float minFreq = (float(minbin) * sr) / fftSize; float maxFreq = (float(maxbin) * sr) / fftSize; float displayMinFreq = minFreq; float displayMaxFreq = maxFreq; if (fftSize != m_fftSize) { displayMinFreq = getEffectiveMinFrequency(); displayMaxFreq = getEffectiveMaxFrequency(); } // cerr << "(giving actual minFreq " << minFreq << " and display minFreq " << displayMinFreq << ")" << endl; int increment = getWindowIncrement(); bool logarithmic = (m_frequencyScale == LogFrequencyScale); /* float yforbin[maxbin - minbin + 1]; for (size_t q = minbin; q <= maxbin; ++q) { float f0 = (float(q) * sr) / fftSize; yforbin[q - minbin] = v->getYForFrequency(f0, displayMinFreq, displayMaxFreq, logarithmic); } */ MagnitudeRange overallMag = m_viewMags[v]; bool overallMagChanged = false; bool fftSuspended = false; #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << ((float(v->getFrameForX(1) - v->getFrameForX(0))) / increment) << " bin(s) per pixel" << endl; #endif bool runOutOfData = false; if (w == 0) { SVDEBUG << "*** NOTE: w == 0" << endl; } #ifdef DEBUG_SPECTROGRAM_REPAINT size_t pixels = 0; #endif Profiler outerprof("SpectrogramLayer::paint: all cols"); // The draw buffer contains a fragment at either our pixel // resolution (if there is more than one time-bin per pixel) or // time-bin resolution (if a time-bin spans more than one pixel). // We need to ensure that it starts and ends at points where a // time-bin boundary occurs at an exact pixel boundary, and with a // certain amount of overlap across existing pixels so that we can // scale and draw from it without smoothing errors at the edges. // If (getFrameForX(x) / increment) * increment == // getFrameForX(x), then x is a time-bin boundary. We want two // such boundaries at either side of the draw buffer -- one which // we draw up to, and one which we subsequently crop at. bool bufferBinResolution = false; if (increment > zoomLevel) bufferBinResolution = true; long leftBoundaryFrame = -1, leftCropFrame = -1; long rightBoundaryFrame = -1, rightCropFrame = -1; int bufwid; if (bufferBinResolution) { for (int x = x0; ; --x) { long f = v->getFrameForX(x); if ((f / increment) * increment == f) { if (leftCropFrame == -1) leftCropFrame = f; else if (x < x0 - 2) { leftBoundaryFrame = f; break; } } } for (int x = x0 + w; ; ++x) { long f = v->getFrameForX(x); if ((f / increment) * increment == f) { if (rightCropFrame == -1) rightCropFrame = f; else if (x > x0 + w + 2) { rightBoundaryFrame = f; break; } } } #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Left: crop: " << leftCropFrame << " (bin " << leftCropFrame/increment << "); boundary: " << leftBoundaryFrame << " (bin " << leftBoundaryFrame/increment << ")" << endl; cerr << "Right: crop: " << rightCropFrame << " (bin " << rightCropFrame/increment << "); boundary: " << rightBoundaryFrame << " (bin " << rightBoundaryFrame/increment << ")" << endl; #endif bufwid = (rightBoundaryFrame - leftBoundaryFrame) / increment; } else { bufwid = w; } #ifdef __GNUC__ int binforx[bufwid]; float binfory[h]; #else int *binforx = (int *)alloca(bufwid * sizeof(int)); float *binfory = (float *)alloca(h * sizeof(float)); #endif bool usePeaksCache = false; if (bufferBinResolution) { for (int x = 0; x < bufwid; ++x) { binforx[x] = (leftBoundaryFrame / increment) + x; // cerr << "binforx[" << x << "] = " << binforx[x] << endl; } m_drawBuffer = QImage(bufwid, h, QImage::Format_Indexed8); } else { for (int x = 0; x < bufwid; ++x) { float s0 = 0, s1 = 0; if (getXBinRange(v, x + x0, s0, s1)) { binforx[x] = int(s0 + 0.0001); } else { binforx[x] = -1; //??? } } if (m_drawBuffer.width() < bufwid || m_drawBuffer.height() < h) { m_drawBuffer = QImage(bufwid, h, QImage::Format_Indexed8); } usePeaksCache = (increment * 8) < zoomLevel; if (m_colourScale == PhaseColourScale) usePeaksCache = false; } // No longer exists in Qt5: m_drawBuffer.setNumColors(256); for (int pixel = 0; pixel < 256; ++pixel) { m_drawBuffer.setColor(pixel, m_palette.getColour(pixel).rgb()); } m_drawBuffer.fill(0); if (m_binDisplay != PeakFrequencies) { for (int y = 0; y < h; ++y) { float q0 = 0, q1 = 0; if (!getSmoothedYBinRange(v, h-y-1, q0, q1)) { binfory[y] = -1; } else { binfory[y] = q0; // cerr << "binfory[" << y << "] = " << binfory[y] << endl; } } paintDrawBuffer(v, bufwid, h, binforx, binfory, usePeaksCache, overallMag, overallMagChanged); } else { paintDrawBufferPeakFrequencies(v, bufwid, h, binforx, minbin, maxbin, displayMinFreq, displayMaxFreq, logarithmic, overallMag, overallMagChanged); } /* for (int x = 0; x < w / xPixelRatio; ++x) { Profiler innerprof("SpectrogramLayer::paint: 1 pixel column"); runOutOfData = !paintColumnValues(v, fft, x0, x, minbin, maxbin, displayMinFreq, displayMaxFreq, xPixelRatio, h, yforbin); if (runOutOfData) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Run out of data -- dropping out of loop" << endl; #endif break; } } */ #ifdef DEBUG_SPECTROGRAM_REPAINT // cerr << pixels << " pixels drawn" << endl; #endif if (overallMagChanged) { m_viewMags[v] = overallMag; #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Overall mag is now [" << m_viewMags[v].getMin() << "->" << m_viewMags[v].getMax() << "] - will be updating" << endl; #endif } else { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Overall mag unchanged at [" << m_viewMags[v].getMin() << "->" << m_viewMags[v].getMax() << "]" << endl; #endif } outerprof.end(); Profiler profiler2("SpectrogramLayer::paint: draw image"); if (recreateWholeImageCache) { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "Recreating image cache: width = " << v->width() << ", height = " << h << endl; #endif cache.image = QImage(v->width(), h, QImage::Format_ARGB32_Premultiplied); } if (w > 0) { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "Painting " << w << "x" << h << " from draw buffer at " << 0 << "," << 0 << " to " << w << "x" << h << " on cache at " << x0 << "," << 0 << endl; #endif QPainter cachePainter(&cache.image); if (bufferBinResolution) { int scaledLeft = v->getXForFrame(leftBoundaryFrame); int scaledRight = v->getXForFrame(rightBoundaryFrame); #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "Rescaling image from " << bufwid << "x" << h << " to " << scaledRight-scaledLeft << "x" << h << endl; #endif Preferences::SpectrogramXSmoothing xsmoothing = Preferences::getInstance()->getSpectrogramXSmoothing(); // SVDEBUG << "xsmoothing == " << xsmoothing << endl; QImage scaled = m_drawBuffer.scaled (scaledRight - scaledLeft, h, Qt::IgnoreAspectRatio, ((xsmoothing == Preferences::SpectrogramXInterpolated) ? Qt::SmoothTransformation : Qt::FastTransformation)); int scaledLeftCrop = v->getXForFrame(leftCropFrame); int scaledRightCrop = v->getXForFrame(rightCropFrame); #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "Drawing image region of width " << scaledRightCrop - scaledLeftCrop << " to " << scaledLeftCrop << " from " << scaledLeftCrop - scaledLeft << endl; #endif cachePainter.drawImage (QRect(scaledLeftCrop, 0, scaledRightCrop - scaledLeftCrop, h), scaled, QRect(scaledLeftCrop - scaledLeft, 0, scaledRightCrop - scaledLeftCrop, h)); } else { cachePainter.drawImage(QRect(x0, 0, w, h), m_drawBuffer, QRect(0, 0, w, h)); } cachePainter.end(); } QRect pr = rect & cache.validArea; #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "Painting " << pr.width() << "x" << pr.height() << " from cache at " << pr.x() << "," << pr.y() << " to window" << endl; #endif paint.drawImage(pr.x(), pr.y(), cache.image, pr.x(), pr.y(), pr.width(), pr.height()); //!!! // paint.drawImage(v->rect(), cache.image, // QRect(QPoint(0, 0), cache.image.size())); cache.startFrame = startFrame; cache.zoomLevel = zoomLevel; if (!m_synchronous) { if (!m_normalizeVisibleArea || !overallMagChanged) { if (cache.validArea.x() > 0) { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::paint() updating left (0, " << cache.validArea.x() << ")" << endl; #endif v->update(0, 0, cache.validArea.x(), h); } if (cache.validArea.x() + cache.validArea.width() < cache.image.width()) { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::paint() updating right (" << cache.validArea.x() + cache.validArea.width() << ", " << cache.image.width() - (cache.validArea.x() + cache.validArea.width()) << ")" << endl; #endif v->update(cache.validArea.x() + cache.validArea.width(), 0, cache.image.width() - (cache.validArea.x() + cache.validArea.width()), h); } } else { // overallMagChanged cerr << "\noverallMagChanged - updating all\n" << endl; cache.validArea = QRect(); v->update(); } } illuminateLocalFeatures(v, paint); #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::paint() returning" << endl; #endif if (!m_synchronous) { m_lastPaintBlockWidth = paintBlockWidth; (void)gettimeofday(&tv, 0); m_lastPaintTime = RealTime::fromTimeval(tv) - mainPaintStart; } //!!! if (fftSuspended) fft->resume(); } bool SpectrogramLayer::paintDrawBufferPeakFrequencies(View *v, int w, int h, int *binforx, int minbin, int maxbin, float displayMinFreq, float displayMaxFreq, bool logarithmic, MagnitudeRange &overallMag, bool &overallMagChanged) const { Profiler profiler("SpectrogramLayer::paintDrawBufferPeakFrequencies"); #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "minbin " << minbin << ", maxbin " << maxbin << "; w " << w << ", h " << h << endl; #endif if (minbin < 0) minbin = 0; if (maxbin < 0) maxbin = minbin+1; FFTModel *fft = getFFTModel(v); if (!fft) return false; FFTModel::PeakSet peakfreqs; int px = -1, psx = -1; #ifdef __GNUC__ float values[maxbin - minbin + 1]; #else float *values = (float *)alloca((maxbin - minbin + 1) * sizeof(float)); #endif for (int x = 0; x < w; ++x) { if (binforx[x] < 0) continue; float columnMax = 0.f; int sx0 = binforx[x]; int sx1 = sx0; if (x+1 < w) sx1 = binforx[x+1]; if (sx0 < 0) sx0 = sx1 - 1; if (sx0 < 0) continue; if (sx1 <= sx0) sx1 = sx0 + 1; for (int sx = sx0; sx < sx1; ++sx) { if (x == px && sx == psx) continue; if (sx < 0 || sx >= int(fft->getWidth())) continue; if (!m_synchronous) { if (!fft->isColumnAvailable(sx)) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Met unavailable column at col " << sx << endl; #endif return false; } } MagnitudeRange mag; if (sx != psx) { peakfreqs = fft->getPeakFrequencies(FFTModel::AllPeaks, sx, minbin, maxbin - 1); if (m_colourScale == PhaseColourScale) { fft->getPhasesAt(sx, values, minbin, maxbin - minbin + 1); } else if (m_normalizeColumns) { fft->getNormalizedMagnitudesAt(sx, values, minbin, maxbin - minbin + 1); } else { fft->getMagnitudesAt(sx, values, minbin, maxbin - minbin + 1); } psx = sx; } for (FFTModel::PeakSet::const_iterator pi = peakfreqs.begin(); pi != peakfreqs.end(); ++pi) { int bin = pi->first; int freq = pi->second; if (bin < minbin) continue; if (bin > maxbin) break; float value = values[bin - minbin]; if (m_colourScale != PhaseColourScale) { if (!m_normalizeColumns) { value /= (m_fftSize/2.f); } mag.sample(value); value *= m_gain; } float y = v->getYForFrequency (freq, displayMinFreq, displayMaxFreq, logarithmic); int iy = int(y + 0.5); if (iy < 0 || iy >= h) continue; m_drawBuffer.setPixel(x, iy, getDisplayValue(v, value)); } if (mag.isSet()) { if (sx >= int(m_columnMags.size())) { #ifdef DEBUG_SPECTROGRAM cerr << "INTERNAL ERROR: " << sx << " >= " << m_columnMags.size() << " at SpectrogramLayer.cpp::paintDrawBuffer" << endl; #endif } else { m_columnMags[sx].sample(mag); if (overallMag.sample(mag)) overallMagChanged = true; } } } } return true; } bool SpectrogramLayer::paintDrawBuffer(View *v, int w, int h, int *binforx, float *binfory, bool usePeaksCache, MagnitudeRange &overallMag, bool &overallMagChanged) const { Profiler profiler("SpectrogramLayer::paintDrawBuffer"); int minbin = int(binfory[0] + 0.0001); int maxbin = binfory[h-1]; #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "minbin " << minbin << ", maxbin " << maxbin << "; w " << w << ", h " << h << endl; #endif if (minbin < 0) minbin = 0; if (maxbin < 0) maxbin = minbin+1; DenseThreeDimensionalModel *sourceModel = 0; FFTModel *fft = 0; int divisor = 1; #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Note: bin display = " << m_binDisplay << ", w = " << w << ", binforx[" << w-1 << "] = " << binforx[w-1] << ", binforx[0] = " << binforx[0] << endl; #endif if (usePeaksCache) { //!!! sourceModel = getPeakCache(v); divisor = 8;//!!! minbin = 0; maxbin = sourceModel->getHeight(); } else { sourceModel = fft = getFFTModel(v); } if (!sourceModel) return false; bool interpolate = false; Preferences::SpectrogramSmoothing smoothing = Preferences::getInstance()->getSpectrogramSmoothing(); if (smoothing == Preferences::SpectrogramInterpolated || smoothing == Preferences::SpectrogramZeroPaddedAndInterpolated) { if (m_binDisplay != PeakBins && m_binDisplay != PeakFrequencies) { interpolate = true; } } int psx = -1; #ifdef __GNUC__ float autoarray[maxbin - minbin + 1]; float peaks[h]; #else float *autoarray = (float *)alloca((maxbin - minbin + 1) * sizeof(float)); float *peaks = (float *)alloca(h * sizeof(float)); #endif const float *values = autoarray; DenseThreeDimensionalModel::Column c; for (int x = 0; x < w; ++x) { if (binforx[x] < 0) continue; // float columnGain = m_gain; float columnMax = 0.f; int sx0 = binforx[x] / divisor; int sx1 = sx0; if (x+1 < w) sx1 = binforx[x+1] / divisor; if (sx0 < 0) sx0 = sx1 - 1; if (sx0 < 0) continue; if (sx1 <= sx0) sx1 = sx0 + 1; for (int y = 0; y < h; ++y) peaks[y] = 0.f; for (int sx = sx0; sx < sx1; ++sx) { #ifdef DEBUG_SPECTROGRAM_REPAINT // cerr << "sx = " << sx << endl; #endif if (sx < 0 || sx >= int(sourceModel->getWidth())) continue; if (!m_synchronous) { if (!sourceModel->isColumnAvailable(sx)) { #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "Met unavailable column at col " << sx << endl; #endif return false; } } MagnitudeRange mag; if (sx != psx) { if (fft) { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "Retrieving column " << sx << " from fft directly" << endl; #endif if (m_colourScale == PhaseColourScale) { fft->getPhasesAt(sx, autoarray, minbin, maxbin - minbin + 1); } else if (m_normalizeColumns) { fft->getNormalizedMagnitudesAt(sx, autoarray, minbin, maxbin - minbin + 1); } else { fft->getMagnitudesAt(sx, autoarray, minbin, maxbin - minbin + 1); } } else { #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "Retrieving column " << sx << " from peaks cache" << endl; #endif c = sourceModel->getColumn(sx); if (m_normalizeColumns) { for (int y = 0; y < h; ++y) { if (c[y] > columnMax) columnMax = c[y]; } } values = c.constData() + minbin; } psx = sx; } for (int y = 0; y < h; ++y) { float sy0 = binfory[y]; float sy1 = sy0 + 1; if (y+1 < h) sy1 = binfory[y+1]; float value = 0.f; if (interpolate && fabsf(sy1 - sy0) < 1.f) { float centre = (sy0 + sy1) / 2; float dist = (centre - 0.5) - lrintf(centre - 0.5); int bin = int(centre); int other = (dist < 0 ? (bin-1) : (bin+1)); if (bin < minbin) bin = minbin; if (bin > maxbin) bin = maxbin; if (other < minbin || other > maxbin) other = bin; float prop = 1.f - fabsf(dist); float v0 = values[bin - minbin]; float v1 = values[other - minbin]; if (m_binDisplay == PeakBins) { if (bin == minbin || bin == maxbin || v0 < values[bin-minbin-1] || v0 < values[bin-minbin+1]) v0 = 0.f; if (other == minbin || other == maxbin || v1 < values[other-minbin-1] || v1 < values[other-minbin+1]) v1 = 0.f; } if (v0 == 0.f && v1 == 0.f) continue; value = prop * v0 + (1.f - prop) * v1; if (m_colourScale != PhaseColourScale) { if (!m_normalizeColumns) { value /= (m_fftSize/2.f); } mag.sample(value); value *= m_gain; } peaks[y] = value; } else { int by0 = int(sy0 + 0.0001); int by1 = int(sy1 + 0.0001); if (by1 < by0 + 1) by1 = by0 + 1; for (int bin = by0; bin < by1; ++bin) { value = values[bin - minbin]; if (m_binDisplay == PeakBins) { if (bin == minbin || bin == maxbin || value < values[bin-minbin-1] || value < values[bin-minbin+1]) continue; } if (m_colourScale != PhaseColourScale) { if (!m_normalizeColumns) { value /= (m_fftSize/2.f); } mag.sample(value); value *= m_gain; } if (value > peaks[y]) peaks[y] = value; //!!! not right for phase! } } } if (mag.isSet()) { if (sx >= int(m_columnMags.size())) { #ifdef DEBUG_SPECTROGRAM cerr << "INTERNAL ERROR: " << sx << " >= " << m_columnMags.size() << " at SpectrogramLayer.cpp::paintDrawBuffer" << endl; #endif } else { m_columnMags[sx].sample(mag); if (overallMag.sample(mag)) overallMagChanged = true; } } } for (int y = 0; y < h; ++y) { float peak = peaks[y]; if (m_colourScale != PhaseColourScale && m_normalizeColumns && columnMax > 0.f) { peak /= columnMax; } unsigned char peakpix = getDisplayValue(v, peak); m_drawBuffer.setPixel(x, h-y-1, peakpix); } } return true; } void SpectrogramLayer::illuminateLocalFeatures(View *v, QPainter &paint) const { Profiler profiler("SpectrogramLayer::illuminateLocalFeatures"); QPoint localPos; if (!v->shouldIlluminateLocalFeatures(this, localPos) || !m_model) { return; } // cerr << "SpectrogramLayer: illuminateLocalFeatures(" // << localPos.x() << "," << localPos.y() << ")" << endl; float s0, s1; float f0, f1; if (getXBinRange(v, localPos.x(), s0, s1) && getYBinSourceRange(v, localPos.y(), f0, f1)) { int s0i = int(s0 + 0.001); int s1i = int(s1); int x0 = v->getXForFrame(s0i * getWindowIncrement()); int x1 = v->getXForFrame((s1i + 1) * getWindowIncrement()); int y1 = int(getYForFrequency(v, f1)); int y0 = int(getYForFrequency(v, f0)); // cerr << "SpectrogramLayer: illuminate " // << x0 << "," << y1 << " -> " << x1 << "," << y0 << endl; paint.setPen(v->getForeground()); //!!! should we be using paintCrosshairs for this? paint.drawRect(x0, y1, x1 - x0 + 1, y0 - y1 + 1); } } float SpectrogramLayer::getYForFrequency(const View *v, float frequency) const { return v->getYForFrequency(frequency, getEffectiveMinFrequency(), getEffectiveMaxFrequency(), m_frequencyScale == LogFrequencyScale); } float SpectrogramLayer::getFrequencyForY(const View *v, int y) const { return v->getFrequencyForY(y, getEffectiveMinFrequency(), getEffectiveMaxFrequency(), m_frequencyScale == LogFrequencyScale); } int SpectrogramLayer::getCompletion(View *v) const { if (m_updateTimer == 0) return 100; if (m_fftModels.find(v) == m_fftModels.end()) return 100; size_t completion = m_fftModels[v].first->getCompletion(); #ifdef DEBUG_SPECTROGRAM_REPAINT SVDEBUG << "SpectrogramLayer::getCompletion: completion = " << completion << endl; #endif return completion; } QString SpectrogramLayer::getError(View *v) const { if (m_fftModels.find(v) == m_fftModels.end()) return ""; return m_fftModels[v].first->getError(); } bool SpectrogramLayer::getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; int sr = m_model->getSampleRate(); min = float(sr) / m_fftSize; max = float(sr) / 2; logarithmic = (m_frequencyScale == LogFrequencyScale); unit = "Hz"; return true; } bool SpectrogramLayer::getDisplayExtents(float &min, float &max) const { min = getEffectiveMinFrequency(); max = getEffectiveMaxFrequency(); // SVDEBUG << "SpectrogramLayer::getDisplayExtents: " << min << "->" << max << endl; return true; } bool SpectrogramLayer::setDisplayExtents(float min, float max) { if (!m_model) return false; // SVDEBUG << "SpectrogramLayer::setDisplayExtents: " << min << "->" << max << endl; if (min < 0) min = 0; if (max > m_model->getSampleRate()/2) max = m_model->getSampleRate()/2; size_t minf = lrintf(min); size_t maxf = lrintf(max); if (m_minFrequency == minf && m_maxFrequency == maxf) return true; invalidateImageCaches(); invalidateMagnitudes(); m_minFrequency = minf; m_maxFrequency = maxf; emit layerParametersChanged(); int vs = getCurrentVerticalZoomStep(); if (vs != m_lastEmittedZoomStep) { emit verticalZoomChanged(); m_lastEmittedZoomStep = vs; } return true; } bool SpectrogramLayer::getYScaleValue(const View *v, int y, float &value, QString &unit) const { value = getFrequencyForY(v, y); unit = "Hz"; return true; } bool SpectrogramLayer::snapToFeatureFrame(View *, int &frame, size_t &resolution, SnapType snap) const { resolution = getWindowIncrement(); int left = (frame / resolution) * resolution; int right = left + resolution; switch (snap) { case SnapLeft: frame = left; break; case SnapRight: frame = right; break; case SnapNearest: case SnapNeighbouring: if (frame - left > right - frame) frame = right; else frame = left; break; } return true; } void SpectrogramLayer::measureDoubleClick(View *v, QMouseEvent *e) { ImageCache &cache = m_imageCaches[v]; cerr << "cache width: " << cache.image.width() << ", height: " << cache.image.height() << endl; QImage image = cache.image; ImageRegionFinder finder; QRect rect = finder.findRegionExtents(&image, e->pos()); if (rect.isValid()) { MeasureRect mr; setMeasureRectFromPixrect(v, mr, rect); CommandHistory::getInstance()->addCommand (new AddMeasurementRectCommand(this, mr)); } } bool SpectrogramLayer::getCrosshairExtents(View *v, QPainter &paint, QPoint cursorPos, std::vector &extents) const { QRect vertical(cursorPos.x() - 12, 0, 12, v->height()); extents.push_back(vertical); QRect horizontal(0, cursorPos.y(), cursorPos.x(), 1); extents.push_back(horizontal); int sw = getVerticalScaleWidth(v, m_haveDetailedScale, paint); QRect freq(sw, cursorPos.y() - paint.fontMetrics().ascent() - 2, paint.fontMetrics().width("123456 Hz") + 2, paint.fontMetrics().height()); extents.push_back(freq); QRect pitch(sw, cursorPos.y() + 2, paint.fontMetrics().width("C#10+50c") + 2, paint.fontMetrics().height()); extents.push_back(pitch); QRect rt(cursorPos.x(), v->height() - paint.fontMetrics().height() - 2, paint.fontMetrics().width("1234.567 s"), paint.fontMetrics().height()); extents.push_back(rt); int w(paint.fontMetrics().width("1234567890") + 2); QRect frame(cursorPos.x() - w - 2, v->height() - paint.fontMetrics().height() - 2, w, paint.fontMetrics().height()); extents.push_back(frame); return true; } void SpectrogramLayer::paintCrosshairs(View *v, QPainter &paint, QPoint cursorPos) const { paint.save(); int sw = getVerticalScaleWidth(v, m_haveDetailedScale, paint); QFont fn = paint.font(); if (fn.pointSize() > 8) { fn.setPointSize(fn.pointSize() - 1); paint.setFont(fn); } paint.setPen(m_crosshairColour); paint.drawLine(0, cursorPos.y(), cursorPos.x() - 1, cursorPos.y()); paint.drawLine(cursorPos.x(), 0, cursorPos.x(), v->height()); float fundamental = getFrequencyForY(v, cursorPos.y()); v->drawVisibleText(paint, sw + 2, cursorPos.y() - 2, QString("%1 Hz").arg(fundamental), View::OutlinedText); if (Pitch::isFrequencyInMidiRange(fundamental)) { QString pitchLabel = Pitch::getPitchLabelForFrequency(fundamental); v->drawVisibleText(paint, sw + 2, cursorPos.y() + paint.fontMetrics().ascent() + 2, pitchLabel, View::OutlinedText); } long frame = v->getFrameForX(cursorPos.x()); RealTime rt = RealTime::frame2RealTime(frame, m_model->getSampleRate()); QString rtLabel = QString("%1 s").arg(rt.toText(true).c_str()); QString frameLabel = QString("%1").arg(frame); v->drawVisibleText(paint, cursorPos.x() - paint.fontMetrics().width(frameLabel) - 2, v->height() - 2, frameLabel, View::OutlinedText); v->drawVisibleText(paint, cursorPos.x() + 2, v->height() - 2, rtLabel, View::OutlinedText); int harmonic = 2; while (harmonic < 100) { float hy = lrintf(getYForFrequency(v, fundamental * harmonic)); if (hy < 0 || hy > v->height()) break; int len = 7; if (harmonic % 2 == 0) { if (harmonic % 4 == 0) { len = 12; } else { len = 10; } } paint.drawLine(cursorPos.x() - len, int(hy), cursorPos.x(), int(hy)); ++harmonic; } paint.restore(); } QString SpectrogramLayer::getFeatureDescription(View *v, QPoint &pos) const { int x = pos.x(); int y = pos.y(); if (!m_model || !m_model->isOK()) return ""; float magMin = 0, magMax = 0; float phaseMin = 0, phaseMax = 0; float freqMin = 0, freqMax = 0; float adjFreqMin = 0, adjFreqMax = 0; QString pitchMin, pitchMax; RealTime rtMin, rtMax; bool haveValues = false; if (!getXBinSourceRange(v, x, rtMin, rtMax)) { return ""; } if (getXYBinSourceRange(v, x, y, magMin, magMax, phaseMin, phaseMax)) { haveValues = true; } QString adjFreqText = "", adjPitchText = ""; if (m_binDisplay == PeakFrequencies) { if (!getAdjustedYBinSourceRange(v, x, y, freqMin, freqMax, adjFreqMin, adjFreqMax)) { return ""; } if (adjFreqMin != adjFreqMax) { adjFreqText = tr("Peak Frequency:\t%1 - %2 Hz\n") .arg(adjFreqMin).arg(adjFreqMax); } else { adjFreqText = tr("Peak Frequency:\t%1 Hz\n") .arg(adjFreqMin); } QString pmin = Pitch::getPitchLabelForFrequency(adjFreqMin); QString pmax = Pitch::getPitchLabelForFrequency(adjFreqMax); if (pmin != pmax) { adjPitchText = tr("Peak Pitch:\t%3 - %4\n").arg(pmin).arg(pmax); } else { adjPitchText = tr("Peak Pitch:\t%2\n").arg(pmin); } } else { if (!getYBinSourceRange(v, y, freqMin, freqMax)) return ""; } QString text; if (rtMin != rtMax) { text += tr("Time:\t%1 - %2\n") .arg(rtMin.toText(true).c_str()) .arg(rtMax.toText(true).c_str()); } else { text += tr("Time:\t%1\n") .arg(rtMin.toText(true).c_str()); } if (freqMin != freqMax) { text += tr("%1Bin Frequency:\t%2 - %3 Hz\n%4Bin Pitch:\t%5 - %6\n") .arg(adjFreqText) .arg(freqMin) .arg(freqMax) .arg(adjPitchText) .arg(Pitch::getPitchLabelForFrequency(freqMin)) .arg(Pitch::getPitchLabelForFrequency(freqMax)); } else { text += tr("%1Bin Frequency:\t%2 Hz\n%3Bin Pitch:\t%4\n") .arg(adjFreqText) .arg(freqMin) .arg(adjPitchText) .arg(Pitch::getPitchLabelForFrequency(freqMin)); } if (haveValues) { float dbMin = AudioLevel::multiplier_to_dB(magMin); float dbMax = AudioLevel::multiplier_to_dB(magMax); QString dbMinString; QString dbMaxString; if (dbMin == AudioLevel::DB_FLOOR) { dbMinString = tr("-Inf"); } else { dbMinString = QString("%1").arg(lrintf(dbMin)); } if (dbMax == AudioLevel::DB_FLOOR) { dbMaxString = tr("-Inf"); } else { dbMaxString = QString("%1").arg(lrintf(dbMax)); } if (lrintf(dbMin) != lrintf(dbMax)) { text += tr("dB:\t%1 - %2").arg(dbMinString).arg(dbMaxString); } else { text += tr("dB:\t%1").arg(dbMinString); } if (phaseMin != phaseMax) { text += tr("\nPhase:\t%1 - %2").arg(phaseMin).arg(phaseMax); } else { text += tr("\nPhase:\t%1").arg(phaseMin); } } return text; } int SpectrogramLayer::getColourScaleWidth(QPainter &paint) const { int cw; cw = paint.fontMetrics().width("-80dB"); return cw; } int SpectrogramLayer::getVerticalScaleWidth(View *, bool detailed, QPainter &paint) const { if (!m_model || !m_model->isOK()) return 0; int cw = 0; if (detailed) cw = getColourScaleWidth(paint); int tw = paint.fontMetrics().width(QString("%1") .arg(m_maxFrequency > 0 ? m_maxFrequency - 1 : m_model->getSampleRate() / 2)); int fw = paint.fontMetrics().width(tr("43Hz")); if (tw < fw) tw = fw; int tickw = (m_frequencyScale == LogFrequencyScale ? 10 : 4); return cw + tickw + tw + 13; } void SpectrogramLayer::paintVerticalScale(View *v, bool detailed, QPainter &paint, QRect rect) const { if (!m_model || !m_model->isOK()) { return; } Profiler profiler("SpectrogramLayer::paintVerticalScale"); //!!! cache this? int h = rect.height(), w = rect.width(); int tickw = (m_frequencyScale == LogFrequencyScale ? 10 : 4); int pkw = (m_frequencyScale == LogFrequencyScale ? 10 : 0); size_t bins = m_fftSize / 2; int sr = m_model->getSampleRate(); if (m_maxFrequency > 0) { bins = int((double(m_maxFrequency) * m_fftSize) / sr + 0.1); if (bins > m_fftSize / 2) bins = m_fftSize / 2; } int cw = 0; if (detailed) cw = getColourScaleWidth(paint); int cbw = paint.fontMetrics().width("dB"); int py = -1; int textHeight = paint.fontMetrics().height(); int toff = -textHeight + paint.fontMetrics().ascent() + 2; if (detailed && (h > textHeight * 3 + 10)) { int topLines = 2; if (m_colourScale == PhaseColourScale) topLines = 1; int ch = h - textHeight * (topLines + 1) - 8; // paint.drawRect(4, textHeight + 4, cw - 1, ch + 1); paint.drawRect(4 + cw - cbw, textHeight * topLines + 4, cbw - 1, ch + 1); QString top, bottom; float min = m_viewMags[v].getMin(); float max = m_viewMags[v].getMax(); float dBmin = AudioLevel::multiplier_to_dB(min); float dBmax = AudioLevel::multiplier_to_dB(max); if (dBmax < -60.f) dBmax = -60.f; else top = QString("%1").arg(lrintf(dBmax)); if (dBmin < dBmax - 60.f) dBmin = dBmax - 60.f; bottom = QString("%1").arg(lrintf(dBmin)); //!!! & phase etc if (m_colourScale != PhaseColourScale) { paint.drawText((cw + 6 - paint.fontMetrics().width("dBFS")) / 2, 2 + textHeight + toff, "dBFS"); } // paint.drawText((cw + 6 - paint.fontMetrics().width(top)) / 2, paint.drawText(3 + cw - cbw - paint.fontMetrics().width(top), 2 + textHeight * topLines + toff + textHeight/2, top); paint.drawText(3 + cw - cbw - paint.fontMetrics().width(bottom), h + toff - 3 - textHeight/2, bottom); paint.save(); paint.setBrush(Qt::NoBrush); int lasty = 0; int lastdb = 0; for (int i = 0; i < ch; ++i) { float dBval = dBmin + (((dBmax - dBmin) * i) / (ch - 1)); int idb = int(dBval); float value = AudioLevel::dB_to_multiplier(dBval); int colour = getDisplayValue(v, value * m_gain); paint.setPen(m_palette.getColour(colour)); int y = textHeight * topLines + 4 + ch - i; paint.drawLine(5 + cw - cbw, y, cw + 2, y); if (i == 0) { lasty = y; lastdb = idb; } else if (i < ch - paint.fontMetrics().ascent() && idb != lastdb && ((abs(y - lasty) > textHeight && idb % 10 == 0) || (abs(y - lasty) > paint.fontMetrics().ascent() && idb % 5 == 0))) { paint.setPen(v->getBackground()); QString text = QString("%1").arg(idb); paint.drawText(3 + cw - cbw - paint.fontMetrics().width(text), y + toff + textHeight/2, text); paint.setPen(v->getForeground()); paint.drawLine(5 + cw - cbw, y, 8 + cw - cbw, y); lasty = y; lastdb = idb; } } paint.restore(); } paint.drawLine(cw + 7, 0, cw + 7, h); int bin = -1; for (int y = 0; y < v->height(); ++y) { float q0, q1; if (!getYBinRange(v, v->height() - y, q0, q1)) continue; int vy; if (int(q0) > bin) { vy = y; bin = int(q0); } else { continue; } int freq = (sr * bin) / m_fftSize; if (py >= 0 && (vy - py) < textHeight - 1) { if (m_frequencyScale == LinearFrequencyScale) { paint.drawLine(w - tickw, h - vy, w, h - vy); } continue; } QString text = QString("%1").arg(freq); if (bin == 1) text = tr("%1Hz").arg(freq); // bin 0 is DC paint.drawLine(cw + 7, h - vy, w - pkw - 1, h - vy); if (h - vy - textHeight >= -2) { int tx = w - 3 - paint.fontMetrics().width(text) - std::max(tickw, pkw); paint.drawText(tx, h - vy + toff, text); } py = vy; } if (m_frequencyScale == LogFrequencyScale) { // piano keyboard PianoScale().paintPianoVertical (v, paint, QRect(w - pkw - 1, 0, pkw, h), getEffectiveMinFrequency(), getEffectiveMaxFrequency()); } m_haveDetailedScale = detailed; } class SpectrogramRangeMapper : public RangeMapper { public: SpectrogramRangeMapper(int sr, int /* fftsize */) : m_dist(float(sr) / 2), m_s2(sqrtf(sqrtf(2))) { } ~SpectrogramRangeMapper() { } virtual int getPositionForValue(float value) const { float dist = m_dist; int n = 0; while (dist > (value + 0.00001) && dist > 0.1f) { dist /= m_s2; ++n; } return n; } virtual float getValueForPosition(int position) const { // Vertical zoom step 0 shows the entire range from DC -> // Nyquist frequency. Step 1 shows 2^(1/4) of the range of // step 0, and so on until the visible range is smaller than // the frequency step between bins at the current fft size. float dist = m_dist; int n = 0; while (n < position) { dist /= m_s2; ++n; } return dist; } virtual QString getUnit() const { return "Hz"; } protected: float m_dist; float m_s2; }; int SpectrogramLayer::getVerticalZoomSteps(int &defaultStep) const { if (!m_model) return 0; int sr = m_model->getSampleRate(); SpectrogramRangeMapper mapper(sr, m_fftSize); // int maxStep = mapper.getPositionForValue((float(sr) / m_fftSize) + 0.001); int maxStep = mapper.getPositionForValue(0); int minStep = mapper.getPositionForValue(float(sr) / 2); size_t initialMax = m_initialMaxFrequency; if (initialMax == 0) initialMax = sr / 2; defaultStep = mapper.getPositionForValue(initialMax) - minStep; // SVDEBUG << "SpectrogramLayer::getVerticalZoomSteps: " << maxStep - minStep << " (" << maxStep <<"-" << minStep << "), default is " << defaultStep << " (from initial max freq " << initialMax << ")" << endl; return maxStep - minStep; } int SpectrogramLayer::getCurrentVerticalZoomStep() const { if (!m_model) return 0; float dmin, dmax; getDisplayExtents(dmin, dmax); SpectrogramRangeMapper mapper(m_model->getSampleRate(), m_fftSize); int n = mapper.getPositionForValue(dmax - dmin); // SVDEBUG << "SpectrogramLayer::getCurrentVerticalZoomStep: " << n << endl; return n; } void SpectrogramLayer::setVerticalZoomStep(int step) { if (!m_model) return; float dmin = m_minFrequency, dmax = m_maxFrequency; // getDisplayExtents(dmin, dmax); // cerr << "current range " << dmin << " -> " << dmax << ", range " << dmax-dmin << ", mid " << (dmax + dmin)/2 << endl; int sr = m_model->getSampleRate(); SpectrogramRangeMapper mapper(sr, m_fftSize); float newdist = mapper.getValueForPosition(step); float newmin, newmax; if (m_frequencyScale == LogFrequencyScale) { // need to pick newmin and newmax such that // // (log(newmin) + log(newmax)) / 2 == logmid // and // newmax - newmin = newdist // // so log(newmax - newdist) + log(newmax) == 2logmid // log(newmax(newmax - newdist)) == 2logmid // newmax.newmax - newmax.newdist == exp(2logmid) // newmax^2 + (-newdist)newmax + -exp(2logmid) == 0 // quadratic with a = 1, b = -newdist, c = -exp(2logmid), all known // // positive root // newmax = (newdist + sqrt(newdist^2 + 4exp(2logmid))) / 2 // // but logmid = (log(dmin) + log(dmax)) / 2 // so exp(2logmid) = exp(log(dmin) + log(dmax)) // = exp(log(dmin.dmax)) // = dmin.dmax // so newmax = (newdist + sqrtf(newdist^2 + 4dmin.dmax)) / 2 newmax = (newdist + sqrtf(newdist*newdist + 4*dmin*dmax)) / 2; newmin = newmax - newdist; // cerr << "newmin = " << newmin << ", newmax = " << newmax << endl; } else { float dmid = (dmax + dmin) / 2; newmin = dmid - newdist / 2; newmax = dmid + newdist / 2; } float mmin, mmax; mmin = 0; mmax = float(sr) / 2; if (newmin < mmin) { newmax += (mmin - newmin); newmin = mmin; } if (newmax > mmax) { newmax = mmax; } // SVDEBUG << "SpectrogramLayer::setVerticalZoomStep: " << step << ": " << newmin << " -> " << newmax << " (range " << newdist << ")" << endl; setMinFrequency(lrintf(newmin)); setMaxFrequency(lrintf(newmax)); } RangeMapper * SpectrogramLayer::getNewVerticalZoomRangeMapper() const { if (!m_model) return 0; return new SpectrogramRangeMapper(m_model->getSampleRate(), m_fftSize); } void SpectrogramLayer::updateMeasureRectYCoords(View *v, const MeasureRect &r) const { int y0 = 0; if (r.startY > 0.0) y0 = getYForFrequency(v, r.startY); int y1 = y0; if (r.endY > 0.0) y1 = getYForFrequency(v, r.endY); // SVDEBUG << "SpectrogramLayer::updateMeasureRectYCoords: start " << r.startY << " -> " << y0 << ", end " << r.endY << " -> " << y1 << endl; r.pixrect = QRect(r.pixrect.x(), y0, r.pixrect.width(), y1 - y0); } void SpectrogramLayer::setMeasureRectYCoord(View *v, MeasureRect &r, bool start, int y) const { if (start) { r.startY = getFrequencyForY(v, y); r.endY = r.startY; } else { r.endY = getFrequencyForY(v, y); } // SVDEBUG << "SpectrogramLayer::setMeasureRectYCoord: start " << r.startY << " <- " << y << ", end " << r.endY << " <- " << y << endl; } void SpectrogramLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s; s += QString("channel=\"%1\" " "windowSize=\"%2\" " "windowHopLevel=\"%3\" " "gain=\"%4\" " "threshold=\"%5\" ") .arg(m_channel) .arg(m_windowSize) .arg(m_windowHopLevel) .arg(m_gain) .arg(m_threshold); s += QString("minFrequency=\"%1\" " "maxFrequency=\"%2\" " "colourScale=\"%3\" " "colourScheme=\"%4\" " "colourRotation=\"%5\" " "frequencyScale=\"%6\" " "binDisplay=\"%7\" " "normalizeColumns=\"%8\" " "normalizeVisibleArea=\"%9\"") .arg(m_minFrequency) .arg(m_maxFrequency) .arg(m_colourScale) .arg(m_colourMap) .arg(m_colourRotation) .arg(m_frequencyScale) .arg(m_binDisplay) .arg(m_normalizeColumns ? "true" : "false") .arg(m_normalizeVisibleArea ? "true" : "false"); Layer::toXml(stream, indent, extraAttributes + " " + s); } void SpectrogramLayer::setProperties(const QXmlAttributes &attributes) { bool ok = false; int channel = attributes.value("channel").toInt(&ok); if (ok) setChannel(channel); size_t windowSize = attributes.value("windowSize").toUInt(&ok); if (ok) setWindowSize(windowSize); size_t windowHopLevel = attributes.value("windowHopLevel").toUInt(&ok); if (ok) setWindowHopLevel(windowHopLevel); else { size_t windowOverlap = attributes.value("windowOverlap").toUInt(&ok); // a percentage value if (ok) { if (windowOverlap == 0) setWindowHopLevel(0); else if (windowOverlap == 25) setWindowHopLevel(1); else if (windowOverlap == 50) setWindowHopLevel(2); else if (windowOverlap == 75) setWindowHopLevel(3); else if (windowOverlap == 90) setWindowHopLevel(4); } } float gain = attributes.value("gain").toFloat(&ok); if (ok) setGain(gain); float threshold = attributes.value("threshold").toFloat(&ok); if (ok) setThreshold(threshold); size_t minFrequency = attributes.value("minFrequency").toUInt(&ok); if (ok) { SVDEBUG << "SpectrogramLayer::setProperties: setting min freq to " << minFrequency << endl; setMinFrequency(minFrequency); } size_t maxFrequency = attributes.value("maxFrequency").toUInt(&ok); if (ok) { SVDEBUG << "SpectrogramLayer::setProperties: setting max freq to " << maxFrequency << endl; setMaxFrequency(maxFrequency); } ColourScale colourScale = (ColourScale) attributes.value("colourScale").toInt(&ok); if (ok) setColourScale(colourScale); int colourMap = attributes.value("colourScheme").toInt(&ok); if (ok) setColourMap(colourMap); int colourRotation = attributes.value("colourRotation").toInt(&ok); if (ok) setColourRotation(colourRotation); FrequencyScale frequencyScale = (FrequencyScale) attributes.value("frequencyScale").toInt(&ok); if (ok) setFrequencyScale(frequencyScale); BinDisplay binDisplay = (BinDisplay) attributes.value("binDisplay").toInt(&ok); if (ok) setBinDisplay(binDisplay); bool normalizeColumns = (attributes.value("normalizeColumns").trimmed() == "true"); setNormalizeColumns(normalizeColumns); bool normalizeVisibleArea = (attributes.value("normalizeVisibleArea").trimmed() == "true"); setNormalizeVisibleArea(normalizeVisibleArea); } sonic-visualiser-2.3~repack1.orig/svgui/layer/SpectrumLayer.cpp0000644000175000017500000005542012252354725023514 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "SpectrumLayer.h" #include "data/model/FFTModel.h" #include "view/View.h" #include "base/AudioLevel.h" #include "base/Preferences.h" #include "base/RangeMapper.h" #include "base/Pitch.h" #include "ColourMapper.h" #include #include SpectrumLayer::SpectrumLayer() : m_originModel(0), m_channel(-1), m_channelSet(false), m_windowSize(4096), m_windowType(HanningWindow), m_windowHopLevel(3), m_showPeaks(false), m_newFFTNeeded(true) { Preferences *prefs = Preferences::getInstance(); connect(prefs, SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); setWindowType(prefs->getWindowType()); setBinScale(LogBins); } SpectrumLayer::~SpectrumLayer() { Model *m = const_cast (static_cast(m_sliceableModel)); if (m) m->aboutToDelete(); m_sliceableModel = 0; delete m; } void SpectrumLayer::setModel(DenseTimeValueModel *model) { SVDEBUG << "SpectrumLayer::setModel(" << model << ") from " << m_originModel << endl; if (m_originModel == model) return; m_originModel = model; if (m_sliceableModel) { Model *m = const_cast (static_cast(m_sliceableModel)); m->aboutToDelete(); setSliceableModel(0); delete m; } m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setChannel(int channel) { SVDEBUG << "SpectrumLayer::setChannel(" << channel << ") from " << m_channel << endl; m_channelSet = true; if (m_channel == channel) return; m_channel = channel; m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setupFFT() { if (m_sliceableModel) { Model *m = const_cast (static_cast(m_sliceableModel)); m->aboutToDelete(); setSliceableModel(0); delete m; } if (!m_originModel) { return; } FFTModel *newFFT = new FFTModel(m_originModel, m_channel, m_windowType, m_windowSize, getWindowIncrement(), m_windowSize, false, StorageAdviser::Criteria (StorageAdviser::SpeedCritical | StorageAdviser::FrequentLookupLikely)); setSliceableModel(newFFT); m_biasCurve.clear(); for (size_t i = 0; i < m_windowSize; ++i) { m_biasCurve.push_back(1.f / (float(m_windowSize)/2.f)); } newFFT->resume(); m_newFFTNeeded = false; } Layer::PropertyList SpectrumLayer::getProperties() const { PropertyList list = SliceLayer::getProperties(); list.push_back("Window Size"); list.push_back("Window Increment"); list.push_back("Show Peak Frequencies"); return list; } QString SpectrumLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Window Size") return tr("Window Size"); if (name == "Window Increment") return tr("Window Overlap"); if (name == "Show Peak Frequencies") return tr("Show Peak Frequencies"); return SliceLayer::getPropertyLabel(name); } QString SpectrumLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Show Peak Frequencies") return "show-peaks"; return SliceLayer::getPropertyIconName(name); } Layer::PropertyType SpectrumLayer::getPropertyType(const PropertyName &name) const { if (name == "Window Size") return ValueProperty; if (name == "Window Increment") return ValueProperty; if (name == "Show Peak Frequencies") return ToggleProperty; return SliceLayer::getPropertyType(name); } QString SpectrumLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Window Size" || name == "Window Increment") return tr("Window"); if (name == "Show Peak Frequencies") return tr("Bins"); return SliceLayer::getPropertyGroupName(name); } int SpectrumLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Window Size") { *min = 0; *max = 15; *deflt = 5; val = 0; int ws = m_windowSize; while (ws > 32) { ws >>= 1; val ++; } } else if (name == "Window Increment") { *min = 0; *max = 5; *deflt = 2; val = m_windowHopLevel; } else if (name == "Show Peak Frequencies") { return m_showPeaks ? 1 : 0; } else { val = SliceLayer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString SpectrumLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Window Size") { return QString("%1").arg(32 << value); } if (name == "Window Increment") { switch (value) { default: case 0: return tr("None"); case 1: return tr("25 %"); case 2: return tr("50 %"); case 3: return tr("75 %"); case 4: return tr("87.5 %"); case 5: return tr("93.75 %"); } } return SliceLayer::getPropertyValueLabel(name, value); } RangeMapper * SpectrumLayer::getNewPropertyRangeMapper(const PropertyName &name) const { return SliceLayer::getNewPropertyRangeMapper(name); } void SpectrumLayer::setProperty(const PropertyName &name, int value) { if (name == "Window Size") { setWindowSize(32 << value); } else if (name == "Window Increment") { setWindowHopLevel(value); } else if (name == "Show Peak Frequencies") { setShowPeaks(value ? true : false); } else { SliceLayer::setProperty(name, value); } } void SpectrumLayer::setWindowSize(size_t ws) { if (m_windowSize == ws) return; m_windowSize = ws; m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setWindowHopLevel(size_t v) { if (m_windowHopLevel == v) return; m_windowHopLevel = v; m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setWindowType(WindowType w) { if (m_windowType == w) return; m_windowType = w; m_newFFTNeeded = true; emit layerParametersChanged(); } void SpectrumLayer::setShowPeaks(bool show) { if (m_showPeaks == show) return; m_showPeaks = show; emit layerParametersChanged(); } void SpectrumLayer::preferenceChanged(PropertyContainer::PropertyName name) { if (name == "Window Type") { setWindowType(Preferences::getInstance()->getWindowType()); return; } } bool SpectrumLayer::getValueExtents(float &, float &, bool &, QString &) const { return false; } float SpectrumLayer::getXForBin(int bin, int totalBins, float w) const { if (!m_sliceableModel) return SliceLayer::getXForBin(bin, totalBins, w); float sampleRate = m_sliceableModel->getSampleRate(); float binfreq = (sampleRate * bin) / (totalBins * 2); return getXForFrequency(binfreq, w); } int SpectrumLayer::getBinForX(float x, int totalBins, float w) const { if (!m_sliceableModel) return SliceLayer::getBinForX(x, totalBins, w); float sampleRate = m_sliceableModel->getSampleRate(); float binfreq = getFrequencyForX(x, w); return int((binfreq * totalBins * 2) / sampleRate); } float SpectrumLayer::getFrequencyForX(float x, float w) const { float freq = 0; if (!m_sliceableModel) return 0; int sampleRate = m_sliceableModel->getSampleRate(); float maxfreq = float(sampleRate) / 2; switch (m_binScale) { case LinearBins: freq = ((x * maxfreq) / w); break; case LogBins: freq = powf(10.f, (x * log10f(maxfreq)) / w); break; case InvertedLogBins: freq = maxfreq - powf(10.f, ((w - x) * log10f(maxfreq)) / w); break; } return freq; } float SpectrumLayer::getXForFrequency(float freq, float w) const { float x = 0; if (!m_sliceableModel) return x; int sampleRate = m_sliceableModel->getSampleRate(); float maxfreq = float(sampleRate) / 2; switch (m_binScale) { case LinearBins: x = (freq * w) / maxfreq; break; case LogBins: x = (log10f(freq) * w) / log10f(maxfreq); break; case InvertedLogBins: if (maxfreq == freq) x = w; else x = w - (log10f(maxfreq - freq) * w) / log10f(maxfreq); break; } return x; } bool SpectrumLayer::getXScaleValue(const View *v, int x, float &value, QString &unit) const { if (m_xorigins.find(v) == m_xorigins.end()) return false; int xorigin = m_xorigins.find(v)->second; value = getFrequencyForX(x - xorigin, v->width() - xorigin - 1); unit = "Hz"; return true; } bool SpectrumLayer::getYScaleValue(const View *v, int y, float &value, QString &unit) const { value = getValueForY(y, v); if (m_energyScale == dBScale || m_energyScale == MeterScale) { if (value > 0.f) { value = 10.f * log10f(value); if (value < m_threshold) value = m_threshold; } else value = m_threshold; unit = "dBV"; } else { unit = "V"; } return true; } bool SpectrumLayer::getYScaleDifference(const View *v, int y0, int y1, float &diff, QString &unit) const { bool rv = SliceLayer::getYScaleDifference(v, y0, y1, diff, unit); if (rv && (unit == "dBV")) unit = "dB"; return rv; } bool SpectrumLayer::getCrosshairExtents(View *v, QPainter &paint, QPoint cursorPos, std::vector &extents) const { QRect vertical(cursorPos.x(), cursorPos.y(), 1, v->height() - cursorPos.y()); extents.push_back(vertical); QRect horizontal(0, cursorPos.y(), v->width(), 12); extents.push_back(horizontal); int hoffset = 2; if (m_binScale == LogBins) hoffset = 13; int sw = getVerticalScaleWidth(v, false, paint); QRect value(sw, cursorPos.y() - paint.fontMetrics().ascent() - 2, paint.fontMetrics().width("0.0000001 V") + 2, paint.fontMetrics().height()); extents.push_back(value); QRect log(sw, cursorPos.y() + 2, paint.fontMetrics().width("-80.000 dBV") + 2, paint.fontMetrics().height()); extents.push_back(log); QRect freq(cursorPos.x(), v->height() - paint.fontMetrics().height() - hoffset, paint.fontMetrics().width("123456 Hz") + 2, paint.fontMetrics().height()); extents.push_back(freq); int w(paint.fontMetrics().width("C#10+50c") + 2); QRect pitch(cursorPos.x() - w, v->height() - paint.fontMetrics().height() - hoffset, w, paint.fontMetrics().height()); extents.push_back(pitch); return true; } void SpectrumLayer::paintCrosshairs(View *v, QPainter &paint, QPoint cursorPos) const { if (!m_sliceableModel) return; paint.save(); QFont fn = paint.font(); if (fn.pointSize() > 8) { fn.setPointSize(fn.pointSize() - 1); paint.setFont(fn); } ColourMapper mapper(m_colourMap, 0, 1); paint.setPen(mapper.getContrastingColour()); int xorigin = m_xorigins[v]; int w = v->width() - xorigin - 1; paint.drawLine(xorigin, cursorPos.y(), v->width(), cursorPos.y()); paint.drawLine(cursorPos.x(), cursorPos.y(), cursorPos.x(), v->height()); float fundamental = getFrequencyForX(cursorPos.x() - xorigin, w); int hoffset = 2; if (m_binScale == LogBins) hoffset = 13; v->drawVisibleText(paint, cursorPos.x() + 2, v->height() - 2 - hoffset, QString("%1 Hz").arg(fundamental), View::OutlinedText); if (Pitch::isFrequencyInMidiRange(fundamental)) { QString pitchLabel = Pitch::getPitchLabelForFrequency(fundamental); v->drawVisibleText(paint, cursorPos.x() - paint.fontMetrics().width(pitchLabel) - 2, v->height() - 2 - hoffset, pitchLabel, View::OutlinedText); } float value = getValueForY(cursorPos.y(), v); float thresh = m_threshold; float db = thresh; if (value > 0.f) db = 10.f * log10f(value); if (db < thresh) db = thresh; v->drawVisibleText(paint, xorigin + 2, cursorPos.y() - 2, QString("%1 V").arg(value), View::OutlinedText); v->drawVisibleText(paint, xorigin + 2, cursorPos.y() + 2 + paint.fontMetrics().ascent(), QString("%1 dBV").arg(db), View::OutlinedText); int harmonic = 2; while (harmonic < 100) { float hx = lrintf(getXForFrequency(fundamental * harmonic, w)); hx += xorigin; if (hx < xorigin || hx > v->width()) break; int len = 7; if (harmonic % 2 == 0) { if (harmonic % 4 == 0) { len = 12; } else { len = 10; } } paint.drawLine(int(hx), cursorPos.y(), int(hx), cursorPos.y() + len); ++harmonic; } paint.restore(); } QString SpectrumLayer::getFeatureDescription(View *v, QPoint &p) const { if (!m_sliceableModel) return ""; int minbin = 0, maxbin = 0, range = 0; QString genericDesc = SliceLayer::getFeatureDescription (v, p, false, minbin, maxbin, range); if (genericDesc == "") return ""; float minvalue = 0.f; if (minbin < int(m_values.size())) minvalue = m_values[minbin]; float maxvalue = minvalue; if (maxbin < int(m_values.size())) maxvalue = m_values[maxbin]; if (minvalue > maxvalue) std::swap(minvalue, maxvalue); QString binstr; QString hzstr; int minfreq = lrintf((minbin * m_sliceableModel->getSampleRate()) / m_windowSize); int maxfreq = lrintf((std::max(maxbin, minbin+1) * m_sliceableModel->getSampleRate()) / m_windowSize); if (maxbin != minbin) { binstr = tr("%1 - %2").arg(minbin+1).arg(maxbin+1); } else { binstr = QString("%1").arg(minbin+1); } if (minfreq != maxfreq) { hzstr = tr("%1 - %2 Hz").arg(minfreq).arg(maxfreq); } else { hzstr = tr("%1 Hz").arg(minfreq); } QString valuestr; if (maxvalue != minvalue) { valuestr = tr("%1 - %2").arg(minvalue).arg(maxvalue); } else { valuestr = QString("%1").arg(minvalue); } QString dbstr; float mindb = AudioLevel::multiplier_to_dB(minvalue); float maxdb = AudioLevel::multiplier_to_dB(maxvalue); QString mindbstr; QString maxdbstr; if (mindb == AudioLevel::DB_FLOOR) { mindbstr = tr("-Inf"); } else { mindbstr = QString("%1").arg(lrintf(mindb)); } if (maxdb == AudioLevel::DB_FLOOR) { maxdbstr = tr("-Inf"); } else { maxdbstr = QString("%1").arg(lrintf(maxdb)); } if (lrintf(mindb) != lrintf(maxdb)) { dbstr = tr("%1 - %2").arg(mindbstr).arg(maxdbstr); } else { dbstr = tr("%1").arg(mindbstr); } QString description; if (range > int(m_sliceableModel->getResolution())) { description = tr("%1\nBin:\t%2 (%3)\n%4 value:\t%5\ndB:\t%6") .arg(genericDesc) .arg(binstr) .arg(hzstr) .arg(m_samplingMode == NearestSample ? tr("First") : m_samplingMode == SampleMean ? tr("Mean") : tr("Peak")) .arg(valuestr) .arg(dbstr); } else { description = tr("%1\nBin:\t%2 (%3)\nValue:\t%4\ndB:\t%5") .arg(genericDesc) .arg(binstr) .arg(hzstr) .arg(valuestr) .arg(dbstr); } return description; } void SpectrumLayer::paint(View *v, QPainter &paint, QRect rect) const { if (!m_originModel || !m_originModel->isOK() || !m_originModel->isReady()) { SVDEBUG << "SpectrumLayer::paint: no origin model, or origin model not OK or not ready" << endl; return; } if (m_newFFTNeeded) { SVDEBUG << "SpectrumLayer::paint: new FFT needed, calling setupFFT" << endl; const_cast(this)->setupFFT(); //ugh } FFTModel *fft = dynamic_cast (const_cast(m_sliceableModel)); float thresh = (powf(10, -6) / m_gain) * (m_windowSize / 2.f); // -60dB adj int xorigin = getVerticalScaleWidth(v, false, paint) + 1; int w = v->width() - xorigin - 1; int pkh = 0; //!!! if (m_binScale == LogBins) { pkh = 10; //!!! } paint.save(); if (fft && m_showPeaks) { // draw peak lines // SVDEBUG << "Showing peaks..." << endl; size_t col = v->getCentreFrame() / fft->getResolution(); paint.save(); paint.setRenderHint(QPainter::Antialiasing, false); paint.setPen(QColor(160, 160, 160)); //!!! int peakminbin = 0; int peakmaxbin = fft->getHeight() - 1; float peakmaxfreq = Pitch::getFrequencyForPitch(128); peakmaxbin = ((peakmaxfreq * fft->getHeight() * 2) / fft->getSampleRate()); FFTModel::PeakSet peaks = fft->getPeakFrequencies (FFTModel::MajorPitchAdaptivePeaks, col, peakminbin, peakmaxbin); ColourMapper mapper(ColourMapper::BlackOnWhite, 0, 1); BiasCurve curve; getBiasCurve(curve); size_t cs = curve.size(); std::vector values; for (size_t bin = 0; bin < fft->getHeight(); ++bin) { float value = m_sliceableModel->getValueAt(col, bin); if (bin < cs) value *= curve[bin]; values.push_back(value); } for (FFTModel::PeakSet::iterator i = peaks.begin(); i != peaks.end(); ++i) { size_t bin = i->first; // cerr << "bin = " << bin << ", thresh = " << thresh << ", value = " << fft->getMagnitudeAt(col, bin) << endl; if (!fft->isOverThreshold(col, bin, thresh)) continue; float freq = i->second; int x = lrintf(getXForFrequency(freq, w)); float norm = 0.f; float y = getYForValue(values[bin], v, norm); // don't need y, need norm paint.setPen(mapper.map(norm)); paint.drawLine(xorigin + x, 0, xorigin + x, v->height() - pkh - 1); } paint.restore(); } SliceLayer::paint(v, paint, rect); //!!! All of this stuff relating to depicting frequencies //(keyboard, crosshairs etc) should be applicable to any slice //layer whose model has a vertical scale unit of Hz. However, the //dense 3d model at the moment doesn't record its vertical scale //unit -- we need to fix that and hoist this code as appropriate. //Same really goes for any code in SpectrogramLayer that could be //relevant to Colour3DPlotLayer with unit Hz, but that's a bigger //proposition. // if (m_binScale == LogBins) { // int pkh = 10; int h = v->height(); // piano keyboard //!!! should be in a new paintHorizontalScale()? // nice to have a piano keyboard class, of course paint.drawLine(xorigin, h - pkh - 1, w + xorigin, h - pkh - 1); int px = xorigin, ppx = xorigin; paint.setBrush(paint.pen().color()); for (int i = 0; i < 128; ++i) { float f = Pitch::getFrequencyForPitch(i); int x = lrintf(getXForFrequency(f, w)); x += xorigin; if (i == 0) { px = ppx = x; } if (i == 1) { ppx = px - (x - px); } if (x < xorigin) { ppx = px; px = x; continue; } if (x > w) { break; } int n = (i % 12); if (n == 1) { // C# -- fill the C from here QColor col = Qt::gray; if (i == 61) { // filling middle C col = Qt::blue; col = col.light(150); } if (x - ppx > 2) { paint.fillRect((px + ppx) / 2 + 1, h - pkh, x - (px + ppx) / 2 - 1, pkh, col); } } if (n == 1 || n == 3 || n == 6 || n == 8 || n == 10) { // black notes paint.drawLine(x, h - pkh, x, h); int rw = lrintf(float(x - px) / 4) * 2; if (rw < 2) rw = 2; paint.drawRect(x - rw/2, h - pkh, rw, pkh/2); } else if (n == 0 || n == 5) { // C, F if (px < w) { paint.drawLine((x + px) / 2, h - pkh, (x + px) / 2, h); } } ppx = px; px = x; } // } paint.restore(); } void SpectrumLayer::getBiasCurve(BiasCurve &curve) const { curve = m_biasCurve; } void SpectrumLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s = QString("windowSize=\"%1\" " "windowHopLevel=\"%2\" " "showPeaks=\"%3\" ") .arg(m_windowSize) .arg(m_windowHopLevel) .arg(m_showPeaks ? "true" : "false"); SliceLayer::toXml(stream, indent, extraAttributes + " " + s); } void SpectrumLayer::setProperties(const QXmlAttributes &attributes) { SliceLayer::setProperties(attributes); bool ok = false; size_t windowSize = attributes.value("windowSize").toUInt(&ok); if (ok) setWindowSize(windowSize); size_t windowHopLevel = attributes.value("windowHopLevel").toUInt(&ok); if (ok) setWindowHopLevel(windowHopLevel); bool showPeaks = (attributes.value("showPeaks").trimmed() == "true"); setShowPeaks(showPeaks); } sonic-visualiser-2.3~repack1.orig/svgui/layer/TimeRulerLayer.cpp0000644000175000017500000002421512252354725023620 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "TimeRulerLayer.h" #include "LayerFactory.h" #include "data/model/Model.h" #include "base/RealTime.h" #include "ColourDatabase.h" #include "view/View.h" #include #include #include //#define DEBUG_TIME_RULER_LAYER 1 TimeRulerLayer::TimeRulerLayer() : SingleColourLayer(), m_model(0), m_labelHeight(LabelTop) { } void TimeRulerLayer::setModel(Model *model) { if (m_model == model) return; m_model = model; emit modelReplaced(); } bool TimeRulerLayer::snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { resolution = 1; return false; } bool q; int tick = getMajorTickSpacing(v, q); RealTime rtick = RealTime::fromMilliseconds(tick); int rate = m_model->getSampleRate(); RealTime rt = RealTime::frame2RealTime(frame, rate); double ratio = rt / rtick; int rounded = int(ratio); RealTime rdrt = rtick * rounded; int left = RealTime::realTime2Frame(rdrt, rate); resolution = RealTime::realTime2Frame(rtick, rate); int right = left + resolution; // SVDEBUG << "TimeRulerLayer::snapToFeatureFrame: type " // << int(snap) << ", frame " << frame << " (time " // << rt << ", tick " << rtick << ", rounded " << rdrt << ") "; switch (snap) { case SnapLeft: frame = left; break; case SnapRight: frame = right; break; case SnapNearest: { if (abs(frame - left) > abs(right - frame)) { frame = right; } else { frame = left; } break; } case SnapNeighbouring: { int dl = -1, dr = -1; int x = v->getXForFrame(frame); if (left > v->getStartFrame() && left < v->getEndFrame()) { dl = abs(v->getXForFrame(left) - x); } if (right > v->getStartFrame() && right < v->getEndFrame()) { dr = abs(v->getXForFrame(right) - x); } int fuzz = 2; if (dl >= 0 && dr >= 0) { if (dl < dr) { if (dl <= fuzz) { frame = left; } } else { if (dr < fuzz) { frame = right; } } } else if (dl >= 0) { if (dl <= fuzz) { frame = left; } } else if (dr >= 0) { if (dr <= fuzz) { frame = right; } } } } // SVDEBUG << " -> " << frame << " (resolution = " << resolution << ")" << endl; return true; } int TimeRulerLayer::getMajorTickSpacing(View *v, bool &quarterTicks) const { // return value is in milliseconds if (!m_model || !v) return 1000; int sampleRate = m_model->getSampleRate(); if (!sampleRate) return 1000; long startFrame = v->getStartFrame(); long endFrame = v->getEndFrame(); int minPixelSpacing = 50; RealTime rtStart = RealTime::frame2RealTime(startFrame, sampleRate); RealTime rtEnd = RealTime::frame2RealTime(endFrame, sampleRate); int count = v->width() / minPixelSpacing; if (count < 1) count = 1; RealTime rtGap = (rtEnd - rtStart) / count; int incms; quarterTicks = false; if (rtGap.sec > 0) { incms = 1000; int s = rtGap.sec; if (s > 0) { incms *= 5; s /= 5; } if (s > 0) { incms *= 2; s /= 2; } if (s > 0) { incms *= 6; s /= 6; quarterTicks = true; } if (s > 0) { incms *= 5; s /= 5; quarterTicks = false; } if (s > 0) { incms *= 2; s /= 2; } if (s > 0) { incms *= 6; s /= 6; quarterTicks = true; } while (s > 0) { incms *= 10; s /= 10; quarterTicks = false; } } else { incms = 1; int ms = rtGap.msec(); if (ms > 0) { incms *= 10; ms /= 10; } if (ms > 0) { incms *= 10; ms /= 10; } if (ms > 0) { incms *= 5; ms /= 5; } if (ms > 0) { incms *= 2; ms /= 2; } } return incms; } void TimeRulerLayer::paint(View *v, QPainter &paint, QRect rect) const { #ifdef DEBUG_TIME_RULER_LAYER SVDEBUG << "TimeRulerLayer::paint (" << rect.x() << "," << rect.y() << ") [" << rect.width() << "x" << rect.height() << "]" << endl; #endif if (!m_model || !m_model->isOK()) return; int sampleRate = m_model->getSampleRate(); if (!sampleRate) return; long startFrame = v->getFrameForX(rect.x() - 50); #ifdef DEBUG_TIME_RULER_LAYER cerr << "start frame = " << startFrame << endl; #endif bool quarter = false; int incms = getMajorTickSpacing(v, quarter); int ms = lrint(1000.0 * (double(startFrame) / double(sampleRate))); ms = (ms / incms) * incms - incms; #ifdef DEBUG_TIME_RULER_LAYER cerr << "start ms = " << ms << " at step " << incms << endl; #endif // Calculate the number of ticks per increment -- approximate // values for x and frame counts here will do, no rounding issue. // We always use the exact incms in our calculations for where to // draw the actual ticks or lines. int minPixelSpacing = 50; long incFrame = (incms * sampleRate) / 1000; int incX = incFrame / v->getZoomLevel(); int ticks = 10; if (incX < minPixelSpacing * 2) { ticks = quarter ? 4 : 5; } QColor greyColour = getPartialShades(v)[1]; paint.save(); while (1) { // frame is used to determine where to draw the lines, so it // needs to correspond to an exact pixel (so that we don't get // a different pixel when scrolling a small amount and // re-drawing with a different start frame). double dms = ms; long frame = lrint((dms * sampleRate) / 1000.0); frame /= v->getZoomLevel(); frame *= v->getZoomLevel(); // so frame corresponds to an exact pixel int x = v->getXForFrame(frame); #ifdef DEBUG_TIME_RULER_LAYER SVDEBUG << "Considering frame = " << frame << ", x = " << x << endl; #endif if (x >= rect.x() + rect.width() + 50) { #ifdef DEBUG_TIME_RULER_LAYER cerr << "X well out of range, ending here" << endl; #endif break; } if (x >= rect.x() - 50) { RealTime rt = RealTime::fromMilliseconds(ms); #ifdef DEBUG_TIME_RULER_LAYER cerr << "X in range, drawing line here for time " << rt.toText() << endl; #endif QString text(QString::fromStdString(rt.toText())); QFontMetrics metrics = paint.fontMetrics(); int tw = metrics.width(text); if (tw < 50 && (x < rect.x() - tw/2 || x >= rect.x() + rect.width() + tw/2)) { #ifdef DEBUG_TIME_RULER_LAYER cerr << "hm, maybe X isn't in range after all (x = " << x << ", tw = " << tw << ", rect.x() = " << rect.x() << ", rect.width() = " << rect.width() << ")" << endl; #endif } paint.setPen(greyColour); paint.drawLine(x, 0, x, v->height()); paint.setPen(getBaseQColor()); paint.drawLine(x, 0, x, 5); paint.drawLine(x, v->height() - 6, x, v->height() - 1); int y; switch (m_labelHeight) { default: case LabelTop: y = 6 + metrics.ascent(); break; case LabelMiddle: y = v->height() / 2 - metrics.height() / 2 + metrics.ascent(); break; case LabelBottom: y = v->height() - metrics.height() + metrics.ascent() - 6; } if (v->getViewManager() && v->getViewManager()->getOverlayMode() != ViewManager::NoOverlays) { if (v->getLayer(0) == this) { // backmost layer, don't worry about outlining the text paint.drawText(x+2 - tw/2, y, text); } else { v->drawVisibleText(paint, x+2 - tw/2, y, text, View::OutlinedText); } } } paint.setPen(greyColour); for (int i = 1; i < ticks; ++i) { dms = ms + (i * double(incms)) / ticks; frame = lrint((dms * sampleRate) / 1000.0); frame /= v->getZoomLevel(); frame *= v->getZoomLevel(); // exact pixel as above x = v->getXForFrame(frame); if (x < rect.x() || x >= rect.x() + rect.width()) { #ifdef DEBUG_TIME_RULER_LAYER // cerr << "tick " << i << ": X out of range, going on to next tick" << endl; #endif continue; } #ifdef DEBUG_TIME_RULER_LAYER cerr << "tick " << i << " in range, drawing at " << x << endl; #endif int sz = 5; if (ticks == 10) { if ((i % 2) == 1) { if (i == 5) { paint.drawLine(x, 0, x, v->height()); } else sz = 3; } else { sz = 7; } } paint.drawLine(x, 0, x, sz); paint.drawLine(x, v->height() - sz - 1, x, v->height() - 1); } ms += incms; } paint.restore(); } int TimeRulerLayer::getDefaultColourHint(bool darkbg, bool &impose) { impose = true; return ColourDatabase::getInstance()->getColourIndex (QString(darkbg ? "White" : "Black")); } QString TimeRulerLayer::getLayerPresentationName() const { LayerFactory *factory = LayerFactory::getInstance(); QString layerName = factory->getLayerPresentationName (factory->getLayerType(this)); return layerName; } void TimeRulerLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { SingleColourLayer::toXml(stream, indent, extraAttributes); } void TimeRulerLayer::setProperties(const QXmlAttributes &attributes) { SingleColourLayer::setProperties(attributes); } sonic-visualiser-2.3~repack1.orig/svgui/layer/ColourScaleLayer.h0000644000175000017500000000155512252354725023572 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef COLOUR_SCALE_LAYER_H #define COLOUR_SCALE_LAYER_H #include #include class ColourScaleLayer { public: virtual QString getScaleUnits() const = 0; virtual QColor getColourForValue(View *v, float value) const = 0; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/ImageRegionFinder.cpp0000644000175000017500000000616212252354725024232 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ImageRegionFinder.h" #include #include #include #include ImageRegionFinder::ImageRegionFinder() { } ImageRegionFinder::~ImageRegionFinder() { } QRect ImageRegionFinder::findRegionExtents(QImage *image, QPoint origin) const { int w = image->width(), h = image->height(); QImage visited(w, h, QImage::Format_Mono); visited.fill(0); std::stack s; s.push(origin); int xmin = origin.x(); int xmax = xmin; int ymin = origin.y(); int ymax = ymin; QRgb opix = image->pixel(origin); while (!s.empty()) { QPoint p = s.top(); s.pop(); visited.setPixel(p, 1); int x = p.x(), y = p.y(); if (x < xmin) xmin = x; if (x > xmax) xmax = x; if (y < ymin) ymin = y; if (y > ymax) ymax = y; std::stack neighbours; int similarNeighbourCount = 0; for (int dx = -1; dx <= 1; ++dx) { for (int dy = -1; dy <= 1; ++dy) { if ((dx != 0 && dy != 0) || (dx == 0 && dy == 0)) continue; if (x + dx < 0 || x + dx >= w || y + dy < 0 || y + dy >= h) continue; if (visited.pixelIndex(x + dx, y + dy) != 0) continue; if (!similar(opix, image->pixel(x + dx, y + dy))) continue; neighbours.push(QPoint(x + dx, y + dy)); ++similarNeighbourCount; } } if (similarNeighbourCount >= 2) { while (!neighbours.empty()) { s.push(neighbours.top()); neighbours.pop(); } } } return QRect(xmin, ymin, xmax - xmin, ymax - ymin); } bool ImageRegionFinder::similar(QRgb a, QRgb b) const { if (b == qRgb(0, 0, 0) || b == qRgb(255, 255, 255)) { // black and white are boundary cases, don't compare similar // to anything -- not even themselves return false; } float ar = float(qRed(a) / 255.f); float ag = float(qGreen(a) / 255.f); float ab = float(qBlue(a) / 255.f); float amag = sqrtf(ar * ar + ag * ag + ab * ab); float thresh = amag / 2; float dr = float(qRed(a) - qRed(b)) / 255.f; float dg = float(qGreen(a) - qGreen(b)) / 255.f; float db = float(qBlue(a) - qBlue(b)) / 255.f; float dist = sqrtf(dr * dr + dg * dg + db * db); // cerr << "thresh=" << thresh << ", dist=" << dist << endl; return (dist < thresh); } sonic-visualiser-2.3~repack1.orig/svgui/layer/TimeRulerLayer.h0000644000175000017500000000375112252354725023267 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TIME_RULER_H_ #define _TIME_RULER_H_ #include "SingleColourLayer.h" #include #include class View; class Model; class QPainter; class TimeRulerLayer : public SingleColourLayer { Q_OBJECT public: TimeRulerLayer(); virtual void paint(View *v, QPainter &paint, QRect rect) const; void setModel(Model *); virtual const Model *getModel() const { return m_model; } enum LabelHeight { LabelTop, LabelMiddle, LabelBottom }; void setLabelHeight(LabelHeight h) { m_labelHeight = h; } LabelHeight getLabelHeight() const { return m_labelHeight; } virtual bool snapToFeatureFrame(View *, int &, size_t &, SnapType) const; virtual ColourSignificance getLayerColourSignificance() const { return ColourIrrelevant; } virtual bool getValueExtents(float &, float &, bool &, QString &) const { return false; } virtual QString getLayerPresentationName() const; virtual int getVerticalScaleWidth(View *, bool, QPainter &) const { return 0; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); protected: Model *m_model; LabelHeight m_labelHeight; virtual int getDefaultColourHint(bool dark, bool &impose); int getMajorTickSpacing(View *, bool &quarterTicks) const; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/PaintAssistant.h0000644000175000017500000000235712252354725023330 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PAINT_ASSISTANT_H_ #define _PAINT_ASSISTANT_H_ #include #include class QPainter; class PaintAssistant { public: enum Scale { LinearScale, MeterScale, dBScale }; static void paintVerticalLevelScale(QPainter &p, QRect rect, float minVal, float maxVal, Scale scale, int &multRtn, std::vector *markCoordRtns = 0); static int getYForValue(Scale scale, float value, float minVal, float maxVal, int minY, int height); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/LogColourScale.cpp0000644000175000017500000000452612252354725023573 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "LogColourScale.h" #include "ColourScaleLayer.h" #include "base/LogRange.h" #include #include #include "view/View.h" int LogColourScale::getWidth(View *v, QPainter &paint) { return paint.fontMetrics().width("-000.00") + 15; } void LogColourScale::paintVertical(View *v, const ColourScaleLayer *layer, QPainter &paint, int x0, float minlog, float maxlog) { int h = v->height(); int n = 10; float val = minlog; float inc = (maxlog - val) / n; char buffer[40]; int w = getWidth(v, paint) + x0; int boxx = 5, boxy = 5; if (layer->getScaleUnits() != "") { boxy += paint.fontMetrics().height(); } int boxw = 10, boxh = h - boxy - 5; int tx = 5 + boxx + boxw; paint.drawRect(boxx, boxy, boxw, boxh); paint.save(); for (int y = 0; y < boxh; ++y) { float val = ((boxh - y) * (maxlog - minlog)) / boxh + minlog; paint.setPen(layer->getColourForValue(v, LogRange::unmap(val))); paint.drawLine(boxx + 1, y + boxy + 1, boxx + boxw, y + boxy + 1); } paint.restore(); int dp = 0; if (inc > 0) { int prec = trunc(log10f(inc)); prec -= 1; if (prec < 0) dp = -prec; } for (int i = 0; i < n; ++i) { int y, ty; y = boxy + int(boxh - ((val - minlog) * boxh) / (maxlog - minlog)); ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; double dv = LogRange::unmap(val); int digits = trunc(log10f(dv)); int sf = dp + (digits > 0 ? digits : 0); if (sf < 2) sf = 2; sprintf(buffer, "%.*g", sf, dv); QString label = QString(buffer); paint.drawLine(boxx + boxw - boxw/3, y, boxx + boxw, y); paint.drawText(tx, ty, label); val += inc; } } sonic-visualiser-2.3~repack1.orig/svgui/layer/LinearColourScale.h0000644000175000017500000000170412252354725023724 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef LINEAR_COLOUR_SCALE_H #define LINEAR_COLOUR_SCALE_H #include class QPainter; class View; class ColourScaleLayer; class LinearColourScale { public: int getWidth(View *v, QPainter &paint); void paintVertical (View *v, const ColourScaleLayer *layer, QPainter &paint, int x0, float minf, float maxf); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/ColourMapper.cpp0000644000175000017500000001475212252354725023330 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ColourMapper.h" #include #include #include "base/Debug.h" ColourMapper::ColourMapper(int map, float min, float max) : QObject(), m_map(map), m_min(min), m_max(max) { if (m_min == m_max) { cerr << "WARNING: ColourMapper: min == max (== " << m_min << "), adjusting" << endl; m_max = m_min + 1; } } ColourMapper::~ColourMapper() { } int ColourMapper::getColourMapCount() { return 12; } QString ColourMapper::getColourMapName(int n) { if (n >= getColourMapCount()) return tr(""); StandardMap map = (StandardMap)n; switch (map) { case DefaultColours: return tr("Default"); case WhiteOnBlack: return tr("White on Black"); case BlackOnWhite: return tr("Black on White"); case RedOnBlue: return tr("Red on Blue"); case YellowOnBlack: return tr("Yellow on Black"); case BlueOnBlack: return tr("Blue on Black"); case Sunset: return tr("Sunset"); case FruitSalad: return tr("Fruit Salad"); case Banded: return tr("Banded"); case Highlight: return tr("Highlight"); case Printer: return tr("Printer"); case HighGain: return tr("High Gain"); } return tr(""); } QColor ColourMapper::map(float value) const { float norm = (value - m_min) / (m_max - m_min); if (norm < 0.f) norm = 0.f; if (norm > 1.f) norm = 1.f; float h = 0.f, s = 0.f, v = 0.f, r = 0.f, g = 0.f, b = 0.f; bool hsv = true; // float red = 0.f, green = 0.3333f; float blue = 0.6666f, pieslice = 0.3333f; if (m_map >= getColourMapCount()) return Qt::black; StandardMap map = (StandardMap)m_map; switch (map) { case DefaultColours: h = blue - norm * 2.f * pieslice; s = 0.5f + norm/2.f; v = norm; break; case WhiteOnBlack: r = g = b = norm; hsv = false; break; case BlackOnWhite: r = g = b = 1.f - norm; hsv = false; break; case RedOnBlue: h = blue - pieslice/4.f + norm * (pieslice + pieslice/4.f); s = 1.f; v = norm; break; case YellowOnBlack: h = 0.15f; s = 1.f; v = norm; break; case BlueOnBlack: h = blue; s = 1.f; v = norm * 2.f; if (v > 1.f) { v = 1.f; s = 1.f - (sqrtf(norm) - 0.707f) * 3.413f; if (s < 0.f) s = 0.f; if (s > 1.f) s = 1.f; } break; case Sunset: r = (norm - 0.24f) * 2.38f; if (r > 1.f) r = 1.f; if (r < 0.f) r = 0.f; g = (norm - 0.64f) * 2.777f; if (g > 1.f) g = 1.f; if (g < 0.f) g = 0.f; b = (3.6f * norm); if (norm > 0.277f) b = 2.f - b; if (b > 1.f) b = 1.f; if (b < 0.f) b = 0.f; hsv = false; break; case FruitSalad: h = blue + (pieslice/6.f) - norm; if (h < 0.f) h += 1.f; s = 1.f; v = 1.f; break; case Banded: if (norm < 0.125) return Qt::darkGreen; else if (norm < 0.25) return Qt::green; else if (norm < 0.375) return Qt::darkBlue; else if (norm < 0.5) return Qt::blue; else if (norm < 0.625) return Qt::darkYellow; else if (norm < 0.75) return Qt::yellow; else if (norm < 0.875) return Qt::darkRed; else return Qt::red; break; case Highlight: if (norm > 0.99) return Qt::white; else return Qt::darkBlue; case Printer: if (norm > 0.8) { r = 1.f; } else if (norm > 0.7) { r = 0.9f; } else if (norm > 0.6) { r = 0.8f; } else if (norm > 0.5) { r = 0.7f; } else if (norm > 0.4) { r = 0.6f; } else if (norm > 0.3) { r = 0.5f; } else if (norm > 0.2) { r = 0.4f; } else { r = 0.f; } r = g = b = 1.f - r; hsv = false; break; case HighGain: if (norm <= 1.f / 256.f) { norm = 0.f; } else { norm = 0.1f + (powf(((norm - 0.5f) * 2.f), 3.f) + 1.f) / 2.081f; } // now as for Sunset r = (norm - 0.24f) * 2.38f; if (r > 1.f) r = 1.f; if (r < 0.f) r = 0.f; g = (norm - 0.64f) * 2.777f; if (g > 1.f) g = 1.f; if (g < 0.f) g = 0.f; b = (3.6f * norm); if (norm > 0.277f) b = 2.f - b; if (b > 1.f) b = 1.f; if (b < 0.f) b = 0.f; hsv = false; /* if (r > 1.f) r = 1.f; r = g = b = 1.f - r; hsv = false; */ break; } if (hsv) { return QColor::fromHsvF(h, s, v); } else { return QColor::fromRgbF(r, g, b); } } QColor ColourMapper::getContrastingColour() const { if (m_map >= getColourMapCount()) return Qt::white; StandardMap map = (StandardMap)m_map; switch (map) { case DefaultColours: return QColor(255, 150, 50); case WhiteOnBlack: return Qt::red; case BlackOnWhite: return Qt::darkGreen; case RedOnBlue: return Qt::green; case YellowOnBlack: return QColor::fromHsv(240, 255, 255); case BlueOnBlack: return Qt::red; case Sunset: return Qt::white; case FruitSalad: return Qt::white; case Banded: return Qt::cyan; case Highlight: return Qt::red; case Printer: return Qt::red; case HighGain: return Qt::red; } return Qt::white; } bool ColourMapper::hasLightBackground() const { if (m_map >= getColourMapCount()) return false; StandardMap map = (StandardMap)m_map; switch (map) { case BlackOnWhite: case Printer: case HighGain: return true; default: return false; } } sonic-visualiser-2.3~repack1.orig/svgui/layer/Layer.h0000644000175000017500000005505612252354725021443 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _LAYER_H_ #define _LAYER_H_ #include "base/PropertyContainer.h" #include "base/XmlExportable.h" #include "base/Selection.h" #include "widgets/CommandHistory.h" #include "system/System.h" #include #include #include #include #include #include #include #include class ZoomConstraint; class Model; class QPainter; class View; class QMouseEvent; class Clipboard; class RangeMapper; /** * The base class for visual representations of the data found in a * Model. Layers are expected to be able to draw themselves onto a * View, and may also be editable. */ class Layer : public PropertyContainer, public XmlExportable { Q_OBJECT public: Layer(); virtual ~Layer(); virtual const Model *getModel() const = 0; Model *getModel() { return const_cast(const_cast(this)->getModel()); } /** * Return a zoom constraint object defining the supported zoom * levels for this layer. If this returns zero, the layer will * support any integer zoom level. */ virtual const ZoomConstraint *getZoomConstraint() const { return 0; } /** * Return true if this layer can handle zoom levels other than * those supported by its zoom constraint (presumably less * efficiently or accurately than the officially supported zoom * levels). If true, the layer will unenthusistically accept any * integer zoom level from 1 to the maximum returned by its zoom * constraint. */ virtual bool supportsOtherZoomLevels() const { return true; } /** * Paint the given rectangle of this layer onto the given view * using the given painter, superimposing it on top of any * existing material in that view. The view is provided here * because it is possible for one layer to exist in more than one * view, so the dimensions of the view may vary from one paint * call to another (without any view having been resized). */ virtual void paint(View *, QPainter &, QRect) const = 0; /** * Enable or disable synchronous painting. If synchronous * painting is enabled, a call to paint() must complete painting * the entire rectangle before it returns. If synchronous * painting is disabled (which should be the default), the paint() * call may defer painting some regions if data is not yet * available, by calling back on its view to schedule another * update. Synchronous painting is necessary when rendering to an * image. Simple layer types will always paint synchronously, and * so may ignore this. */ virtual void setSynchronousPainting(bool /* synchronous */) { } enum VerticalPosition { PositionTop, PositionMiddle, PositionBottom }; virtual VerticalPosition getPreferredTimeRulerPosition() const { return PositionMiddle; } virtual VerticalPosition getPreferredFrameCountPosition() const { return PositionBottom; } virtual bool hasLightBackground() const { return true; } virtual QString getPropertyContainerIconName() const; virtual QString getPropertyContainerName() const { if (m_presentationName != "") return m_presentationName; else return objectName(); } virtual void setPresentationName(QString name); virtual QString getLayerPresentationName() const; virtual QPixmap getLayerPresentationPixmap(QSize) const { return QPixmap(); } virtual int getVerticalScaleWidth(View *, bool detailed, QPainter &) const = 0; virtual void paintVerticalScale(View *, bool detailed, QPainter &, QRect) const { } virtual bool getCrosshairExtents(View *, QPainter &, QPoint /* cursorPos */, std::vector &) const { return false; } virtual void paintCrosshairs(View *, QPainter &, QPoint) const { } virtual void paintMeasurementRects(View *, QPainter &, bool showFocus, QPoint focusPoint) const; virtual bool nearestMeasurementRectChanged(View *, QPoint prev, QPoint now) const; virtual QString getFeatureDescription(View *, QPoint &) const { return ""; } virtual QString getLabelPreceding(size_t frame) const { return ""; } enum SnapType { SnapLeft, SnapRight, SnapNearest, SnapNeighbouring }; /** * Adjust the given frame to snap to the nearest feature, if * possible. * * If snap is SnapLeft or SnapRight, adjust the frame to match * that of the nearest feature in the given direction regardless * of how far away it is. If snap is SnapNearest, adjust the * frame to that of the nearest feature in either direction. If * snap is SnapNeighbouring, adjust the frame to that of the * nearest feature if it is close, and leave it alone (returning * false) otherwise. SnapNeighbouring should always choose the * same feature that would be used in an editing operation through * calls to editStart etc. * * Return true if a suitable feature was found and frame adjusted * accordingly. Return false if no suitable feature was available * (and leave frame unmodified). If returning true, also return * the resolution of the model in this layer in sample frames. */ virtual bool snapToFeatureFrame(View * /* v */, int & /* frame */, size_t &resolution, SnapType /* snap */) const { resolution = 1; return false; } /** * Adjust the given frame to snap to the next feature that has * "effectively" the same value as the feature prior to the given * frame, if possible. * * The snap type must be SnapLeft (snap to the time of the next * feature prior to the one preceding the given frame that has a * similar value to it) or SnapRight (snap to the time of the next * feature following the given frame that has a similar value to * the feature preceding it). Other values are not permitted. * * Return true if a suitable feature was found and frame adjusted * accordingly. Return false if no suitable feature was available * (and leave frame unmodified). If returning true, also return * the resolution of the model in this layer in sample frames. */ virtual bool snapToSimilarFeature(View * /* v */, int & /* source frame */, size_t &resolution, SnapType /* snap */) const { resolution = 1; return false; } // Draw, erase, and edit modes: // // Layer needs to get actual mouse events, I guess. Draw mode is // probably the easier. virtual void drawStart(View *, QMouseEvent *) { } virtual void drawDrag(View *, QMouseEvent *) { } virtual void drawEnd(View *, QMouseEvent *) { } virtual void eraseStart(View *, QMouseEvent *) { } virtual void eraseDrag(View *, QMouseEvent *) { } virtual void eraseEnd(View *, QMouseEvent *) { } virtual void editStart(View *, QMouseEvent *) { } virtual void editDrag(View *, QMouseEvent *) { } virtual void editEnd(View *, QMouseEvent *) { } // Measurement rectangle (or equivalent). Unlike draw and edit, // the base Layer class can provide working implementations of // these for most situations. // virtual void measureStart(View *, QMouseEvent *); virtual void measureDrag(View *, QMouseEvent *); virtual void measureEnd(View *, QMouseEvent *); virtual void measureDoubleClick(View *, QMouseEvent *); virtual bool haveCurrentMeasureRect() const { return m_haveCurrentMeasureRect; } virtual void deleteCurrentMeasureRect(); // using a command /** * Open an editor on the item under the mouse (e.g. on * double-click). If there is no item or editing is not * supported, return false. */ virtual bool editOpen(View *, QMouseEvent *) { return false; } virtual void moveSelection(Selection, size_t /* newStartFrame */) { } virtual void resizeSelection(Selection, Selection /* newSize */) { } virtual void deleteSelection(Selection) { } virtual void copy(View *, Selection, Clipboard & /* to */) { } /** * Paste from the given clipboard onto the layer at the given * frame offset. If interactive is true, the layer may ask the * user about paste options through a dialog if desired, and may * return false if the user cancelled the paste operation. This * function should return true if a paste actually occurred. */ virtual bool paste(View *, const Clipboard & /* from */, int /* frameOffset */, bool /* interactive */) { return false; } // Text mode: // // Label nearest feature. We need to get the feature coordinates // and current label from the layer, and then the pane can pop up // a little text entry dialog at the right location. Or we edit // in place? Probably the dialog is easier. /** * This should return true if the layer can safely be scrolled * automatically by a given view (simply copying the existing data * and then refreshing the exposed area) without altering its * meaning. For the view widget as a whole this is usually not * possible because of invariant (non-scrolling) material * displayed over the top, but the widget may be able to optimise * scrolling better if it is known that individual views can be * scrolled safely in this way. */ virtual bool isLayerScrollable(const View *) const { return true; } /** * This should return true if the layer completely obscures any * underlying layers. It's used to determine whether the view can * safely draw any selection rectangles under the layer instead of * over it, in the case where the layer is not scrollable and * therefore needs to be redrawn each time (so that the selection * rectangle can be cached). */ virtual bool isLayerOpaque() const { return false; } enum ColourSignificance { ColourAbsent, ColourIrrelevant, ColourDistinguishes, ColourAndBackgroundSignificant, ColourHasMeaningfulValue }; /** * This should return the degree of meaning associated with colour * in this layer. * * If ColourAbsent, the layer does not use colour. If * ColourIrrelevant, the layer is coloured and the colour may be * set by the user, but it doesn't really matter what the colour * is (for example, in a time ruler layer). If * ColourDistinguishes, then the colour is used to distinguish * this layer from other similar layers (e.g. for data layers). * If ColourAndBackgroundSignificant, then the layer should be * given greater weight than ColourDistinguishes layers when * choosing a background colour (e.g. for waveforms). If * ColourHasMeaningfulValue, colours are actually meaningful -- * the view will then show selections using unfilled rectangles * instead of translucent filled rectangles, so as not to disturb * the colours underneath. */ virtual ColourSignificance getLayerColourSignificance() const = 0; /** * This should return true if the layer can be edited by the user. * If this is the case, the appropriate edit tools may be made * available by the application and the layer's drawStart/Drag/End * and editStart/Drag/End methods should be implemented. */ virtual bool isLayerEditable() const { return false; } /** * Return the proportion of background work complete in drawing * this view, as a percentage -- in most cases this will be the * value returned by pointer from a call to the underlying model's * isReady(int *) call. The view may choose to show a progress * meter if it finds that this returns < 100 at any given moment. */ virtual int getCompletion(View *) const { return 100; } /** * Return an error string if any errors have occurred while * loading or processing data for the given view. Return the * empty string if no error has occurred. */ virtual QString getError(View *) const { return ""; } virtual void setObjectName(const QString &name); /** * Convert the layer's data (though not those of the model it * refers to) into XML for file output. This class implements the * basic name/type/model-id output; subclasses will typically call * this superclass implementation with extra attributes describing * their particular properties. */ virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; /** * Set the particular properties of a layer (those specific to the * subclass) from a set of XML attributes. This is the effective * inverse of the toXml method. */ virtual void setProperties(const QXmlAttributes &) = 0; /** * Produce XML containing the layer's ID and type. This is used * to refer to the layer in the display section of the SV session * file, for a layer that has already been described in the data * section. */ virtual void toBriefXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; /** * Add a measurement rectangle from the given XML attributes * (presumably taken from a measurement element). * Does not use a command. */ virtual void addMeasurementRect(const QXmlAttributes &); /** * Indicate that a layer is not currently visible in the given * view and is not expected to become visible in the near future * (for example because the user has explicitly removed or hidden * it). The layer may respond by (for example) freeing any cache * memory it is using, until next time its paint method is called, * when it should set itself un-dormant again. * * A layer class that overrides this function must also call this * class's implementation. */ virtual void setLayerDormant(const View *v, bool dormant); /** * Return whether the layer is dormant (i.e. hidden) in the given * view. */ virtual bool isLayerDormant(const View *v) const; virtual PlayParameters *getPlayParameters(); virtual bool needsTextLabelHeight() const { return false; } virtual bool hasTimeXAxis() const { return true; } /** * Return the minimum and maximum values for the y axis of the * model in this layer, as well as whether the layer is configured * to use a logarithmic y axis display. Also return the unit for * these values if known. * * This function returns the "normal" extents for the layer, not * necessarily the extents actually in use in the display. */ virtual bool getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const = 0; /** * Return the minimum and maximum values within the displayed * range for the y axis, if only a subset of the whole range of * the model (returned by getValueExtents) is being displayed. * Return false if the layer is not imposing a particular display * extent (using the normal layer extents or deferring to whatever * is in use for the same units elsewhere in the view). */ virtual bool getDisplayExtents(float & /* min */, float & /* max */) const { return false; } /** * Set the displayed minimum and maximum values for the y axis to * the given range, if supported. Return false if not supported * on this layer (and set nothing). In most cases, layers that * return false for getDisplayExtents should also return false for * this function. */ virtual bool setDisplayExtents(float /* min */, float /* max */) { return false; } /** * Return the value and unit at the given x coordinate in the * given view. This is for descriptive purposes using the * measurement tool. The default implementation works correctly * if the layer hasTimeXAxis(). */ virtual bool getXScaleValue(const View *v, int x, float &value, QString &unit) const; /** * Return the value and unit at the given y coordinate in the * given view. */ virtual bool getYScaleValue(const View *, int /* y */, float &/* value */, QString &/* unit */) const { return false; } /** * Return the difference between the values at the given y * coordinates in the given view, and the unit of the difference. * The default implementation just calls getYScaleValue twice and * returns the difference, with the same unit. */ virtual bool getYScaleDifference(const View *v, int y0, int y1, float &diff, QString &unit) const; /** * Get the number of vertical zoom steps available for this layer. * If vertical zooming is not available, return 0. The meaning of * "zooming" is entirely up to the layer -- changing the zoom * level may cause the layer to reset its display extents or * change another property such as display gain. However, layers * are advised for consistency to treat smaller zoom steps as * "more distant" or "zoomed out" and larger ones as "closer" or * "zoomed in". * * Layers that provide this facility should also emit the * verticalZoomChanged signal if their vertical zoom changes * due to factors other than setVerticalZoomStep being called. */ virtual int getVerticalZoomSteps(int & /* defaultStep */) const { return 0; } /** * Get the current vertical zoom step. A layer may support finer * control over ranges etc than is available through the integer * zoom step mechanism; if this one does, it should just return * the nearest of the available zoom steps to the current settings. */ virtual int getCurrentVerticalZoomStep() const { return 0; } /** * Set the vertical zoom step. The meaning of "zooming" is * entirely up to the layer -- changing the zoom level may cause * the layer to reset its display extents or change another * property such as display gain. */ virtual void setVerticalZoomStep(int) { } /** * Create and return a range mapper for vertical zoom step values. * See the RangeMapper documentation for more details. The * returned value is allocated on the heap and will be deleted by * the caller. */ virtual RangeMapper *getNewVerticalZoomRangeMapper() const { return 0; } public slots: void showLayer(View *, bool show); signals: void modelChanged(); void modelCompletionChanged(); void modelAlignmentCompletionChanged(); void modelChanged(size_t startFrame, size_t endFrame); void modelReplaced(); void layerParametersChanged(); void layerParameterRangesChanged(); void layerMeasurementRectsChanged(); void layerNameChanged(); void verticalZoomChanged(); protected: void connectSignals(const Model *); virtual size_t alignToReference(View *v, size_t frame) const; virtual size_t alignFromReference(View *v, size_t frame) const; bool clipboardHasDifferentAlignment(View *v, const Clipboard &clip) const; struct MeasureRect { mutable QRect pixrect; bool haveFrames; long startFrame; // only valid if haveFrames long endFrame; // ditto double startY; double endY; bool operator<(const MeasureRect &mr) const; void toXml(QTextStream &stream, QString indent) const; }; class AddMeasurementRectCommand : public Command { public: AddMeasurementRectCommand(Layer *layer, MeasureRect rect) : m_layer(layer), m_rect(rect) { } virtual QString getName() const; virtual void execute(); virtual void unexecute(); private: Layer *m_layer; MeasureRect m_rect; }; class DeleteMeasurementRectCommand : public Command { public: DeleteMeasurementRectCommand(Layer *layer, MeasureRect rect) : m_layer(layer), m_rect(rect) { } virtual QString getName() const; virtual void execute(); virtual void unexecute(); private: Layer *m_layer; MeasureRect m_rect; }; void addMeasureRectToSet(const MeasureRect &r) { m_measureRects.insert(r); emit layerMeasurementRectsChanged(); } void deleteMeasureRectFromSet(const MeasureRect &r) { m_measureRects.erase(r); emit layerMeasurementRectsChanged(); } typedef std::set MeasureRectSet; MeasureRectSet m_measureRects; MeasureRect m_draggingRect; bool m_haveDraggingRect; mutable bool m_haveCurrentMeasureRect; mutable QPoint m_currentMeasureRectPoint; // Note that pixrects are only correct for a single view. // So we should update them at the start of the paint procedure // (painting is single threaded) and only use them after that. void updateMeasurePixrects(View *v) const; virtual void updateMeasureRectYCoords(View *v, const MeasureRect &r) const; virtual void setMeasureRectYCoord(View *v, MeasureRect &r, bool start, int y) const; virtual void setMeasureRectFromPixrect(View *v, MeasureRect &r, QRect pixrect) const; // This assumes updateMeasurementPixrects has been called MeasureRectSet::const_iterator findFocusedMeasureRect(QPoint) const; void paintMeasurementRect(View *v, QPainter &paint, const MeasureRect &r, bool focus) const; QString m_presentationName; private: mutable QMutex m_dormancyMutex; mutable std::map m_dormancy; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/SliceLayer.h0000644000175000017500000001272512252354725022417 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SLICE_LAYER_H_ #define _SLICE_LAYER_H_ #include "SingleColourLayer.h" #include "base/Window.h" #include "data/model/DenseThreeDimensionalModel.h" #include class SliceLayer : public SingleColourLayer { Q_OBJECT public: SliceLayer(); ~SliceLayer(); // virtual void setModel(const Model *model); // virtual const Model *getModel() const { return m_model; } virtual const Model *getModel() const { return 0; } void setSliceableModel(const Model *model); virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual int getVerticalScaleWidth(View *v, bool, QPainter &) const; virtual void paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const; virtual ColourSignificance getLayerColourSignificance() const { return ColourAndBackgroundSignificant; } virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); virtual void setProperties(const QXmlAttributes &); virtual bool getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const; virtual bool hasTimeXAxis() const { return false; } virtual bool isLayerScrollable(const View *) const { return false; } enum EnergyScale { LinearScale, MeterScale, dBScale, AbsoluteScale }; enum SamplingMode { NearestSample, SampleMean, SamplePeak }; enum PlotStyle { PlotLines, PlotSteps, PlotBlocks, PlotFilledBlocks }; enum BinScale { LinearBins, LogBins, InvertedLogBins }; void setFillColourMap(int); int getFillColourMap() const { return m_colourMap; } void setEnergyScale(EnergyScale); EnergyScale getEnergyScale() const { return m_energyScale; } void setSamplingMode(SamplingMode); SamplingMode getSamplingMode() const { return m_samplingMode; } void setPlotStyle(PlotStyle style); PlotStyle getPlotStyle() const { return m_plotStyle; } void setBinScale(BinScale scale); BinScale getBinScale() const { return m_binScale; } void setThreshold(float); int getThreshold() const { return m_threshold; } void setGain(float gain); float getGain() const; void setNormalize(bool n); bool getNormalize() const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; public slots: void sliceableModelReplaced(const Model *, const Model *); void modelAboutToBeDeleted(Model *); protected: virtual float getXForBin(int bin, int totalBins, float w) const; virtual int getBinForX(float x, int totalBins, float w) const; virtual float getYForValue(float value, const View *v, float &norm) const; virtual float getValueForY(float y, const View *v) const; virtual QString getFeatureDescription(View *v, QPoint &, bool includeBinDescription, int &minbin, int &maxbin, int &range) const; // This curve may, of course, be flat -- the spectrum uses it for // normalizing the fft results by the fft size (with 1/(fftsize/2) // in each bin). typedef std::vector BiasCurve; virtual void getBiasCurve(BiasCurve &) const { return; } virtual float getThresholdDb() const; virtual int getDefaultColourHint(bool dark, bool &impose); const DenseThreeDimensionalModel *m_sliceableModel; int m_colourMap; EnergyScale m_energyScale; SamplingMode m_samplingMode; PlotStyle m_plotStyle; BinScale m_binScale; bool m_normalize; float m_threshold; float m_initialThreshold; float m_gain; mutable std::vector m_scalePoints; mutable std::map m_xorigins; mutable std::map m_yorigins; mutable std::map m_heights; mutable size_t m_currentf0; mutable size_t m_currentf1; mutable std::vector m_values; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/ColourMapper.h0000644000175000017500000000315412252354725022767 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _COLOUR_MAPPER_H_ #define _COLOUR_MAPPER_H_ #include #include #include /** * A class for mapping intensity values onto various colour maps. */ class ColourMapper : public QObject { Q_OBJECT public: ColourMapper(int map, float minValue, float maxValue); virtual ~ColourMapper(); enum StandardMap { DefaultColours, Sunset, WhiteOnBlack, BlackOnWhite, RedOnBlue, YellowOnBlack, BlueOnBlack, FruitSalad, Banded, Highlight, Printer, HighGain }; int getMap() const { return m_map; } float getMinValue() const { return m_min; } float getMaxValue() const { return m_max; } static int getColourMapCount(); static QString getColourMapName(int n); QColor map(float value) const; QColor getContrastingColour() const; // for cursors etc bool hasLightBackground() const; protected: int m_map; float m_min; float m_max; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/SliceableLayer.h0000644000175000017500000000311212252354725023231 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SLICEABLE_LAYER_H_ #define _SLICEABLE_LAYER_H_ #include "Layer.h" /** * Base class for layers that can be sliced, that is, that contain * models appropriate for use in a SliceLayer. */ class SliceableLayer : public Layer { Q_OBJECT public: // Get a model that can be sliced, i.e. a // DenseThreeDimensionalModel. This may be the layer's usual // model, or it may be a model derived from it (e.g. FFTModel in a // spectrogram that was constructed from a DenseTimeValueModel). // The SliceableLayer retains ownership of the model, and will // emit sliceableModelReplaced if it is about to become invalid. virtual const Model *getSliceableModel() const = 0; signals: // Emitted when a model that was obtained through // getSliceableModel is about to be deleted. If replacement is // non-NULL, it may be used instead. void sliceableModelReplaced(const Model *modelToBeReplaced, const Model *replacement); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/PianoScale.h0000644000175000017500000000152312252354725022373 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef PIANO_SCALE_H #define PIANO_SCALE_H #include class QPainter; class View; class PianoScale { public: void paintPianoVertical (View *v, QPainter &paint, QRect rect, float minf, float maxf); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/Colour3DPlotLayer.cpp0000644000175000017500000012743712252354725024213 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Colour3DPlotLayer.h" #include "view/View.h" #include "base/Profiler.h" #include "base/LogRange.h" #include "base/RangeMapper.h" #include "ColourMapper.h" #include #include #include #include #include #include #ifndef __GNUC__ #include #endif //#define DEBUG_COLOUR_3D_PLOT_LAYER_PAINT 1 Colour3DPlotLayer::Colour3DPlotLayer() : m_model(0), m_cache(0), m_peaksCache(0), m_peakResolution(256), m_cacheValidStart(0), m_cacheValidEnd(0), m_colourScale(LinearScale), m_colourScaleSet(false), m_colourMap(0), m_gain(1.0), m_binScale(LinearBinScale), m_normalizeColumns(false), m_normalizeVisibleArea(false), m_invertVertical(false), m_opaque(false), m_smooth(false), m_miny(0), m_maxy(0) { } Colour3DPlotLayer::~Colour3DPlotLayer() { delete m_cache; delete m_peaksCache; } void Colour3DPlotLayer::setModel(const DenseThreeDimensionalModel *model) { if (m_model == model) return; const DenseThreeDimensionalModel *oldModel = m_model; m_model = model; if (!m_model || !m_model->isOK()) return; connectSignals(m_model); connect(m_model, SIGNAL(modelChanged()), this, SLOT(modelChanged())); connect(m_model, SIGNAL(modelChanged(size_t, size_t)), this, SLOT(modelChanged(size_t, size_t))); m_peakResolution = 256; if (model->getResolution() > 512) { m_peakResolution = 16; } else if (model->getResolution() > 128) { m_peakResolution = 64; } else if (model->getResolution() > 2) { m_peakResolution = 128; } cacheInvalid(); emit modelReplaced(); emit sliceableModelReplaced(oldModel, model); } void Colour3DPlotLayer::cacheInvalid() { delete m_cache; delete m_peaksCache; m_cache = 0; m_peaksCache = 0; m_cacheValidStart = 0; m_cacheValidEnd = 0; } void Colour3DPlotLayer::cacheInvalid(size_t startFrame, size_t endFrame) { if (!m_cache) return; size_t modelResolution = m_model->getResolution(); size_t start = startFrame / modelResolution; size_t end = endFrame / modelResolution + 1; if (m_cacheValidStart < end) m_cacheValidStart = end; if (m_cacheValidEnd > start) m_cacheValidEnd = start; if (m_cacheValidStart > m_cacheValidEnd) m_cacheValidEnd = m_cacheValidStart; } void Colour3DPlotLayer::modelChanged() { if (!m_colourScaleSet && m_colourScale == LinearScale) { if (m_model) { if (m_model->shouldUseLogValueScale()) { setColourScale(LogScale); } else { m_colourScaleSet = true; } } } cacheInvalid(); } void Colour3DPlotLayer::modelChanged(size_t startFrame, size_t endFrame) { if (!m_colourScaleSet && m_colourScale == LinearScale) { if (m_model && m_model->getWidth() > 50) { if (m_model->shouldUseLogValueScale()) { setColourScale(LogScale); } else { m_colourScaleSet = true; } } } cacheInvalid(startFrame, endFrame); } Layer::PropertyList Colour3DPlotLayer::getProperties() const { PropertyList list; list.push_back("Colour"); list.push_back("Colour Scale"); list.push_back("Normalize Columns"); list.push_back("Normalize Visible Area"); list.push_back("Gain"); list.push_back("Bin Scale"); list.push_back("Invert Vertical Scale"); list.push_back("Opaque"); list.push_back("Smooth"); return list; } QString Colour3DPlotLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Colour") return tr("Colour"); if (name == "Colour Scale") return tr("Scale"); if (name == "Normalize Columns") return tr("Normalize Columns"); if (name == "Normalize Visible Area") return tr("Normalize Visible Area"); if (name == "Invert Vertical Scale") return tr("Invert Vertical Scale"); if (name == "Gain") return tr("Gain"); if (name == "Opaque") return tr("Always Opaque"); if (name == "Smooth") return tr("Smooth"); if (name == "Bin Scale") return tr("Bin Scale"); return ""; } QString Colour3DPlotLayer::getPropertyIconName(const PropertyName &name) const { if (name == "Normalize Columns") return "normalise-columns"; if (name == "Normalize Visible Area") return "normalise"; if (name == "Invert Vertical Scale") return "invert-vertical"; if (name == "Opaque") return "opaque"; if (name == "Smooth") return "smooth"; return ""; } Layer::PropertyType Colour3DPlotLayer::getPropertyType(const PropertyName &name) const { if (name == "Gain") return RangeProperty; if (name == "Normalize Columns") return ToggleProperty; if (name == "Normalize Visible Area") return ToggleProperty; if (name == "Invert Vertical Scale") return ToggleProperty; if (name == "Opaque") return ToggleProperty; if (name == "Smooth") return ToggleProperty; return ValueProperty; } QString Colour3DPlotLayer::getPropertyGroupName(const PropertyName &name) const { if (name == "Normalize Columns" || name == "Normalize Visible Area" || name == "Colour Scale" || name == "Gain") return tr("Scale"); if (name == "Bin Scale" || name == "Invert Vertical Scale") return tr("Bins"); if (name == "Opaque" || name == "Smooth" || name == "Colour") return tr("Colour"); return QString(); } int Colour3DPlotLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Gain") { *min = -50; *max = 50; *deflt = lrintf(log10(1.f) * 20.0);; if (*deflt < *min) *deflt = *min; if (*deflt > *max) *deflt = *max; val = lrintf(log10(m_gain) * 20.0); if (val < *min) val = *min; if (val > *max) val = *max; } else if (name == "Colour Scale") { *min = 0; *max = 3; *deflt = (int)LinearScale; val = (int)m_colourScale; } else if (name == "Colour") { *min = 0; *max = ColourMapper::getColourMapCount() - 1; *deflt = 0; val = m_colourMap; } else if (name == "Normalize Columns") { *deflt = 0; val = (m_normalizeColumns ? 1 : 0); } else if (name == "Normalize Visible Area") { *deflt = 0; val = (m_normalizeVisibleArea ? 1 : 0); } else if (name == "Invert Vertical Scale") { *deflt = 0; val = (m_invertVertical ? 1 : 0); } else if (name == "Bin Scale") { *min = 0; *max = 1; *deflt = int(LinearBinScale); val = (int)m_binScale; } else if (name == "Opaque") { *deflt = 0; val = (m_opaque ? 1 : 0); } else if (name == "Smooth") { *deflt = 0; val = (m_smooth ? 1 : 0); } else { val = Layer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString Colour3DPlotLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour") { return ColourMapper::getColourMapName(value); } if (name == "Colour Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Log"); case 2: return tr("+/-1"); case 3: return tr("Absolute"); } } if (name == "Bin Scale") { switch (value) { default: case 0: return tr("Linear"); case 1: return tr("Log"); } } return tr(""); } RangeMapper * Colour3DPlotLayer::getNewPropertyRangeMapper(const PropertyName &name) const { if (name == "Gain") { return new LinearRangeMapper(-50, 50, -25, 25, tr("dB")); } return 0; } void Colour3DPlotLayer::setProperty(const PropertyName &name, int value) { if (name == "Gain") { setGain(pow(10, float(value)/20.0)); } else if (name == "Colour Scale") { switch (value) { default: case 0: setColourScale(LinearScale); break; case 1: setColourScale(LogScale); break; case 2: setColourScale(PlusMinusOneScale); break; case 3: setColourScale(AbsoluteScale); break; } } else if (name == "Colour") { setColourMap(value); } else if (name == "Normalize Columns") { setNormalizeColumns(value ? true : false); } else if (name == "Normalize Visible Area") { setNormalizeVisibleArea(value ? true : false); } else if (name == "Invert Vertical Scale") { setInvertVertical(value ? true : false); } else if (name == "Opaque") { setOpaque(value ? true : false); } else if (name == "Smooth") { setSmooth(value ? true : false); } else if (name == "Bin Scale") { switch (value) { default: case 0: setBinScale(LinearBinScale); break; case 1: setBinScale(LogBinScale); break; } } } void Colour3DPlotLayer::setColourScale(ColourScale scale) { if (m_colourScale == scale) return; m_colourScale = scale; m_colourScaleSet = true; cacheInvalid(); emit layerParametersChanged(); } void Colour3DPlotLayer::setColourMap(int map) { if (m_colourMap == map) return; m_colourMap = map; cacheInvalid(); emit layerParametersChanged(); } void Colour3DPlotLayer::setGain(float gain) { if (m_gain == gain) return; m_gain = gain; cacheInvalid(); emit layerParametersChanged(); } float Colour3DPlotLayer::getGain() const { return m_gain; } void Colour3DPlotLayer::setBinScale(BinScale binScale) { if (m_binScale == binScale) return; m_binScale = binScale; cacheInvalid(); emit layerParametersChanged(); } Colour3DPlotLayer::BinScale Colour3DPlotLayer::getBinScale() const { return m_binScale; } void Colour3DPlotLayer::setNormalizeColumns(bool n) { if (m_normalizeColumns == n) return; m_normalizeColumns = n; cacheInvalid(); emit layerParametersChanged(); } bool Colour3DPlotLayer::getNormalizeColumns() const { return m_normalizeColumns; } void Colour3DPlotLayer::setNormalizeVisibleArea(bool n) { if (m_normalizeVisibleArea == n) return; m_normalizeVisibleArea = n; cacheInvalid(); emit layerParametersChanged(); } bool Colour3DPlotLayer::getNormalizeVisibleArea() const { return m_normalizeVisibleArea; } void Colour3DPlotLayer::setInvertVertical(bool n) { if (m_invertVertical == n) return; m_invertVertical = n; cacheInvalid(); emit layerParametersChanged(); } void Colour3DPlotLayer::setOpaque(bool n) { if (m_opaque == n) return; m_opaque = n; emit layerParametersChanged(); } void Colour3DPlotLayer::setSmooth(bool n) { if (m_smooth == n) return; m_smooth = n; emit layerParametersChanged(); } bool Colour3DPlotLayer::getInvertVertical() const { return m_invertVertical; } bool Colour3DPlotLayer::getOpaque() const { return m_opaque; } bool Colour3DPlotLayer::getSmooth() const { return m_smooth; } void Colour3DPlotLayer::setLayerDormant(const View *v, bool dormant) { if (dormant) { #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT SVDEBUG << "Colour3DPlotLayer::setLayerDormant(" << dormant << ")" << endl; #endif if (isLayerDormant(v)) { return; } Layer::setLayerDormant(v, true); cacheInvalid(); } else { Layer::setLayerDormant(v, false); } } bool Colour3DPlotLayer::isLayerScrollable(const View *v) const { if (m_normalizeVisibleArea) return false; QPoint discard; return !v->shouldIlluminateLocalFeatures(this, discard); } bool Colour3DPlotLayer::getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const { if (!m_model) return false; min = 0; max = m_model->getHeight(); logarithmic = false; unit = ""; return true; } bool Colour3DPlotLayer::getDisplayExtents(float &min, float &max) const { if (!m_model) return false; min = m_miny; max = m_maxy; if (max <= min) { min = 0; max = m_model->getHeight(); } if (min < 0) min = 0; if (max > m_model->getHeight()) max = m_model->getHeight(); return true; } bool Colour3DPlotLayer::setDisplayExtents(float min, float max) { if (!m_model) return false; m_miny = lrintf(min); m_maxy = lrintf(max); emit layerParametersChanged(); return true; } int Colour3DPlotLayer::getVerticalZoomSteps(int &defaultStep) const { if (!m_model) return 0; defaultStep = 0; int h = m_model->getHeight(); return h; } int Colour3DPlotLayer::getCurrentVerticalZoomStep() const { if (!m_model) return 0; float min, max; getDisplayExtents(min, max); return m_model->getHeight() - lrintf(max - min); } void Colour3DPlotLayer::setVerticalZoomStep(int step) { if (!m_model) return; // SVDEBUG << "Colour3DPlotLayer::setVerticalZoomStep(" <getHeight(); getDisplayExtents(mn, mx); float h = v->height(); if (m_binScale == LinearBinScale) { y = h - (((bin - mn) * h) / (mx - mn)); } else { float logmin = mn + 1, logmax = mx + 1; LogRange::mapRange(logmin, logmax); y = h - (((LogRange::map(bin + 1) - logmin) * h) / (logmax - logmin)); } return y; } float Colour3DPlotLayer::getBinForY(View *v, float y) const { float bin = y; if (!m_model) return bin; float mn = 0, mx = m_model->getHeight(); getDisplayExtents(mn, mx); float h = v->height(); if (m_binScale == LinearBinScale) { bin = mn + ((h - y) * (mx - mn)) / h; } else { float logmin = mn + 1, logmax = mx + 1; LogRange::mapRange(logmin, logmax); bin = LogRange::unmap(logmin + ((h - y) * (logmax - logmin)) / h) - 1; } return bin; } QString Colour3DPlotLayer::getFeatureDescription(View *v, QPoint &pos) const { if (!m_model) return ""; int x = pos.x(); int y = pos.y(); size_t modelStart = m_model->getStartFrame(); size_t modelResolution = m_model->getResolution(); float srRatio = float(v->getViewManager()->getMainModelSampleRate()) / float(m_model->getSampleRate()); int sx0 = int((v->getFrameForX(x) / srRatio - long(modelStart)) / long(modelResolution)); int f0 = sx0 * modelResolution; int f1 = f0 + modelResolution; int sh = m_model->getHeight(); int symin = m_miny; int symax = m_maxy; if (symax <= symin) { symin = 0; symax = sh; } if (symin < 0) symin = 0; if (symax > sh) symax = sh; // float binHeight = float(v->height()) / (symax - symin); // int sy = int((v->height() - y) / binHeight) + symin; int sy = getBinForY(v, y); if (m_invertVertical) sy = m_model->getHeight() - sy - 1; float value = m_model->getValueAt(sx0, sy); // cerr << "bin value (" << sx0 << "," << sy << ") is " << value << endl; QString binName = m_model->getBinName(sy); if (binName == "") binName = QString("[%1]").arg(sy + 1); else binName = QString("%1 [%2]").arg(binName).arg(sy + 1); QString text = tr("Time:\t%1 - %2\nBin:\t%3\nValue:\t%4") .arg(RealTime::frame2RealTime(f0, m_model->getSampleRate()) .toText(true).c_str()) .arg(RealTime::frame2RealTime(f1, m_model->getSampleRate()) .toText(true).c_str()) .arg(binName) .arg(value); return text; } int Colour3DPlotLayer::getColourScaleWidth(QPainter &) const { int cw = 20; return cw; } int Colour3DPlotLayer::getVerticalScaleWidth(View *, bool, QPainter &paint) const { if (!m_model) return 0; QString sampleText = QString("[%1]").arg(m_model->getHeight()); int tw = paint.fontMetrics().width(sampleText); bool another = false; for (size_t i = 0; i < m_model->getHeight(); ++i) { if (m_model->getBinName(i).length() > sampleText.length()) { sampleText = m_model->getBinName(i); another = true; } } if (another) { tw = std::max(tw, paint.fontMetrics().width(sampleText)); } return tw + 13 + getColourScaleWidth(paint); } void Colour3DPlotLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const { if (!m_model) return; int h = rect.height(), w = rect.width(); int cw = getColourScaleWidth(paint); int ch = h - 20; if (ch > 20 && m_cache) { float min = m_model->getMinimumLevel(); float max = m_model->getMaximumLevel(); float mmin = min; float mmax = max; if (m_colourScale == LogScale) { LogRange::mapRange(mmin, mmax); } else if (m_colourScale == PlusMinusOneScale) { mmin = -1.f; mmax = 1.f; } else if (m_colourScale == AbsoluteScale) { if (mmin < 0) { if (fabsf(mmin) > fabsf(mmax)) mmax = fabsf(mmin); else mmax = fabsf(mmax); mmin = 0; } else { mmin = fabsf(mmin); mmax = fabsf(mmax); } } if (max == min) max = min + 1.0; if (mmax == mmin) mmax = mmin + 1.0; paint.setPen(v->getForeground()); paint.drawRect(4, 10, cw - 8, ch+1); for (int y = 0; y < ch; ++y) { float value = ((max - min) * (ch - y - 1)) / ch + min; if (m_colourScale == LogScale) { value = LogRange::map(value); } int pixel = int(((value - mmin) * 256) / (mmax - mmin)); if (pixel >= 0 && pixel < 256) { QRgb c = m_cache->color(pixel); paint.setPen(QColor(qRed(c), qGreen(c), qBlue(c))); paint.drawLine(5, 11 + y, cw - 5, 11 + y); } else { cerr << "WARNING: Colour3DPlotLayer::paintVerticalScale: value " << value << ", mmin " << mmin << ", mmax " << mmax << " leads to invalid pixel " << pixel << endl; } } QString minstr = QString("%1").arg(min); QString maxstr = QString("%1").arg(max); paint.save(); QFont font = paint.font(); font.setPixelSize(10); paint.setFont(font); int msw = paint.fontMetrics().width(maxstr); QMatrix m; m.translate(cw - 6, ch + 10); m.rotate(-90); paint.setWorldMatrix(m); v->drawVisibleText(paint, 2, 0, minstr, View::OutlinedText); m.translate(ch - msw - 2, 0); paint.setWorldMatrix(m); v->drawVisibleText(paint, 0, 0, maxstr, View::OutlinedText); paint.restore(); } paint.setPen(v->getForeground()); int sh = m_model->getHeight(); int symin = m_miny; int symax = m_maxy; if (symax <= symin) { symin = 0; symax = sh; } if (symin < 0) symin = 0; if (symax > sh) symax = sh; paint.save(); int py = h; for (size_t i = symin; i <= symax; ++i) { int y0; y0 = lrintf(getYForBin(v, i)); int h = py - y0; if (i > symin) { if (paint.fontMetrics().height() >= h) { if (h >= 8) { QFont tf = paint.font(); tf.setPixelSize(h-2); paint.setFont(tf); } else { continue; } } } py = y0; if (i < symax) { paint.drawLine(cw, y0, w, y0); } if (i > symin) { size_t idx = i - 1; if (m_invertVertical) idx = m_model->getHeight() - idx - 1; QString text = m_model->getBinName(idx); if (text == "") text = QString("[%1]").arg(idx + 1); int ty = y0 + (h/2) - (paint.fontMetrics().height()/2) + paint.fontMetrics().ascent() + 1; paint.drawText(cw + 5, ty, text); } } paint.restore(); } DenseThreeDimensionalModel::Column Colour3DPlotLayer::getColumn(size_t col) const { DenseThreeDimensionalModel::Column values = m_model->getColumn(col); while (values.size() < m_model->getHeight()) values.push_back(0.f); if (!m_normalizeColumns) return values; float colMax = 0.f, colMin = 0.f; float min = 0.f, max = 0.f; min = m_model->getMinimumLevel(); max = m_model->getMaximumLevel(); for (size_t y = 0; y < values.size(); ++y) { if (y == 0 || values.at(y) > colMax) colMax = values.at(y); if (y == 0 || values.at(y) < colMin) colMin = values.at(y); } if (colMin == colMax) colMax = colMin + 1; for (size_t y = 0; y < values.size(); ++y) { float value = values.at(y); float norm = (value - colMin) / (colMax - colMin); float newvalue = min + (max - min) * norm; if (value != newvalue) values[y] = newvalue; } return values; } void Colour3DPlotLayer::fillCache(size_t firstBin, size_t lastBin) const { Profiler profiler("Colour3DPlotLayer::fillCache"); size_t modelStart = m_model->getStartFrame(); size_t modelEnd = m_model->getEndFrame(); size_t modelResolution = m_model->getResolution(); #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT SVDEBUG << "Colour3DPlotLayer::fillCache: " << firstBin << " -> " << lastBin << endl; #endif size_t modelStartBin = modelStart / modelResolution; size_t modelEndBin = modelEnd / modelResolution; size_t cacheWidth = modelEndBin - modelStartBin + 1; if (lastBin > modelEndBin) cacheWidth = lastBin - modelStartBin + 1; size_t cacheHeight = m_model->getHeight(); if (m_cache && (m_cache->height() != int(cacheHeight))) { delete m_cache; delete m_peaksCache; m_cache = 0; m_peaksCache = 0; } if (m_cache && (m_cache->width() != int(cacheWidth))) { QImage *newCache = new QImage(m_cache->copy(0, 0, cacheWidth, cacheHeight)); delete m_cache; m_cache = newCache; if (m_peaksCache) { QImage *newPeaksCache = new QImage(m_peaksCache->copy (0, 0, cacheWidth / m_peakResolution, cacheHeight)); delete m_peaksCache; m_peaksCache = newPeaksCache; } } if (!m_cache) { m_cache = new QImage (cacheWidth, cacheHeight, QImage::Format_Indexed8); // No longer exists in Qt5: m_cache->setNumColors(256); m_cache->fill(0); if (!m_normalizeVisibleArea) { m_peaksCache = new QImage (cacheWidth / m_peakResolution + 1, cacheHeight, QImage::Format_Indexed8); // No longer exists in Qt5: m_peaksCache->setNumColors(256); m_peaksCache->fill(0); } else if (m_peaksCache) { delete m_peaksCache; m_peaksCache = 0; } m_cacheValidStart = 0; m_cacheValidEnd = 0; } if (m_cacheValidStart <= firstBin && m_cacheValidEnd >= lastBin) { #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT cerr << "Cache is valid in this region already" << endl; #endif return; } size_t fillStart = firstBin; size_t fillEnd = lastBin; if (fillStart < modelStartBin) fillStart = modelStartBin; if (fillStart > modelEndBin) fillStart = modelEndBin; if (fillEnd < modelStartBin) fillEnd = modelStartBin; if (fillEnd > modelEndBin) fillEnd = modelEndBin; bool normalizeVisible = (m_normalizeVisibleArea && !m_normalizeColumns); if (!normalizeVisible && (m_cacheValidStart < m_cacheValidEnd)) { if (m_cacheValidEnd < fillStart) { fillStart = m_cacheValidEnd + 1; } if (m_cacheValidStart > fillEnd) { fillEnd = m_cacheValidStart - 1; } m_cacheValidStart = std::min(fillStart, m_cacheValidStart); m_cacheValidEnd = std::max(fillEnd, m_cacheValidEnd); } else { // the only valid area, ever, is the currently visible one m_cacheValidStart = fillStart; m_cacheValidEnd = fillEnd; } #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT cerr << "Cache size " << cacheWidth << "x" << cacheHeight << " will be valid from " << m_cacheValidStart << " to " << m_cacheValidEnd << endl; #endif DenseThreeDimensionalModel::Column values; float min = m_model->getMinimumLevel(); float max = m_model->getMaximumLevel(); if (m_colourScale == LogScale) { LogRange::mapRange(min, max); } else if (m_colourScale == PlusMinusOneScale) { min = -1.f; max = 1.f; } else if (m_colourScale == AbsoluteScale) { if (min < 0) { if (fabsf(min) > fabsf(max)) max = fabsf(min); else max = fabsf(max); min = 0; } else { min = fabsf(min); max = fabsf(max); } } if (max == min) max = min + 1.0; ColourMapper mapper(m_colourMap, 0.f, 255.f); for (int index = 0; index < 256; ++index) { QColor colour = mapper.map(index); m_cache->setColor (index, qRgb(colour.red(), colour.green(), colour.blue())); if (m_peaksCache) { m_peaksCache->setColor (index, qRgb(colour.red(), colour.green(), colour.blue())); } } float visibleMax = 0.f, visibleMin = 0.f; if (normalizeVisible) { for (size_t c = fillStart; c <= fillEnd; ++c) { values = getColumn(c); float colMax = 0.f, colMin = 0.f; for (size_t y = 0; y < cacheHeight; ++y) { if (y >= values.size()) break; if (y == 0 || values[y] > colMax) colMax = values[y]; if (y == 0 || values[y] < colMin) colMin = values[y]; } if (c == fillStart || colMax > visibleMax) visibleMax = colMax; if (c == fillStart || colMin < visibleMin) visibleMin = colMin; } if (m_colourScale == LogScale) { visibleMin = LogRange::map(visibleMin); visibleMax = LogRange::map(visibleMax); if (visibleMin > visibleMax) std::swap(visibleMin, visibleMax); } else if (m_colourScale == AbsoluteScale) { if (visibleMin < 0) { if (fabsf(visibleMin) > fabsf(visibleMax)) visibleMax = fabsf(visibleMin); else visibleMax = fabsf(visibleMax); visibleMin = 0; } else { visibleMin = fabsf(visibleMin); visibleMax = fabsf(visibleMax); } } } if (visibleMin == visibleMax) visibleMax = visibleMin + 1; int *peaks = 0; if (m_peaksCache) { peaks = new int[cacheHeight]; for (int y = 0; y < cacheHeight; ++y) { peaks[y] = 0; } } for (size_t c = fillStart; c <= fillEnd; ++c) { values = getColumn(c); for (size_t y = 0; y < cacheHeight; ++y) { float value = min; if (y < values.size()) { value = values.at(y); } value = value * m_gain; if (m_colourScale == LogScale) { value = LogRange::map(value); } else if (m_colourScale == AbsoluteScale) { value = fabsf(value); } if (normalizeVisible) { float norm = (value - visibleMin) / (visibleMax - visibleMin); value = min + (max - min) * norm; } int pixel = int(((value - min) * 256) / (max - min)); if (pixel < 0) pixel = 0; if (pixel > 255) pixel = 255; if (peaks && (pixel > peaks[y])) peaks[y] = pixel; if (m_invertVertical) { m_cache->setPixel(c, cacheHeight - y - 1, pixel); } else { m_cache->setPixel(c, y, pixel); } } if (peaks) { size_t notch = (c % m_peakResolution); if (notch == m_peakResolution-1 || c == fillEnd) { size_t pc = c / m_peakResolution; for (size_t y = 0; y < cacheHeight; ++y) { if (m_invertVertical) { m_peaksCache->setPixel(pc, cacheHeight - y - 1, peaks[y]); } else { m_peaksCache->setPixel(pc, y, peaks[y]); } } for (int y = 0; y < cacheHeight; ++y) { peaks[y] = 0; } } } } delete[] peaks; } void Colour3DPlotLayer::paint(View *v, QPainter &paint, QRect rect) const { /* if (m_model) { SVDEBUG << "Colour3DPlotLayer::paint: model says shouldUseLogValueScale = " << m_model->shouldUseLogValueScale() << endl; } */ Profiler profiler("Colour3DPlotLayer::paint"); #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT SVDEBUG << "Colour3DPlotLayer::paint(): m_model is " << m_model << ", zoom level is " << v->getZoomLevel() << endl; #endif int completion = 0; if (!m_model || !m_model->isOK() || !m_model->isReady(&completion)) { if (completion > 0) { paint.fillRect(0, 10, v->width() * completion / 100, 10, QColor(120, 120, 120)); } return; } if (m_normalizeVisibleArea && !m_normalizeColumns) rect = v->rect(); size_t modelStart = m_model->getStartFrame(); size_t modelEnd = m_model->getEndFrame(); size_t modelResolution = m_model->getResolution(); // The cache is from the model's start frame to the model's end // frame at the model's window increment frames per pixel. We // want to draw from our start frame + x0 * zoomLevel to our start // frame + x1 * zoomLevel at zoomLevel frames per pixel. // We have quite different paint mechanisms for rendering "large" // bins (more than one bin per pixel in both directions) and // "small". This is "large"; see paintDense below for "small". int x0 = rect.left(); int x1 = rect.right() + 1; int h = v->height(); float srRatio = float(v->getViewManager()->getMainModelSampleRate()) / float(m_model->getSampleRate()); int sx0 = int((v->getFrameForX(x0) / srRatio - long(modelStart)) / long(modelResolution)); int sx1 = int((v->getFrameForX(x1) / srRatio - long(modelStart)) / long(modelResolution)); int sh = m_model->getHeight(); int symin = m_miny; int symax = m_maxy; if (symax <= symin) { symin = 0; symax = sh; } if (symin < 0) symin = 0; if (symax > sh) symax = sh; if (sx0 > 0) --sx0; fillCache(sx0 < 0 ? 0 : sx0, sx1 < 0 ? 0 : sx1); #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT SVDEBUG << "Colour3DPlotLayer::paint: height = "<< m_model->getHeight() << ", modelStart = " << modelStart << ", resolution = " << modelResolution << ", model rate = " << m_model->getSampleRate() << " (zoom level = " << v->getZoomLevel() << ", srRatio = " << srRatio << ")" << endl; #endif if (m_opaque || m_smooth || int(m_model->getHeight()) >= v->height() || ((modelResolution * srRatio) / v->getZoomLevel()) < 2) { #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT SVDEBUG << "calling paintDense" << endl; #endif paintDense(v, paint, rect); return; } #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT SVDEBUG << "Colour3DPlotLayer::paint: w " << x1-x0 << ", h " << h << ", sx0 " << sx0 << ", sx1 " << sx1 << ", sw " << sx1-sx0 << ", sh " << sh << endl; cerr << "Colour3DPlotLayer: sample rate is " << m_model->getSampleRate() << ", resolution " << m_model->getResolution() << endl; #endif QPoint illuminatePos; bool illuminate = v->shouldIlluminateLocalFeatures(this, illuminatePos); char labelbuf[10]; for (int sx = sx0; sx <= sx1; ++sx) { int fx = sx * int(modelResolution); if (fx + int(modelResolution) <= int(modelStart) || fx > int(modelEnd)) continue; int rx0 = v->getXForFrame(int((fx + int(modelStart)) * srRatio)); int rx1 = v->getXForFrame(int((fx + int(modelStart) + int(modelResolution) + 1) * srRatio)); int rw = rx1 - rx0; if (rw < 1) rw = 1; bool showLabel = (rw > 10 && paint.fontMetrics().width("0.000000") < rw - 3 && paint.fontMetrics().height() < (h / sh)); for (int sy = symin; sy < symax; ++sy) { int ry0 = getYForBin(v, sy); int ry1 = getYForBin(v, sy + 1); QRect r(rx0, ry1, rw, ry0 - ry1); QRgb pixel = qRgb(255, 255, 255); if (sx >= 0 && sx < m_cache->width() && sy >= 0 && sy < m_cache->height()) { pixel = m_cache->pixel(sx, sy); } if (rw == 1) { paint.setPen(pixel); paint.setBrush(Qt::NoBrush); paint.drawLine(r.x(), r.y(), r.x(), r.y() + r.height() - 1); continue; } QColor pen(255, 255, 255, 80); QColor brush(pixel); if (rw > 3 && r.height() > 3) { brush.setAlpha(160); } paint.setPen(Qt::NoPen); paint.setBrush(brush); if (illuminate) { if (r.contains(illuminatePos)) { paint.setPen(v->getForeground()); } } #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT // cerr << "rect " << r.x() << "," << r.y() << " " // << r.width() << "x" << r.height() << endl; #endif paint.drawRect(r); if (showLabel) { if (sx >= 0 && sx < m_cache->width() && sy >= 0 && sy < m_cache->height()) { float value = m_model->getValueAt(sx, sy); sprintf(labelbuf, "%06f", value); QString text(labelbuf); paint.setPen(v->getBackground()); paint.drawText(rx0 + 2, ry0 - h / sh - 1 + 2 + paint.fontMetrics().ascent(), text); } } } } } void Colour3DPlotLayer::paintDense(View *v, QPainter &paint, QRect rect) const { Profiler profiler("Colour3DPlotLayer::paintDense"); if (!m_cache) return; float modelStart = m_model->getStartFrame(); float modelResolution = m_model->getResolution(); int mmsr = v->getViewManager()->getMainModelSampleRate(); int msr = m_model->getSampleRate(); float srRatio = float(mmsr) / float(msr); int x0 = rect.left(); int x1 = rect.right() + 1; const int w = x1 - x0; // const so it can be used as array size below int h = v->height(); // we always paint full height int sh = m_model->getHeight(); int symin = m_miny; int symax = m_maxy; if (symax <= symin) { symin = 0; symax = sh; } if (symin < 0) symin = 0; if (symax > sh) symax = sh; QImage img(w, h, QImage::Format_Indexed8); img.setColorTable(m_cache->colorTable()); uchar *peaks = new uchar[w]; memset(peaks, 0, w); int zoomLevel = v->getZoomLevel(); QImage *source = m_cache; SVDEBUG << "modelResolution " << modelResolution << ", srRatio " << srRatio << ", m_peakResolution " << m_peakResolution << ", zoomLevel " << zoomLevel << ", result " << ((modelResolution * srRatio * m_peakResolution) / zoomLevel) << endl; if (m_peaksCache) { if (((modelResolution * srRatio * m_peakResolution) / zoomLevel) < 1) { SVDEBUG << "using peaks cache" << endl; source = m_peaksCache; modelResolution *= m_peakResolution; } else { SVDEBUG << "not using peaks cache" << endl; } } else { SVDEBUG << "have no peaks cache" << endl; } int psy1i = -1; int sw = source->width(); long xf = -1; long nxf = v->getFrameForX(x0); float epsilon = 0.000001; #ifdef __GNUC__ float sxa[w * 2]; #else float *sxa = (float *)alloca(w * 2 * sizeof(float)); #endif for (int x = 0; x < w; ++x) { xf = nxf; nxf = xf + zoomLevel; float sx0 = (float(xf) / srRatio - modelStart) / modelResolution; float sx1 = (float(nxf) / srRatio - modelStart) / modelResolution; sxa[x*2] = sx0; sxa[x*2 + 1] = sx1; } float logmin = symin+1, logmax = symax+1; LogRange::mapRange(logmin, logmax); if (m_smooth) { for (int y = 0; y < h; ++y) { float sy = getBinForY(v, y) - 0.5; int syi = int(sy + epsilon); if (syi < 0 || syi >= source->height()) continue; uchar *targetLine = img.scanLine(y); uchar *sourceLine = source->scanLine(syi); uchar *nextSource; if (syi + 1 < source->height()) { nextSource = source->scanLine(syi + 1); } else { nextSource = sourceLine; } for (int x = 0; x < w; ++x) { targetLine[x] = 0; float sx0 = sxa[x*2]; if (sx0 < 0) continue; int sx0i = int(sx0 + epsilon); if (sx0i >= sw) break; float a, b, value; float sx1 = sxa[x*2+1]; if (sx1 > sx0 + 1.f) { int sx1i = int(sx1); bool have = false; for (int sx = sx0i; sx <= sx1i; ++sx) { if (sx < 0 || sx >= sw) continue; if (!have) { a = float(sourceLine[sx]); b = float(nextSource[sx]); have = true; } else { a = std::max(a, float(sourceLine[sx])); b = std::max(b, float(nextSource[sx])); } } float yprop = sy - syi; value = (a * (1.f - yprop) + b * yprop); } else { a = float(sourceLine[sx0i]); b = float(nextSource[sx0i]); float yprop = sy - syi; value = (a * (1.f - yprop) + b * yprop); int oi = sx0i + 1; float xprop = sx0 - sx0i; xprop -= 0.5; if (xprop < 0) { oi = sx0i - 1; xprop = -xprop; } if (oi < 0 || oi >= sw) oi = sx0i; a = float(sourceLine[oi]); b = float(nextSource[oi]); value = (value * (1.f - xprop) + (a * (1.f - yprop) + b * yprop) * xprop); } int vi = lrintf(value); if (vi > 255) vi = 255; if (vi < 0) vi = 0; targetLine[x] = uchar(vi); } } } else { for (int y = 0; y < h; ++y) { float sy0, sy1; sy0 = getBinForY(v, y + 1); sy1 = getBinForY(v, y); int sy0i = int(sy0 + epsilon); int sy1i = int(sy1); uchar *targetLine = img.scanLine(y); if (sy0i == sy1i && sy0i == psy1i) { // same source scan line as just computed goto copy; } for (int x = 0; x < w; ++x) { peaks[x] = 0; } for (int sy = sy0i; sy <= sy1i; ++sy) { if (sy < 0 || sy >= source->height()) continue; uchar *sourceLine = source->scanLine(sy); for (int x = 0; x < w; ++x) { float sx1 = sxa[x*2 + 1]; if (sx1 < 0) continue; int sx1i = int(sx1); float sx0 = sxa[x*2]; if (sx0 < 0) continue; int sx0i = int(sx0 + epsilon); if (sx0i >= sw) break; uchar peak = 0; for (int sx = sx0i; sx <= sx1i; ++sx) { if (sx < 0 || sx >= sw) continue; if (sourceLine[sx] > peak) peak = sourceLine[sx]; } peaks[x] = peak; } } copy: for (int x = 0; x < w; ++x) { targetLine[x] = peaks[x]; } } } delete[] peaks; paint.drawImage(x0, 0, img); } bool Colour3DPlotLayer::snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const { if (!m_model) { return Layer::snapToFeatureFrame(v, frame, resolution, snap); } resolution = m_model->getResolution(); int left = (frame / resolution) * resolution; int right = left + resolution; switch (snap) { case SnapLeft: frame = left; break; case SnapRight: frame = right; break; case SnapNearest: case SnapNeighbouring: if (frame - left > right - frame) frame = right; else frame = left; break; } return true; } void Colour3DPlotLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s = QString("scale=\"%1\" " "colourScheme=\"%2\" " "normalizeColumns=\"%3\" " "normalizeVisibleArea=\"%4\" " "minY=\"%5\" " "maxY=\"%6\" " "invertVertical=\"%7\" " "opaque=\"%8\" %9") .arg((int)m_colourScale) .arg(m_colourMap) .arg(m_normalizeColumns ? "true" : "false") .arg(m_normalizeVisibleArea ? "true" : "false") .arg(m_miny) .arg(m_maxy) .arg(m_invertVertical ? "true" : "false") .arg(m_opaque ? "true" : "false") .arg(QString("binScale=\"%1\" smooth=\"%2\" gain=\"%3\" ") .arg((int)m_binScale) .arg(m_smooth ? "true" : "false") .arg(m_gain)); Layer::toXml(stream, indent, extraAttributes + " " + s); } void Colour3DPlotLayer::setProperties(const QXmlAttributes &attributes) { bool ok = false, alsoOk = false; ColourScale scale = (ColourScale)attributes.value("scale").toInt(&ok); if (ok) setColourScale(scale); int colourMap = attributes.value("colourScheme").toInt(&ok); if (ok) setColourMap(colourMap); BinScale binscale = (BinScale)attributes.value("binScale").toInt(&ok); if (ok) setBinScale(binscale); bool normalizeColumns = (attributes.value("normalizeColumns").trimmed() == "true"); setNormalizeColumns(normalizeColumns); bool normalizeVisibleArea = (attributes.value("normalizeVisibleArea").trimmed() == "true"); setNormalizeVisibleArea(normalizeVisibleArea); bool invertVertical = (attributes.value("invertVertical").trimmed() == "true"); setInvertVertical(invertVertical); bool opaque = (attributes.value("opaque").trimmed() == "true"); setOpaque(opaque); bool smooth = (attributes.value("smooth").trimmed() == "true"); setSmooth(smooth); float gain = attributes.value("gain").toFloat(&ok); if (ok) setGain(gain); float min = attributes.value("minY").toFloat(&ok); float max = attributes.value("maxY").toFloat(&alsoOk); if (ok && alsoOk) setDisplayExtents(min, max); } sonic-visualiser-2.3~repack1.orig/svgui/layer/TimeValueLayer.h0000644000175000017500000001451212252354725023247 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TIME_VALUE_LAYER_H_ #define _TIME_VALUE_LAYER_H_ #include "SingleColourLayer.h" #include "VerticalScaleLayer.h" #include "ColourScaleLayer.h" #include "data/model/SparseTimeValueModel.h" #include #include class View; class QPainter; class TimeValueLayer : public SingleColourLayer, public VerticalScaleLayer, public ColourScaleLayer { Q_OBJECT public: TimeValueLayer(); virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual int getVerticalScaleWidth(View *v, bool, QPainter &) const; virtual void paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual QString getLabelPreceding(size_t) const; virtual bool snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual bool snapToSimilarFeature(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual void drawStart(View *v, QMouseEvent *); virtual void drawDrag(View *v, QMouseEvent *); virtual void drawEnd(View *v, QMouseEvent *); virtual void eraseStart(View *v, QMouseEvent *); virtual void eraseDrag(View *v, QMouseEvent *); virtual void eraseEnd(View *v, QMouseEvent *); virtual void editStart(View *v, QMouseEvent *); virtual void editDrag(View *v, QMouseEvent *); virtual void editEnd(View *v, QMouseEvent *); virtual bool editOpen(View *v, QMouseEvent *); virtual void moveSelection(Selection s, size_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(View *v, Selection s, Clipboard &to); virtual bool paste(View *v, const Clipboard &from, int frameOffset, bool interactive); virtual const Model *getModel() const { return m_model; } void setModel(SparseTimeValueModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); void setFillColourMap(int); int getFillColourMap() const { return m_colourMap; } enum PlotStyle { PlotPoints, PlotStems, PlotConnectedPoints, PlotLines, PlotCurve, PlotSegmentation, PlotDiscreteCurves }; void setPlotStyle(PlotStyle style); PlotStyle getPlotStyle() const { return m_plotStyle; } enum VerticalScale { AutoAlignScale, LinearScale, LogScale, PlusMinusOneScale }; void setVerticalScale(VerticalScale scale); VerticalScale getVerticalScale() const { return m_verticalScale; } void setDrawSegmentDivisions(bool); bool getDrawSegmentDivisions() const { return m_drawSegmentDivisions; } void setShowDerivative(bool); bool getShowDerivative() const { return m_derivative; } virtual bool isLayerScrollable(const View *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(View *) const { return m_model->getCompletion(); } virtual bool needsTextLabelHeight() const { return m_plotStyle == PlotSegmentation && m_model->hasTextLabels(); } virtual bool getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const; virtual bool getDisplayExtents(float &min, float &max) const; virtual bool setDisplayExtents(float min, float max); virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); virtual ColourSignificance getLayerColourSignificance() const { if (m_plotStyle == PlotSegmentation) { return ColourHasMeaningfulValue; } else { return ColourDistinguishes; } } /// VerticalScaleLayer and ColourScaleLayer methods virtual int getYForValue(View *, float value) const; virtual float getValueForY(View *, int y) const; virtual QString getScaleUnits() const; virtual QColor getColourForValue(View *v, float value) const; protected: void getScaleExtents(View *, float &min, float &max, bool &log) const; bool shouldAutoAlign() const; SparseTimeValueModel::PointList getLocalPoints(View *v, int) const; virtual int getDefaultColourHint(bool dark, bool &impose); SparseTimeValueModel *m_model; bool m_editing; SparseTimeValueModel::Point m_originalPoint; SparseTimeValueModel::Point m_editingPoint; SparseTimeValueModel::EditCommand *m_editingCommand; int m_colourMap; PlotStyle m_plotStyle; VerticalScale m_verticalScale; bool m_drawSegmentDivisions; bool m_derivative; mutable float m_scaleMinimum; mutable float m_scaleMaximum; void finish(SparseTimeValueModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/ImageRegionFinder.h0000644000175000017500000000164712252354725023702 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _IMAGE_REGION_FINDER_H_ #define _IMAGE_REGION_FINDER_H_ #include #include class QImage; class ImageRegionFinder { public: ImageRegionFinder(); virtual ~ImageRegionFinder(); QRect findRegionExtents(QImage *image, QPoint origin) const; protected: bool similar(QRgb a, QRgb b) const; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/ColourDatabase.h0000644000175000017500000000444212252354725023250 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _COLOUR_DATABASE_H_ #define _COLOUR_DATABASE_H_ #include #include #include #include #include #include class ColourDatabase : public QObject { Q_OBJECT public: static ColourDatabase *getInstance(); int getColourCount() const; QString getColourName(int c) const; QColor getColour(int c) const; QColor getColour(QString name) const; int getColourIndex(QString name) const; // -1 -> not found int getColourIndex(QColor c) const; // returns first index of possibly many bool haveColour(QColor c) const; bool useDarkBackground(int c) const; void setUseDarkBackground(int c, bool dark); int addColour(QColor, QString); // returns index void removeColour(QString); // returned colour is not necessarily in database QColor getContrastingColour(int c) const; // for use in XML export void getStringValues(int index, QString &colourName, QString &colourSpec, QString &darkbg) const; // for use in XML import int putStringValues(QString colourName, QString colourSpec, QString darkbg); // for use by PropertyContainer getPropertyRangeAndValue methods void getColourPropertyRange(int *min, int *max) const; QPixmap getExamplePixmap(int index, QSize size) const; signals: void colourDatabaseChanged(); protected: ColourDatabase(); struct ColourRec { QColor colour; QString name; bool darkbg; }; typedef std::vector ColourList; ColourList m_colours; static ColourDatabase m_instance; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/Colour3DPlotLayer.h0000644000175000017500000001361312252354725023646 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _COLOUR_3D_PLOT_H_ #define _COLOUR_3D_PLOT_H_ #include "SliceableLayer.h" #include "data/model/DenseThreeDimensionalModel.h" class View; class QPainter; class QImage; /** * This is a view that displays dense 3-D data (time, some sort of * binned y-axis range, value) as a colour plot with value mapped to * colour range. Its source is a DenseThreeDimensionalModel. * * This was the original implementation for the spectrogram view, but * it was replaced with a more efficient implementation that derived * the spectrogram itself from a DenseTimeValueModel instead of using * a three-dimensional model. This class is retained in case it * becomes useful, but it will probably need some cleaning up if it's * ever actually used. */ class Colour3DPlotLayer : public SliceableLayer { Q_OBJECT public: Colour3DPlotLayer(); ~Colour3DPlotLayer(); virtual const ZoomConstraint *getZoomConstraint() const { return m_model ? m_model->getZoomConstraint() : 0; } virtual const Model *getModel() const { return m_model; } virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual int getVerticalScaleWidth(View *v, bool, QPainter &) const; virtual void paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual bool snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual void setLayerDormant(const View *v, bool dormant); virtual bool isLayerScrollable(const View *v) const; virtual ColourSignificance getLayerColourSignificance() const { return ColourHasMeaningfulValue; } void setModel(const DenseThreeDimensionalModel *model); virtual int getCompletion(View *) const { return m_model->getCompletion(); } virtual PropertyList getProperties() const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyLabel(const PropertyName &) const; virtual QString getPropertyIconName(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; virtual void setProperty(const PropertyName &, int value); virtual void setProperties(const QXmlAttributes &); enum ColourScale { LinearScale, LogScale, PlusMinusOneScale, AbsoluteScale }; void setColourScale(ColourScale); ColourScale getColourScale() const { return m_colourScale; } void setColourMap(int map); int getColourMap() const; /** * Set the gain multiplier for sample values in this view. * The default is 1.0. */ void setGain(float gain); float getGain() const; enum BinScale { LinearBinScale, LogBinScale }; /** * Specify the scale for the y axis. */ void setBinScale(BinScale); BinScale getBinScale() const; void setNormalizeColumns(bool n); bool getNormalizeColumns() const; void setNormalizeVisibleArea(bool n); bool getNormalizeVisibleArea() const; void setInvertVertical(bool i); bool getInvertVertical() const; void setOpaque(bool i); bool getOpaque() const; void setSmooth(bool i); bool getSmooth() const; virtual bool getValueExtents(float &min, float &max, bool &logarithmic, QString &unit) const; virtual bool getDisplayExtents(float &min, float &max) const; virtual bool setDisplayExtents(float min, float max); virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; virtual const Model *getSliceableModel() const { return m_model; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; protected slots: void cacheInvalid(); void cacheInvalid(size_t startFrame, size_t endFrame); void modelChanged(); void modelChanged(size_t, size_t); protected: const DenseThreeDimensionalModel *m_model; // I do not own this mutable QImage *m_cache; mutable QImage *m_peaksCache; mutable size_t m_cacheValidStart; mutable size_t m_cacheValidEnd; ColourScale m_colourScale; bool m_colourScaleSet; int m_colourMap; float m_gain; BinScale m_binScale; bool m_normalizeColumns; bool m_normalizeVisibleArea; bool m_invertVertical; bool m_opaque; bool m_smooth; size_t m_peakResolution; int m_miny; int m_maxy; DenseThreeDimensionalModel::Column getColumn(size_t col) const; int getColourScaleWidth(QPainter &) const; void fillCache(size_t firstBin, size_t lastBin) const; void paintDense(View *v, QPainter &paint, QRect rect) const; float getYForBin(View *, float bin) const; float getBinForY(View *, float y) const; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/LogNumericalScale.h0000644000175000017500000000171412252354725023710 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef LOG_NUMERICAL_SCALE_H #define LOG_NUMERICAL_SCALE_H #include class QPainter; class View; class VerticalScaleLayer; class LogNumericalScale { public: int getWidth(View *v, QPainter &paint); void paintVertical (View *v, const VerticalScaleLayer *layer, QPainter &paint, int x0, float minlog, float maxlog); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/LayerFactory.h0000644000175000017500000000447012252354725022765 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _LAYER_FACTORY_H_ #define _LAYER_FACTORY_H_ #include #include class Layer; class Model; class Clipboard; class LayerFactory { public: enum LayerType { // Standard layers Waveform, Spectrogram, TimeRuler, TimeInstants, TimeValues, Notes, Regions, Text, Image, Colour3DPlot, Spectrum, Slice, // Layers with different initial parameters MelodicRangeSpectrogram, PeakFrequencySpectrogram, // Not-a-layer-type UnknownLayer = 255 }; static LayerFactory *getInstance(); virtual ~LayerFactory(); typedef std::set LayerTypeSet; LayerTypeSet getValidLayerTypes(Model *model); LayerTypeSet getValidEmptyLayerTypes(); LayerType getLayerType(const Layer *); Layer *createLayer(LayerType type); void setLayerDefaultProperties(LayerType type, Layer *layer); QString getLayerPresentationName(LayerType type); bool isLayerSliceable(const Layer *); void setModel(Layer *layer, Model *model); Model *createEmptyModel(LayerType type, Model *baseModel); int getChannel(Layer *layer); void setChannel(Layer *layer, int channel); QString getLayerIconName(LayerType); QString getLayerTypeName(LayerType); LayerType getLayerTypeForName(QString); LayerType getLayerTypeForClipboardContents(const Clipboard &); protected: template bool trySetModel(Layer *layerBase, Model *modelBase) { LayerClass *layer = dynamic_cast(layerBase); if (!layer) return false; ModelClass *model = dynamic_cast(modelBase); if (!model) return false; layer->setModel(model); return true; } static LayerFactory *m_instance; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/NoteLayer.h0000644000175000017500000001305012252354725022255 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _NOTE_LAYER_H_ #define _NOTE_LAYER_H_ #include "SingleColourLayer.h" #include "VerticalScaleLayer.h" #include "data/model/NoteModel.h" #include #include class View; class QPainter; class NoteLayer : public SingleColourLayer, public VerticalScaleLayer { Q_OBJECT public: NoteLayer(); virtual void paint(View *v, QPainter &paint, QRect rect) const; virtual int getVerticalScaleWidth(View *v, bool, QPainter &) const; virtual void paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const; virtual QString getFeatureDescription(View *v, QPoint &) const; virtual bool snapToFeatureFrame(View *v, int &frame, size_t &resolution, SnapType snap) const; virtual void drawStart(View *v, QMouseEvent *); virtual void drawDrag(View *v, QMouseEvent *); virtual void drawEnd(View *v, QMouseEvent *); virtual void eraseStart(View *v, QMouseEvent *); virtual void eraseDrag(View *v, QMouseEvent *); virtual void eraseEnd(View *v, QMouseEvent *); virtual void editStart(View *v, QMouseEvent *); virtual void editDrag(View *v, QMouseEvent *); virtual void editEnd(View *v, QMouseEvent *); virtual bool editOpen(View *v, QMouseEvent *); virtual void moveSelection(Selection s, size_t newStartFrame); virtual void resizeSelection(Selection s, Selection newSize); virtual void deleteSelection(Selection s); virtual void copy(View *v, Selection s, Clipboard &to); virtual bool paste(View *v, const Clipboard &from, int frameOffset, bool interactive); virtual const Model *getModel() const { return m_model; } void setModel(NoteModel *model); virtual PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyType getPropertyType(const PropertyName &) const; virtual QString getPropertyGroupName(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); enum VerticalScale { AutoAlignScale, LinearScale, LogScale, MIDIRangeScale }; void setVerticalScale(VerticalScale scale); VerticalScale getVerticalScale() const { return m_verticalScale; } virtual bool isLayerScrollable(const View *v) const; virtual bool isLayerEditable() const { return true; } virtual int getCompletion(View *) const { return m_model->getCompletion(); } virtual bool getValueExtents(float &min, float &max, bool &log, QString &unit) const; virtual bool getDisplayExtents(float &min, float &max) const; virtual bool setDisplayExtents(float min, float max); virtual int getVerticalZoomSteps(int &defaultStep) const; virtual int getCurrentVerticalZoomStep() const; virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; /** * Add a note-on. Used when recording MIDI "live". The note will * not be finally added to the layer until the corresponding * note-off. */ void addNoteOn(long frame, int pitch, int velocity); /** * Add a note-off. This will cause a note to appear, if and only * if there is a matching pending note-on. */ void addNoteOff(long frame, int pitch); /** * Abandon all pending note-on events. */ void abandonNoteOns(); virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; void setProperties(const QXmlAttributes &attributes); /// VerticalScaleLayer methods virtual int getYForValue(View *v, float value) const; virtual float getValueForY(View *v, int y) const; virtual QString getScaleUnits() const; protected: void getScaleExtents(View *, float &min, float &max, bool &log) const; bool shouldConvertMIDIToHz() const; virtual int getDefaultColourHint(bool dark, bool &impose); NoteModel::PointList getLocalPoints(View *v, int) const; bool getPointToDrag(View *v, int x, int y, NoteModel::Point &) const; NoteModel *m_model; bool m_editing; int m_dragPointX; int m_dragPointY; int m_dragStartX; int m_dragStartY; NoteModel::Point m_originalPoint; NoteModel::Point m_editingPoint; NoteModel::EditCommand *m_editingCommand; VerticalScale m_verticalScale; typedef std::set NoteSet; NoteSet m_pendingNoteOns; mutable float m_scaleMinimum; mutable float m_scaleMaximum; bool shouldAutoAlign() const; void finish(NoteModel::EditCommand *command) { Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/LinearNumericalScale.h0000644000175000017500000000172112252354725024377 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef LINEAR_NUMERICAL_SCALE_H #define LINEAR_NUMERICAL_SCALE_H #include class QPainter; class View; class VerticalScaleLayer; class LinearNumericalScale { public: int getWidth(View *v, QPainter &paint); void paintVertical (View *v, const VerticalScaleLayer *layer, QPainter &paint, int x0, float minf, float maxf); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/layer/SingleColourLayer.cpp0000644000175000017500000002035712252354725024320 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "SingleColourLayer.h" #include "ColourDatabase.h" #include "view/View.h" #include #include #include //#define DEBUG_COLOUR_SELECTION 1 SingleColourLayer::ColourRefCount SingleColourLayer::m_colourRefCount; SingleColourLayer::SingleColourLayer() : m_colour(0), m_colourExplicitlySet(false), m_defaultColourSet(false) { setDefaultColourFor(0); } QPixmap SingleColourLayer::getLayerPresentationPixmap(QSize size) const { return ColourDatabase::getInstance()->getExamplePixmap(m_colour, size); } bool SingleColourLayer::hasLightBackground() const { bool dark = ColourDatabase::getInstance()->useDarkBackground(m_colour); return !dark; } Layer::PropertyList SingleColourLayer::getProperties() const { PropertyList list = Layer::getProperties(); list.push_back("Colour"); return list; } QString SingleColourLayer::getPropertyLabel(const PropertyName &name) const { if (name == "Colour") return tr("Colour"); return ""; } Layer::PropertyType SingleColourLayer::getPropertyType(const PropertyName &name) const { if (name == "Colour") return ColourProperty; return InvalidProperty; } QString SingleColourLayer::getPropertyGroupName(const PropertyName &) const { return QString(); } int SingleColourLayer::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { int val = 0; int garbage0, garbage1, garbage2; if (!min) min = &garbage0; if (!max) max = &garbage1; if (!deflt) deflt = &garbage2; if (name == "Colour") { ColourDatabase::getInstance()->getColourPropertyRange(min, max); *deflt = 0; //!!! val = m_colour; } else { val = Layer::getPropertyRangeAndValue(name, min, max, deflt); } return val; } QString SingleColourLayer::getPropertyValueLabel(const PropertyName &name, int value) const { if (name == "Colour") { ColourDatabase *db = ColourDatabase::getInstance(); if (value >= 0 && size_t(value) < db->getColourCount()) { return db->getColourName(value); } } return tr(""); } RangeMapper * SingleColourLayer::getNewPropertyRangeMapper(const PropertyName &) const { return 0; } void SingleColourLayer::setProperty(const PropertyName &name, int value) { if (name == "Colour") { setBaseColour(value); } } void SingleColourLayer::setDefaultColourFor(View *v) { #ifdef DEBUG_COLOUR_SELECTION SVDEBUG << "SingleColourLayer::setDefaultColourFor: m_colourExplicitlySet = " << m_colourExplicitlySet << ", m_defaultColourSet " << m_defaultColourSet << endl; #endif if (m_colourExplicitlySet || m_defaultColourSet) return; if (v) m_defaultColourSet = true; // v==0 case doesn't really count bool dark = false; if (v) { dark = !v->hasLightBackground(); } else { QColor bg = QApplication::palette().color(QPalette::Window); if (bg.red() + bg.green() + bg.blue() < 384) dark = true; } ColourDatabase *cdb = ColourDatabase::getInstance(); int hint = -1; bool impose = false; if (v) { if (m_colourRefCount.find(m_colour) != m_colourRefCount.end() && m_colourRefCount[m_colour] > 0) { m_colourRefCount[m_colour]--; } // We don't want to call this if !v because that probably // means we're being called from the constructor, and this is // a virtual function hint = getDefaultColourHint(dark, impose); #ifdef DEBUG_COLOUR_SELECTION cerr << "hint = " << hint << ", impose = " << impose << endl; #endif } else { #ifdef DEBUG_COLOUR_SELECTION cerr << "(from ctor)" << endl; #endif } if (hint >= 0 && impose) { setBaseColour(hint); return; } int bestCount = 0, bestColour = -1; for (int i = 0; i < cdb->getColourCount(); ++i) { int index = i; if (hint > 0) index = (index + hint) % cdb->getColourCount(); if (cdb->useDarkBackground(index) != dark) continue; int count = 0; if (m_colourRefCount.find(index) != m_colourRefCount.end()) { count = m_colourRefCount[index]; } #ifdef DEBUG_COLOUR_SELECTION cerr << "index = " << index << ", count = " << count; #endif if (bestColour < 0 || count < bestCount) { bestColour = index; bestCount = count; #ifdef DEBUG_COLOUR_SELECTION cerr << " *"; #endif } #ifdef DEBUG_COLOUR_SELECTION cerr << endl; #endif } if (bestColour < 0) m_colour = 0; else m_colour = bestColour; if (m_colourRefCount.find(m_colour) == m_colourRefCount.end()) { m_colourRefCount[m_colour] = 1; } else { m_colourRefCount[m_colour]++; } } void SingleColourLayer::setBaseColour(int colour) { m_colourExplicitlySet = true; if (m_colour == colour) return; if (m_colourRefCount.find(m_colour) != m_colourRefCount.end() && m_colourRefCount[m_colour] > 0) { m_colourRefCount[m_colour]--; } m_colour = colour; if (m_colourRefCount.find(m_colour) == m_colourRefCount.end()) { m_colourRefCount[m_colour] = 1; } else { m_colourRefCount[m_colour]++; } flagBaseColourChanged(); emit layerParametersChanged(); } int SingleColourLayer::getBaseColour() const { return m_colour; } QColor SingleColourLayer::getBaseQColor() const { return ColourDatabase::getInstance()->getColour(m_colour); } QColor SingleColourLayer::getBackgroundQColor(View *v) const { return v->getBackground(); } QColor SingleColourLayer::getForegroundQColor(View *v) const { return v->getForeground(); } std::vector SingleColourLayer::getPartialShades(View *v) const { std::vector s; QColor base = getBaseQColor(); QColor bg = getBackgroundQColor(v); for (int i = 0; i < 3; ++i) { int red = base.red() + ((bg.red() - base.red()) * (i + 1)) / 4; int green = base.green() + ((bg.green() - base.green()) * (i + 1)) / 4; int blue = base.blue() + ((bg.blue() - base.blue()) * (i + 1)) / 4; s.push_back(QColor(red, green, blue)); } return s; } void SingleColourLayer::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { QString s; QString colourName, colourSpec, darkbg; ColourDatabase::getInstance()->getStringValues (m_colour, colourName, colourSpec, darkbg); s += QString("colourName=\"%1\" " "colour=\"%2\" " "darkBackground=\"%3\" ") .arg(colourName) .arg(colourSpec) .arg(darkbg); Layer::toXml(stream, indent, extraAttributes + " " + s); } void SingleColourLayer::setProperties(const QXmlAttributes &attributes) { QString colourName = attributes.value("colourName"); QString colourSpec = attributes.value("colour"); QString darkbg = attributes.value("darkBackground"); int colour = ColourDatabase::getInstance()->putStringValues (colourName, colourSpec, darkbg); m_colourExplicitlySet = true; if (m_colour != colour) { #ifdef DEBUG_COLOUR_SELECTION SVDEBUG << "SingleColourLayer::setProperties: changing colour from " << m_colour << " to " << colour << endl; #endif if (m_colourRefCount.find(m_colour) != m_colourRefCount.end() && m_colourRefCount[m_colour] > 0) { m_colourRefCount[m_colour]--; } m_colour = colour; if (m_colourRefCount.find(m_colour) == m_colourRefCount.end()) { m_colourRefCount[m_colour] = 1; } else { m_colourRefCount[m_colour]++; } flagBaseColourChanged(); } } sonic-visualiser-2.3~repack1.orig/svgui/layer/LayerFactory.cpp0000644000175000017500000003631112252354725023317 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "LayerFactory.h" #include "WaveformLayer.h" #include "SpectrogramLayer.h" #include "TimeRulerLayer.h" #include "TimeInstantLayer.h" #include "TimeValueLayer.h" #include "NoteLayer.h" #include "RegionLayer.h" #include "TextLayer.h" #include "ImageLayer.h" #include "Colour3DPlotLayer.h" #include "SpectrumLayer.h" #include "SliceLayer.h" #include "SliceableLayer.h" #include "base/Clipboard.h" #include "data/model/RangeSummarisableTimeValueModel.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/NoteModel.h" #include "data/model/RegionModel.h" #include "data/model/TextModel.h" #include "data/model/ImageModel.h" #include "data/model/DenseThreeDimensionalModel.h" #include "data/model/WaveFileModel.h" #include "data/model/WritableWaveFileModel.h" #include #include #include #include #include LayerFactory * LayerFactory::m_instance = new LayerFactory; LayerFactory * LayerFactory::getInstance() { return m_instance; } LayerFactory::~LayerFactory() { } QString LayerFactory::getLayerPresentationName(LayerType type) { switch (type) { case Waveform: return Layer::tr("Waveform"); case Spectrogram: return Layer::tr("Spectrogram"); case TimeRuler: return Layer::tr("Ruler"); case TimeInstants: return Layer::tr("Time Instants"); case TimeValues: return Layer::tr("Time Values"); case Notes: return Layer::tr("Notes"); case Regions: return Layer::tr("Regions"); case Text: return Layer::tr("Text"); case Image: return Layer::tr("Images"); case Colour3DPlot: return Layer::tr("Colour 3D Plot"); case Spectrum: return Layer::tr("Spectrum"); case Slice: return Layer::tr("Time Slice"); case MelodicRangeSpectrogram: // The user can change all the parameters of this after the // fact -- there's nothing permanently melodic-range about it // that should be encoded in its name return Layer::tr("Spectrogram"); case PeakFrequencySpectrogram: // likewise return Layer::tr("Spectrogram"); default: break; } return Layer::tr("Layer"); } bool LayerFactory::isLayerSliceable(const Layer *layer) { if (dynamic_cast(layer)) { if (dynamic_cast(layer)) { //!!! We can create slices of spectrograms, but there's a // problem managing the models. The source model for the // slice layer has to be one of the spectrogram's FFT // models -- that's fine, except that we can't store & // recall the slice layer with a reference to that model // because the model is internal to the spectrogram layer // and the document has no record of it. We would need // some other way of managing models that are used in this // way. For the moment we just don't allow slices of // spectrograms -- and provide a spectrum layer for this // instead. // // This business needs a bit more thought -- either come // up with a sensible way to deal with that stuff, or // simplify the existing slice layer logic so that it // doesn't have to deal with models disappearing on it at // all (and use the normal Document setModel mechanism to // set its sliceable model instead of the fancy pants // nonsense it's doing at the moment). return false; } return true; } return false; } LayerFactory::LayerTypeSet LayerFactory::getValidLayerTypes(Model *model) { LayerTypeSet types; if (dynamic_cast(model)) { types.insert(Colour3DPlot); types.insert(Slice); } if (dynamic_cast(model)) { types.insert(Waveform); } if (dynamic_cast(model)) { types.insert(Spectrogram); types.insert(MelodicRangeSpectrogram); types.insert(PeakFrequencySpectrogram); } if (dynamic_cast(model)) { types.insert(TimeInstants); } if (dynamic_cast(model)) { types.insert(TimeValues); } if (dynamic_cast(model)) { types.insert(Notes); } if (dynamic_cast(model)) { types.insert(Regions); } if (dynamic_cast(model)) { types.insert(Text); } if (dynamic_cast(model)) { types.insert(Image); } if (dynamic_cast(model)) { types.insert(Spectrum); } // We don't count TimeRuler here as it doesn't actually display // the data, although it can be backed by any model return types; } LayerFactory::LayerTypeSet LayerFactory::getValidEmptyLayerTypes() { LayerTypeSet types; types.insert(TimeInstants); types.insert(TimeValues); types.insert(Notes); types.insert(Regions); types.insert(Text); types.insert(Image); //!!! and in principle Colour3DPlot -- now that's a challenge return types; } LayerFactory::LayerType LayerFactory::getLayerType(const Layer *layer) { if (dynamic_cast(layer)) return Waveform; if (dynamic_cast(layer)) return Spectrogram; if (dynamic_cast(layer)) return TimeRuler; if (dynamic_cast(layer)) return TimeInstants; if (dynamic_cast(layer)) return TimeValues; if (dynamic_cast(layer)) return Notes; if (dynamic_cast(layer)) return Regions; if (dynamic_cast(layer)) return Text; if (dynamic_cast(layer)) return Image; if (dynamic_cast(layer)) return Colour3DPlot; if (dynamic_cast(layer)) return Spectrum; if (dynamic_cast(layer)) return Slice; return UnknownLayer; } QString LayerFactory::getLayerIconName(LayerType type) { switch (type) { case Waveform: return "waveform"; case Spectrogram: return "spectrogram"; case TimeRuler: return "timeruler"; case TimeInstants: return "instants"; case TimeValues: return "values"; case Notes: return "notes"; case Regions: return "regions"; case Text: return "text"; case Image: return "image"; case Colour3DPlot: return "colour3d"; case Spectrum: return "spectrum"; case Slice: return "spectrum"; case MelodicRangeSpectrogram: return "spectrogram"; case PeakFrequencySpectrogram: return "spectrogram"; default: return "unknown"; } } QString LayerFactory::getLayerTypeName(LayerType type) { switch (type) { case Waveform: return "waveform"; case Spectrogram: return "spectrogram"; case TimeRuler: return "timeruler"; case TimeInstants: return "timeinstants"; case TimeValues: return "timevalues"; case Notes: return "notes"; case Regions: return "regions"; case Text: return "text"; case Image: return "image"; case Colour3DPlot: return "colour3dplot"; case Spectrum: return "spectrum"; case Slice: return "slice"; case MelodicRangeSpectrogram: return "melodicrange"; case PeakFrequencySpectrogram: return "peakfrequency"; default: return "unknown"; } } LayerFactory::LayerType LayerFactory::getLayerTypeForName(QString name) { if (name == "waveform") return Waveform; if (name == "spectrogram") return Spectrogram; if (name == "timeruler") return TimeRuler; if (name == "timeinstants") return TimeInstants; if (name == "timevalues") return TimeValues; if (name == "notes") return Notes; if (name == "regions") return Regions; if (name == "text") return Text; if (name == "image") return Image; if (name == "colour3dplot") return Colour3DPlot; if (name == "spectrum") return Spectrum; if (name == "slice") return Slice; return UnknownLayer; } void LayerFactory::setModel(Layer *layer, Model *model) { // if (trySetModel(layer, model)) // return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; if (trySetModel(layer, model)) return; // if (trySetModel(layer, model)) // return; } Model * LayerFactory::createEmptyModel(LayerType layerType, Model *baseModel) { if (layerType == TimeInstants) { return new SparseOneDimensionalModel(baseModel->getSampleRate(), 1); } else if (layerType == TimeValues) { return new SparseTimeValueModel(baseModel->getSampleRate(), 1, true); } else if (layerType == Notes) { return new NoteModel(baseModel->getSampleRate(), 1, true); } else if (layerType == Regions) { return new RegionModel(baseModel->getSampleRate(), 1, true); } else if (layerType == Text) { return new TextModel(baseModel->getSampleRate(), 1, true); } else if (layerType == Image) { return new ImageModel(baseModel->getSampleRate(), 1, true); } else { return 0; } } int LayerFactory::getChannel(Layer *layer) { if (dynamic_cast(layer)) { return dynamic_cast(layer)->getChannel(); } if (dynamic_cast(layer)) { return dynamic_cast(layer)->getChannel(); } return -1; } void LayerFactory::setChannel(Layer *layer, int channel) { if (dynamic_cast(layer)) { dynamic_cast(layer)->setChannel(channel); return; } if (dynamic_cast(layer)) { dynamic_cast(layer)->setChannel(channel); return; } if (dynamic_cast(layer)) { dynamic_cast(layer)->setChannel(channel); return; } } Layer * LayerFactory::createLayer(LayerType type) { Layer *layer = 0; switch (type) { case Waveform: layer = new WaveformLayer; break; case Spectrogram: layer = new SpectrogramLayer; break; case TimeRuler: layer = new TimeRulerLayer; break; case TimeInstants: layer = new TimeInstantLayer; break; case TimeValues: layer = new TimeValueLayer; break; case Notes: layer = new NoteLayer; break; case Regions: layer = new RegionLayer; break; case Text: layer = new TextLayer; break; case Image: layer = new ImageLayer; break; case Colour3DPlot: layer = new Colour3DPlotLayer; break; case Spectrum: layer = new SpectrumLayer; break; case Slice: layer = new SliceLayer; break; case MelodicRangeSpectrogram: layer = new SpectrogramLayer(SpectrogramLayer::MelodicRange); break; case PeakFrequencySpectrogram: layer = new SpectrogramLayer(SpectrogramLayer::MelodicPeaks); break; default: break; } if (!layer) { SVDEBUG << "LayerFactory::createLayer: Unknown layer type " << type << endl; } else { // SVDEBUG << "LayerFactory::createLayer: Setting object name " // << getLayerPresentationName(type) << " on " << layer << endl; layer->setObjectName(getLayerPresentationName(type)); setLayerDefaultProperties(type, layer); } return layer; } void LayerFactory::setLayerDefaultProperties(LayerType type, Layer *layer) { // SVDEBUG << "LayerFactory::setLayerDefaultProperties: type " << type << " (name \"" << getLayerTypeName(type) << "\")" << endl; QSettings settings; settings.beginGroup("LayerDefaults"); QString defaults = settings.value(getLayerTypeName(type), "").toString(); if (defaults == "") return; // cerr << "defaults=\"" << defaults << "\"" << endl; QString xml = layer->toXmlString(); QDomDocument docOld, docNew; if (docOld.setContent(xml, false) && docNew.setContent(defaults, false)) { QXmlAttributes attrs; QDomElement layerElt = docNew.firstChildElement("layer"); QDomNamedNodeMap attrNodes = layerElt.attributes(); for (unsigned int i = 0; i < attrNodes.length(); ++i) { QDomAttr attr = attrNodes.item(i).toAttr(); if (attr.isNull()) continue; // cerr << "append \"" << attr.name() // << "\" -> \"" << attr.value() << "\"" // << endl; attrs.append(attr.name(), "", "", attr.value()); } layerElt = docOld.firstChildElement("layer"); attrNodes = layerElt.attributes(); for (unsigned int i = 0; i < attrNodes.length(); ++i) { QDomAttr attr = attrNodes.item(i).toAttr(); if (attr.isNull()) continue; if (attrs.value(attr.name()) == "") { // cerr << "append \"" << attr.name() // << "\" -> \"" << attr.value() << "\"" // << endl; attrs.append(attr.name(), "", "", attr.value()); } } layer->setProperties(attrs); } settings.endGroup(); } LayerFactory::LayerType LayerFactory::getLayerTypeForClipboardContents(const Clipboard &clip) { const Clipboard::PointList &contents = clip.getPoints(); bool haveFrame = false; bool haveValue = false; bool haveDuration = false; bool haveLevel = false; for (Clipboard::PointList::const_iterator i = contents.begin(); i != contents.end(); ++i) { if (i->haveFrame()) haveFrame = true; if (i->haveValue()) haveValue = true; if (i->haveDuration()) haveDuration = true; if (i->haveLevel()) haveLevel = true; } if (haveFrame && haveValue && haveDuration && haveLevel) return Notes; if (haveFrame && haveValue && haveDuration) return Regions; if (haveFrame && haveValue) return TimeValues; return TimeInstants; } sonic-visualiser-2.3~repack1.orig/svgui/layer/LogNumericalScale.cpp0000644000175000017500000000565312252354725024251 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2013 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "LogNumericalScale.h" #include "VerticalScaleLayer.h" #include "base/LogRange.h" #include #include #include "view/View.h" //#define DEBUG_TIME_VALUE_LAYER 1 int LogNumericalScale::getWidth(View *, QPainter &paint) { return paint.fontMetrics().width("-000.00") + 10; } void LogNumericalScale::paintVertical(View *v, const VerticalScaleLayer *layer, QPainter &paint, int x0, float minlog, float maxlog) { int w = getWidth(v, paint) + x0; int n = 10; float val = minlog; float inc = (maxlog - val) / n; // even increments of log scale // smallest increment as displayed float minDispInc = LogRange::unmap(minlog + inc) - LogRange::unmap(minlog); #ifdef DEBUG_TIME_VALUE_LAYER cerr << "min = " << minlog << ", max = " << maxlog << ", inc = " << inc << ", minDispInc = " << minDispInc << endl; #endif char buffer[40]; float round = 1.f; int dp = 0; if (minDispInc > 0) { int prec = trunc(log10f(minDispInc)); if (prec < 0) dp = -prec; round = powf(10.f, prec); if (dp > 4) dp = 4; #ifdef DEBUG_TIME_VALUE_LAYER cerr << "round = " << round << ", prec = " << prec << ", dp = " << dp << endl; #endif } int prevy = -1; for (int i = 0; i < n; ++i) { int y, ty; bool drawText = true; if (i == n-1 && v->height() < paint.fontMetrics().height() * (n*2)) { if (layer->getScaleUnits() != "") drawText = false; } float dispval = LogRange::unmap(val); dispval = floor(dispval / round) * round; #ifdef DEBUG_TIME_VALUE_LAYER cerr << "val = " << val << ", dispval = " << dispval << endl; #endif y = layer->getYForValue(v, dispval); ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) { val += inc; continue; } int digits = trunc(log10f(dispval)); int sf = dp + (digits > 0 ? digits : 0); if (sf < 4) sf = 4; #ifdef DEBUG_TIME_VALUE_LAYER cerr << "sf = " << sf << endl; #endif sprintf(buffer, "%.*g", sf, dispval); QString label = QString(buffer); paint.drawLine(w - 5, y, w, y); if (drawText) { paint.drawText(w - paint.fontMetrics().width(label) - 6, ty, label); } prevy = y; val += inc; } } sonic-visualiser-2.3~repack1.orig/svgui/install-sh0000755000175000017500000003246412252354725021104 0ustar miramira#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sonic-visualiser-2.3~repack1.orig/svgui/view/0000755000175000017500000000000012264464201020033 5ustar miramirasonic-visualiser-2.3~repack1.orig/svgui/view/ViewManager.cpp0000644000175000017500000004322712252354725022762 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ViewManager.h" #include "base/AudioPlaySource.h" #include "base/RealTime.h" #include "data/model/Model.h" #include "widgets/CommandHistory.h" #include "View.h" #include "Overview.h" #include #include #include //#define DEBUG_VIEW_MANAGER 1 ViewManager::ViewManager() : m_playSource(0), m_globalCentreFrame(0), m_globalZoom(1024), m_playbackFrame(0), m_playbackModel(0), m_mainModelSampleRate(0), m_lastLeft(0), m_lastRight(0), m_inProgressExclusive(true), m_toolMode(NavigateMode), m_playLoopMode(false), m_playSelectionMode(false), m_playSoloMode(false), m_alignMode(false), m_overlayMode(MinimalOverlays), m_zoomWheelsEnabled(true), m_showCentreLine(true), m_illuminateLocalFeatures(true), m_showWorkTitle(false), m_lightPalette(QApplication::palette()), m_darkPalette(QApplication::palette()) { QSettings settings; settings.beginGroup("MainWindow"); m_overlayMode = OverlayMode (settings.value("overlay-mode", int(m_overlayMode)).toInt()); if (m_overlayMode != NoOverlays && m_overlayMode != MinimalOverlays && m_overlayMode != AllOverlays) { m_overlayMode = MinimalOverlays; } m_zoomWheelsEnabled = settings.value("zoom-wheels-enabled", m_zoomWheelsEnabled).toBool(); m_showCentreLine = settings.value("show-centre-line", m_showCentreLine).toBool(); settings.endGroup(); if (getGlobalDarkBackground()) { /* cerr << "dark palette:" << endl; cerr << "window = " << QApplication::palette().color(QPalette::Window).name() << endl; cerr << "windowtext = " << QApplication::palette().color(QPalette::WindowText).name() << endl; cerr << "base = " << QApplication::palette().color(QPalette::Base).name() << endl; cerr << "alternatebase = " << QApplication::palette().color(QPalette::AlternateBase).name() << endl; cerr << "text = " << QApplication::palette().color(QPalette::Text).name() << endl; cerr << "button = " << QApplication::palette().color(QPalette::Button).name() << endl; cerr << "buttontext = " << QApplication::palette().color(QPalette::ButtonText).name() << endl; cerr << "brighttext = " << QApplication::palette().color(QPalette::BrightText).name() << endl; cerr << "light = " << QApplication::palette().color(QPalette::Light).name() << endl; cerr << "dark = " << QApplication::palette().color(QPalette::Dark).name() << endl; cerr << "mid = " << QApplication::palette().color(QPalette::Mid).name() << endl; */ m_lightPalette = QPalette(QColor("#000000"), // WindowText QColor("#dddfe4"), // Button QColor("#ffffff"), // Light QColor("#555555"), // Dark QColor("#c7c7c7"), // Mid QColor("#000000"), // Text QColor("#ffffff"), // BrightText QColor("#ffffff"), // Base QColor("#efefef")); // Window } else { /* cerr << "light palette:" << endl; cerr << "window = " << QApplication::palette().color(QPalette::Window).name() << endl; cerr << "windowtext = " << QApplication::palette().color(QPalette::WindowText).name() << endl; cerr << "base = " << QApplication::palette().color(QPalette::Base).name() << endl; cerr << "alternatebase = " << QApplication::palette().color(QPalette::AlternateBase).name() << endl; cerr << "text = " << QApplication::palette().color(QPalette::Text).name() << endl; cerr << "button = " << QApplication::palette().color(QPalette::Button).name() << endl; cerr << "buttontext = " << QApplication::palette().color(QPalette::ButtonText).name() << endl; cerr << "brighttext = " << QApplication::palette().color(QPalette::BrightText).name() << endl; cerr << "light = " << QApplication::palette().color(QPalette::Light).name() << endl; cerr << "dark = " << QApplication::palette().color(QPalette::Dark).name() << endl; cerr << "mid = " << QApplication::palette().color(QPalette::Mid).name() << endl; */ m_darkPalette = QPalette(QColor("#ffffff"), // WindowText QColor("#3e3e3e"), // Button QColor("#808080"), // Light QColor("#1e1e1e"), // Dark QColor("#404040"), // Mid QColor("#ffffff"), // Text QColor("#ffffff"), // BrightText QColor("#000000"), // Base QColor("#202020")); // Window } } ViewManager::~ViewManager() { } unsigned long ViewManager::getGlobalCentreFrame() const { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::getGlobalCentreFrame: returning " << m_globalCentreFrame << endl; #endif return m_globalCentreFrame; } void ViewManager::setGlobalCentreFrame(unsigned long f) { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::setGlobalCentreFrame to " << f << endl; #endif m_globalCentreFrame = f; emit globalCentreFrameChanged(f); } unsigned long ViewManager::getGlobalZoom() const { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::getGlobalZoom: returning " << m_globalZoom << endl; #endif return m_globalZoom; } unsigned long ViewManager::getPlaybackFrame() const { if (m_playSource && m_playSource->isPlaying()) { m_playbackFrame = m_playSource->getCurrentPlayingFrame(); } return m_playbackFrame; } void ViewManager::setPlaybackFrame(unsigned long f) { if (m_playbackFrame != f) { m_playbackFrame = f; emit playbackFrameChanged(f); if (m_playSource && m_playSource->isPlaying()) { m_playSource->play(f); } } } Model * ViewManager::getPlaybackModel() const { return m_playbackModel; } void ViewManager::setPlaybackModel(Model *model) { m_playbackModel = model; } size_t ViewManager::alignPlaybackFrameToReference(size_t frame) const { if (!m_playbackModel) return frame; else return m_playbackModel->alignToReference(frame); } size_t ViewManager::alignReferenceToPlaybackFrame(size_t frame) const { if (!m_playbackModel) return frame; else return m_playbackModel->alignFromReference(frame); } bool ViewManager::haveInProgressSelection() const { return !m_inProgressSelection.isEmpty(); } const Selection & ViewManager::getInProgressSelection(bool &exclusive) const { exclusive = m_inProgressExclusive; return m_inProgressSelection; } void ViewManager::setInProgressSelection(const Selection &selection, bool exclusive) { m_inProgressExclusive = exclusive; m_inProgressSelection = selection; if (exclusive) clearSelections(); emit inProgressSelectionChanged(); } void ViewManager::clearInProgressSelection() { m_inProgressSelection = Selection(); emit inProgressSelectionChanged(); } const MultiSelection & ViewManager::getSelection() const { return m_selections; } const MultiSelection::SelectionList & ViewManager::getSelections() const { return m_selections.getSelections(); } void ViewManager::setSelection(const Selection &selection) { MultiSelection ms(m_selections); ms.setSelection(selection); setSelections(ms); } void ViewManager::addSelection(const Selection &selection) { MultiSelection ms(m_selections); ms.addSelection(selection); setSelections(ms); } void ViewManager::removeSelection(const Selection &selection) { MultiSelection ms(m_selections); ms.removeSelection(selection); setSelections(ms); } void ViewManager::clearSelections() { MultiSelection ms(m_selections); ms.clearSelections(); setSelections(ms); } void ViewManager::setSelections(const MultiSelection &ms) { if (m_selections.getSelections() == ms.getSelections()) return; SetSelectionCommand *command = new SetSelectionCommand(this, ms); CommandHistory::getInstance()->addCommand(command); } size_t ViewManager::constrainFrameToSelection(size_t frame) const { MultiSelection::SelectionList sl = getSelections(); if (sl.empty()) return frame; for (MultiSelection::SelectionList::const_iterator i = sl.begin(); i != sl.end(); ++i) { if (frame < i->getEndFrame()) { if (frame < i->getStartFrame()) { return i->getStartFrame(); } else { return frame; } } } return sl.begin()->getStartFrame(); } void ViewManager::signalSelectionChange() { emit selectionChanged(); } ViewManager::SetSelectionCommand::SetSelectionCommand(ViewManager *vm, const MultiSelection &ms) : m_vm(vm), m_oldSelection(vm->m_selections), m_newSelection(ms) { } ViewManager::SetSelectionCommand::~SetSelectionCommand() { } void ViewManager::SetSelectionCommand::execute() { m_vm->m_selections = m_newSelection; m_vm->signalSelectionChange(); } void ViewManager::SetSelectionCommand::unexecute() { m_vm->m_selections = m_oldSelection; m_vm->signalSelectionChange(); } QString ViewManager::SetSelectionCommand::getName() const { if (m_newSelection.getSelections().empty()) return tr("Clear Selection"); if (m_newSelection.getSelections().size() > 1) return tr("Select Multiple Regions"); else return tr("Select Region"); } Selection ViewManager::getContainingSelection(size_t frame, bool defaultToFollowing) const { return m_selections.getContainingSelection(frame, defaultToFollowing); } void ViewManager::setToolMode(ToolMode mode) { m_toolMode = mode; emit toolModeChanged(); switch (mode) { case NavigateMode: emit activity(tr("Enter Navigate mode")); break; case SelectMode: emit activity(tr("Enter Select mode")); break; case EditMode: emit activity(tr("Enter Edit mode")); break; case DrawMode: emit activity(tr("Enter Draw mode")); break; case EraseMode: emit activity(tr("Enter Erase mode")); break; case MeasureMode: emit activity(tr("Enter Measure mode")); break; }; } void ViewManager::setPlayLoopMode(bool mode) { if (m_playLoopMode != mode) { m_playLoopMode = mode; emit playLoopModeChanged(); emit playLoopModeChanged(mode); if (mode) emit activity(tr("Switch on Loop mode")); else emit activity(tr("Switch off Loop mode")); } } void ViewManager::setPlaySelectionMode(bool mode) { if (m_playSelectionMode != mode) { m_playSelectionMode = mode; emit playSelectionModeChanged(); emit playSelectionModeChanged(mode); if (mode) emit activity(tr("Switch on Play Selection mode")); else emit activity(tr("Switch off Play Selection mode")); } } void ViewManager::setPlaySoloMode(bool mode) { if (m_playSoloMode != mode) { m_playSoloMode = mode; emit playSoloModeChanged(); emit playSoloModeChanged(mode); if (mode) emit activity(tr("Switch on Play Solo mode")); else emit activity(tr("Switch off Play Solo mode")); } } void ViewManager::setAlignMode(bool mode) { if (m_alignMode != mode) { m_alignMode = mode; emit alignModeChanged(); emit alignModeChanged(mode); if (mode) emit activity(tr("Switch on Alignment mode")); else emit activity(tr("Switch off Alignment mode")); } } size_t ViewManager::getPlaybackSampleRate() const { if (m_playSource) { return m_playSource->getSourceSampleRate(); } return 0; } size_t ViewManager::getOutputSampleRate() const { if (m_playSource) { return m_playSource->getTargetSampleRate(); } return 0; } void ViewManager::setAudioPlaySource(AudioPlaySource *source) { if (!m_playSource) { QTimer::singleShot(100, this, SLOT(checkPlayStatus())); } m_playSource = source; } void ViewManager::playStatusChanged(bool /* playing */) { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::playStatusChanged" << endl; #endif checkPlayStatus(); } void ViewManager::checkPlayStatus() { if (m_playSource && m_playSource->isPlaying()) { float left = 0, right = 0; if (m_playSource->getOutputLevels(left, right)) { if (left != m_lastLeft || right != m_lastRight) { emit outputLevelsChanged(left, right); m_lastLeft = left; m_lastRight = right; } } m_playbackFrame = m_playSource->getCurrentPlayingFrame(); #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::checkPlayStatus: Playing, frame " << m_playbackFrame << ", levels " << m_lastLeft << "," << m_lastRight << endl; #endif emit playbackFrameChanged(m_playbackFrame); QTimer::singleShot(20, this, SLOT(checkPlayStatus())); } else { if (m_lastLeft != 0.0 || m_lastRight != 0.0) { emit outputLevelsChanged(0.0, 0.0); m_lastLeft = 0.0; m_lastRight = 0.0; } #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::checkPlayStatus: Not playing" << endl; #endif } } bool ViewManager::isPlaying() const { return m_playSource && m_playSource->isPlaying(); } void ViewManager::viewCentreFrameChanged(unsigned long f, bool locked, PlaybackFollowMode mode) { View *v = dynamic_cast(sender()); #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::viewCentreFrameChanged(" << f << ", " << locked << ", " << mode << "), view is " << v << endl; #endif if (locked) { m_globalCentreFrame = f; emit globalCentreFrameChanged(f); } else { if (v) emit viewCentreFrameChanged(v, f); } if (!dynamic_cast(v) || (mode != PlaybackIgnore)) { if (m_mainModelSampleRate != 0) { emit activity(tr("Scroll to %1") .arg(RealTime::frame2RealTime (f, m_mainModelSampleRate).toText().c_str())); } } if (mode == PlaybackIgnore) { return; } seek(f); } void ViewManager::seek(unsigned long f) { #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::seek(" << f << ")" << endl; #endif if (m_playSource && m_playSource->isPlaying()) { unsigned long playFrame = m_playSource->getCurrentPlayingFrame(); unsigned long diff = std::max(f, playFrame) - std::min(f, playFrame); if (diff > 20000) { m_playbackFrame = f; m_playSource->play(f); #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::considerSeek: reseeking from " << playFrame << " to " << f << endl; #endif emit playbackFrameChanged(f); } } else { if (m_playbackFrame != f) { m_playbackFrame = f; emit playbackFrameChanged(f); } } } void ViewManager::viewZoomLevelChanged(unsigned long z, bool locked) { View *v = dynamic_cast(sender()); if (!v) { SVDEBUG << "ViewManager::viewZoomLevelChanged: WARNING: sender is not a view" << endl; return; } //!!! emit zoomLevelChanged(); if (locked) { m_globalZoom = z; } #ifdef DEBUG_VIEW_MANAGER cerr << "ViewManager::viewZoomLevelChanged(" << v << ", " << z << ", " << locked << ")" << endl; #endif emit viewZoomLevelChanged(v, z, locked); if (!dynamic_cast(v)) { emit activity(tr("Zoom to %n sample(s) per pixel", "", z)); } } void ViewManager::setOverlayMode(OverlayMode mode) { if (m_overlayMode != mode) { m_overlayMode = mode; emit overlayModeChanged(); emit activity(tr("Change overlay level")); } QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("overlay-mode", int(m_overlayMode)); settings.endGroup(); } void ViewManager::setZoomWheelsEnabled(bool enabled) { if (m_zoomWheelsEnabled != enabled) { m_zoomWheelsEnabled = enabled; emit zoomWheelsEnabledChanged(); if (enabled) emit activity("Show zoom wheels"); else emit activity("Hide zoom wheels"); } QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("zoom-wheels-enabled", m_zoomWheelsEnabled); settings.endGroup(); } void ViewManager::setShowCentreLine(bool show) { if (m_showCentreLine != show) { m_showCentreLine = show; emit showCentreLineChanged(); if (show) emit activity("Show centre line"); else emit activity("Hide centre line"); } QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("show-centre-line", int(m_showCentreLine)); settings.endGroup(); } void ViewManager::setGlobalDarkBackground(bool dark) { // also save the current palette, in case the user has changed it // since construction if (getGlobalDarkBackground()) { m_darkPalette = QApplication::palette(); } else { m_lightPalette = QApplication::palette(); } if (dark) { QApplication::setPalette(m_darkPalette); } else { QApplication::setPalette(m_lightPalette); } } bool ViewManager::getGlobalDarkBackground() const { bool dark = false; QColor windowBg = QApplication::palette().color(QPalette::Window); if (windowBg.red() + windowBg.green() + windowBg.blue() < 384) { dark = true; } return dark; } sonic-visualiser-2.3~repack1.orig/svgui/view/Overview.cpp0000644000175000017500000001701012252354725022352 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Overview.h" #include "layer/Layer.h" #include "data/model/Model.h" #include "base/ZoomConstraint.h" #include #include #include //#define DEBUG_OVERVIEW 1 Overview::Overview(QWidget *w) : View(w, false), m_clickedInRange(false) { setObjectName(tr("Overview")); m_followPan = false; m_followZoom = false; setPlaybackFollow(PlaybackIgnore); m_modelTestTime.start(); } void Overview::modelChanged(size_t startFrame, size_t endFrame) { bool zoomChanged = false; size_t frameCount = getModelsEndFrame() - getModelsStartFrame(); int zoomLevel = frameCount / width(); if (zoomLevel < 1) zoomLevel = 1; zoomLevel = getZoomConstraintBlockSize(zoomLevel, ZoomConstraint::RoundUp); if (zoomLevel != m_zoomLevel) { zoomChanged = true; } if (!zoomChanged) { if (m_modelTestTime.elapsed() < 1000) { for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->getModel() && (!(*i)->getModel()->isOK() || !(*i)->getModel()->isReady())) { return; } } } else { m_modelTestTime.restart(); } } View::modelChanged(startFrame, endFrame); } void Overview::modelReplaced() { m_playPointerFrame = getAlignedPlaybackFrame(); View::modelReplaced(); } void Overview::registerView(View *view) { m_views.insert(view); update(); } void Overview::unregisterView(View *view) { m_views.erase(view); update(); } void Overview::globalCentreFrameChanged(unsigned long f) { #ifdef DEBUG_OVERVIEW cerr << "Overview::globalCentreFrameChanged: " << f << endl; #endif update(); } void Overview::viewCentreFrameChanged(View *v, unsigned long f) { #ifdef DEBUG_OVERVIEW cerr << "Overview[" << this << "]::viewCentreFrameChanged(" << v << "): " << f << endl; #endif if (m_views.find(v) != m_views.end()) { update(); } } void Overview::viewZoomLevelChanged(View *v, unsigned long, bool) { if (v == this) return; if (m_views.find(v) != m_views.end()) { update(); } } void Overview::viewManagerPlaybackFrameChanged(unsigned long f) { #ifdef DEBUG_OVERVIEW cerr << "Overview[" << this << "]::viewManagerPlaybackFrameChanged(" << f << "): " << f << endl; #endif bool changed = false; f = getAlignedPlaybackFrame(); if (getXForFrame(m_playPointerFrame) != getXForFrame(f)) changed = true; m_playPointerFrame = f; if (changed) update(); } void Overview::paintEvent(QPaintEvent *e) { // Recalculate zoom in case the size of the widget has changed. #ifdef DEBUG_OVERVIEW cerr << "Overview::paintEvent: width is " << width() << ", centre frame " << m_centreFrame << endl; #endif size_t startFrame = getModelsStartFrame(); size_t frameCount = getModelsEndFrame() - getModelsStartFrame(); int zoomLevel = frameCount / width(); if (zoomLevel < 1) zoomLevel = 1; zoomLevel = getZoomConstraintBlockSize(zoomLevel, ZoomConstraint::RoundUp); if (zoomLevel != m_zoomLevel) { m_zoomLevel = zoomLevel; emit zoomLevelChanged(m_zoomLevel, m_followZoom); } size_t centreFrame = startFrame + m_zoomLevel * (width() / 2); if (centreFrame > (startFrame + getModelsEndFrame())/2) { centreFrame = (startFrame + getModelsEndFrame())/2; } if (centreFrame != m_centreFrame) { #ifdef DEBUG_OVERVIEW cerr << "Overview::paintEvent: Centre frame changed from " << m_centreFrame << " to " << centreFrame << " and thus start frame from " << getStartFrame(); #endif m_centreFrame = centreFrame; #ifdef DEBUG_OVERVIEW cerr << " to " << getStartFrame() << endl; #endif emit centreFrameChanged(m_centreFrame, false, PlaybackIgnore); } View::paintEvent(e); QPainter paint; paint.begin(this); QRect r(rect()); if (e) { r = e->rect(); paint.setClipRect(r); } paint.setPen(getForeground()); int y = 0; int prevx0 = -10; int prevx1 = -10; for (ViewSet::iterator i = m_views.begin(); i != m_views.end(); ++i) { if (!*i) continue; View *w = (View *)*i; long f0 = w->getFrameForX(0); long f1 = w->getFrameForX(w->width()); if (f0 >= 0) { size_t rf0 = w->alignToReference(f0); f0 = alignFromReference(rf0); } if (f1 >= 0) { size_t rf1 = w->alignToReference(f1); f1 = alignFromReference(rf1); } int x0 = getXForFrame(f0); int x1 = getXForFrame(f1); if (x0 != prevx0 || x1 != prevx1) { y += height() / 10 + 1; prevx0 = x0; prevx1 = x1; } if (x1 <= x0) x1 = x0 + 1; paint.drawRect(x0, y, x1 - x0, height() - 2 * y); } paint.end(); } void Overview::mousePressEvent(QMouseEvent *e) { m_clickPos = e->pos(); long clickFrame = getFrameForX(m_clickPos.x()); if (clickFrame > 0) m_dragCentreFrame = clickFrame; else m_dragCentreFrame = 0; m_clickedInRange = true; for (ViewSet::iterator i = m_views.begin(); i != m_views.end(); ++i) { if (*i && (*i)->getAligningModel() == getAligningModel()) { m_dragCentreFrame = (*i)->getCentreFrame(); break; } } } void Overview::mouseReleaseEvent(QMouseEvent *e) { if (m_clickedInRange) { mouseMoveEvent(e); } m_clickedInRange = false; } void Overview::mouseMoveEvent(QMouseEvent *e) { if (!m_clickedInRange) return; long xoff = int(e->x()) - int(m_clickPos.x()); long frameOff = xoff * m_zoomLevel; size_t newCentreFrame = m_dragCentreFrame; if (frameOff > 0) { newCentreFrame += frameOff; } else if (newCentreFrame >= size_t(-frameOff)) { newCentreFrame += frameOff; } else { newCentreFrame = 0; } if (newCentreFrame >= getModelsEndFrame()) { newCentreFrame = getModelsEndFrame(); if (newCentreFrame > 0) --newCentreFrame; } if (std::max(m_centreFrame, newCentreFrame) - std::min(m_centreFrame, newCentreFrame) > size_t(m_zoomLevel)) { size_t rf = alignToReference(newCentreFrame); #ifdef DEBUG_OVERVIEW cerr << "Overview::mouseMoveEvent: x " << e->x() << " and click x " << m_clickPos.x() << " -> frame " << newCentreFrame << " -> rf " << rf << endl; #endif emit centreFrameChanged(rf, true, PlaybackScrollContinuous); } } void Overview::mouseDoubleClickEvent(QMouseEvent *e) { long frame = getFrameForX(e->x()); size_t rf = 0; if (frame > 0) rf = alignToReference(frame); #ifdef DEBUG_OVERVIEW cerr << "Overview::mouseDoubleClickEvent: frame " << frame << " -> rf " << rf << endl; #endif m_clickedInRange = false; // we're not starting a drag with the second click emit centreFrameChanged(rf, true, PlaybackScrollContinuous); } void Overview::enterEvent(QEvent *) { emit contextHelpChanged(tr("Click and drag to navigate; double-click to jump")); } void Overview::leaveEvent(QEvent *) { emit contextHelpChanged(""); } sonic-visualiser-2.3~repack1.orig/svgui/view/View.cpp0000644000175000017500000017274112252354725021473 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "View.h" #include "layer/Layer.h" #include "data/model/Model.h" #include "base/ZoomConstraint.h" #include "base/Profiler.h" #include "base/Pitch.h" #include "base/Preferences.h" #include "layer/TimeRulerLayer.h" #include "layer/SingleColourLayer.h" #include "data/model/PowerOfSqrtTwoZoomConstraint.h" #include "data/model/RangeSummarisableTimeValueModel.h" #include #include #include #include #include #include #include #include #include #include #include #include //#define DEBUG_VIEW_WIDGET_PAINT 1 View::View(QWidget *w, bool showProgress) : QFrame(w), m_centreFrame(0), m_zoomLevel(1024), m_followPan(true), m_followZoom(true), m_followPlay(PlaybackScrollPage), m_playPointerFrame(0), m_showProgress(showProgress), m_cache(0), m_cacheCentreFrame(0), m_cacheZoomLevel(1024), m_selectionCached(false), m_deleting(false), m_haveSelectedLayer(false), m_manager(0), m_propertyContainer(new ViewPropertyContainer(this)) { SVDEBUG << "View::View(" << this << ")" << endl; } View::~View() { // SVDEBUG << "View::~View(" << this << ")" << endl; m_deleting = true; delete m_propertyContainer; } PropertyContainer::PropertyList View::getProperties() const { PropertyContainer::PropertyList list; list.push_back("Global Scroll"); list.push_back("Global Zoom"); list.push_back("Follow Playback"); return list; } QString View::getPropertyLabel(const PropertyName &pn) const { if (pn == "Global Scroll") return tr("Global Scroll"); if (pn == "Global Zoom") return tr("Global Zoom"); if (pn == "Follow Playback") return tr("Follow Playback"); return ""; } PropertyContainer::PropertyType View::getPropertyType(const PropertyContainer::PropertyName &name) const { if (name == "Global Scroll") return PropertyContainer::ToggleProperty; if (name == "Global Zoom") return PropertyContainer::ToggleProperty; if (name == "Follow Playback") return PropertyContainer::ValueProperty; return PropertyContainer::InvalidProperty; } int View::getPropertyRangeAndValue(const PropertyContainer::PropertyName &name, int *min, int *max, int *deflt) const { if (deflt) *deflt = 1; if (name == "Global Scroll") return m_followPan; if (name == "Global Zoom") return m_followZoom; if (name == "Follow Playback") { if (min) *min = 0; if (max) *max = 2; if (deflt) *deflt = int(PlaybackScrollPage); return int(m_followPlay); } if (min) *min = 0; if (max) *max = 0; if (deflt) *deflt = 0; return 0; } QString View::getPropertyValueLabel(const PropertyContainer::PropertyName &name, int value) const { if (name == "Follow Playback") { switch (value) { default: case 0: return tr("Scroll"); case 1: return tr("Page"); case 2: return tr("Off"); } } return tr(""); } void View::setProperty(const PropertyContainer::PropertyName &name, int value) { if (name == "Global Scroll") { setFollowGlobalPan(value != 0); } else if (name == "Global Zoom") { setFollowGlobalZoom(value != 0); } else if (name == "Follow Playback") { switch (value) { default: case 0: setPlaybackFollow(PlaybackScrollContinuous); break; case 1: setPlaybackFollow(PlaybackScrollPage); break; case 2: setPlaybackFollow(PlaybackIgnore); break; } } } size_t View::getPropertyContainerCount() const { return m_layers.size() + 1; // the 1 is for me } const PropertyContainer * View::getPropertyContainer(size_t i) const { return (const PropertyContainer *)(((View *)this)-> getPropertyContainer(i)); } PropertyContainer * View::getPropertyContainer(size_t i) { if (i == 0) return m_propertyContainer; return m_layers[i-1]; } bool View::getValueExtents(QString unit, float &min, float &max, bool &log) const { bool have = false; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { QString layerUnit; float layerMin = 0.0, layerMax = 0.0; float displayMin = 0.0, displayMax = 0.0; bool layerLog = false; if ((*i)->getValueExtents(layerMin, layerMax, layerLog, layerUnit) && layerUnit.toLower() == unit.toLower()) { if ((*i)->getDisplayExtents(displayMin, displayMax)) { min = displayMin; max = displayMax; log = layerLog; have = true; break; } else { if (!have || layerMin < min) min = layerMin; if (!have || layerMax > max) max = layerMax; if (layerLog) log = true; have = true; } } } return have; } int View::getTextLabelHeight(const Layer *layer, QPainter &paint) const { std::map sortedLayers; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->needsTextLabelHeight()) { sortedLayers[getObjectExportId(*i)] = *i; } } int y = 15 + paint.fontMetrics().ascent(); for (std::map::const_iterator i = sortedLayers.begin(); i != sortedLayers.end(); ++i) { if (i->second == layer) return y; y += paint.fontMetrics().height(); } return y; } void View::propertyContainerSelected(View *client, PropertyContainer *pc) { if (client != this) return; if (pc == m_propertyContainer) { if (m_haveSelectedLayer) { m_haveSelectedLayer = false; update(); } return; } delete m_cache; m_cache = 0; Layer *selectedLayer = 0; for (LayerList::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if (*i == pc) { selectedLayer = *i; m_layers.erase(i); break; } } if (selectedLayer) { m_haveSelectedLayer = true; m_layers.push_back(selectedLayer); update(); } else { m_haveSelectedLayer = false; } emit propertyContainerSelected(pc); } void View::toolModeChanged() { // SVDEBUG << "View::toolModeChanged(" << m_manager->getToolMode() << ")" << endl; } void View::overlayModeChanged() { delete m_cache; m_cache = 0; update(); } void View::zoomWheelsEnabledChanged() { // subclass might override this } long View::getStartFrame() const { return getFrameForX(0); } size_t View::getEndFrame() const { return getFrameForX(width()) - 1; } void View::setStartFrame(long f) { setCentreFrame(f + m_zoomLevel * (width() / 2)); } bool View::setCentreFrame(size_t f, bool e) { bool changeVisible = false; if (m_centreFrame != f) { int formerPixel = m_centreFrame / m_zoomLevel; m_centreFrame = f; int newPixel = m_centreFrame / m_zoomLevel; if (newPixel != formerPixel) { #ifdef DEBUG_VIEW_WIDGET_PAINT cout << "View(" << this << ")::setCentreFrame: newPixel " << newPixel << ", formerPixel " << formerPixel << endl; #endif update(); changeVisible = true; } if (e) { size_t rf = alignToReference(f); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View[" << this << "]::setCentreFrame(" << f << "): emitting centreFrameChanged(" << rf << ")" << endl; #endif emit centreFrameChanged(rf, m_followPan, m_followPlay); } } return changeVisible; } int View::getXForFrame(long frame) const { return (frame - getStartFrame()) / m_zoomLevel; } long View::getFrameForX(int x) const { long z = (long)m_zoomLevel; long frame = m_centreFrame - (width()/2) * z; #ifdef DEBUG_VIEW_WIDGET_PAINT SVDEBUG << "View::getFrameForX(" << x << "): z = " << z << ", m_centreFrame = " << m_centreFrame << ", width() = " << width() << ", frame = " << frame << endl; #endif frame = (frame / z) * z; // this is start frame return frame + x * z; } float View::getYForFrequency(float frequency, float minf, float maxf, bool logarithmic) const { Profiler profiler("View::getYForFrequency"); int h = height(); if (logarithmic) { static float lastminf = 0.0, lastmaxf = 0.0; static float logminf = 0.0, logmaxf = 0.0; if (lastminf != minf) { lastminf = (minf == 0.0 ? 1.0 : minf); logminf = log10f(minf); } if (lastmaxf != maxf) { lastmaxf = (maxf < lastminf ? lastminf : maxf); logmaxf = log10f(maxf); } if (logminf == logmaxf) return 0; return h - (h * (log10f(frequency) - logminf)) / (logmaxf - logminf); } else { if (minf == maxf) return 0; return h - (h * (frequency - minf)) / (maxf - minf); } } float View::getFrequencyForY(int y, float minf, float maxf, bool logarithmic) const { int h = height(); if (logarithmic) { static float lastminf = 0.0, lastmaxf = 0.0; static float logminf = 0.0, logmaxf = 0.0; if (lastminf != minf) { lastminf = (minf == 0.0 ? 1.0 : minf); logminf = log10f(minf); } if (lastmaxf != maxf) { lastmaxf = (maxf < lastminf ? lastminf : maxf); logmaxf = log10f(maxf); } if (logminf == logmaxf) return 0; return pow(10.f, logminf + ((logmaxf - logminf) * (h - y)) / h); } else { if (minf == maxf) return 0; return minf + ((h - y) * (maxf - minf)) / h; } } int View::getZoomLevel() const { #ifdef DEBUG_VIEW_WIDGET_PAINT // cout << "zoom level: " << m_zoomLevel << endl; #endif return m_zoomLevel; } void View::setZoomLevel(size_t z) { if (z < 1) z = 1; if (m_zoomLevel != int(z)) { m_zoomLevel = z; emit zoomLevelChanged(z, m_followZoom); update(); } } bool View::hasLightBackground() const { bool darkPalette = false; if (m_manager) darkPalette = m_manager->getGlobalDarkBackground(); Layer::ColourSignificance maxSignificance = Layer::ColourAbsent; bool mostSignificantHasDarkBackground = false; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { Layer::ColourSignificance s = (*i)->getLayerColourSignificance(); bool light = (*i)->hasLightBackground(); if (int(s) > int(maxSignificance)) { maxSignificance = s; mostSignificantHasDarkBackground = !light; } else if (s == maxSignificance && !light) { mostSignificantHasDarkBackground = true; } } if (int(maxSignificance) >= int(Layer::ColourAndBackgroundSignificant)) { return !mostSignificantHasDarkBackground; } else { return !darkPalette; } } QColor View::getBackground() const { bool light = hasLightBackground(); QColor widgetbg = palette().window().color(); bool widgetLight = (widgetbg.red() + widgetbg.green() + widgetbg.blue()) > 384; if (widgetLight == light) { if (widgetLight) { return widgetbg.light(); } else { return widgetbg.dark(); } } else if (light) return Qt::white; else return Qt::black; } QColor View::getForeground() const { bool light = hasLightBackground(); QColor widgetfg = palette().text().color(); bool widgetLight = (widgetfg.red() + widgetfg.green() + widgetfg.blue()) > 384; if (widgetLight != light) return widgetfg; else if (light) return Qt::black; else return Qt::white; } View::LayerProgressBar::LayerProgressBar(QWidget *parent) : QProgressBar(parent) { } void View::addLayer(Layer *layer) { delete m_cache; m_cache = 0; SingleColourLayer *scl = dynamic_cast(layer); if (scl) scl->setDefaultColourFor(this); m_layers.push_back(layer); QProgressBar *pb = new QProgressBar(this); pb->setMinimum(0); pb->setMaximum(0); pb->setFixedWidth(80); pb->setTextVisible(false); ProgressBarRec pbr; pbr.bar = pb; pbr.lastCheck = 0; pbr.checkTimer = new QTimer(); connect(pbr.checkTimer, SIGNAL(timeout()), this, SLOT(progressCheckStalledTimerElapsed())); m_progressBars[layer] = pbr; QFont f(pb->font()); int fs = Preferences::getInstance()->getViewFontSize(); f.setPointSize(std::min(fs, int(ceil(fs * 0.85)))); pb->setFont(f); pb->hide(); connect(layer, SIGNAL(layerParametersChanged()), this, SLOT(layerParametersChanged())); connect(layer, SIGNAL(layerParameterRangesChanged()), this, SLOT(layerParameterRangesChanged())); connect(layer, SIGNAL(layerMeasurementRectsChanged()), this, SLOT(layerMeasurementRectsChanged())); connect(layer, SIGNAL(layerNameChanged()), this, SLOT(layerNameChanged())); connect(layer, SIGNAL(modelChanged()), this, SLOT(modelChanged())); connect(layer, SIGNAL(modelCompletionChanged()), this, SLOT(modelCompletionChanged())); connect(layer, SIGNAL(modelAlignmentCompletionChanged()), this, SLOT(modelAlignmentCompletionChanged())); connect(layer, SIGNAL(modelChanged(size_t, size_t)), this, SLOT(modelChanged(size_t, size_t))); connect(layer, SIGNAL(modelReplaced()), this, SLOT(modelReplaced())); update(); emit propertyContainerAdded(layer); } void View::removeLayer(Layer *layer) { if (m_deleting) { return; } delete m_cache; m_cache = 0; for (LayerList::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if (*i == layer) { m_layers.erase(i); if (m_progressBars.find(layer) != m_progressBars.end()) { delete m_progressBars[layer].bar; delete m_progressBars[layer].checkTimer; m_progressBars.erase(layer); } break; } } disconnect(layer, SIGNAL(layerParametersChanged()), this, SLOT(layerParametersChanged())); disconnect(layer, SIGNAL(layerParameterRangesChanged()), this, SLOT(layerParameterRangesChanged())); disconnect(layer, SIGNAL(layerNameChanged()), this, SLOT(layerNameChanged())); disconnect(layer, SIGNAL(modelChanged()), this, SLOT(modelChanged())); disconnect(layer, SIGNAL(modelCompletionChanged()), this, SLOT(modelCompletionChanged())); disconnect(layer, SIGNAL(modelAlignmentCompletionChanged()), this, SLOT(modelAlignmentCompletionChanged())); disconnect(layer, SIGNAL(modelChanged(size_t, size_t)), this, SLOT(modelChanged(size_t, size_t))); disconnect(layer, SIGNAL(modelReplaced()), this, SLOT(modelReplaced())); update(); emit propertyContainerRemoved(layer); } Layer * View::getSelectedLayer() { if (m_haveSelectedLayer && !m_layers.empty()) { return getLayer(getLayerCount() - 1); } else { return 0; } } const Layer * View::getSelectedLayer() const { return const_cast(const_cast(this)->getSelectedLayer()); } void View::setViewManager(ViewManager *manager) { if (m_manager) { m_manager->disconnect(this, SLOT(globalCentreFrameChanged(unsigned long))); m_manager->disconnect(this, SLOT(viewCentreFrameChanged(View *, unsigned long))); m_manager->disconnect(this, SLOT(viewManagerPlaybackFrameChanged(unsigned long))); m_manager->disconnect(this, SLOT(viewZoomLevelChanged(View *, unsigned long, bool))); m_manager->disconnect(this, SLOT(toolModeChanged())); m_manager->disconnect(this, SLOT(selectionChanged())); m_manager->disconnect(this, SLOT(overlayModeChanged())); m_manager->disconnect(this, SLOT(zoomWheelsEnabledChanged())); disconnect(m_manager, SLOT(viewCentreFrameChanged(unsigned long, bool, PlaybackFollowMode))); disconnect(m_manager, SLOT(zoomLevelChanged(unsigned long, bool))); } m_manager = manager; connect(m_manager, SIGNAL(globalCentreFrameChanged(unsigned long)), this, SLOT(globalCentreFrameChanged(unsigned long))); connect(m_manager, SIGNAL(viewCentreFrameChanged(View *, unsigned long)), this, SLOT(viewCentreFrameChanged(View *, unsigned long))); connect(m_manager, SIGNAL(playbackFrameChanged(unsigned long)), this, SLOT(viewManagerPlaybackFrameChanged(unsigned long))); connect(m_manager, SIGNAL(viewZoomLevelChanged(View *, unsigned long, bool)), this, SLOT(viewZoomLevelChanged(View *, unsigned long, bool))); connect(m_manager, SIGNAL(toolModeChanged()), this, SLOT(toolModeChanged())); connect(m_manager, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); connect(m_manager, SIGNAL(inProgressSelectionChanged()), this, SLOT(selectionChanged())); connect(m_manager, SIGNAL(overlayModeChanged()), this, SLOT(overlayModeChanged())); connect(m_manager, SIGNAL(showCentreLineChanged()), this, SLOT(overlayModeChanged())); connect(m_manager, SIGNAL(zoomWheelsEnabledChanged()), this, SLOT(zoomWheelsEnabledChanged())); connect(this, SIGNAL(centreFrameChanged(unsigned long, bool, PlaybackFollowMode)), m_manager, SLOT(viewCentreFrameChanged(unsigned long, bool, PlaybackFollowMode))); connect(this, SIGNAL(zoomLevelChanged(unsigned long, bool)), m_manager, SLOT(viewZoomLevelChanged(unsigned long, bool))); // setCentreFrame(m_manager->getViewInitialCentreFrame()); if (m_followPlay == PlaybackScrollPage) { // SVDEBUG << "View::setViewManager: setting centre frame to global centre frame: " << m_manager->getGlobalCentreFrame() << endl; setCentreFrame(m_manager->getGlobalCentreFrame(), false); } else if (m_followPlay == PlaybackScrollContinuous) { // SVDEBUG << "View::setViewManager: setting centre frame to playback frame: " << m_manager->getPlaybackFrame() << endl; setCentreFrame(m_manager->getPlaybackFrame(), false); } else if (m_followPan) { // SVDEBUG << "View::setViewManager: (follow pan) setting centre frame to global centre frame: " << m_manager->getGlobalCentreFrame() << endl; setCentreFrame(m_manager->getGlobalCentreFrame(), false); } if (m_followZoom) setZoomLevel(m_manager->getGlobalZoom()); movePlayPointer(getAlignedPlaybackFrame()); toolModeChanged(); } void View::setViewManager(ViewManager *vm, long initialCentreFrame) { setViewManager(vm); setCentreFrame(initialCentreFrame, false); } void View::setFollowGlobalPan(bool f) { m_followPan = f; emit propertyContainerPropertyChanged(m_propertyContainer); } void View::setFollowGlobalZoom(bool f) { m_followZoom = f; emit propertyContainerPropertyChanged(m_propertyContainer); } void View::drawVisibleText(QPainter &paint, int x, int y, QString text, TextStyle style) const { if (style == OutlinedText || style == OutlinedItalicText) { paint.save(); if (style == OutlinedItalicText) { QFont f(paint.font()); f.setItalic(true); paint.setFont(f); } QColor penColour, surroundColour, boxColour; penColour = getForeground(); surroundColour = getBackground(); boxColour = surroundColour; boxColour.setAlpha(127); paint.setPen(Qt::NoPen); paint.setBrush(boxColour); QRect r = paint.fontMetrics().boundingRect(text); r.translate(QPoint(x, y)); // cerr << "drawVisibleText: r = " << r.x() << "," <getModel() == obj) { recreate = true; break; } } if (recreate) { delete m_cache; m_cache = 0; } emit layerModelChanged(); checkProgress(obj); update(); } void View::modelChanged(size_t startFrame, size_t endFrame) { QObject *obj = sender(); long myStartFrame = getStartFrame(); size_t myEndFrame = getEndFrame(); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::modelChanged(" << startFrame << "," << endFrame << ") [me " << myStartFrame << "," << myEndFrame << "]" << endl; #endif if (myStartFrame > 0 && endFrame < size_t(myStartFrame)) { checkProgress(obj); return; } if (startFrame > myEndFrame) { checkProgress(obj); return; } // If the model that has changed is not used by any of the cached // layers, we won't need to recreate the cache bool recreate = false; bool discard; LayerList scrollables = getScrollableBackLayers(false, discard); for (LayerList::const_iterator i = scrollables.begin(); i != scrollables.end(); ++i) { if (*i == obj || (*i)->getModel() == obj) { recreate = true; break; } } if (recreate) { delete m_cache; m_cache = 0; } if (long(startFrame) < myStartFrame) startFrame = myStartFrame; if (endFrame > myEndFrame) endFrame = myEndFrame; checkProgress(obj); update(); } void View::modelCompletionChanged() { // cerr << "View(" << this << ")::modelCompletionChanged()" << endl; QObject *obj = sender(); checkProgress(obj); } void View::modelAlignmentCompletionChanged() { // cerr << "View(" << this << ")::modelAlignmentCompletionChanged()" << endl; QObject *obj = sender(); checkProgress(obj); } void View::modelReplaced() { #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::modelReplaced()" << endl; #endif delete m_cache; m_cache = 0; update(); } void View::layerParametersChanged() { Layer *layer = dynamic_cast(sender()); #ifdef DEBUG_VIEW_WIDGET_PAINT SVDEBUG << "View::layerParametersChanged()" << endl; #endif delete m_cache; m_cache = 0; update(); if (layer) { emit propertyContainerPropertyChanged(layer); } } void View::layerParameterRangesChanged() { Layer *layer = dynamic_cast(sender()); if (layer) emit propertyContainerPropertyRangeChanged(layer); } void View::layerMeasurementRectsChanged() { Layer *layer = dynamic_cast(sender()); if (layer) update(); } void View::layerNameChanged() { Layer *layer = dynamic_cast(sender()); if (layer) emit propertyContainerNameChanged(layer); } void View::globalCentreFrameChanged(unsigned long rf) { if (m_followPan) { size_t f = alignFromReference(rf); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View[" << this << "]::globalCentreFrameChanged(" << rf << "): setting centre frame to " << f << endl; #endif setCentreFrame(f, false); } } void View::viewCentreFrameChanged(View *, unsigned long ) { // We do nothing with this, but a subclass might } void View::viewManagerPlaybackFrameChanged(unsigned long f) { if (m_manager) { if (sender() != m_manager) return; } f = getAlignedPlaybackFrame(); movePlayPointer(f); } void View::movePlayPointer(unsigned long newFrame) { if (m_playPointerFrame == newFrame) return; bool visibleChange = (getXForFrame(m_playPointerFrame) != getXForFrame(newFrame)); size_t oldPlayPointerFrame = m_playPointerFrame; m_playPointerFrame = newFrame; if (!visibleChange) return; bool somethingGoingOn = ((QApplication::mouseButtons() != Qt::NoButton) || (QApplication::keyboardModifiers() & Qt::AltModifier)); switch (m_followPlay) { case PlaybackScrollContinuous: if (!somethingGoingOn) { setCentreFrame(m_playPointerFrame, false); } break; case PlaybackScrollPage: { int xold = getXForFrame(oldPlayPointerFrame); update(xold - 4, 0, 9, height()); long w = getEndFrame() - getStartFrame(); w -= w/5; long sf = (m_playPointerFrame / w) * w - w/8; if (m_manager && m_manager->isPlaying() && m_manager->getPlaySelectionMode()) { MultiSelection::SelectionList selections = m_manager->getSelections(); if (!selections.empty()) { size_t selectionStart = selections.begin()->getStartFrame(); if (sf < long(selectionStart) - w / 10) { sf = long(selectionStart) - w / 10; } } } #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "PlaybackScrollPage: f = " << m_playPointerFrame << ", sf = " << sf << ", start frame " << getStartFrame() << endl; #endif // We don't consider scrolling unless the pointer is outside // the clearly visible range already int xnew = getXForFrame(m_playPointerFrame); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "xnew = " << xnew << ", width = " << width() << endl; #endif if (xnew < width()/8 || xnew > (width()*7)/8) { if (!somethingGoingOn) { long offset = getFrameForX(width()/2) - getStartFrame(); long newCentre = sf + offset; bool changed = setCentreFrame(newCentre, false); if (changed) { xold = getXForFrame(oldPlayPointerFrame); update(xold - 4, 0, 9, height()); } } } update(xnew - 4, 0, 9, height()); break; } case PlaybackIgnore: if (long(m_playPointerFrame) >= getStartFrame() && m_playPointerFrame < getEndFrame()) { update(); } break; } } void View::viewZoomLevelChanged(View *p, unsigned long z, bool locked) { #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View[" << this << "]: viewZoomLevelChanged(" << p << ", " << z << ", " << locked << ")" << endl; #endif if (m_followZoom && p != this && locked) { setZoomLevel(z); } } void View::selectionChanged() { if (m_selectionCached) { delete m_cache; m_cache = 0; m_selectionCached = false; } update(); } size_t View::getFirstVisibleFrame() const { long f0 = getStartFrame(); size_t f = getModelsStartFrame(); if (f0 < 0 || f0 < long(f)) return f; return f0; } size_t View::getLastVisibleFrame() const { size_t f0 = getEndFrame(); size_t f = getModelsEndFrame(); if (f0 > f) return f; return f0; } size_t View::getModelsStartFrame() const { bool first = true; size_t startFrame = 0; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->getModel() && (*i)->getModel()->isOK()) { size_t thisStartFrame = (*i)->getModel()->getStartFrame(); if (first || thisStartFrame < startFrame) { startFrame = thisStartFrame; } first = false; } } return startFrame; } size_t View::getModelsEndFrame() const { bool first = true; size_t endFrame = 0; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->getModel() && (*i)->getModel()->isOK()) { size_t thisEndFrame = (*i)->getModel()->getEndFrame(); if (first || thisEndFrame > endFrame) { endFrame = thisEndFrame; } first = false; } } if (first) return getModelsStartFrame(); return endFrame; } int View::getModelsSampleRate() const { //!!! Just go for the first, for now. If we were supporting // multiple samplerates, we'd probably want to do frame/time // conversion in the model //!!! nah, this wants to always return the sr of the main model! for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->getModel() && (*i)->getModel()->isOK()) { return (*i)->getModel()->getSampleRate(); } } return 0; } View::ModelSet View::getModels() { ModelSet models; for (int i = 0; i < getLayerCount(); ++i) { Layer *layer = getLayer(i); if (dynamic_cast(layer)) { continue; } if (layer && layer->getModel()) { Model *model = layer->getModel(); models.insert(model); } } return models; } Model * View::getAligningModel() const { if (!m_manager || !m_manager->getAlignMode() || !m_manager->getPlaybackModel()) { return 0; } Model *anyModel = 0; Model *alignedModel = 0; Model *goodModel = 0; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { Layer *layer = *i; if (!layer) continue; if (dynamic_cast(layer)) continue; Model *model = (*i)->getModel(); if (!model) continue; anyModel = model; if (model->getAlignmentReference()) { alignedModel = model; if (layer->isLayerOpaque() || dynamic_cast(model)) { goodModel = model; } } } if (goodModel) return goodModel; else if (alignedModel) return alignedModel; else return anyModel; } size_t View::alignFromReference(size_t f) const { if (!m_manager->getAlignMode()) return f; Model *aligningModel = getAligningModel(); if (!aligningModel) return f; return aligningModel->alignFromReference(f); } size_t View::alignToReference(size_t f) const { if (!m_manager->getAlignMode()) return f; Model *aligningModel = getAligningModel(); if (!aligningModel) return f; return aligningModel->alignToReference(f); } int View::getAlignedPlaybackFrame() const { int pf = m_manager->getPlaybackFrame(); if (!m_manager->getAlignMode()) return pf; Model *aligningModel = getAligningModel(); if (!aligningModel) return pf; /* Model *pm = m_manager->getPlaybackModel(); // cerr << "View[" << this << "]::getAlignedPlaybackFrame: pf = " << pf; if (pm) { pf = pm->alignToReference(pf); // cerr << " -> " << pf; } */ int af = aligningModel->alignFromReference(pf); // cerr << ", aligned = " << af << endl; return af; } bool View::areLayersScrollable() const { // True iff all views are scrollable for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if (!(*i)->isLayerScrollable(this)) return false; } return true; } View::LayerList View::getScrollableBackLayers(bool testChanged, bool &changed) const { changed = false; // We want a list of all the scrollable layers that are behind the // backmost non-scrollable layer. LayerList scrollables; bool metUnscrollable = false; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { // SVDEBUG << "View::getScrollableBackLayers: calling isLayerDormant on layer " << *i << endl; // cerr << "(name is " << (*i)->objectName() << ")" // << endl; // SVDEBUG << "View::getScrollableBackLayers: I am " << this << endl; if ((*i)->isLayerDormant(this)) continue; if ((*i)->isLayerOpaque()) { // You can't see anything behind an opaque layer! scrollables.clear(); if (metUnscrollable) break; } if (!metUnscrollable && (*i)->isLayerScrollable(this)) { scrollables.push_back(*i); } else { metUnscrollable = true; } } if (testChanged && scrollables != m_lastScrollableBackLayers) { m_lastScrollableBackLayers = scrollables; changed = true; } return scrollables; } View::LayerList View::getNonScrollableFrontLayers(bool testChanged, bool &changed) const { changed = false; LayerList nonScrollables; // Everything in front of the first non-scrollable from the back // should also be considered non-scrollable bool started = false; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->isLayerDormant(this)) continue; if (!started && (*i)->isLayerScrollable(this)) { continue; } started = true; if ((*i)->isLayerOpaque()) { // You can't see anything behind an opaque layer! nonScrollables.clear(); } nonScrollables.push_back(*i); } if (testChanged && nonScrollables != m_lastNonScrollableBackLayers) { m_lastNonScrollableBackLayers = nonScrollables; changed = true; } return nonScrollables; } size_t View::getZoomConstraintBlockSize(size_t blockSize, ZoomConstraint::RoundingDirection dir) const { size_t candidate = blockSize; bool haveCandidate = false; PowerOfSqrtTwoZoomConstraint defaultZoomConstraint; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { const ZoomConstraint *zoomConstraint = (*i)->getZoomConstraint(); if (!zoomConstraint) zoomConstraint = &defaultZoomConstraint; size_t thisBlockSize = zoomConstraint->getNearestBlockSize(blockSize, dir); // Go for the block size that's furthest from the one // passed in. Most of the time, that's what we want. if (!haveCandidate || (thisBlockSize > blockSize && thisBlockSize > candidate) || (thisBlockSize < blockSize && thisBlockSize < candidate)) { candidate = thisBlockSize; haveCandidate = true; } } return candidate; } bool View::areLayerColoursSignificant() const { for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->getLayerColourSignificance() == Layer::ColourHasMeaningfulValue) return true; if ((*i)->isLayerOpaque()) break; } return false; } bool View::hasTopLayerTimeXAxis() const { LayerList::const_iterator i = m_layers.end(); if (i == m_layers.begin()) return false; --i; return (*i)->hasTimeXAxis(); } void View::zoom(bool in) { int newZoomLevel = m_zoomLevel; if (in) { newZoomLevel = getZoomConstraintBlockSize(newZoomLevel - 1, ZoomConstraint::RoundDown); } else { newZoomLevel = getZoomConstraintBlockSize(newZoomLevel + 1, ZoomConstraint::RoundUp); } if (newZoomLevel != m_zoomLevel) { setZoomLevel(newZoomLevel); } } void View::scroll(bool right, bool lots, bool e) { long delta; if (lots) { delta = (getEndFrame() - getStartFrame()) / 2; } else { delta = (getEndFrame() - getStartFrame()) / 20; } if (right) delta = -delta; if (int(m_centreFrame) < delta) { setCentreFrame(0, e); } else if (int(m_centreFrame) - delta >= int(getModelsEndFrame())) { setCentreFrame(getModelsEndFrame(), e); } else { setCentreFrame(m_centreFrame - delta, e); } } void View::checkProgress(void *object) { if (!m_showProgress) return; int ph = height(); for (ProgressMap::iterator i = m_progressBars.begin(); i != m_progressBars.end(); ++i) { QProgressBar *pb = i->second.bar; if (i->first == object) { // The timer is used to test for stalls. If the progress // bar does not get updated for some length of time, the // timer prompts it to go back into "indeterminate" mode QTimer *timer = i->second.checkTimer; int completion = i->first->getCompletion(this); QString text = i->first->getPropertyContainerName(); QString error = i->first->getError(this); if (error != "" && error != m_lastError) { QMessageBox::critical(this, tr("Layer rendering error"), error); m_lastError = error; } Model *model = i->first->getModel(); RangeSummarisableTimeValueModel *wfm = dynamic_cast(model); if (completion > 0) { pb->setMaximum(100); // was 0, for indeterminate start } if (completion >= 100) { //!!! if (wfm || (wfm = dynamic_cast (model->getSourceModel()))) { completion = wfm->getAlignmentCompletion(); // SVDEBUG << "View::checkProgress: Alignment completion = " << completion << endl; if (completion < 100) { text = tr("Alignment"); } } } else if (wfm) { update(); // ensure duration &c gets updated } if (completion >= 100) { pb->hide(); timer->stop(); } else { // cerr << "progress = " << completion << endl; if (!pb->isVisible()) { i->second.lastCheck = 0; timer->setInterval(2000); timer->start(); } pb->setValue(completion); pb->move(0, ph - pb->height()); pb->show(); pb->update(); ph -= pb->height(); } } else { if (pb->isVisible()) { ph -= pb->height(); } } } } void View::progressCheckStalledTimerElapsed() { QObject *s = sender(); QTimer *t = qobject_cast(s); if (!t) return; for (ProgressMap::iterator i = m_progressBars.begin(); i != m_progressBars.end(); ++i) { if (i->second.checkTimer == t) { int value = i->second.bar->value(); if (value > 0 && value == i->second.lastCheck) { i->second.bar->setMaximum(0); // indeterminate } i->second.lastCheck = value; return; } } } int View::getProgressBarWidth() const { for (ProgressMap::const_iterator i = m_progressBars.begin(); i != m_progressBars.end(); ++i) { if (i->second.bar && i->second.bar->isVisible()) { return i->second.bar->width(); } } return 0; } void View::setPaintFont(QPainter &paint) { QFont font(paint.font()); font.setPointSize(Preferences::getInstance()->getViewFontSize()); paint.setFont(font); } void View::paintEvent(QPaintEvent *e) { // Profiler prof("View::paintEvent", false); // SVDEBUG << "View::paintEvent: centre frame is " << m_centreFrame << endl; if (m_layers.empty()) { QFrame::paintEvent(e); return; } // ensure our constraints are met /*!!! Should we do this only if we have layers that can't support other zoom levels? m_zoomLevel = getZoomConstraintBlockSize(m_zoomLevel, ZoomConstraint::RoundUp); */ QPainter paint; bool repaintCache = false; bool paintedCacheRect = false; QRect cacheRect(rect()); if (e) { cacheRect &= e->rect(); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "paint rect " << cacheRect.width() << "x" << cacheRect.height() << ", my rect " << width() << "x" << height() << endl; #endif } QRect nonCacheRect(cacheRect); // If not all layers are scrollable, but some of the back layers // are, we should store only those in the cache. bool layersChanged = false; LayerList scrollables = getScrollableBackLayers(true, layersChanged); LayerList nonScrollables = getNonScrollableFrontLayers(true, layersChanged); bool selectionCacheable = nonScrollables.empty(); bool haveSelections = m_manager && !m_manager->getSelections().empty(); bool selectionDrawn = false; // If all the non-scrollable layers are non-opaque, then we draw // the selection rectangle behind them and cache it. If any are // opaque, however, we can't cache. // if (!selectionCacheable) { selectionCacheable = true; for (LayerList::const_iterator i = nonScrollables.begin(); i != nonScrollables.end(); ++i) { if ((*i)->isLayerOpaque()) { selectionCacheable = false; break; } } } if (selectionCacheable) { QPoint localPos; bool closeToLeft, closeToRight; if (shouldIlluminateLocalSelection(localPos, closeToLeft, closeToRight)) { selectionCacheable = false; } } #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: have " << scrollables.size() << " scrollable back layers and " << nonScrollables.size() << " non-scrollable front layers" << endl; cerr << "haveSelections " << haveSelections << ", selectionCacheable " << selectionCacheable << ", m_selectionCached " << m_selectionCached << endl; #endif if (layersChanged || scrollables.empty() || (haveSelections && (selectionCacheable != m_selectionCached))) { delete m_cache; m_cache = 0; m_selectionCached = false; } if (!scrollables.empty()) { #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << "): cache " << m_cache << ", cache zoom " << m_cacheZoomLevel << ", zoom " << m_zoomLevel << endl; #endif if (!m_cache || m_cacheZoomLevel != m_zoomLevel || width() != m_cache->width() || height() != m_cache->height()) { // cache is not valid if (cacheRect.width() < width()/10) { delete m_cache; m_cache = 0; #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: small repaint, not bothering to recreate cache" << endl; #endif } else { delete m_cache; m_cache = new QPixmap(width(), height()); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: recreated cache" << endl; #endif cacheRect = rect(); repaintCache = true; } } else if (m_cacheCentreFrame != m_centreFrame) { long dx = getXForFrame(m_cacheCentreFrame) - getXForFrame(m_centreFrame); if (dx > -width() && dx < width()) { #ifdef PIXMAP_COPY_TO_SELF // This is not normally defined. Copying a pixmap to // itself doesn't work properly on Windows, Mac, or // X11 with the raster backend (it only works when // moving in one direction and then presumably only by // accident). It does actually seem to be fine on X11 // with the native backend, but we prefer not to use // that anyway paint.begin(m_cache); paint.drawPixmap(dx, 0, *m_cache); paint.end(); #else static QPixmap *tmpPixmap = 0; if (!tmpPixmap || tmpPixmap->width() != width() || tmpPixmap->height() != height()) { delete tmpPixmap; tmpPixmap = new QPixmap(width(), height()); } paint.begin(tmpPixmap); paint.drawPixmap(0, 0, *m_cache); paint.end(); paint.begin(m_cache); paint.drawPixmap(dx, 0, *tmpPixmap); paint.end(); #endif if (dx < 0) { cacheRect = QRect(width() + dx, 0, -dx, height()); } else { cacheRect = QRect(0, 0, dx, height()); } #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: scrolled cache by " << dx << endl; #endif } else { cacheRect = rect(); #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: scrolling too far" << endl; #endif } repaintCache = true; } else { #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: cache is good" << endl; #endif paint.begin(this); paint.drawPixmap(cacheRect, *m_cache, cacheRect); paint.end(); QFrame::paintEvent(e); paintedCacheRect = true; } m_cacheCentreFrame = m_centreFrame; m_cacheZoomLevel = m_zoomLevel; } #ifdef DEBUG_VIEW_WIDGET_PAINT // cerr << "View(" << this << ")::paintEvent: cacheRect " << cacheRect << ", nonCacheRect " << (nonCacheRect | cacheRect) << ", repaintCache " << repaintCache << ", paintedCacheRect " << paintedCacheRect << endl; #endif // Scrollable (cacheable) items first if (!paintedCacheRect) { if (repaintCache) paint.begin(m_cache); else paint.begin(this); setPaintFont(paint); paint.setClipRect(cacheRect); paint.setPen(getBackground()); paint.setBrush(getBackground()); paint.drawRect(cacheRect); paint.setPen(getForeground()); paint.setBrush(Qt::NoBrush); for (LayerList::iterator i = scrollables.begin(); i != scrollables.end(); ++i) { paint.setRenderHint(QPainter::Antialiasing, false); paint.save(); (*i)->paint(this, paint, cacheRect); paint.restore(); } if (haveSelections && selectionCacheable) { drawSelections(paint); m_selectionCached = repaintCache; selectionDrawn = true; } paint.end(); if (repaintCache) { cacheRect |= (e ? e->rect() : rect()); paint.begin(this); paint.drawPixmap(cacheRect, *m_cache, cacheRect); paint.end(); } } // Now non-cacheable items. We always need to redraw the // non-cacheable items across at least the area we drew of the // cacheable items. nonCacheRect |= cacheRect; paint.begin(this); paint.setClipRect(nonCacheRect); setPaintFont(paint); if (scrollables.empty()) { paint.setPen(getBackground()); paint.setBrush(getBackground()); paint.drawRect(nonCacheRect); } paint.setPen(getForeground()); paint.setBrush(Qt::NoBrush); for (LayerList::iterator i = nonScrollables.begin(); i != nonScrollables.end(); ++i) { // Profiler profiler2("View::paintEvent non-cacheable"); (*i)->paint(this, paint, nonCacheRect); } paint.end(); paint.begin(this); setPaintFont(paint); if (e) paint.setClipRect(e->rect()); if (!m_selectionCached) { drawSelections(paint); } paint.end(); bool showPlayPointer = true; if (m_followPlay == PlaybackScrollContinuous) { showPlayPointer = false; } else if (long(m_playPointerFrame) <= getStartFrame() || m_playPointerFrame >= getEndFrame()) { showPlayPointer = false; } else if (m_manager && !m_manager->isPlaying()) { if (m_playPointerFrame == getCentreFrame() && m_followPlay != PlaybackIgnore) { showPlayPointer = false; } } if (showPlayPointer) { paint.begin(this); int playx = getXForFrame(m_playPointerFrame); paint.setPen(getForeground()); paint.drawLine(playx - 1, 0, playx - 1, height() - 1); paint.drawLine(playx + 1, 0, playx + 1, height() - 1); paint.drawPoint(playx, 0); paint.drawPoint(playx, height() - 1); paint.setPen(getBackground()); paint.drawLine(playx, 1, playx, height() - 2); paint.end(); } QFrame::paintEvent(e); } void View::drawSelections(QPainter &paint) { if (!hasTopLayerTimeXAxis()) return; MultiSelection::SelectionList selections; if (m_manager) { selections = m_manager->getSelections(); if (m_manager->haveInProgressSelection()) { bool exclusive; Selection inProgressSelection = m_manager->getInProgressSelection(exclusive); if (exclusive) selections.clear(); selections.insert(inProgressSelection); } } paint.save(); bool translucent = !areLayerColoursSignificant(); if (translucent) { paint.setBrush(QColor(150, 150, 255, 80)); } else { paint.setBrush(Qt::NoBrush); } int sampleRate = getModelsSampleRate(); QPoint localPos; long illuminateFrame = -1; bool closeToLeft, closeToRight; if (shouldIlluminateLocalSelection(localPos, closeToLeft, closeToRight)) { illuminateFrame = getFrameForX(localPos.x()); } const QFontMetrics &metrics = paint.fontMetrics(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { int p0 = getXForFrame(alignFromReference(i->getStartFrame())); int p1 = getXForFrame(alignFromReference(i->getEndFrame())); if (p1 < 0 || p0 > width()) continue; #ifdef DEBUG_VIEW_WIDGET_PAINT SVDEBUG << "View::drawSelections: " << p0 << ",-1 [" << (p1-p0) << "x" << (height()+1) << "]" << endl; #endif bool illuminateThis = (illuminateFrame >= 0 && i->contains(illuminateFrame)); paint.setPen(QColor(150, 150, 255)); if (translucent && shouldLabelSelections()) { paint.drawRect(p0, -1, p1 - p0, height() + 1); } else { // Make the top & bottom lines of the box visible if we // are lacking some of the other visual cues. There's no // particular logic to this, it's just a question of what // I happen to think looks nice. paint.drawRect(p0, 0, p1 - p0, height() - 1); } if (illuminateThis) { paint.save(); paint.setPen(QPen(getForeground(), 2)); if (closeToLeft) { paint.drawLine(p0, 1, p1, 1); paint.drawLine(p0, 0, p0, height()); paint.drawLine(p0, height() - 1, p1, height() - 1); } else if (closeToRight) { paint.drawLine(p0, 1, p1, 1); paint.drawLine(p1, 0, p1, height()); paint.drawLine(p0, height() - 1, p1, height() - 1); } else { paint.setBrush(Qt::NoBrush); paint.drawRect(p0, 1, p1 - p0, height() - 2); } paint.restore(); } if (sampleRate && shouldLabelSelections() && m_manager && m_manager->shouldShowSelectionExtents()) { QString startText = QString("%1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime (i->getStartFrame(), sampleRate).toText(true))) .arg(i->getStartFrame()); QString endText = QString(" %1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime (i->getEndFrame(), sampleRate).toText(true))) .arg(i->getEndFrame()); QString durationText = QString("(%1 / %2) ") .arg(QString::fromStdString (RealTime::frame2RealTime (i->getEndFrame() - i->getStartFrame(), sampleRate) .toText(true))) .arg(i->getEndFrame() - i->getStartFrame()); int sw = metrics.width(startText), ew = metrics.width(endText), dw = metrics.width(durationText); int sy = metrics.ascent() + metrics.height() + 4; int ey = sy; int dy = sy + metrics.height(); int sx = p0 + 2; int ex = sx; int dx = sx; bool durationBothEnds = true; if (sw + ew > (p1 - p0)) { ey += metrics.height(); dy += metrics.height(); durationBothEnds = false; } if (ew < (p1 - p0)) { ex = p1 - 2 - ew; } if (dw < (p1 - p0)) { dx = p1 - 2 - dw; } paint.drawText(sx, sy, startText); paint.drawText(ex, ey, endText); paint.drawText(dx, dy, durationText); if (durationBothEnds) { paint.drawText(sx, dy, durationText); } } } paint.restore(); } void View::drawMeasurementRect(QPainter &paint, const Layer *topLayer, QRect r, bool focus) const { // SVDEBUG << "View::drawMeasurementRect(" << r.x() << "," << r.y() << " " // << r.width() << "x" << r.height() << ")" << endl; if (r.x() + r.width() < 0 || r.x() >= width()) return; if (r.width() != 0 || r.height() != 0) { paint.save(); if (focus) { paint.setPen(Qt::NoPen); QColor brushColour(Qt::black); brushColour.setAlpha(hasLightBackground() ? 15 : 40); paint.setBrush(brushColour); if (r.x() > 0) { paint.drawRect(0, 0, r.x(), height()); } if (r.x() + r.width() < width()) { paint.drawRect(r.x() + r.width(), 0, width()-r.x()-r.width(), height()); } if (r.y() > 0) { paint.drawRect(r.x(), 0, r.width(), r.y()); } if (r.y() + r.height() < height()) { paint.drawRect(r.x(), r.y() + r.height(), r.width(), height()-r.y()-r.height()); } paint.setBrush(Qt::NoBrush); } paint.setPen(Qt::green); paint.drawRect(r); paint.restore(); } else { paint.save(); paint.setPen(Qt::green); paint.drawPoint(r.x(), r.y()); paint.restore(); } if (!focus) return; paint.save(); QFont fn = paint.font(); if (fn.pointSize() > 8) { fn.setPointSize(fn.pointSize() - 1); paint.setFont(fn); } int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); float v0, v1; QString u0, u1; bool b0 = false, b1 = false; QString axs, ays, bxs, bys, dxs, dys; int axx, axy, bxx, bxy, dxx, dxy; int aw = 0, bw = 0, dw = 0; int labelCount = 0; // top-left point, x-coord if ((b0 = topLayer->getXScaleValue(this, r.x(), v0, u0))) { axs = QString("%1 %2").arg(v0).arg(u0); if (u0 == "Hz" && Pitch::isFrequencyInMidiRange(v0)) { axs = QString("%1 (%2)").arg(axs) .arg(Pitch::getPitchLabelForFrequency(v0)); } aw = paint.fontMetrics().width(axs); ++labelCount; } // bottom-right point, x-coord if (r.width() > 0) { if ((b1 = topLayer->getXScaleValue(this, r.x() + r.width(), v1, u1))) { bxs = QString("%1 %2").arg(v1).arg(u1); if (u1 == "Hz" && Pitch::isFrequencyInMidiRange(v1)) { bxs = QString("%1 (%2)").arg(bxs) .arg(Pitch::getPitchLabelForFrequency(v1)); } bw = paint.fontMetrics().width(bxs); } } // dimension, width if (b0 && b1 && v1 != v0 && u0 == u1) { dxs = QString("[%1 %2]").arg(fabs(v1 - v0)).arg(u1); dw = paint.fontMetrics().width(dxs); } b0 = false; b1 = false; // top-left point, y-coord if ((b0 = topLayer->getYScaleValue(this, r.y(), v0, u0))) { ays = QString("%1 %2").arg(v0).arg(u0); if (u0 == "Hz" && Pitch::isFrequencyInMidiRange(v0)) { ays = QString("%1 (%2)").arg(ays) .arg(Pitch::getPitchLabelForFrequency(v0)); } aw = std::max(aw, paint.fontMetrics().width(ays)); ++labelCount; } // bottom-right point, y-coord if (r.height() > 0) { if ((b1 = topLayer->getYScaleValue(this, r.y() + r.height(), v1, u1))) { bys = QString("%1 %2").arg(v1).arg(u1); if (u1 == "Hz" && Pitch::isFrequencyInMidiRange(v1)) { bys = QString("%1 (%2)").arg(bys) .arg(Pitch::getPitchLabelForFrequency(v1)); } bw = std::max(bw, paint.fontMetrics().width(bys)); } } bool bd = false; float dy = 0.f; QString du; // dimension, height if ((bd = topLayer->getYScaleDifference(this, r.y(), r.y() + r.height(), dy, du)) && dy != 0) { if (du != "") { if (du == "Hz") { int semis; float cents; semis = Pitch::getPitchForFrequencyDifference(v0, v1, ¢s); dys = QString("[%1 %2 (%3)]") .arg(dy).arg(du) .arg(Pitch::getLabelForPitchRange(semis, cents)); } else { dys = QString("[%1 %2]").arg(dy).arg(du); } } else { dys = QString("[%1]").arg(dy); } dw = std::max(dw, paint.fontMetrics().width(dys)); } int mw = r.width(); int mh = r.height(); bool edgeLabelsInside = false; bool sizeLabelsInside = false; if (mw < std::max(aw, std::max(bw, dw)) + 4) { // defaults stand } else if (mw < aw + bw + 4) { if (mh > fontHeight * labelCount * 3 + 4) { edgeLabelsInside = true; sizeLabelsInside = true; } else if (mh > fontHeight * labelCount * 2 + 4) { edgeLabelsInside = true; } } else if (mw < aw + bw + dw + 4) { if (mh > fontHeight * labelCount * 3 + 4) { edgeLabelsInside = true; sizeLabelsInside = true; } else if (mh > fontHeight * labelCount + 4) { edgeLabelsInside = true; } } else { if (mh > fontHeight * labelCount + 4) { edgeLabelsInside = true; sizeLabelsInside = true; } } if (edgeLabelsInside) { axx = r.x() + 2; axy = r.y() + fontAscent + 2; bxx = r.x() + r.width() - bw - 2; bxy = r.y() + r.height() - (labelCount-1) * fontHeight - 2; } else { axx = r.x() - aw - 2; axy = r.y() + fontAscent; bxx = r.x() + r.width() + 2; bxy = r.y() + r.height() - (labelCount-1) * fontHeight; } dxx = r.width()/2 + r.x() - dw/2; if (sizeLabelsInside) { dxy = r.height()/2 + r.y() - (labelCount * fontHeight)/2 + fontAscent; } else { dxy = r.y() + r.height() + fontAscent + 2; } if (axs != "") { drawVisibleText(paint, axx, axy, axs, OutlinedText); axy += fontHeight; } if (ays != "") { drawVisibleText(paint, axx, axy, ays, OutlinedText); axy += fontHeight; } if (bxs != "") { drawVisibleText(paint, bxx, bxy, bxs, OutlinedText); bxy += fontHeight; } if (bys != "") { drawVisibleText(paint, bxx, bxy, bys, OutlinedText); bxy += fontHeight; } if (dxs != "") { drawVisibleText(paint, dxx, dxy, dxs, OutlinedText); dxy += fontHeight; } if (dys != "") { drawVisibleText(paint, dxx, dxy, dys, OutlinedText); dxy += fontHeight; } paint.restore(); } bool View::render(QPainter &paint, int xorigin, size_t f0, size_t f1) { size_t x0 = f0 / m_zoomLevel; size_t x1 = f1 / m_zoomLevel; size_t w = x1 - x0; size_t origCentreFrame = m_centreFrame; bool someLayersIncomplete = false; for (LayerList::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { int c = (*i)->getCompletion(this); if (c < 100) { someLayersIncomplete = true; break; } } if (someLayersIncomplete) { QProgressDialog progress(tr("Waiting for layers to be ready..."), tr("Cancel"), 0, 100, this); int layerCompletion = 0; while (layerCompletion < 100) { for (LayerList::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { int c = (*i)->getCompletion(this); if (i == m_layers.begin() || c < layerCompletion) { layerCompletion = c; } } if (layerCompletion >= 100) break; progress.setValue(layerCompletion); qApp->processEvents(); if (progress.wasCanceled()) { update(); return false; } usleep(50000); } } QProgressDialog progress(tr("Rendering image..."), tr("Cancel"), 0, w / width(), this); for (size_t x = 0; x < w; x += width()) { progress.setValue(x / width()); qApp->processEvents(); if (progress.wasCanceled()) { m_centreFrame = origCentreFrame; update(); return false; } m_centreFrame = f0 + (x + width()/2) * m_zoomLevel; QRect chunk(0, 0, width(), height()); paint.setPen(getBackground()); paint.setBrush(getBackground()); paint.drawRect(QRect(xorigin + x, 0, width(), height())); paint.setPen(getForeground()); paint.setBrush(Qt::NoBrush); for (LayerList::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if(!((*i)->isLayerDormant(this))){ paint.setRenderHint(QPainter::Antialiasing, false); paint.save(); paint.translate(xorigin + x, 0); cerr << "Centre frame now: " << m_centreFrame << " drawing to " << chunk.x() + x + xorigin << ", " << chunk.width() << endl; (*i)->setSynchronousPainting(true); (*i)->paint(this, paint, chunk); (*i)->setSynchronousPainting(false); paint.restore(); } } } m_centreFrame = origCentreFrame; update(); return true; } QImage * View::toNewImage() { size_t f0 = getModelsStartFrame(); size_t f1 = getModelsEndFrame(); return toNewImage(f0, f1); } QImage * View::toNewImage(size_t f0, size_t f1) { size_t x0 = f0 / getZoomLevel(); size_t x1 = f1 / getZoomLevel(); QImage *image = new QImage(x1 - x0, height(), QImage::Format_RGB32); QPainter *paint = new QPainter(image); if (!render(*paint, 0, f0, f1)) { delete paint; delete image; return 0; } else { delete paint; return image; } } QSize View::getImageSize() { size_t f0 = getModelsStartFrame(); size_t f1 = getModelsEndFrame(); return getImageSize(f0, f1); } QSize View::getImageSize(size_t f0, size_t f1) { size_t x0 = f0 / getZoomLevel(); size_t x1 = f1 / getZoomLevel(); return QSize(x1 - x0, height()); } void View::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; stream << QString("\n") .arg(m_centreFrame) .arg(m_zoomLevel) .arg(m_followPan) .arg(m_followZoom) .arg(m_followPlay == PlaybackScrollContinuous ? "scroll" : m_followPlay == PlaybackScrollPage ? "page" : "ignore") .arg(extraAttributes); for (size_t i = 0; i < m_layers.size(); ++i) { bool visible = !m_layers[i]->isLayerDormant(this); m_layers[i]->toBriefXml(stream, indent + " ", QString("visible=\"%1\"") .arg(visible ? "true" : "false")); } stream << indent + "\n"; } ViewPropertyContainer::ViewPropertyContainer(View *v) : m_v(v) { connect(m_v, SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SIGNAL(propertyChanged(PropertyContainer::PropertyName))); } sonic-visualiser-2.3~repack1.orig/svgui/view/view.pro0000644000175000017500000000072712252354725021543 0ustar miramiraTEMPLATE = lib SV_UNIT_PACKAGES = load(../prf/sv.prf) CONFIG += sv staticlib qt thread warn_on stl rtti exceptions QT += xml TARGET = svview DEPENDPATH += . .. INCLUDEPATH += . .. OBJECTS_DIR = tmp_obj MOC_DIR = tmp_moc # Input HEADERS += Overview.h \ Pane.h \ PaneStack.h \ View.h \ ViewManager.h SOURCES += Overview.cpp \ Pane.cpp \ PaneStack.cpp \ View.cpp \ ViewManager.cpp sonic-visualiser-2.3~repack1.orig/svgui/view/Overview.h0000644000175000017500000000373512252354725022030 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _OVERVIEW_H_ #define _OVERVIEW_H_ #include "View.h" #include #include class QWidget; class QPaintEvent; class Layer; class View; #include class Overview : public View { Q_OBJECT public: Overview(QWidget *parent = 0); void registerView(View *view); void unregisterView(View *view); virtual QString getPropertyContainerIconName() const { return "panner"; } public slots: virtual void modelChanged(size_t startFrame, size_t endFrame); virtual void modelReplaced(); virtual void globalCentreFrameChanged(unsigned long); virtual void viewCentreFrameChanged(View *, unsigned long); virtual void viewZoomLevelChanged(View *, unsigned long, bool); virtual void viewManagerPlaybackFrameChanged(unsigned long); protected: virtual void paintEvent(QPaintEvent *e); virtual void mousePressEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); virtual bool shouldLabelSelections() const { return false; } QPoint m_clickPos; QPoint m_mousePos; bool m_clickedInRange; size_t m_dragCentreFrame; QTime m_modelTestTime; typedef std::set ViewSet; ViewSet m_views; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/view/PaneStack.cpp0000644000175000017500000003525612252354725022431 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PaneStack.h" #include "Pane.h" #include "widgets/PropertyStack.h" #include "widgets/IconLoader.h" #include "widgets/ClickableLabel.h" #include "layer/Layer.h" #include "ViewManager.h" #include #include #include #include #include #include #include #include #include #include //#define DEBUG_PANE_STACK 1 PaneStack::PaneStack(QWidget *parent, ViewManager *viewManager) : QFrame(parent), m_currentPane(0), m_splitter(new QSplitter), m_propertyStackStack(new QStackedWidget), m_viewManager(viewManager), m_propertyStackMinWidth(100), m_layoutStyle(PropertyStackPerPaneLayout) { QHBoxLayout *layout = new QHBoxLayout; layout->setMargin(0); layout->setSpacing(0); m_splitter->setOrientation(Qt::Vertical); m_splitter->setOpaqueResize(false); layout->addWidget(m_splitter); layout->setStretchFactor(m_splitter, 1); layout->addWidget(m_propertyStackStack); m_propertyStackStack->hide(); setLayout(layout); } Pane * PaneStack::addPane(bool suppressPropertyBox) { return insertPane(getPaneCount(), suppressPropertyBox); } Pane * PaneStack::insertPane(int index, bool suppressPropertyBox) { QFrame *frame = new QFrame; QGridLayout *layout = new QGridLayout; layout->setMargin(0); layout->setSpacing(2); QPushButton *xButton = new QPushButton(frame); xButton->setIcon(IconLoader().load("cross")); xButton->setFixedSize(QSize(16, 16)); xButton->setFlat(true); layout->addWidget(xButton, 0, 0); connect(xButton, SIGNAL(clicked()), this, SLOT(paneDeleteButtonClicked())); ClickableLabel *currentIndicator = new ClickableLabel(frame); connect(currentIndicator, SIGNAL(clicked()), this, SLOT(indicatorClicked())); layout->addWidget(currentIndicator, 1, 0); layout->setRowStretch(1, 20); currentIndicator->setMinimumWidth(8); currentIndicator->setScaledContents(true); long initialCentreFrame = -1; for (int i = 0; i < m_panes.size(); ++i) { long f = m_panes[i].pane->getCentreFrame(); initialCentreFrame = f; break; } Pane *pane = new Pane(frame); if (initialCentreFrame >= 0) { pane->setViewManager(m_viewManager, initialCentreFrame); } else { pane->setViewManager(m_viewManager); } layout->addWidget(pane, 0, 1, 2, 1); layout->setColumnStretch(1, 20); QWidget *properties = 0; if (suppressPropertyBox) { properties = new QFrame(); } else { properties = new PropertyStack(frame, pane); connect(properties, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)), this, SLOT(propertyContainerSelected(View *, PropertyContainer *))); connect(properties, SIGNAL(viewSelected(View *)), this, SLOT(viewSelected(View *))); connect(properties, SIGNAL(contextHelpChanged(const QString &)), this, SIGNAL(contextHelpChanged(const QString &))); } if (m_layoutStyle == PropertyStackPerPaneLayout) { layout->addWidget(properties, 0, 2, 2, 1); } else { properties->setParent(m_propertyStackStack); m_propertyStackStack->addWidget(properties); } layout->setColumnStretch(2, 0); PaneRec rec; rec.pane = pane; rec.propertyStack = properties; rec.xButton = xButton; rec.currentIndicator = currentIndicator; rec.frame = frame; rec.layout = layout; m_panes.push_back(rec); frame->setLayout(layout); m_splitter->insertWidget(index, frame); connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)), this, SLOT(propertyContainerAdded(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)), this, SLOT(propertyContainerRemoved(PropertyContainer *))); connect(pane, SIGNAL(paneInteractedWith()), this, SLOT(paneInteractedWith())); connect(pane, SIGNAL(rightButtonMenuRequested(QPoint)), this, SLOT(rightButtonMenuRequested(QPoint))); connect(pane, SIGNAL(dropAccepted(QStringList)), this, SLOT(paneDropAccepted(QStringList))); connect(pane, SIGNAL(dropAccepted(QString)), this, SLOT(paneDropAccepted(QString))); emit paneAdded(pane); emit paneAdded(); if (!m_currentPane) { setCurrentPane(pane); } showOrHidePaneAccessories(); return pane; } void PaneStack::setPropertyStackMinWidth(int mw) { for (std::vector::iterator i = m_panes.begin(); i != m_panes.end(); ++i) { i->propertyStack->setMinimumWidth(mw); } m_propertyStackMinWidth = mw; } void PaneStack::setLayoutStyle(LayoutStyle style) { if (style == m_layoutStyle) return; m_layoutStyle = style; std::vector::iterator i; switch (style) { case NoPropertyStacks: case SinglePropertyStackLayout: for (i = m_panes.begin(); i != m_panes.end(); ++i) { i->layout->removeWidget(i->propertyStack); i->propertyStack->setParent(m_propertyStackStack); m_propertyStackStack->addWidget(i->propertyStack); } m_propertyStackStack->setVisible(style != NoPropertyStacks); break; case PropertyStackPerPaneLayout: for (i = m_panes.begin(); i != m_panes.end(); ++i) { m_propertyStackStack->removeWidget(i->propertyStack); i->propertyStack->setParent(i->frame); i->layout->addWidget(i->propertyStack, 0, 2, 2, 1); i->propertyStack->show(); } m_propertyStackStack->hide(); break; } } Pane * PaneStack::getPane(int n) { if (n < m_panes.size()) { return m_panes[n].pane; } else { return 0; } } int PaneStack::getPaneIndex(Pane *pane) { for (int i = 0; i < getPaneCount(); ++i) { if (pane == getPane(i)) { return i; } } return -1; } Pane * PaneStack::getHiddenPane(int n) { return m_hiddenPanes[n].pane; } void PaneStack::deletePane(Pane *pane) { std::vector::iterator i; bool found = false; for (i = m_panes.begin(); i != m_panes.end(); ++i) { if (i->pane == pane) { m_panes.erase(i); found = true; break; } } if (!found) { for (i = m_hiddenPanes.begin(); i != m_hiddenPanes.end(); ++i) { if (i->pane == pane) { m_hiddenPanes.erase(i); found = true; break; } } if (!found) { cerr << "WARNING: PaneStack::deletePane(" << pane << "): Pane not found in visible or hidden panes, not deleting" << endl; return; } } emit paneAboutToBeDeleted(pane); delete pane->parent(); if (m_currentPane == pane) { if (m_panes.size() > 0) { setCurrentPane(m_panes[0].pane); } else { setCurrentPane(0); } } showOrHidePaneAccessories(); emit paneDeleted(); } void PaneStack::showOrHidePaneAccessories() { cerr << "PaneStack::showOrHidePaneAccessories: count == " << getPaneCount() << endl; bool multi = (getPaneCount() > 1); for (std::vector::iterator i = m_panes.begin(); i != m_panes.end(); ++i) { i->xButton->setVisible(multi); i->currentIndicator->setVisible(multi); } } int PaneStack::getPaneCount() const { return m_panes.size(); } int PaneStack::getHiddenPaneCount() const { return m_hiddenPanes.size(); } void PaneStack::hidePane(Pane *pane) { std::vector::iterator i = m_panes.begin(); while (i != m_panes.end()) { if (i->pane == pane) { m_hiddenPanes.push_back(*i); m_panes.erase(i); QWidget *pw = dynamic_cast(pane->parent()); if (pw) pw->hide(); if (m_currentPane == pane) { if (m_panes.size() > 0) { setCurrentPane(m_panes[0].pane); } else { setCurrentPane(0); } } showOrHidePaneAccessories(); emit paneHidden(pane); emit paneHidden(); return; } ++i; } cerr << "WARNING: PaneStack::hidePane(" << pane << "): Pane not found in visible panes" << endl; } void PaneStack::showPane(Pane *pane) { std::vector::iterator i = m_hiddenPanes.begin(); while (i != m_hiddenPanes.end()) { if (i->pane == pane) { m_panes.push_back(*i); m_hiddenPanes.erase(i); QWidget *pw = dynamic_cast(pane->parent()); if (pw) pw->show(); //!!! update current pane showOrHidePaneAccessories(); return; } ++i; } cerr << "WARNING: PaneStack::showPane(" << pane << "): Pane not found in hidden panes" << endl; } void PaneStack::setCurrentPane(Pane *pane) // may be null { if (m_currentPane == pane) return; std::vector::iterator i = m_panes.begin(); // We used to do this by setting the foreground and background // role, but it seems the background role is ignored and the // background drawn transparent in Qt 4.1 -- I can't quite see why QPixmap selectedMap(1, 1); selectedMap.fill(QApplication::palette().color(QPalette::Foreground)); QPixmap unselectedMap(1, 1); unselectedMap.fill(QApplication::palette().color(QPalette::Background)); bool found = false; while (i != m_panes.end()) { if (i->pane == pane) { i->currentIndicator->setPixmap(selectedMap); if (m_layoutStyle != PropertyStackPerPaneLayout) { m_propertyStackStack->setCurrentWidget(i->propertyStack); } found = true; } else { i->currentIndicator->setPixmap(unselectedMap); } ++i; } if (found || pane == 0) { m_currentPane = pane; emit currentPaneChanged(m_currentPane); } else { cerr << "WARNING: PaneStack::setCurrentPane(" << pane << "): pane is not a visible pane in this stack" << endl; } } void PaneStack::setCurrentLayer(Pane *pane, Layer *layer) // may be null { setCurrentPane(pane); if (m_currentPane) { std::vector::iterator i = m_panes.begin(); while (i != m_panes.end()) { if (i->pane == pane) { PropertyStack *stack = dynamic_cast (i->propertyStack); if (stack) { if (stack->containsContainer(layer)) { stack->setCurrentIndex(stack->getContainerIndex(layer)); emit currentLayerChanged(pane, layer); } else { stack->setCurrentIndex (stack->getContainerIndex (pane->getPropertyContainer(0))); emit currentLayerChanged(pane, 0); } } break; } ++i; } } } Pane * PaneStack::getCurrentPane() { return m_currentPane; } void PaneStack::propertyContainerAdded(PropertyContainer *) { sizePropertyStacks(); } void PaneStack::propertyContainerRemoved(PropertyContainer *) { sizePropertyStacks(); } void PaneStack::propertyContainerSelected(View *client, PropertyContainer *pc) { std::vector::iterator i = m_panes.begin(); while (i != m_panes.end()) { PropertyStack *stack = dynamic_cast(i->propertyStack); if (stack && stack->getClient() == client && stack->containsContainer(pc)) { setCurrentPane(i->pane); break; } ++i; } Layer *layer = dynamic_cast(pc); if (layer) emit currentLayerChanged(m_currentPane, layer); else emit currentLayerChanged(m_currentPane, 0); } void PaneStack::viewSelected(View *v) { Pane *p = dynamic_cast(v); if (p) setCurrentPane(p); } void PaneStack::paneInteractedWith() { Pane *pane = dynamic_cast(sender()); if (!pane) return; setCurrentPane(pane); } void PaneStack::rightButtonMenuRequested(QPoint position) { Pane *pane = dynamic_cast(sender()); if (!pane) return; emit rightButtonMenuRequested(pane, position); } void PaneStack::sizePropertyStacks() { int maxMinWidth = 0; if (m_propertyStackMinWidth > 0) maxMinWidth = m_propertyStackMinWidth; for (size_t i = 0; i < m_panes.size(); ++i) { if (!m_panes[i].propertyStack) continue; #ifdef DEBUG_PANE_STACK SVDEBUG << "PaneStack::sizePropertyStacks: " << i << ": min " << m_panes[i].propertyStack->minimumSizeHint().width() << ", hint " << m_panes[i].propertyStack->sizeHint().width() << ", current " << m_panes[i].propertyStack->width() << endl; #endif if (m_panes[i].propertyStack->sizeHint().width() > maxMinWidth) { maxMinWidth = m_panes[i].propertyStack->sizeHint().width(); } } #ifdef DEBUG_PANE_STACK SVDEBUG << "PaneStack::sizePropertyStacks: max min width " << maxMinWidth << endl; #endif int setWidth = maxMinWidth; m_propertyStackStack->setMaximumWidth(setWidth + 10); for (size_t i = 0; i < m_panes.size(); ++i) { if (!m_panes[i].propertyStack) continue; m_panes[i].propertyStack->setMinimumWidth(setWidth); } emit propertyStacksResized(setWidth); emit propertyStacksResized(); } void PaneStack::paneDropAccepted(QStringList uriList) { Pane *pane = dynamic_cast(sender()); emit dropAccepted(pane, uriList); } void PaneStack::paneDropAccepted(QString text) { Pane *pane = dynamic_cast(sender()); emit dropAccepted(pane, text); } void PaneStack::paneDeleteButtonClicked() { QObject *s = sender(); for (size_t i = 0; i < m_panes.size(); ++i) { if (m_panes[i].xButton == s) { emit paneDeleteButtonClicked(m_panes[i].pane); } } } void PaneStack::indicatorClicked() { QObject *s = sender(); for (size_t i = 0; i < m_panes.size(); ++i) { if (m_panes[i].currentIndicator == s) { setCurrentPane(m_panes[i].pane); return; } } } void PaneStack::sizePanesEqually() { QList sizes = m_splitter->sizes(); if (sizes.empty()) return; int count = sizes.size(); int total = 0; for (int i = 0; i < count; ++i) { total += sizes[i]; } if (total == 0) return; sizes.clear(); int each = total / count; int remaining = total; for (int i = 0; i < count; ++i) { if (i == count - 1) { sizes.push_back(remaining); } else { sizes.push_back(each); remaining -= each; } } /* cerr << "sizes: "; for (int i = 0; i < sizes.size(); ++i) { cerr << sizes[i] << " "; } cerr << endl; */ m_splitter->setSizes(sizes); } sonic-visualiser-2.3~repack1.orig/svgui/view/PaneStack.h0000644000175000017500000000736012252354725022071 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PANESTACK_H_ #define _PANESTACK_H_ #include #include class QWidget; class QLabel; class QStackedWidget; class QSplitter; class QGridLayout; class QPushButton; class View; class Pane; class Layer; class ViewManager; class PropertyContainer; class PropertyStack; class PaneStack : public QFrame { Q_OBJECT public: PaneStack(QWidget *parent, ViewManager *viewManager); Pane *addPane(bool suppressPropertyBox = false); // I own the returned value Pane *insertPane(int index, bool suppressPropertyBox = false); // I own the returned value void deletePane(Pane *pane); // Deletes the pane, but _not_ its layers int getPaneCount() const; // Returns only count of visible panes Pane *getPane(int n); // Of visible panes; I own the returned value int getPaneIndex(Pane *pane); // so getPane(index)==pane; -1 if absent void hidePane(Pane *pane); // Also removes pane from getPane/getPaneCount void showPane(Pane *pane); // Returns pane to getPane/getPaneCount int getHiddenPaneCount() const; Pane *getHiddenPane(int n); // I own the returned value void setCurrentPane(Pane *pane); void setCurrentLayer(Pane *pane, Layer *layer); Pane *getCurrentPane(); enum LayoutStyle { NoPropertyStacks = 0, SinglePropertyStackLayout = 1, PropertyStackPerPaneLayout = 2 }; LayoutStyle getLayoutStyle() const { return m_layoutStyle; } void setLayoutStyle(LayoutStyle style); void setPropertyStackMinWidth(int mw); void sizePanesEqually(); signals: void currentPaneChanged(Pane *pane); void currentLayerChanged(Pane *pane, Layer *layer); void rightButtonMenuRequested(Pane *pane, QPoint position); void propertyStacksResized(int width); void propertyStacksResized(); void contextHelpChanged(const QString &); void paneAdded(Pane *pane); void paneAdded(); void paneHidden(Pane *pane); void paneHidden(); void paneAboutToBeDeleted(Pane *pane); void paneDeleted(); void dropAccepted(Pane *pane, QStringList uriList); void dropAccepted(Pane *pane, QString text); void paneDeleteButtonClicked(Pane *pane); public slots: void propertyContainerAdded(PropertyContainer *); void propertyContainerRemoved(PropertyContainer *); void propertyContainerSelected(View *client, PropertyContainer *); void viewSelected(View *v); void paneInteractedWith(); void rightButtonMenuRequested(QPoint); void paneDropAccepted(QStringList); void paneDropAccepted(QString); void paneDeleteButtonClicked(); void indicatorClicked(); protected: Pane *m_currentPane; struct PaneRec { Pane *pane; QWidget *propertyStack; QPushButton *xButton; QLabel *currentIndicator; QFrame *frame; QGridLayout *layout; }; std::vector m_panes; std::vector m_hiddenPanes; QSplitter *m_splitter; QStackedWidget *m_propertyStackStack; ViewManager *m_viewManager; // I don't own this int m_propertyStackMinWidth; void sizePropertyStacks(); void showOrHidePaneAccessories(); LayoutStyle m_layoutStyle; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/view/Pane.h0000644000175000017500000001343612252354725021104 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PANE_H_ #define _PANE_H_ #include #include #include "base/ZoomConstraint.h" #include "View.h" #include "base/Selection.h" class QWidget; class QPaintEvent; class Layer; class Thumbwheel; class Panner; class NotifyingPushButton; class KeyReference; class Pane : public View { Q_OBJECT public: Pane(QWidget *parent = 0); virtual QString getPropertyContainerIconName() const { return "pane"; } virtual bool shouldIlluminateLocalFeatures(const Layer *layer, QPoint &pos) const; virtual bool shouldIlluminateLocalSelection(QPoint &pos, bool &closeToLeft, bool &closeToRight) const; void setCentreLineVisible(bool visible); bool getCentreLineVisible() const { return m_centreLineVisible; } virtual size_t getFirstVisibleFrame() const; virtual size_t getVerticalScaleWidth() const; virtual QImage *toNewImage(size_t f0, size_t f1); virtual QImage *toNewImage() { return View::toNewImage(); } virtual QSize getImageSize(size_t f0, size_t f1); virtual QSize getImageSize() { return View::getImageSize(); } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; static void registerShortcuts(KeyReference &kr); signals: void paneInteractedWith(); void rightButtonMenuRequested(QPoint position); void dropAccepted(QStringList uriList); void dropAccepted(QString text); public slots: virtual void toolModeChanged(); virtual void zoomWheelsEnabledChanged(); virtual void viewZoomLevelChanged(View *v, unsigned long z, bool locked); virtual void modelAlignmentCompletionChanged(); virtual void horizontalThumbwheelMoved(int value); virtual void verticalThumbwheelMoved(int value); virtual void verticalZoomChanged(); virtual void verticalPannerMoved(float x, float y, float w, float h); virtual void editVerticalPannerExtents(); virtual void layerParametersChanged(); virtual void propertyContainerSelected(View *, PropertyContainer *pc); void mouseEnteredWidget(); void mouseLeftWidget(); protected: virtual void paintEvent(QPaintEvent *e); virtual void mousePressEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void enterEvent(QEvent *e); virtual void leaveEvent(QEvent *e); virtual void wheelEvent(QWheelEvent *e); virtual void resizeEvent(QResizeEvent *e); virtual void dragEnterEvent(QDragEnterEvent *e); virtual void dropEvent(QDropEvent *e); void drawVerticalScale(QRect r, Layer *, QPainter &); void drawFeatureDescription(Layer *, QPainter &); void drawCentreLine(int, QPainter &, bool omitLine); void drawDurationAndRate(QRect, const Model *, int, QPainter &); void drawWorkTitle(QRect, QPainter &, const Model *); void drawLayerNames(QRect, QPainter &); void drawEditingSelection(QPainter &); void drawAlignmentStatus(QRect, QPainter &, const Model *, bool down); virtual bool render(QPainter &paint, int x0, size_t f0, size_t f1); Selection getSelectionAt(int x, bool &closeToLeft, bool &closeToRight) const; bool editSelectionStart(QMouseEvent *e); bool editSelectionDrag(QMouseEvent *e); bool editSelectionEnd(QMouseEvent *e); bool selectionIsBeingEdited() const; void updateHeadsUpDisplay(); void updateVerticalPanner(); bool canTopLayerMoveVertical(); bool getTopLayerDisplayExtents(float &valueMin, float &valueMax, float &displayMin, float &displayMax, QString *unit = 0); bool setTopLayerDisplayExtents(float displayMin, float displayMax); void dragTopLayer(QMouseEvent *e); void dragExtendSelection(QMouseEvent *e); void zoomToRegion(int x0, int y0, int x1, int y1); void updateContextHelp(const QPoint *pos); void edgeScrollMaybe(int x); bool m_identifyFeatures; QPoint m_identifyPoint; QPoint m_clickPos; QPoint m_mousePos; bool m_clickedInRange; bool m_shiftPressed; bool m_ctrlPressed; bool m_altPressed; bool m_navigating; bool m_resizing; bool m_editing; bool m_releasing; size_t m_dragCentreFrame; float m_dragStartMinValue; bool m_centreLineVisible; size_t m_selectionStartFrame; Selection m_editingSelection; int m_editingSelectionEdge; mutable int m_scaleWidth; enum DragMode { UnresolvedDrag, VerticalDrag, HorizontalDrag, FreeDrag }; DragMode m_dragMode; DragMode updateDragMode(DragMode currentMode, QPoint origin, QPoint currentPoint, bool canMoveHorizontal, bool canMoveVertical, bool resistHorizontal, bool resistVertical); QWidget *m_headsUpDisplay; Panner *m_vpan; Thumbwheel *m_hthumb; Thumbwheel *m_vthumb; NotifyingPushButton *m_reset; bool m_mouseInWidget; static QCursor *m_measureCursor1; static QCursor *m_measureCursor2; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/view/Pane.cpp0000644000175000017500000023034712252354725021441 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Pane.h" #include "layer/Layer.h" #include "data/model/Model.h" #include "base/ZoomConstraint.h" #include "base/RealTime.h" #include "base/Profiler.h" #include "ViewManager.h" #include "widgets/CommandHistory.h" #include "widgets/TextAbbrev.h" #include "base/Preferences.h" #include "layer/WaveformLayer.h" //!!! ugh #include "data/model/WaveFileModel.h" #include #include #include #include #include #include #include #include #include #include //!!! for HUD -- pull out into a separate class #include #include #include #include "widgets/Thumbwheel.h" #include "widgets/Panner.h" #include "widgets/RangeInputDialog.h" #include "widgets/NotifyingPushButton.h" #include "widgets/KeyReference.h" //!!! should probably split KeyReference into a data class in base and another that shows the widget //#define DEBUG_PANE QCursor *Pane::m_measureCursor1 = 0; QCursor *Pane::m_measureCursor2 = 0; Pane::Pane(QWidget *w) : View(w, true), m_identifyFeatures(false), m_clickedInRange(false), m_shiftPressed(false), m_ctrlPressed(false), m_altPressed(false), m_navigating(false), m_resizing(false), m_editing(false), m_releasing(false), m_centreLineVisible(true), m_scaleWidth(0), m_headsUpDisplay(0), m_vpan(0), m_hthumb(0), m_vthumb(0), m_reset(0), m_mouseInWidget(false) { setObjectName("Pane"); setMouseTracking(true); setAcceptDrops(true); updateHeadsUpDisplay(); // SVDEBUG << "Pane::Pane(" << this << ") returning" << endl; } void Pane::updateHeadsUpDisplay() { Profiler profiler("Pane::updateHeadsUpDisplay"); if (!isVisible()) return; /* int count = 0; int currentLevel = 1; int level = 1; while (true) { if (getZoomLevel() == level) currentLevel = count; int newLevel = getZoomConstraintBlockSize(level + 1, ZoomConstraint::RoundUp); if (newLevel == level) break; if (newLevel == 131072) break; //!!! just because level = newLevel; ++count; } cerr << "Have " << count+1 << " zoom levels" << endl; */ Layer *layer = 0; if (getLayerCount() > 0) layer = getLayer(getLayerCount() - 1); if (!m_headsUpDisplay) { m_headsUpDisplay = new QFrame(this); QGridLayout *layout = new QGridLayout; layout->setMargin(0); layout->setSpacing(0); m_headsUpDisplay->setLayout(layout); m_hthumb = new Thumbwheel(Qt::Horizontal); m_hthumb->setObjectName(tr("Horizontal Zoom")); m_hthumb->setCursor(Qt::ArrowCursor); layout->addWidget(m_hthumb, 1, 0, 1, 2); m_hthumb->setFixedWidth(70); m_hthumb->setFixedHeight(16); m_hthumb->setDefaultValue(0); m_hthumb->setSpeed(0.6); connect(m_hthumb, SIGNAL(valueChanged(int)), this, SLOT(horizontalThumbwheelMoved(int))); connect(m_hthumb, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_hthumb, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); m_vpan = new Panner; m_vpan->setCursor(Qt::ArrowCursor); layout->addWidget(m_vpan, 0, 1); m_vpan->setFixedWidth(12); m_vpan->setFixedHeight(70); m_vpan->setAlpha(80, 130); connect(m_vpan, SIGNAL(rectExtentsChanged(float, float, float, float)), this, SLOT(verticalPannerMoved(float, float, float, float))); connect(m_vpan, SIGNAL(doubleClicked()), this, SLOT(editVerticalPannerExtents())); connect(m_vpan, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_vpan, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); m_vthumb = new Thumbwheel(Qt::Vertical); m_vthumb->setObjectName(tr("Vertical Zoom")); m_vthumb->setCursor(Qt::ArrowCursor); layout->addWidget(m_vthumb, 0, 2); m_vthumb->setFixedWidth(16); m_vthumb->setFixedHeight(70); connect(m_vthumb, SIGNAL(valueChanged(int)), this, SLOT(verticalThumbwheelMoved(int))); connect(m_vthumb, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_vthumb, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); if (layer) { RangeMapper *rm = layer->getNewVerticalZoomRangeMapper(); if (rm) m_vthumb->setRangeMapper(rm); } m_reset = new NotifyingPushButton; m_reset->setFlat(true); m_reset->setCursor(Qt::ArrowCursor); m_reset->setFixedHeight(16); m_reset->setFixedWidth(16); m_reset->setIcon(QPixmap(":/icons/zoom-reset.png")); m_reset->setToolTip(tr("Reset zoom to default")); layout->addWidget(m_reset, 1, 2); layout->setColumnStretch(0, 20); connect(m_reset, SIGNAL(clicked()), m_hthumb, SLOT(resetToDefault())); connect(m_reset, SIGNAL(clicked()), m_vthumb, SLOT(resetToDefault())); connect(m_reset, SIGNAL(clicked()), m_vpan, SLOT(resetToDefault())); connect(m_reset, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_reset, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); } int count = 0; int current = 0; int level = 1; //!!! pull out into function (presumably in View) bool haveConstraint = false; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->getZoomConstraint() && !(*i)->supportsOtherZoomLevels()) { haveConstraint = true; break; } } if (haveConstraint) { while (true) { if (getZoomLevel() == level) current = count; int newLevel = getZoomConstraintBlockSize(level + 1, ZoomConstraint::RoundUp); if (newLevel == level) break; level = newLevel; if (++count == 50) break; } } else { // if we have no particular constraints, we can really spread out while (true) { if (getZoomLevel() >= level) current = count; int step = level / 10; int pwr = 0; while (step > 0) { ++pwr; step /= 2; } step = 1; while (pwr > 0) { step *= 2; --pwr; } // cerr << level << endl; level += step; if (++count == 100 || level > 262144) break; } } // cerr << "Have " << count << " zoom levels" << endl; m_hthumb->setMinimumValue(0); m_hthumb->setMaximumValue(count); m_hthumb->setValue(count - current); // cerr << "set value to " << count-current << endl; // cerr << "default value is " << m_hthumb->getDefaultValue() << endl; if (count != 50 && m_hthumb->getDefaultValue() == 0) { m_hthumb->setDefaultValue(count - current); // cerr << "set default value to " << m_hthumb->getDefaultValue() << endl; } bool haveVThumb = false; if (layer) { int defaultStep = 0; int max = layer->getVerticalZoomSteps(defaultStep); if (max == 0) { m_vthumb->hide(); } else { haveVThumb = true; m_vthumb->show(); m_vthumb->blockSignals(true); m_vthumb->setMinimumValue(0); m_vthumb->setMaximumValue(max); m_vthumb->setDefaultValue(defaultStep); m_vthumb->setValue(layer->getCurrentVerticalZoomStep()); m_vthumb->blockSignals(false); // cerr << "Vertical thumbwheel: min 0, max " << max // << ", default " << defaultStep << ", value " // << m_vthumb->getValue() << endl; } } updateVerticalPanner(); if (m_manager && m_manager->getZoomWheelsEnabled() && width() > 120 && height() > 100) { if (!m_headsUpDisplay->isVisible()) { m_headsUpDisplay->show(); } if (haveVThumb) { m_headsUpDisplay->setFixedHeight(m_vthumb->height() + m_hthumb->height()); m_headsUpDisplay->move(width() - 86, height() - 86); } else { m_headsUpDisplay->setFixedHeight(m_hthumb->height()); m_headsUpDisplay->move(width() - 86, height() - 16); } } else { m_headsUpDisplay->hide(); } } void Pane::updateVerticalPanner() { if (!m_vpan || !m_manager || !m_manager->getZoomWheelsEnabled()) return; // In principle we should show or hide the panner on the basis of // whether the top layer has adjustable display extents, and we do // that below. However, we have no basis for layout of the panner // if the vertical scroll wheel is not also present. So if we // have no vertical scroll wheel, we should remove the panner as // well. Ideally any layer that implements display extents should // implement vertical zoom steps as well, but they don't all at // the moment. Layer *layer = 0; if (getLayerCount() > 0) layer = getLayer(getLayerCount() - 1); int discard; if (layer && layer->getVerticalZoomSteps(discard) == 0) { m_vpan->hide(); return; } float vmin, vmax, dmin, dmax; if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax) && vmax != vmin) { float y0 = (dmin - vmin) / (vmax - vmin); float y1 = (dmax - vmin) / (vmax - vmin); m_vpan->blockSignals(true); m_vpan->setRectExtents(0, 1.0 - y1, 1, y1 - y0); m_vpan->blockSignals(false); m_vpan->show(); } else { m_vpan->hide(); } } bool Pane::shouldIlluminateLocalFeatures(const Layer *layer, QPoint &pos) const { QPoint discard; bool b0, b1; if (m_manager && m_manager->getToolMode() == ViewManager::MeasureMode) { return false; } if (m_manager && !m_manager->shouldIlluminateLocalFeatures()) { return false; } if (layer == getSelectedLayer() && !shouldIlluminateLocalSelection(discard, b0, b1)) { pos = m_identifyPoint; return m_identifyFeatures; } return false; } bool Pane::shouldIlluminateLocalSelection(QPoint &pos, bool &closeToLeft, bool &closeToRight) const { if (m_identifyFeatures && m_manager && m_manager->getToolMode() == ViewManager::EditMode && !m_manager->getSelections().empty() && !selectionIsBeingEdited()) { Selection s(getSelectionAt(m_identifyPoint.x(), closeToLeft, closeToRight)); if (!s.isEmpty()) { if (getSelectedLayer() && getSelectedLayer()->isLayerEditable()) { pos = m_identifyPoint; return true; } } } return false; } bool Pane::selectionIsBeingEdited() const { if (!m_editingSelection.isEmpty()) { if (m_mousePos != m_clickPos && getFrameForX(m_mousePos.x()) != getFrameForX(m_clickPos.x())) { return true; } } return false; } void Pane::setCentreLineVisible(bool visible) { m_centreLineVisible = visible; update(); } void Pane::paintEvent(QPaintEvent *e) { // Profiler profiler("Pane::paintEvent", true); QPainter paint; QRect r(rect()); if (e) r = e->rect(); View::paintEvent(e); paint.begin(this); setPaintFont(paint); if (e) paint.setClipRect(r); ViewManager::ToolMode toolMode = m_manager->getToolMode(); if (m_manager && // !m_manager->isPlaying() && m_mouseInWidget && toolMode == ViewManager::MeasureMode) { for (LayerList::iterator vi = m_layers.end(); vi != m_layers.begin(); ) { --vi; std::vector crosshairExtents; if ((*vi)->getCrosshairExtents(this, paint, m_identifyPoint, crosshairExtents)) { (*vi)->paintCrosshairs(this, paint, m_identifyPoint); break; } else if ((*vi)->isLayerOpaque()) { break; } } } Layer *topLayer = getTopLayer(); bool haveSomeTimeXAxis = false; const Model *waveformModel = 0; // just for reporting purposes const Model *workModel = 0; for (LayerList::iterator vi = m_layers.end(); vi != m_layers.begin(); ) { --vi; if (!haveSomeTimeXAxis && (*vi)->hasTimeXAxis()) { haveSomeTimeXAxis = true; } if (dynamic_cast(*vi)) { waveformModel = (*vi)->getModel(); workModel = waveformModel; } else { Model *m = (*vi)->getModel(); if (dynamic_cast(m)) { workModel = m; } else if (m && dynamic_cast(m->getSourceModel())) { workModel = m->getSourceModel(); } } if (waveformModel && workModel && haveSomeTimeXAxis) break; } m_scaleWidth = 0; if (m_manager && m_manager->shouldShowVerticalScale() && topLayer) { drawVerticalScale(r, topLayer, paint); } if (m_identifyFeatures && m_manager && m_manager->shouldIlluminateLocalFeatures() && topLayer) { drawFeatureDescription(topLayer, paint); } int sampleRate = getModelsSampleRate(); paint.setBrush(Qt::NoBrush); if (m_centreLineVisible && m_manager && m_manager->shouldShowCentreLine()) { drawCentreLine(sampleRate, paint, !haveSomeTimeXAxis); } paint.setPen(QColor(50, 50, 50)); if (waveformModel && m_manager && m_manager->shouldShowDuration()) { drawDurationAndRate(r, waveformModel, sampleRate, paint); } bool haveWorkTitle = false; if (workModel && m_manager && m_manager->shouldShowWorkTitle()) { drawWorkTitle(r, paint, workModel); haveWorkTitle = true; } if (workModel && m_manager && m_manager->getAlignMode()) { drawAlignmentStatus(r, paint, workModel, haveWorkTitle); } if (m_manager && m_manager->shouldShowLayerNames()) { drawLayerNames(r, paint); } if (m_shiftPressed && m_clickedInRange && (toolMode == ViewManager::NavigateMode || m_navigating)) { //!!! be nice if this looked a bit more in keeping with the //selection block paint.setPen(Qt::blue); //!!! shouldn't use clickPos -- needs to use a clicked frame paint.drawRect(m_clickPos.x(), m_clickPos.y(), m_mousePos.x() - m_clickPos.x(), m_mousePos.y() - m_clickPos.y()); } if (toolMode == ViewManager::MeasureMode && topLayer) { bool showFocus = false; if (!m_manager || !m_manager->isPlaying()) showFocus = true; topLayer->paintMeasurementRects(this, paint, showFocus, m_identifyPoint); } if (selectionIsBeingEdited()) { drawEditingSelection(paint); } paint.end(); } size_t Pane::getVerticalScaleWidth() const { if (m_scaleWidth > 0) return m_scaleWidth; else return 0; } void Pane::drawVerticalScale(QRect r, Layer *topLayer, QPainter &paint) { Layer *scaleLayer = 0; float min, max; bool log; QString unit; // If the top layer has no scale and reports no display // extents, but does report a unit, then the scale should be // drawn from any underlying layer with a scale and that unit. // If the top layer has no scale and no value extents at all, // then the scale should be drawn from any underlying layer // with a scale regardless of unit. int sw = topLayer->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); if (sw > 0) { scaleLayer = topLayer; m_scaleWidth = sw; } else { bool hasDisplayExtents = topLayer->getDisplayExtents(min, max); bool hasValueExtents = topLayer->getValueExtents(min, max, log, unit); if (!hasDisplayExtents) { if (!hasValueExtents) { for (LayerList::iterator vi = m_layers.end(); vi != m_layers.begin(); ) { --vi; if ((*vi) == topLayer) continue; sw = (*vi)->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); if (sw > 0) { scaleLayer = *vi; m_scaleWidth = sw; break; } } } else if (unit != "") { // && hasValueExtents && !hasDisplayExtents QString requireUnit = unit; for (LayerList::iterator vi = m_layers.end(); vi != m_layers.begin(); ) { --vi; if ((*vi) == topLayer) continue; if ((*vi)->getDisplayExtents(min, max)) { // search no further than this: if the // scale from this layer isn't suitable, // we'll have to draw no scale (else we'd // risk ending up with the wrong scale) if ((*vi)->getValueExtents(min, max, log, unit) && unit == requireUnit) { sw = (*vi)->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); if (sw > 0) { scaleLayer = *vi; m_scaleWidth = sw; } } break; } } } } } if (!scaleLayer) m_scaleWidth = 0; if (m_scaleWidth > 0 && r.left() < m_scaleWidth) { // Profiler profiler("Pane::paintEvent - painting vertical scale", true); // SVDEBUG << "Pane::paintEvent: calling paint.save() in vertical scale block" << endl; paint.save(); paint.setPen(getForeground()); paint.setBrush(getBackground()); paint.drawRect(0, -1, m_scaleWidth, height()+1); paint.setBrush(Qt::NoBrush); scaleLayer->paintVerticalScale (this, m_manager->shouldShowVerticalColourScale(), paint, QRect(0, 0, m_scaleWidth, height())); paint.restore(); } } void Pane::drawFeatureDescription(Layer *topLayer, QPainter &paint) { QPoint pos = m_identifyPoint; QString desc = topLayer->getFeatureDescription(this, pos); if (desc != "") { paint.save(); int tabStop = paint.fontMetrics().width(tr("Some lengthy prefix:")); QRect boundingRect = paint.fontMetrics().boundingRect (rect(), Qt::AlignRight | Qt::AlignTop | Qt::TextExpandTabs, desc, tabStop); if (hasLightBackground()) { paint.setPen(Qt::NoPen); paint.setBrush(QColor(250, 250, 250, 200)); } else { paint.setPen(Qt::NoPen); paint.setBrush(QColor(50, 50, 50, 200)); } int extra = paint.fontMetrics().descent(); paint.drawRect(width() - boundingRect.width() - 10 - extra, 10 - extra, boundingRect.width() + 2 * extra, boundingRect.height() + extra); if (hasLightBackground()) { paint.setPen(QColor(150, 20, 0)); } else { paint.setPen(QColor(255, 150, 100)); } QTextOption option; option.setWrapMode(QTextOption::NoWrap); option.setAlignment(Qt::AlignRight | Qt::AlignTop); option.setTabStop(tabStop); paint.drawText(QRectF(width() - boundingRect.width() - 10, 10, boundingRect.width(), boundingRect.height()), desc, option); paint.restore(); } } void Pane::drawCentreLine(int sampleRate, QPainter &paint, bool omitLine) { int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); QColor c = QColor(0, 0, 0); if (!hasLightBackground()) { c = QColor(240, 240, 240); } paint.setPen(c); int x = width() / 2; if (!omitLine) { paint.drawLine(x, 0, x, height() - 1); paint.drawLine(x-1, 1, x+1, 1); paint.drawLine(x-2, 0, x+2, 0); paint.drawLine(x-1, height() - 2, x+1, height() - 2); paint.drawLine(x-2, height() - 1, x+2, height() - 1); } paint.setPen(QColor(50, 50, 50)); int y = height() - fontHeight + fontAscent - 6; LayerList::iterator vi = m_layers.end(); if (vi != m_layers.begin()) { switch ((*--vi)->getPreferredFrameCountPosition()) { case Layer::PositionTop: y = fontAscent + 6; break; case Layer::PositionMiddle: y = (height() - fontHeight) / 2 + fontAscent; break; case Layer::PositionBottom: // y already set correctly break; } } if (m_manager && m_manager->shouldShowFrameCount()) { if (sampleRate) { QString text(QString::fromStdString (RealTime::frame2RealTime (m_centreFrame, sampleRate) .toText(true))); int tw = paint.fontMetrics().width(text); int x = width()/2 - 4 - tw; drawVisibleText(paint, x, y, text, OutlinedText); } QString text = QString("%1").arg(m_centreFrame); int x = width()/2 + 4; drawVisibleText(paint, x, y, text, OutlinedText); } } void Pane::drawAlignmentStatus(QRect r, QPainter &paint, const Model *model, bool down) { const Model *reference = model->getAlignmentReference(); /* if (!reference) { cerr << "Pane[" << this << "]::drawAlignmentStatus: No reference" << endl; } else if (reference == model) { cerr << "Pane[" << this << "]::drawAlignmentStatus: This is the reference model" << endl; } else { cerr << "Pane[" << this << "]::drawAlignmentStatus: This is not the reference" << endl; } */ QString text; int completion = 100; if (reference == model) { text = tr("Reference"); } else if (!reference) { text = tr("Unaligned"); } else { completion = model->getAlignmentCompletion(); if (completion == 0) { text = tr("Unaligned"); } else if (completion < 100) { text = tr("Aligning: %1%").arg(completion); } else { text = tr("Aligned"); } } paint.save(); QFont font(paint.font()); font.setBold(true); paint.setFont(font); if (completion < 100) paint.setBrush(Qt::red); int y = 5; if (down) y += paint.fontMetrics().height(); int w = paint.fontMetrics().width(text); int h = paint.fontMetrics().height(); if (r.top() > h + y || r.left() > w + m_scaleWidth + 5) { paint.restore(); return; } drawVisibleText(paint, m_scaleWidth + 5, paint.fontMetrics().ascent() + y, text, OutlinedText); paint.restore(); } void Pane::modelAlignmentCompletionChanged() { View::modelAlignmentCompletionChanged(); update(QRect(0, 0, 300, 100)); } void Pane::drawWorkTitle(QRect r, QPainter &paint, const Model *model) { QString title = model->getTitle(); QString maker = model->getMaker(); //SVDEBUG << "Pane::drawWorkTitle: title=\"" << title//<< "\", maker=\"" << maker << "\"" << endl; if (title == "") return; QString text = title; if (maker != "") { text = tr("%1 - %2").arg(title).arg(maker); } paint.save(); QFont font(paint.font()); font.setItalic(true); paint.setFont(font); int y = 5; int w = paint.fontMetrics().width(text); int h = paint.fontMetrics().height(); if (r.top() > h + y || r.left() > w + m_scaleWidth + 5) { paint.restore(); return; } drawVisibleText(paint, m_scaleWidth + 5, paint.fontMetrics().ascent() + y, text, OutlinedText); paint.restore(); } void Pane::drawLayerNames(QRect r, QPainter &paint) { int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); int lly = height() - 6; if (m_manager->getZoomWheelsEnabled()) { lly -= 20; } if (r.y() + r.height() < lly - int(m_layers.size()) * fontHeight) { return; } QStringList texts; std::vector pixmaps; for (LayerList::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { texts.push_back((*i)->getLayerPresentationName()); // cerr << "Pane " << this << ": Layer presentation name for " << *i << ": " // << texts[texts.size()-1] << endl; pixmaps.push_back((*i)->getLayerPresentationPixmap (QSize(fontAscent, fontAscent))); } int maxTextWidth = width() / 3; texts = TextAbbrev::abbreviate(texts, paint.fontMetrics(), maxTextWidth); int llx = width() - maxTextWidth - 5; if (m_manager->getZoomWheelsEnabled()) { llx -= 36; } if (r.x() + r.width() >= llx - fontAscent - 3) { for (size_t i = 0; i < texts.size(); ++i) { // cerr << "Pane "<< this << ": text " << i << ": " << texts[i] << endl; if (i + 1 == texts.size()) { paint.setPen(getForeground()); } drawVisibleText(paint, llx, lly - fontHeight + fontAscent, texts[i], OutlinedText); if (!pixmaps[i].isNull()) { paint.drawPixmap(llx - fontAscent - 3, lly - fontHeight + (fontHeight-fontAscent)/2, pixmaps[i]); } lly -= fontHeight; } } } void Pane::drawEditingSelection(QPainter &paint) { int offset = m_mousePos.x() - m_clickPos.x(); long origStart = m_editingSelection.getStartFrame(); int p0 = getXForFrame(origStart) + offset; int p1 = getXForFrame(m_editingSelection.getEndFrame()) + offset; if (m_editingSelectionEdge < 0) { p1 = getXForFrame(m_editingSelection.getEndFrame()); } else if (m_editingSelectionEdge > 0) { p0 = getXForFrame(m_editingSelection.getStartFrame()); } long newStart = getFrameForX(p0); long newEnd = getFrameForX(p1); paint.save(); paint.setPen(QPen(getForeground(), 2)); int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); int sampleRate = getModelsSampleRate(); QString startText, endText, offsetText; startText = QString("%1").arg(newStart); endText = QString("%1").arg(newEnd); offsetText = QString("%1").arg(newStart - origStart); if (newStart >= origStart) { offsetText = tr("+%1").arg(offsetText); } if (sampleRate) { startText = QString("%1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime(newStart, sampleRate).toText())) .arg(startText); endText = QString("%1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime(newEnd, sampleRate).toText())) .arg(endText); offsetText = QString("%1 / %2") .arg(QString::fromStdString (RealTime::frame2RealTime(newStart - origStart, sampleRate).toText())) .arg(offsetText); if (newStart >= origStart) { offsetText = tr("+%1").arg(offsetText); } } drawVisibleText(paint, p0 + 2, fontAscent + fontHeight + 4, startText, OutlinedText); drawVisibleText(paint, p1 + 2, fontAscent + fontHeight + 4, endText, OutlinedText); drawVisibleText(paint, p0 + 2, fontAscent + fontHeight*2 + 4, offsetText, OutlinedText); drawVisibleText(paint, p1 + 2, fontAscent + fontHeight*2 + 4, offsetText, OutlinedText); //!!! duplicating display policy with View::drawSelections if (m_editingSelectionEdge < 0) { paint.drawLine(p0, 1, p1, 1); paint.drawLine(p0, 0, p0, height()); paint.drawLine(p0, height() - 1, p1, height() - 1); } else if (m_editingSelectionEdge > 0) { paint.drawLine(p0, 1, p1, 1); paint.drawLine(p1, 0, p1, height()); paint.drawLine(p0, height() - 1, p1, height() - 1); } else { paint.setBrush(Qt::NoBrush); paint.drawRect(p0, 1, p1 - p0, height() - 2); } paint.restore(); } void Pane::drawDurationAndRate(QRect r, const Model *waveformModel, int sampleRate, QPainter &paint) { int fontHeight = paint.fontMetrics().height(); int fontAscent = paint.fontMetrics().ascent(); if (r.y() + r.height() < height() - fontHeight - 6) return; size_t modelRate = waveformModel->getSampleRate(); size_t nativeRate = waveformModel->getNativeRate(); size_t playbackRate = m_manager->getPlaybackSampleRate(); size_t outputRate = m_manager->getOutputSampleRate(); QString srNote = ""; // Show (R) for waveform models that have been resampled or will // be resampled on playback, and (X) for waveform models that will // be played at the wrong rate because their rate differs from the // current playback rate (which is not necessarily that of the // main model). if (playbackRate != 0) { if (modelRate == playbackRate) { if (modelRate != outputRate || modelRate != nativeRate) { srNote = " " + tr("(R)"); } } else { srNote = " " + tr("(X)"); } } QString desc = tr("%1 / %2Hz%3") .arg(RealTime::frame2RealTime(waveformModel->getEndFrame(), sampleRate) .toText(false).c_str()) .arg(nativeRate) .arg(srNote); int x = m_scaleWidth + 5; int pbw = getProgressBarWidth(); if (x < pbw + 5) x = pbw + 5; if (r.x() < x + paint.fontMetrics().width(desc)) { drawVisibleText(paint, x, height() - fontHeight + fontAscent - 6, desc, OutlinedText); } } bool Pane::render(QPainter &paint, int xorigin, size_t f0, size_t f1) { if (!View::render(paint, xorigin + m_scaleWidth, f0, f1)) { return false; } if (m_scaleWidth > 0) { for (LayerList::iterator vi = m_layers.end(); vi != m_layers.begin(); ) { --vi; paint.save(); paint.setPen(getForeground()); paint.setBrush(getBackground()); paint.drawRect(xorigin, -1, m_scaleWidth, height()+1); paint.setBrush(Qt::NoBrush); (*vi)->paintVerticalScale (this, m_manager->shouldShowVerticalColourScale(), paint, QRect(xorigin, 0, m_scaleWidth, height())); paint.restore(); break; } } return true; } QImage * Pane::toNewImage(size_t f0, size_t f1) { size_t x0 = f0 / getZoomLevel(); size_t x1 = f1 / getZoomLevel(); QImage *image = new QImage(x1 - x0 + m_scaleWidth, height(), QImage::Format_RGB32); int formerScaleWidth = m_scaleWidth; if (m_manager && m_manager->shouldShowVerticalScale()) { for (LayerList::iterator vi = m_layers.end(); vi != m_layers.begin(); ) { --vi; QPainter paint(image); m_scaleWidth = (*vi)->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); break; } } else { m_scaleWidth = 0; } if (m_scaleWidth != formerScaleWidth) { delete image; image = new QImage(x1 - x0 + m_scaleWidth, height(), QImage::Format_RGB32); } QPainter *paint = new QPainter(image); if (!render(*paint, 0, f0, f1)) { delete paint; delete image; return 0; } else { delete paint; return image; } } QSize Pane::getImageSize(size_t f0, size_t f1) { QSize s = View::getImageSize(f0, f1); QImage *image = new QImage(100, 100, QImage::Format_RGB32); QPainter paint(image); int sw = 0; if (m_manager && m_manager->shouldShowVerticalScale()) { for (LayerList::iterator vi = m_layers.end(); vi != m_layers.begin(); ) { --vi; sw = (*vi)->getVerticalScaleWidth (this, m_manager->shouldShowVerticalColourScale(), paint); break; } } return QSize(sw + s.width(), s.height()); } size_t Pane::getFirstVisibleFrame() const { long f0 = getFrameForX(m_scaleWidth); size_t f = View::getFirstVisibleFrame(); if (f0 < 0 || f0 < long(f)) return f; return f0; } Selection Pane::getSelectionAt(int x, bool &closeToLeftEdge, bool &closeToRightEdge) const { closeToLeftEdge = closeToRightEdge = false; if (!m_manager) return Selection(); long testFrame = getFrameForX(x - 5); if (testFrame < 0) { testFrame = getFrameForX(x); if (testFrame < 0) return Selection(); } Selection selection = m_manager->getContainingSelection(testFrame, true); if (selection.isEmpty()) return selection; int lx = getXForFrame(selection.getStartFrame()); int rx = getXForFrame(selection.getEndFrame()); int fuzz = 2; if (x < lx - fuzz || x > rx + fuzz) return Selection(); int width = rx - lx; fuzz = 3; if (width < 12) fuzz = width / 4; if (fuzz < 1) fuzz = 1; if (x < lx + fuzz) closeToLeftEdge = true; if (x > rx - fuzz) closeToRightEdge = true; return selection; } bool Pane::canTopLayerMoveVertical() { float vmin, vmax, dmin, dmax; if (!getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) return false; if (dmin <= vmin && dmax >= vmax) return false; return true; } bool Pane::getTopLayerDisplayExtents(float &vmin, float &vmax, float &dmin, float &dmax, QString *unit) { Layer *layer = getTopLayer(); if (!layer) return false; bool vlog; QString vunit; bool rv = (layer->getValueExtents(vmin, vmax, vlog, vunit) && layer->getDisplayExtents(dmin, dmax)); if (unit) *unit = vunit; return rv; } bool Pane::setTopLayerDisplayExtents(float dmin, float dmax) { Layer *layer = getTopLayer(); if (!layer) return false; return layer->setDisplayExtents(dmin, dmax); } void Pane::registerShortcuts(KeyReference &kr) { kr.setCategory(tr("Zoom")); kr.registerAlternativeShortcut(tr("Zoom In"), tr("Wheel Up")); kr.registerAlternativeShortcut(tr("Zoom Out"), tr("Wheel Down")); kr.setCategory(tr("General Pane Mouse Actions")); kr.registerShortcut(tr("Zoom"), tr("Wheel"), tr("Zoom in or out in time axis")); kr.registerShortcut(tr("Scroll"), tr("Ctrl+Wheel"), tr("Scroll rapidly left or right in time axis")); kr.registerShortcut(tr("Zoom Vertically"), tr("Shift+Wheel"), tr("Zoom in or out in the vertical axis")); kr.registerShortcut(tr("Scroll Vertically"), tr("Alt+Wheel"), tr("Scroll up or down in the vertical axis")); kr.registerShortcut(tr("Navigate"), tr("Middle"), tr("Click middle button and drag to navigate with any tool")); kr.registerShortcut(tr("Relocate"), tr("Double-Click Middle"), tr("Double-click middle button to relocate with any tool")); kr.registerShortcut(tr("Menu"), tr("Right"), tr("Show pane context menu")); kr.setCategory(tr("Navigate Tool Mouse Actions")); kr.registerShortcut(tr("Navigate"), tr("Left"), tr("Click left button and drag to move around")); kr.registerShortcut(tr("Zoom to Area"), tr("Shift+Left"), tr("Shift-click left button and drag to zoom to a rectangular area")); kr.registerShortcut(tr("Relocate"), tr("Double-Click Left"), tr("Double-click left button to jump to clicked location")); kr.registerShortcut(tr("Edit"), tr("Double-Click Left"), tr("Double-click left button on an item to edit it")); kr.setCategory(tr("Select Tool Mouse Actions")); kr.registerShortcut(tr("Select"), tr("Left"), tr("Click left button and drag to select region; drag region edge to resize")); kr.registerShortcut(tr("Multi Select"), tr("Ctrl+Left"), #ifdef Q_OS_MAC tr("Cmd-click left button and drag to select an additional region")); #else tr("Ctrl-click left button and drag to select an additional region")); #endif kr.registerShortcut(tr("Fine Select"), tr("Shift+Left"), tr("Shift-click left button and drag to select without snapping to items or grid")); kr.setCategory(tr("Edit Tool Mouse Actions")); kr.registerShortcut(tr("Move"), tr("Left"), tr("Click left button on an item or selected region and drag to move")); kr.registerShortcut(tr("Edit"), tr("Double-Click Left"), tr("Double-click left button on an item to edit it")); kr.setCategory(tr("Draw Tool Mouse Actions")); kr.registerShortcut(tr("Draw"), tr("Left"), tr("Click left button and drag to create new item")); kr.setCategory(tr("Measure Tool Mouse Actions")); kr.registerShortcut(tr("Measure Area"), tr("Left"), tr("Click left button and drag to measure a rectangular area")); kr.registerShortcut(tr("Measure Item"), tr("Double-Click Left"), tr("Click left button and drag to measure extents of an item or shape")); kr.registerShortcut(tr("Zoom to Area"), tr("Shift+Left"), tr("Shift-click left button and drag to zoom to a rectangular area")); } void Pane::mousePressEvent(QMouseEvent *e) { if (e->buttons() & Qt::RightButton) { emit contextHelpChanged(""); emit rightButtonMenuRequested(mapToGlobal(e->pos())); return; } // cerr << "mousePressEvent" << endl; m_clickPos = e->pos(); m_mousePos = m_clickPos; m_clickedInRange = true; m_editingSelection = Selection(); m_editingSelectionEdge = 0; m_shiftPressed = (e->modifiers() & Qt::ShiftModifier); m_ctrlPressed = (e->modifiers() & Qt::ControlModifier); m_altPressed = (e->modifiers() & Qt::AltModifier); m_dragMode = UnresolvedDrag; ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolMode(); m_navigating = false; m_resizing = false; m_editing = false; m_releasing = false; if (mode == ViewManager::NavigateMode || (e->buttons() & Qt::MidButton) || (mode == ViewManager::MeasureMode && (e->buttons() & Qt::LeftButton) && m_shiftPressed)) { if (mode != ViewManager::NavigateMode) { setCursor(Qt::PointingHandCursor); } m_navigating = true; m_dragCentreFrame = m_centreFrame; m_dragStartMinValue = 0; float vmin, vmax, dmin, dmax; if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) { m_dragStartMinValue = dmin; } } else if (mode == ViewManager::SelectMode) { if (!hasTopLayerTimeXAxis()) return; bool closeToLeft = false, closeToRight = false; Selection selection = getSelectionAt(e->x(), closeToLeft, closeToRight); if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) { m_manager->removeSelection(selection); if (closeToLeft) { m_selectionStartFrame = selection.getEndFrame(); } else { m_selectionStartFrame = selection.getStartFrame(); } m_manager->setInProgressSelection(selection, false); m_resizing = true; } else { int mouseFrame = getFrameForX(e->x()); size_t resolution = 1; int snapFrame = mouseFrame; Layer *layer = getSelectedLayer(); if (layer && !m_shiftPressed) { layer->snapToFeatureFrame(this, snapFrame, resolution, Layer::SnapLeft); } if (snapFrame < 0) snapFrame = 0; m_selectionStartFrame = snapFrame; if (m_manager) { m_manager->setInProgressSelection (Selection(alignToReference(snapFrame), alignToReference(snapFrame + resolution)), !m_ctrlPressed); } m_resizing = false; } update(); } else if (mode == ViewManager::DrawMode) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { layer->drawStart(this, e); } } else if (mode == ViewManager::EraseMode) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { layer->eraseStart(this, e); } } else if (mode == ViewManager::EditMode) { // Do nothing here -- we'll do it in mouseMoveEvent when the // drag threshold has been passed } else if (mode == ViewManager::MeasureMode) { Layer *layer = getTopLayer(); if (layer) layer->measureStart(this, e); update(); } emit paneInteractedWith(); } void Pane::mouseReleaseEvent(QMouseEvent *e) { if (e->buttons() & Qt::RightButton) { return; } // cerr << "mouseReleaseEvent" << endl; ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolMode(); m_releasing = true; if (m_clickedInRange) { mouseMoveEvent(e); } if (m_navigating || mode == ViewManager::NavigateMode) { m_navigating = false; if (mode != ViewManager::NavigateMode) { // restore cursor toolModeChanged(); } if (m_shiftPressed) { int x0 = std::min(m_clickPos.x(), m_mousePos.x()); int x1 = std::max(m_clickPos.x(), m_mousePos.x()); int y0 = std::min(m_clickPos.y(), m_mousePos.y()); int y1 = std::max(m_clickPos.y(), m_mousePos.y()); zoomToRegion(x0, y0, x1, y1); } } else if (mode == ViewManager::SelectMode) { if (!hasTopLayerTimeXAxis()) { m_releasing = false; return; } if (m_manager && m_manager->haveInProgressSelection()) { bool exclusive; Selection selection = m_manager->getInProgressSelection(exclusive); if (selection.getEndFrame() < selection.getStartFrame() + 2) { selection = Selection(); } m_manager->clearInProgressSelection(); if (exclusive) { m_manager->setSelection(selection); } else { m_manager->addSelection(selection); } } update(); } else if (mode == ViewManager::DrawMode) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { layer->drawEnd(this, e); update(); } } else if (mode == ViewManager::EraseMode) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { layer->eraseEnd(this, e); update(); } } else if (mode == ViewManager::EditMode) { if (m_editing) { if (!editSelectionEnd(e)) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { layer->editEnd(this, e); update(); } } } } else if (mode == ViewManager::MeasureMode) { Layer *layer = getTopLayer(); if (layer) layer->measureEnd(this, e); if (m_measureCursor1) setCursor(*m_measureCursor1); update(); } m_clickedInRange = false; m_releasing = false; emit paneInteractedWith(); } void Pane::mouseMoveEvent(QMouseEvent *e) { if (e->buttons() & Qt::RightButton) { return; } // cerr << "mouseMoveEvent" << endl; QPoint pos = e->pos(); updateContextHelp(&pos); if (m_navigating && m_clickedInRange && !m_releasing) { // if no buttons pressed, and not called from // mouseReleaseEvent, we want to reset clicked-ness (to avoid // annoying continual drags when we moved the mouse outside // the window after pressing button first time). if (!(e->buttons() & Qt::LeftButton) && !(e->buttons() & Qt::MidButton)) { m_clickedInRange = false; return; } } ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolMode(); QPoint prevPoint = m_identifyPoint; m_identifyPoint = e->pos(); if (!m_clickedInRange) { if (mode == ViewManager::SelectMode && hasTopLayerTimeXAxis()) { bool closeToLeft = false, closeToRight = false; getSelectionAt(e->x(), closeToLeft, closeToRight); if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) { setCursor(Qt::SizeHorCursor); } else { setCursor(Qt::ArrowCursor); } } if (!m_manager->isPlaying()) { bool updating = false; if (getSelectedLayer() && m_manager->shouldIlluminateLocalFeatures()) { bool previouslyIdentifying = m_identifyFeatures; m_identifyFeatures = true; if (m_identifyFeatures != previouslyIdentifying || m_identifyPoint != prevPoint) { update(); updating = true; } } if (!updating && mode == ViewManager::MeasureMode && m_manager && !m_manager->isPlaying()) { Layer *layer = getTopLayer(); if (layer && layer->nearestMeasurementRectChanged (this, prevPoint, m_identifyPoint)) { update(); } } } return; } if (m_navigating || mode == ViewManager::NavigateMode) { if (m_shiftPressed) { m_mousePos = e->pos(); update(); } else { dragTopLayer(e); } } else if (mode == ViewManager::SelectMode) { if (!hasTopLayerTimeXAxis()) return; dragExtendSelection(e); } else if (mode == ViewManager::DrawMode) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { layer->drawDrag(this, e); } } else if (mode == ViewManager::EraseMode) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { layer->eraseDrag(this, e); } } else if (mode == ViewManager::EditMode) { bool resist = true; if ((e->modifiers() & Qt::ShiftModifier)) { m_shiftPressed = true; // ... but don't set it false if shift has been // released -- we want the state when we started // dragging to be used most of the time } if (m_shiftPressed) resist = false; m_dragMode = updateDragMode (m_dragMode, m_clickPos, e->pos(), true, // can move horiz true, // can move vert resist, // resist horiz resist); // resist vert if (!m_editing) { if (m_dragMode != UnresolvedDrag) { m_editing = true; QMouseEvent clickEvent(QEvent::MouseButtonPress, m_clickPos, Qt::NoButton, e->buttons(), e->modifiers()); if (!editSelectionStart(&clickEvent)) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { layer->editStart(this, &clickEvent); } } } } else { if (!editSelectionDrag(e)) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { int x = e->x(); int y = e->y(); if (m_dragMode == VerticalDrag) x = m_clickPos.x(); else if (m_dragMode == HorizontalDrag) y = m_clickPos.y(); QMouseEvent moveEvent(QEvent::MouseMove, QPoint(x, y), Qt::NoButton, e->buttons(), e->modifiers()); layer->editDrag(this, &moveEvent); } } } } else if (mode == ViewManager::MeasureMode) { if (m_measureCursor2) setCursor(*m_measureCursor2); Layer *layer = getTopLayer(); if (layer) { layer->measureDrag(this, e); if (layer->hasTimeXAxis()) edgeScrollMaybe(e->x()); } update(); } } void Pane::zoomToRegion(int x0, int y0, int x1, int y1) { int w = x1 - x0; long newStartFrame = getFrameForX(x0); long visibleFrames = getEndFrame() - getStartFrame(); if (newStartFrame <= -visibleFrames) { newStartFrame = -visibleFrames + 1; } if (newStartFrame >= long(getModelsEndFrame())) { newStartFrame = getModelsEndFrame() - 1; } float ratio = float(w) / float(width()); // cerr << "ratio: " << ratio << endl; size_t newZoomLevel = (size_t)nearbyint(m_zoomLevel * ratio); if (newZoomLevel < 1) newZoomLevel = 1; // cerr << "start: " << m_startFrame << ", level " << m_zoomLevel << endl; setZoomLevel(getZoomConstraintBlockSize(newZoomLevel)); setStartFrame(newStartFrame); QString unit; float min, max; bool log; Layer *layer = 0; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->getValueExtents(min, max, log, unit) && (*i)->getDisplayExtents(min, max)) { layer = *i; break; } } if (layer) { if (log) { min = (min < 0.0) ? -log10f(-min) : (min == 0.0) ? 0.0 : log10f(min); max = (max < 0.0) ? -log10f(-max) : (max == 0.0) ? 0.0 : log10f(max); } float rmin = min + ((max - min) * (height() - y1)) / height(); float rmax = min + ((max - min) * (height() - y0)) / height(); cerr << "min: " << min << ", max: " << max << ", y0: " << y0 << ", y1: " << y1 << ", h: " << height() << ", rmin: " << rmin << ", rmax: " << rmax << endl; if (log) { rmin = powf(10, rmin); rmax = powf(10, rmax); } cerr << "finally: rmin: " << rmin << ", rmax: " << rmax << " " << unit << endl; layer->setDisplayExtents(rmin, rmax); updateVerticalPanner(); } } void Pane::dragTopLayer(QMouseEvent *e) { // We need to avoid making it too easy to drag both // horizontally and vertically, in the case where the // mouse is moved "mostly" in horizontal or vertical axis // with only a small variation in the other axis. This is // particularly important during playback (when we want to // avoid small horizontal motions) or in slow refresh // layers like spectrogram (when we want to avoid small // vertical motions). // // To this end we have horizontal and vertical thresholds // and a series of states: unresolved, horizontally or // vertically constrained, free. // // When the mouse first moves, we're unresolved: we // restrict ourselves to whichever direction seems safest, // until the mouse has passed a small threshold distance // from the click point. Then we lock in to one of the // constrained modes, based on which axis that distance // was measured in first. Finally, if it turns out we've // also moved more than a certain larger distance in the // other direction as well, we may switch into free mode. // // If the top layer is incapable of being dragged // vertically, the logic is short circuited. m_dragMode = updateDragMode (m_dragMode, m_clickPos, e->pos(), true, // can move horiz canTopLayerMoveVertical(), // can move vert canTopLayerMoveVertical() || (m_manager && m_manager->isPlaying()), // resist horiz !(m_manager && m_manager->isPlaying())); // resist vert if (m_dragMode == HorizontalDrag || m_dragMode == FreeDrag) { long frameOff = getFrameForX(e->x()) - getFrameForX(m_clickPos.x()); size_t newCentreFrame = m_dragCentreFrame; if (frameOff < 0) { newCentreFrame -= frameOff; } else if (newCentreFrame >= size_t(frameOff)) { newCentreFrame -= frameOff; } else { newCentreFrame = 0; } #ifdef DEBUG_PANE SVDEBUG << "Pane::dragTopLayer: newCentreFrame = " << newCentreFrame << ", models end frame = " << getModelsEndFrame() << endl; #endif if (newCentreFrame >= getModelsEndFrame()) { newCentreFrame = getModelsEndFrame(); if (newCentreFrame > 0) --newCentreFrame; } if (getXForFrame(m_centreFrame) != getXForFrame(newCentreFrame)) { setCentreFrame(newCentreFrame, !m_altPressed); } } if (m_dragMode == VerticalDrag || m_dragMode == FreeDrag) { float vmin = 0.f, vmax = 0.f; float dmin = 0.f, dmax = 0.f; if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) { // cerr << "ydiff = " << ydiff << endl; int ydiff = e->y() - m_clickPos.y(); float perpix = (dmax - dmin) / height(); float valdiff = ydiff * perpix; // cerr << "valdiff = " << valdiff << endl; if (m_dragMode == UnresolvedDrag && ydiff != 0) { m_dragMode = VerticalDrag; } float newmin = m_dragStartMinValue + valdiff; float newmax = m_dragStartMinValue + (dmax - dmin) + valdiff; if (newmin < vmin) { newmax += vmin - newmin; newmin += vmin - newmin; } if (newmax > vmax) { newmin -= newmax - vmax; newmax -= newmax - vmax; } // cerr << "(" << dmin << ", " << dmax << ") -> (" // << newmin << ", " << newmax << ") (drag start " << m_dragStartMinValue << ")" << endl; setTopLayerDisplayExtents(newmin, newmax); updateVerticalPanner(); } } } Pane::DragMode Pane::updateDragMode(DragMode dragMode, QPoint origin, QPoint point, bool canMoveHorizontal, bool canMoveVertical, bool resistHorizontal, bool resistVertical) { int xdiff = point.x() - origin.x(); int ydiff = point.y() - origin.y(); int smallThreshold = 10, bigThreshold = 80; // SVDEBUG << "Pane::updateDragMode: xdiff = " << xdiff << ", ydiff = " // << ydiff << ", canMoveVertical = " << canMoveVertical << ", drag mode = " << m_dragMode << endl; if (dragMode == UnresolvedDrag) { if (abs(ydiff) > smallThreshold && abs(ydiff) > abs(xdiff) * 2 && canMoveVertical) { // SVDEBUG << "Pane::updateDragMode: passed vertical threshold" << endl; dragMode = VerticalDrag; } else if (abs(xdiff) > smallThreshold && abs(xdiff) > abs(ydiff) * 2 && canMoveHorizontal) { // SVDEBUG << "Pane::updateDragMode: passed horizontal threshold" << endl; dragMode = HorizontalDrag; } else if (abs(xdiff) > smallThreshold && abs(ydiff) > smallThreshold && canMoveVertical && canMoveHorizontal) { // SVDEBUG << "Pane::updateDragMode: passed both thresholds" << endl; dragMode = FreeDrag; } } if (dragMode == VerticalDrag && canMoveHorizontal) { if (abs(xdiff) > bigThreshold) dragMode = FreeDrag; } if (dragMode == HorizontalDrag && canMoveVertical) { if (abs(ydiff) > bigThreshold) dragMode = FreeDrag; } if (dragMode == UnresolvedDrag) { if (!resistHorizontal && xdiff != 0) { dragMode = HorizontalDrag; } if (!resistVertical && ydiff != 0) { if (dragMode == HorizontalDrag) dragMode = FreeDrag; else dragMode = VerticalDrag; } } return dragMode; } void Pane::dragExtendSelection(QMouseEvent *e) { int mouseFrame = getFrameForX(e->x()); size_t resolution = 1; int snapFrameLeft = mouseFrame; int snapFrameRight = mouseFrame; Layer *layer = getSelectedLayer(); if (layer && !m_shiftPressed) { layer->snapToFeatureFrame(this, snapFrameLeft, resolution, Layer::SnapLeft); layer->snapToFeatureFrame(this, snapFrameRight, resolution, Layer::SnapRight); } // cerr << "snap: frame = " << mouseFrame << ", start frame = " << m_selectionStartFrame << ", left = " << snapFrameLeft << ", right = " << snapFrameRight << endl; if (snapFrameLeft < 0) snapFrameLeft = 0; if (snapFrameRight < 0) snapFrameRight = 0; size_t min, max; if (m_selectionStartFrame > size_t(snapFrameLeft)) { min = snapFrameLeft; max = m_selectionStartFrame; } else if (size_t(snapFrameRight) > m_selectionStartFrame) { min = m_selectionStartFrame; max = snapFrameRight; } else { min = snapFrameLeft; max = snapFrameRight; } if (m_manager) { m_manager->setInProgressSelection(Selection(alignToReference(min), alignToReference(max)), !m_resizing && !m_ctrlPressed); } edgeScrollMaybe(e->x()); update(); } void Pane::edgeScrollMaybe(int x) { int mouseFrame = getFrameForX(x); bool doScroll = false; if (!m_manager) doScroll = true; if (!m_manager->isPlaying()) doScroll = true; if (m_followPlay != PlaybackScrollContinuous) doScroll = true; if (doScroll) { int offset = mouseFrame - getStartFrame(); int available = getEndFrame() - getStartFrame(); int move = 0; if (offset >= available * 0.95) { move = int(offset - available * 0.95) + 1; } else if (offset <= available * 0.10) { move = int(available * 0.10 - offset) + 1; move = -move; } if (move != 0) { setCentreFrame(m_centreFrame + move); update(); } } } void Pane::mouseDoubleClickEvent(QMouseEvent *e) { if (e->buttons() & Qt::RightButton) { return; } // cerr << "mouseDoubleClickEvent" << endl; m_clickPos = e->pos(); m_clickedInRange = true; m_shiftPressed = (e->modifiers() & Qt::ShiftModifier); m_ctrlPressed = (e->modifiers() & Qt::ControlModifier); m_altPressed = (e->modifiers() & Qt::AltModifier); ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolMode(); bool relocate = (mode == ViewManager::NavigateMode || (e->buttons() & Qt::MidButton)); if (mode == ViewManager::NavigateMode || mode == ViewManager::EditMode) { Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { if (layer->editOpen(this, e)) relocate = false; } } else if (mode == ViewManager::MeasureMode) { Layer *layer = getTopLayer(); if (layer) layer->measureDoubleClick(this, e); update(); } if (relocate) { long f = getFrameForX(e->x()); setCentreFrame(f); m_dragCentreFrame = f; m_dragStartMinValue = 0; m_dragMode = UnresolvedDrag; float vmin, vmax, dmin, dmax; if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) { m_dragStartMinValue = dmin; } } m_clickedInRange = false; // in case mouseReleaseEvent is not properly called } void Pane::enterEvent(QEvent *) { m_mouseInWidget = true; } void Pane::leaveEvent(QEvent *) { m_mouseInWidget = false; bool previouslyIdentifying = m_identifyFeatures; m_identifyFeatures = false; if (previouslyIdentifying) update(); emit contextHelpChanged(""); } void Pane::resizeEvent(QResizeEvent *) { updateHeadsUpDisplay(); } void Pane::wheelEvent(QWheelEvent *e) { //cerr << "wheelEvent, delta " << e->delta() << endl; int count = e->delta(); if (count > 0) { if (count >= 120) count /= 120; else count = 1; } if (count < 0) { if (count <= -120) count /= 120; else count = -1; } if (e->modifiers() & Qt::ControlModifier) { // Scroll left or right, rapidly if (getStartFrame() < 0 && getEndFrame() >= getModelsEndFrame()) return; long delta = ((width() / 2) * count * m_zoomLevel); if (int(m_centreFrame) < delta) { setCentreFrame(0); } else if (int(m_centreFrame) - delta >= int(getModelsEndFrame())) { setCentreFrame(getModelsEndFrame()); } else { setCentreFrame(m_centreFrame - delta); } } else if (e->modifiers() & Qt::ShiftModifier) { // Zoom vertically if (m_vpan) { m_vpan->scroll(e->delta() > 0); } } else if (e->modifiers() & Qt::AltModifier) { // Zoom vertically if (m_vthumb) { m_vthumb->scroll(e->delta() > 0); } } else { // Zoom in or out int newZoomLevel = m_zoomLevel; while (count > 0) { if (newZoomLevel <= 2) { newZoomLevel = 1; break; } newZoomLevel = getZoomConstraintBlockSize(newZoomLevel - 1, ZoomConstraint::RoundDown); --count; } while (count < 0) { newZoomLevel = getZoomConstraintBlockSize(newZoomLevel + 1, ZoomConstraint::RoundUp); ++count; } if (newZoomLevel != m_zoomLevel) { setZoomLevel(newZoomLevel); } } emit paneInteractedWith(); } void Pane::horizontalThumbwheelMoved(int value) { //!!! dupe with updateHeadsUpDisplay int count = 0; int level = 1; //!!! pull out into function (presumably in View) bool haveConstraint = false; for (LayerList::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->getZoomConstraint() && !(*i)->supportsOtherZoomLevels()) { haveConstraint = true; break; } } if (haveConstraint) { while (true) { if (m_hthumb->getMaximumValue() - value == count) break; int newLevel = getZoomConstraintBlockSize(level + 1, ZoomConstraint::RoundUp); if (newLevel == level) break; level = newLevel; if (++count == 50) break; } } else { while (true) { if (m_hthumb->getMaximumValue() - value == count) break; int step = level / 10; int pwr = 0; while (step > 0) { ++pwr; step /= 2; } step = 1; while (pwr > 0) { step *= 2; --pwr; } // cerr << level << endl; level += step; if (++count == 100 || level > 262144) break; } } // cerr << "new level is " << level << endl; setZoomLevel(level); } void Pane::verticalThumbwheelMoved(int value) { Layer *layer = 0; if (getLayerCount() > 0) layer = getLayer(getLayerCount() - 1); if (layer) { int defaultStep = 0; int max = layer->getVerticalZoomSteps(defaultStep); if (max == 0) { updateHeadsUpDisplay(); return; } if (value > max) { value = max; } layer->setVerticalZoomStep(value); updateVerticalPanner(); } } void Pane::verticalPannerMoved(float x0, float y0, float w, float h) { float vmin, vmax, dmin, dmax; if (!getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) return; float y1 = y0 + h; float newmax = vmin + ((1.0 - y0) * (vmax - vmin)); float newmin = vmin + ((1.0 - y1) * (vmax - vmin)); // cerr << "verticalPannerMoved: (" << x0 << "," << y0 << "," << w // << "," << h << ") -> (" << newmin << "," << newmax << ")" << endl; setTopLayerDisplayExtents(newmin, newmax); } void Pane::editVerticalPannerExtents() { if (!m_vpan || !m_manager || !m_manager->getZoomWheelsEnabled()) return; float vmin, vmax, dmin, dmax; QString unit; if (!getTopLayerDisplayExtents(vmin, vmax, dmin, dmax, &unit) || vmax == vmin) { return; } RangeInputDialog dialog(tr("Enter new range"), tr("New vertical display range, from %1 to %2 %4:") .arg(vmin).arg(vmax).arg(unit), unit, vmin, vmax, this); dialog.setRange(dmin, dmax); if (dialog.exec() == QDialog::Accepted) { dialog.getRange(dmin, dmax); setTopLayerDisplayExtents(dmin, dmax); updateVerticalPanner(); } } void Pane::layerParametersChanged() { View::layerParametersChanged(); updateHeadsUpDisplay(); } void Pane::dragEnterEvent(QDragEnterEvent *e) { QStringList formats(e->mimeData()->formats()); cerr << "dragEnterEvent: format: " << formats.join(",") << ", possibleActions: " << e->possibleActions() << ", proposedAction: " << e->proposedAction() << endl; if (e->mimeData()->hasFormat("text/uri-list") || e->mimeData()->hasFormat("text/plain")) { if (e->proposedAction() & Qt::CopyAction) { e->acceptProposedAction(); } else { e->setDropAction(Qt::CopyAction); e->accept(); } } } void Pane::dropEvent(QDropEvent *e) { cerr << "dropEvent: text: \"" << e->mimeData()->text() << "\"" << endl; if (e->mimeData()->hasFormat("text/uri-list") || e->mimeData()->hasFormat("text/plain")) { if (e->proposedAction() & Qt::CopyAction) { e->acceptProposedAction(); } else { e->setDropAction(Qt::CopyAction); e->accept(); } if (e->mimeData()->hasFormat("text/uri-list")) { SVDEBUG << "accepting... data is \"" << e->mimeData()->data("text/uri-list").data() << "\"" << endl; emit dropAccepted(QString::fromLocal8Bit (e->mimeData()->data("text/uri-list").data()) .split(QRegExp("[\\r\\n]+"), QString::SkipEmptyParts)); } else { emit dropAccepted(QString::fromLocal8Bit (e->mimeData()->data("text/plain").data())); } } } bool Pane::editSelectionStart(QMouseEvent *e) { if (!m_identifyFeatures || !m_manager || m_manager->getToolMode() != ViewManager::EditMode) { return false; } bool closeToLeft, closeToRight; Selection s(getSelectionAt(e->x(), closeToLeft, closeToRight)); if (s.isEmpty()) return false; m_editingSelection = s; m_editingSelectionEdge = (closeToLeft ? -1 : closeToRight ? 1 : 0); m_mousePos = e->pos(); return true; } bool Pane::editSelectionDrag(QMouseEvent *e) { if (m_editingSelection.isEmpty()) return false; m_mousePos = e->pos(); update(); return true; } bool Pane::editSelectionEnd(QMouseEvent *) { if (m_editingSelection.isEmpty()) return false; int offset = m_mousePos.x() - m_clickPos.x(); Layer *layer = getSelectedLayer(); if (offset == 0 || !layer) { m_editingSelection = Selection(); return true; } int p0 = getXForFrame(m_editingSelection.getStartFrame()) + offset; int p1 = getXForFrame(m_editingSelection.getEndFrame()) + offset; long f0 = getFrameForX(p0); long f1 = getFrameForX(p1); Selection newSelection(f0, f1); if (m_editingSelectionEdge == 0) { CommandHistory::getInstance()->startCompoundOperation (tr("Drag Selection"), true); layer->moveSelection(m_editingSelection, f0); } else { CommandHistory::getInstance()->startCompoundOperation (tr("Resize Selection"), true); if (m_editingSelectionEdge < 0) { f1 = m_editingSelection.getEndFrame(); } else { f0 = m_editingSelection.getStartFrame(); } newSelection = Selection(f0, f1); layer->resizeSelection(m_editingSelection, newSelection); } m_manager->removeSelection(m_editingSelection); m_manager->addSelection(newSelection); CommandHistory::getInstance()->endCompoundOperation(); m_editingSelection = Selection(); return true; } void Pane::toolModeChanged() { ViewManager::ToolMode mode = m_manager->getToolMode(); // SVDEBUG << "Pane::toolModeChanged(" << mode << ")" << endl; if (mode == ViewManager::MeasureMode && !m_measureCursor1) { m_measureCursor1 = new QCursor(QBitmap(":/icons/measure1cursor.xbm"), QBitmap(":/icons/measure1mask.xbm"), 15, 14); m_measureCursor2 = new QCursor(QBitmap(":/icons/measure2cursor.xbm"), QBitmap(":/icons/measure2mask.xbm"), 16, 17); } switch (mode) { case ViewManager::NavigateMode: setCursor(Qt::PointingHandCursor); break; case ViewManager::SelectMode: setCursor(Qt::ArrowCursor); break; case ViewManager::EditMode: setCursor(Qt::UpArrowCursor); break; case ViewManager::DrawMode: setCursor(Qt::CrossCursor); break; case ViewManager::EraseMode: setCursor(Qt::CrossCursor); break; case ViewManager::MeasureMode: if (m_measureCursor1) setCursor(*m_measureCursor1); break; /* case ViewManager::TextMode: setCursor(Qt::IBeamCursor); break; */ } } void Pane::zoomWheelsEnabledChanged() { updateHeadsUpDisplay(); update(); } void Pane::viewZoomLevelChanged(View *v, unsigned long z, bool locked) { // cerr << "Pane[" << this << "]::zoomLevelChanged (global now " // << (m_manager ? m_manager->getGlobalZoom() : 0) << ")" << endl; View::viewZoomLevelChanged(v, z, locked); if (m_hthumb && !m_hthumb->isVisible()) return; if (v != this) { if (!locked || !m_followZoom) return; } if (m_manager && m_manager->getZoomWheelsEnabled()) { updateHeadsUpDisplay(); } } void Pane::propertyContainerSelected(View *v, PropertyContainer *pc) { Layer *layer = 0; if (getLayerCount() > 0) { layer = getLayer(getLayerCount() - 1); disconnect(layer, SIGNAL(verticalZoomChanged()), this, SLOT(verticalZoomChanged())); } View::propertyContainerSelected(v, pc); updateHeadsUpDisplay(); if (m_vthumb) { RangeMapper *rm = 0; if (layer) rm = layer->getNewVerticalZoomRangeMapper(); if (rm) m_vthumb->setRangeMapper(rm); } if (getLayerCount() > 0) { layer = getLayer(getLayerCount() - 1); connect(layer, SIGNAL(verticalZoomChanged()), this, SLOT(verticalZoomChanged())); } } void Pane::verticalZoomChanged() { Layer *layer = 0; if (getLayerCount() > 0) { layer = getLayer(getLayerCount() - 1); if (m_vthumb && m_vthumb->isVisible()) { m_vthumb->setValue(layer->getCurrentVerticalZoomStep()); } } } void Pane::updateContextHelp(const QPoint *pos) { QString help = ""; if (m_clickedInRange) { emit contextHelpChanged(""); return; } ViewManager::ToolMode mode = ViewManager::NavigateMode; if (m_manager) mode = m_manager->getToolMode(); bool editable = false; Layer *layer = getSelectedLayer(); if (layer && layer->isLayerEditable()) { editable = true; } if (mode == ViewManager::NavigateMode) { help = tr("Click and drag to navigate"); } else if (mode == ViewManager::SelectMode) { if (!hasTopLayerTimeXAxis()) return; bool haveSelection = (m_manager && !m_manager->getSelections().empty()); if (haveSelection) { #ifdef Q_OS_MAC if (editable) { help = tr("Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate"); } else { help = tr("Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate"); } #else if (editable) { help = tr("Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate"); } else { help = tr("Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate"); } #endif if (pos) { bool closeToLeft = false, closeToRight = false; Selection selection = getSelectionAt(pos->x(), closeToLeft, closeToRight); if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) { help = tr("Click and drag to move the selection boundary"); } } } else { if (editable) { help = tr("Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate"); } else { help = tr("Click and drag to select a range; middle-click and drag to navigate"); } } } else if (mode == ViewManager::DrawMode) { //!!! could call through to a layer function to find out exact meaning if (editable) { help = tr("Click to add a new item in the active layer"); } } else if (mode == ViewManager::EraseMode) { //!!! could call through to a layer function to find out exact meaning if (editable) { help = tr("Click to erase an item from the active layer"); } } else if (mode == ViewManager::EditMode) { //!!! could call through to layer if (editable) { help = tr("Click and drag an item in the active layer to move it; hold Shift to override initial resistance"); if (pos) { bool closeToLeft = false, closeToRight = false; Selection selection = getSelectionAt(pos->x(), closeToLeft, closeToRight); if (!selection.isEmpty()) { help = tr("Click and drag to move all items in the selected range"); } } } } emit contextHelpChanged(help); } void Pane::mouseEnteredWidget() { QWidget *w = dynamic_cast(sender()); if (!w) return; if (w == m_vpan) { emit contextHelpChanged(tr("Click and drag to adjust the visible range of the vertical scale")); } else if (w == m_vthumb) { emit contextHelpChanged(tr("Click and drag to adjust the vertical zoom level")); } else if (w == m_hthumb) { emit contextHelpChanged(tr("Click and drag to adjust the horizontal zoom level")); } else if (w == m_reset) { emit contextHelpChanged(tr("Reset horizontal and vertical zoom levels to their defaults")); } } void Pane::mouseLeftWidget() { emit contextHelpChanged(""); } void Pane::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { View::toXml (stream, indent, QString("type=\"pane\" centreLineVisible=\"%1\" height=\"%2\" %3") .arg(m_centreLineVisible).arg(height()).arg(extraAttributes)); } sonic-visualiser-2.3~repack1.orig/svgui/view/ViewManager.h0000644000175000017500000002227712252354725022431 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _VIEW_MANAGER_H_ #define _VIEW_MANAGER_H_ #include #include #include #include #include "base/ViewManagerBase.h" #include "base/Selection.h" #include "base/Command.h" #include "base/Clipboard.h" class AudioPlaySource; class Model; enum PlaybackFollowMode { PlaybackScrollContinuous, PlaybackScrollPage, PlaybackIgnore }; class View; /** * The ViewManager manages properties that may need to be synchronised * between separate Views. For example, it handles signals associated * with changes to the global pan and zoom, and it handles selections. * * Views should be implemented in such a way as to work * correctly whether they are supplied with a ViewManager or not. */ class ViewManager : public ViewManagerBase { Q_OBJECT public: ViewManager(); virtual ~ViewManager(); void setAudioPlaySource(AudioPlaySource *source); bool isPlaying() const; unsigned long getGlobalCentreFrame() const; // the set method is a slot unsigned long getGlobalZoom() const; unsigned long getPlaybackFrame() const; // the set method is a slot // Only meaningful in solo mode, and used for optional alignment feature Model *getPlaybackModel() const; void setPlaybackModel(Model *); size_t alignPlaybackFrameToReference(size_t) const; size_t alignReferenceToPlaybackFrame(size_t) const; bool haveInProgressSelection() const; const Selection &getInProgressSelection(bool &exclusive) const; void setInProgressSelection(const Selection &selection, bool exclusive); void clearInProgressSelection(); const MultiSelection &getSelection() const; const MultiSelection::SelectionList &getSelections() const; void setSelection(const Selection &selection); void addSelection(const Selection &selection); void removeSelection(const Selection &selection); void clearSelections(); size_t constrainFrameToSelection(size_t frame) const; /** * Return the selection that contains a given frame. * If defaultToFollowing is true, and if the frame is not in a * selected area, return the next selection after the given frame. * Return the empty selection if no appropriate selection is found. */ Selection getContainingSelection(size_t frame, bool defaultToFollowing) const; Clipboard &getClipboard() { return m_clipboard; } enum ToolMode { NavigateMode, SelectMode, EditMode, DrawMode, EraseMode, MeasureMode }; ToolMode getToolMode() const { return m_toolMode; } void setToolMode(ToolMode mode); bool getPlayLoopMode() const { return m_playLoopMode; } void setPlayLoopMode(bool on); bool getPlaySelectionMode() const { return m_playSelectionMode; } void setPlaySelectionMode(bool on); bool getPlaySoloMode() const { return m_playSoloMode; } void setPlaySoloMode(bool on); bool getAlignMode() const { return m_alignMode; } void setAlignMode(bool on); void setIlluminateLocalFeatures(bool i) { m_illuminateLocalFeatures = i; } void setShowWorkTitle(bool show) { m_showWorkTitle = show; } /** * The sample rate that is used for playback. This is usually the * rate of the main model, but not always. Models whose rates * differ from this will play back at the wrong speed -- there is * no per-model resampler. */ size_t getPlaybackSampleRate() const; /** * The sample rate of the audio output device. If the playback * sample rate differs from this, everything will be resampled at * the output stage. */ size_t getOutputSampleRate() const; /** * The sample rate of the current main model. This may in theory * differ from the playback sample rate, in which case even the * main model will play at the wrong speed. */ size_t getMainModelSampleRate() const { return m_mainModelSampleRate; } void setMainModelSampleRate(size_t sr) { m_mainModelSampleRate = sr; } enum OverlayMode { NoOverlays, MinimalOverlays, AllOverlays }; void setOverlayMode(OverlayMode mode); OverlayMode getOverlayMode() const { return m_overlayMode; } void setShowCentreLine(bool show); bool shouldShowCentreLine() const { return m_showCentreLine; } bool shouldShowDuration() const { return m_overlayMode != NoOverlays; } bool shouldShowFrameCount() const { return m_showCentreLine && shouldShowDuration(); } bool shouldShowVerticalScale() const { return m_overlayMode != NoOverlays; } bool shouldShowVerticalColourScale() const { return m_overlayMode == AllOverlays; } bool shouldShowSelectionExtents() const { return m_overlayMode != NoOverlays; } bool shouldShowLayerNames() const { return m_overlayMode == AllOverlays; } bool shouldShowScaleGuides() const { return m_overlayMode != NoOverlays; } bool shouldShowWorkTitle() const { return m_showWorkTitle; } bool shouldIlluminateLocalFeatures() const { return m_illuminateLocalFeatures; } void setZoomWheelsEnabled(bool enable); bool getZoomWheelsEnabled() const { return m_zoomWheelsEnabled; } void setGlobalDarkBackground(bool dark); bool getGlobalDarkBackground() const; signals: /** Emitted when user causes the global centre frame to change. */ void globalCentreFrameChanged(unsigned long frame); /** Emitted when user scrolls a view, but doesn't affect global centre. */ void viewCentreFrameChanged(View *v, unsigned long frame); /** Emitted when a view zooms. */ void viewZoomLevelChanged(View *v, unsigned long zoom, bool locked); /** Emitted when the playback frame changes. */ void playbackFrameChanged(unsigned long frame); /** Emitted when the output levels change. Values in range 0.0 -> 1.0. */ void outputLevelsChanged(float left, float right); /** Emitted when the selection has changed. */ void selectionChanged(); /** Emitted when the in-progress (rubberbanding) selection has changed. */ void inProgressSelectionChanged(); /** Emitted when the tool mode has been changed. */ void toolModeChanged(); /** Emitted when the play loop mode has been changed. */ void playLoopModeChanged(); void playLoopModeChanged(bool); /** Emitted when the play selection mode has been changed. */ void playSelectionModeChanged(); void playSelectionModeChanged(bool); /** Emitted when the play solo mode has been changed. */ void playSoloModeChanged(); void playSoloModeChanged(bool); /** Emitted when the alignment mode has been changed. */ void alignModeChanged(); void alignModeChanged(bool); /** Emitted when the overlay mode has been changed. */ void overlayModeChanged(); /** Emitted when the centre line visibility has been changed. */ void showCentreLineChanged(); /** Emitted when the zoom wheels have been toggled. */ void zoomWheelsEnabledChanged(); /** Emitted when any loggable activity has occurred. */ void activity(QString); public slots: void viewCentreFrameChanged(unsigned long, bool, PlaybackFollowMode); void viewZoomLevelChanged(unsigned long, bool); void setGlobalCentreFrame(unsigned long); void setPlaybackFrame(unsigned long); void playStatusChanged(bool playing); protected slots: void checkPlayStatus(); void seek(unsigned long); //!!! void considerZoomChange(void *, unsigned long, bool); protected: AudioPlaySource *m_playSource; unsigned long m_globalCentreFrame; unsigned long m_globalZoom; mutable unsigned long m_playbackFrame; Model *m_playbackModel; //!!! size_t m_mainModelSampleRate; float m_lastLeft; float m_lastRight; MultiSelection m_selections; Selection m_inProgressSelection; bool m_inProgressExclusive; Clipboard m_clipboard; ToolMode m_toolMode; bool m_playLoopMode; bool m_playSelectionMode; bool m_playSoloMode; bool m_alignMode; void setSelections(const MultiSelection &ms); void signalSelectionChange(); class SetSelectionCommand : public Command { public: SetSelectionCommand(ViewManager *vm, const MultiSelection &ms); virtual ~SetSelectionCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; protected: ViewManager *m_vm; MultiSelection m_oldSelection; MultiSelection m_newSelection; }; OverlayMode m_overlayMode; bool m_zoomWheelsEnabled; bool m_showCentreLine; bool m_illuminateLocalFeatures; bool m_showWorkTitle; QPalette m_lightPalette; QPalette m_darkPalette; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/view/View.h0000644000175000017500000003434512252354725021135 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _VIEW_H_ #define _VIEW_H_ #include #include #include "base/ZoomConstraint.h" #include "base/PropertyContainer.h" #include "ViewManager.h" #include "base/XmlExportable.h" // #define DEBUG_VIEW_WIDGET_PAINT 1 class Layer; class ViewPropertyContainer; #include #include /** * View is the base class of widgets that display one or more * overlaid views of data against a horizontal time scale. * * A View may have any number of attached Layers, each of which * is expected to have one data Model (although multiple views may * share the same model). * * A View may be panned in time and zoomed, although the * mechanisms for doing so (as well as any other operations and * properties available) depend on the subclass. */ class View : public QFrame, public XmlExportable { Q_OBJECT public: /** * Deleting a View does not delete any of its layers. They should * be managed elsewhere (e.g. by the Document). */ virtual ~View(); /** * Retrieve the first visible sample frame on the widget. * This is a calculated value based on the centre-frame, widget * width and zoom level. The result may be negative. */ long getStartFrame() const; /** * Set the widget pan based on the given first visible frame. The * frame value may be negative. */ void setStartFrame(long); /** * Return the centre frame of the visible widget. This is an * exact value that does not depend on the zoom block size. Other * frame values (start, end) are calculated from this based on the * zoom and other factors. */ size_t getCentreFrame() const { return m_centreFrame; } /** * Set the centre frame of the visible widget. */ void setCentreFrame(size_t f) { setCentreFrame(f, true); } /** * Retrieve the last visible sample frame on the widget. * This is a calculated value based on the centre-frame, widget * width and zoom level. */ size_t getEndFrame() const; /** * Return the pixel x-coordinate corresponding to a given sample * frame (which may be negative). */ int getXForFrame(long frame) const; /** * Return the closest frame to the given pixel x-coordinate. */ long getFrameForX(int x) const; /** * Return the pixel y-coordinate corresponding to a given * frequency, if the frequency range is as specified. This does * not imply any policy about layer frequency ranges, but it might * be useful for layers to match theirs up if desired. * * Not thread-safe in logarithmic mode. Call only from GUI thread. */ float getYForFrequency(float frequency, float minFreq, float maxFreq, bool logarithmic) const; /** * Return the closest frequency to the given pixel y-coordinate, * if the frequency range is as specified. * * Not thread-safe in logarithmic mode. Call only from GUI thread. */ float getFrequencyForY(int y, float minFreq, float maxFreq, bool logarithmic) const; /** * Return the zoom level, i.e. the number of frames per pixel */ int getZoomLevel() const; /** * Set the zoom level, i.e. the number of frames per pixel. The * centre frame will be unchanged; the start and end frames will * change. */ virtual void setZoomLevel(size_t z); /** * Zoom in or out. */ virtual void zoom(bool in); /** * Scroll left or right by a smallish or largish amount. */ virtual void scroll(bool right, bool lots, bool doEmit = true); virtual void addLayer(Layer *v); virtual void removeLayer(Layer *v); // does not delete the layer virtual int getLayerCount() const { return m_layers.size(); } /** * Return a layer, counted in stacking order. That is, layer 0 is * the bottom layer and layer "getLayerCount()-1" is the top one. */ virtual Layer *getLayer(int n) { if (n < int(m_layers.size())) return m_layers[n]; else return 0; } /** * Return the top layer. This is the same as * getLayer(getLayerCount()-1) if there is at least one layer, and * 0 otherwise. */ virtual Layer *getTopLayer() { return m_layers.empty() ? 0 : m_layers[m_layers.size()-1]; } /** * Return the layer last selected by the user. This is normally * the top layer, the same as getLayer(getLayerCount()-1). * However, if the user has selected the pane itself more recently * than any of the layers on it, this function will return 0. It * will also return 0 if there are no layers. */ virtual Layer *getSelectedLayer(); virtual const Layer *getSelectedLayer() const; virtual void setViewManager(ViewManager *m); virtual void setViewManager(ViewManager *m, long initialFrame); virtual ViewManager *getViewManager() const { return m_manager; } virtual void setFollowGlobalPan(bool f); virtual bool getFollowGlobalPan() const { return m_followPan; } virtual void setFollowGlobalZoom(bool f); virtual bool getFollowGlobalZoom() const { return m_followZoom; } virtual bool hasLightBackground() const; virtual QColor getForeground() const; virtual QColor getBackground() const; enum TextStyle { BoxedText, OutlinedText, OutlinedItalicText }; virtual void drawVisibleText(QPainter &p, int x, int y, QString text, TextStyle style) const; virtual void drawMeasurementRect(QPainter &p, const Layer *, QRect rect, bool focus) const; virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const { return false; } virtual bool shouldIlluminateLocalSelection(QPoint &, bool &, bool &) const { return false; } virtual void setPlaybackFollow(PlaybackFollowMode m); virtual PlaybackFollowMode getPlaybackFollow() const { return m_followPlay; } typedef PropertyContainer::PropertyName PropertyName; // We implement the PropertyContainer API, although we don't // actually subclass PropertyContainer. We have our own // PropertyContainer that we can return on request that just // delegates back to us. virtual PropertyContainer::PropertyList getProperties() const; virtual QString getPropertyLabel(const PropertyName &) const; virtual PropertyContainer::PropertyType getPropertyType(const PropertyName &) const; virtual int getPropertyRangeAndValue(const PropertyName &, int *min, int *max, int *deflt) const; virtual QString getPropertyValueLabel(const PropertyName &, int value) const; virtual void setProperty(const PropertyName &, int value); virtual QString getPropertyContainerName() const { return objectName(); } virtual QString getPropertyContainerIconName() const = 0; virtual size_t getPropertyContainerCount() const; virtual const PropertyContainer *getPropertyContainer(size_t i) const; virtual PropertyContainer *getPropertyContainer(size_t i); // Render the contents on a wide canvas virtual QImage *toNewImage(size_t f0, size_t f1); virtual QImage *toNewImage(); virtual QSize getImageSize(size_t f0, size_t f1); virtual QSize getImageSize(); virtual int getTextLabelHeight(const Layer *layer, QPainter &) const; virtual bool getValueExtents(QString unit, float &min, float &max, bool &log) const; virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; // First frame actually in model, to right of scale, if present virtual size_t getFirstVisibleFrame() const; virtual size_t getLastVisibleFrame() const; size_t getModelsStartFrame() const; size_t getModelsEndFrame() const; typedef std::set ModelSet; ModelSet getModels(); //!!! Model *getAligningModel() const; size_t alignFromReference(size_t) const; size_t alignToReference(size_t) const; int getAlignedPlaybackFrame() const; signals: void propertyContainerAdded(PropertyContainer *pc); void propertyContainerRemoved(PropertyContainer *pc); void propertyContainerPropertyChanged(PropertyContainer *pc); void propertyContainerPropertyRangeChanged(PropertyContainer *pc); void propertyContainerNameChanged(PropertyContainer *pc); void propertyContainerSelected(PropertyContainer *pc); void propertyChanged(PropertyContainer::PropertyName); void layerModelChanged(); void centreFrameChanged(unsigned long frame, bool globalScroll, PlaybackFollowMode followMode); void zoomLevelChanged(unsigned long, bool); void contextHelpChanged(const QString &); public slots: virtual void modelChanged(); virtual void modelChanged(size_t startFrame, size_t endFrame); virtual void modelCompletionChanged(); virtual void modelAlignmentCompletionChanged(); virtual void modelReplaced(); virtual void layerParametersChanged(); virtual void layerParameterRangesChanged(); virtual void layerMeasurementRectsChanged(); virtual void layerNameChanged(); virtual void globalCentreFrameChanged(unsigned long); virtual void viewCentreFrameChanged(View *, unsigned long); virtual void viewManagerPlaybackFrameChanged(unsigned long); virtual void viewZoomLevelChanged(View *, unsigned long, bool); virtual void propertyContainerSelected(View *, PropertyContainer *pc); virtual void selectionChanged(); virtual void toolModeChanged(); virtual void overlayModeChanged(); virtual void zoomWheelsEnabledChanged(); virtual void progressCheckStalledTimerElapsed(); protected: View(QWidget *, bool showProgress); virtual void paintEvent(QPaintEvent *e); virtual void drawSelections(QPainter &); virtual bool shouldLabelSelections() const { return true; } virtual bool render(QPainter &paint, int x0, size_t f0, size_t f1); virtual void setPaintFont(QPainter &paint); typedef std::vector LayerList; int getModelsSampleRate() const; bool areLayersScrollable() const; LayerList getScrollableBackLayers(bool testChanged, bool &changed) const; LayerList getNonScrollableFrontLayers(bool testChanged, bool &changed) const; size_t getZoomConstraintBlockSize(size_t blockSize, ZoomConstraint::RoundingDirection dir = ZoomConstraint::RoundNearest) const; // True if the top layer(s) use colours for meaningful things. If // this is the case, selections will be shown using unfilled boxes // rather than with a translucent fill. bool areLayerColoursSignificant() const; // True if the top layer has a time axis on the x coordinate (this // is generally the case except for spectrum/slice layers). It // will not be possible to make or display selections if this is // false. bool hasTopLayerTimeXAxis() const; bool setCentreFrame(size_t f, bool doEmit); void movePlayPointer(unsigned long f); void checkProgress(void *object); int getProgressBarWidth() const; // if visible size_t m_centreFrame; int m_zoomLevel; bool m_followPan; bool m_followZoom; PlaybackFollowMode m_followPlay; size_t m_playPointerFrame; bool m_lightBackground; bool m_showProgress; QPixmap *m_cache; size_t m_cacheCentreFrame; int m_cacheZoomLevel; bool m_selectionCached; bool m_deleting; LayerList m_layers; // I don't own these, but see dtor note above bool m_haveSelectedLayer; QString m_lastError; // caches for use in getScrollableBackLayers, getNonScrollableFrontLayers mutable LayerList m_lastScrollableBackLayers; mutable LayerList m_lastNonScrollableBackLayers; class LayerProgressBar : public QProgressBar { public: LayerProgressBar(QWidget *parent); virtual QString text() const { return m_text; } virtual void setText(QString text) { m_text = text; } protected: QString m_text; }; struct ProgressBarRec { QProgressBar *bar; int lastCheck; QTimer *checkTimer; }; typedef std::map ProgressMap; ProgressMap m_progressBars; // I own the ProgressBars ViewManager *m_manager; // I don't own this ViewPropertyContainer *m_propertyContainer; // I own this }; // Use this for delegation, because we can't subclass from // PropertyContainer (which is a QObject) ourselves because of // ambiguity with QFrame parent class ViewPropertyContainer : public PropertyContainer { Q_OBJECT public: ViewPropertyContainer(View *v); PropertyList getProperties() const { return m_v->getProperties(); } QString getPropertyLabel(const PropertyName &n) const { return m_v->getPropertyLabel(n); } PropertyType getPropertyType(const PropertyName &n) const { return m_v->getPropertyType(n); } int getPropertyRangeAndValue(const PropertyName &n, int *min, int *max, int *deflt) const { return m_v->getPropertyRangeAndValue(n, min, max, deflt); } QString getPropertyValueLabel(const PropertyName &n, int value) const { return m_v->getPropertyValueLabel(n, value); } QString getPropertyContainerName() const { return m_v->getPropertyContainerName(); } QString getPropertyContainerIconName() const { return m_v->getPropertyContainerIconName(); } public slots: virtual void setProperty(const PropertyName &n, int value) { m_v->setProperty(n, value); } protected: View *m_v; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/acinclude.m40000644000175000017500000000777612252354725021301 0ustar miramira AC_DEFUN([SV_MODULE_REQUIRED], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE"],[AC_MSG_ERROR([Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE])]) if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_ERROR([Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE])]) fi fi ]) AC_DEFUN([SV_MODULE_OPTIONAL], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE])]) if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_NOTICE([Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE])]) fi fi fi ]) # Check for Qt. The only part of Qt we use directly is qmake. AC_DEFUN([SV_CHECK_QT], [ AC_REQUIRE([AC_PROG_CXX]) if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, $QTDIR/bin/qmake-qt5,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, $QTDIR/bin/qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake.exe, $QTDIR/bin/qmake.exe,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, qmake-qt5,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, qmake,,$PATH) fi if test x$QMAKE = x ; then AC_MSG_ERROR([ Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. ]) fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) AC_MSG_WARN([ *** The version of qmake found in "$QMAKE" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. ]) esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac ]) sonic-visualiser-2.3~repack1.orig/svgui/Doxyfile0000644000175000017500000014253312252354725020605 0ustar miramira# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = svgui # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.9 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = layer view widgets # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. #USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = Q* *.h # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = HAVE_FFTW3F HAVE_FISHSOUND HAVE_JACK HAVE_LIBLO HAVE_LRDF HAVE_MAD HAVE_OGGZ HAVE_PORTAUDIO HAVE_SAMPLERATE HAVE_SNDFILE HAVE_VAMP # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO sonic-visualiser-2.3~repack1.orig/svgui/bootstrap.sh0000644000175000017500000000004412252354725021436 0ustar miramira#!/bin/sh aclocal -I . && autoconf sonic-visualiser-2.3~repack1.orig/svgui/svgui.pro0000644000175000017500000001331712252354725020753 0ustar miramira TEMPLATE = lib exists(config.pri) { include(config.pri) } win* { !exists(config.pri) { DEFINES += HAVE_BZ2 HAVE_FFTW3 HAVE_FFTW3F HAVE_SNDFILE HAVE_SAMPLERATE HAVE_VAMP HAVE_VAMPHOSTSDK HAVE_RUBBERBAND HAVE_DATAQUAY HAVE_LIBLO HAVE_MAD HAVE_ID3TAG } } CONFIG += staticlib qt thread warn_on stl rtti exceptions QT += network xml gui widgets TARGET = svgui DEPENDPATH += . ../svcore INCLUDEPATH += . ../svcore OBJECTS_DIR = o MOC_DIR = o win32-g++ { INCLUDEPATH += ../sv-dependency-builds/win32-mingw/include } win32-msvc* { INCLUDEPATH += ../sv-dependency-builds/win32-msvc/include } HEADERS += layer/Colour3DPlotLayer.h \ layer/ColourDatabase.h \ layer/ColourMapper.h \ layer/ColourScaleLayer.h \ layer/ImageLayer.h \ layer/ImageRegionFinder.h \ layer/Layer.h \ layer/LayerFactory.h \ layer/LinearNumericalScale.h \ layer/LogNumericalScale.h \ layer/LinearColourScale.h \ layer/LogColourScale.h \ layer/NoteLayer.h \ layer/PaintAssistant.h \ layer/PianoScale.h \ layer/RegionLayer.h \ layer/SingleColourLayer.h \ layer/SliceableLayer.h \ layer/SliceLayer.h \ layer/SpectrogramLayer.h \ layer/SpectrumLayer.h \ layer/TextLayer.h \ layer/TimeInstantLayer.h \ layer/TimeRulerLayer.h \ layer/TimeValueLayer.h \ layer/VerticalScaleLayer.h \ layer/WaveformLayer.h SOURCES += layer/Colour3DPlotLayer.cpp \ layer/ColourDatabase.cpp \ layer/ColourMapper.cpp \ layer/ImageLayer.cpp \ layer/ImageRegionFinder.cpp \ layer/Layer.cpp \ layer/LayerFactory.cpp \ layer/LinearNumericalScale.cpp \ layer/LogNumericalScale.cpp \ layer/LinearColourScale.cpp \ layer/LogColourScale.cpp \ layer/NoteLayer.cpp \ layer/PaintAssistant.cpp \ layer/PianoScale.cpp \ layer/RegionLayer.cpp \ layer/SingleColourLayer.cpp \ layer/SliceLayer.cpp \ layer/SpectrogramLayer.cpp \ layer/SpectrumLayer.cpp \ layer/TextLayer.cpp \ layer/TimeInstantLayer.cpp \ layer/TimeRulerLayer.cpp \ layer/TimeValueLayer.cpp \ layer/WaveformLayer.cpp HEADERS += view/Overview.h \ view/Pane.h \ view/PaneStack.h \ view/View.h \ view/ViewManager.h SOURCES += view/Overview.cpp \ view/Pane.cpp \ view/PaneStack.cpp \ view/View.cpp \ view/ViewManager.cpp HEADERS += widgets/ActivityLog.h \ widgets/AudioDial.h \ widgets/ClickableLabel.h \ widgets/ColourNameDialog.h \ widgets/CommandHistory.h \ widgets/CSVFormatDialog.h \ widgets/Fader.h \ widgets/InteractiveFileFinder.h \ widgets/IconLoader.h \ widgets/ImageDialog.h \ widgets/ItemEditDialog.h \ widgets/KeyReference.h \ widgets/LabelCounterInputDialog.h \ widgets/LayerTree.h \ widgets/LayerTreeDialog.h \ widgets/LEDButton.h \ widgets/ListInputDialog.h \ widgets/MIDIFileImportDialog.h \ widgets/ModelDataTableDialog.h \ widgets/NotifyingCheckBox.h \ widgets/NotifyingComboBox.h \ widgets/NotifyingPushButton.h \ widgets/NotifyingTabBar.h \ widgets/Panner.h \ widgets/PluginParameterBox.h \ widgets/PluginParameterDialog.h \ widgets/ProgressDialog.h \ widgets/PropertyBox.h \ widgets/PropertyStack.h \ widgets/RangeInputDialog.h \ widgets/SelectableLabel.h \ widgets/SubdividingMenu.h \ widgets/TextAbbrev.h \ widgets/Thumbwheel.h \ widgets/TipDialog.h \ widgets/TransformFinder.h \ widgets/WindowShapePreview.h \ widgets/WindowTypeSelector.h SOURCES += widgets/ActivityLog.cpp \ widgets/AudioDial.cpp \ widgets/ColourNameDialog.cpp \ widgets/CommandHistory.cpp \ widgets/CSVFormatDialog.cpp \ widgets/Fader.cpp \ widgets/InteractiveFileFinder.cpp \ widgets/IconLoader.cpp \ widgets/ImageDialog.cpp \ widgets/ItemEditDialog.cpp \ widgets/KeyReference.cpp \ widgets/LabelCounterInputDialog.cpp \ widgets/LayerTree.cpp \ widgets/LayerTreeDialog.cpp \ widgets/LEDButton.cpp \ widgets/ListInputDialog.cpp \ widgets/MIDIFileImportDialog.cpp \ widgets/ModelDataTableDialog.cpp \ widgets/NotifyingCheckBox.cpp \ widgets/NotifyingComboBox.cpp \ widgets/NotifyingPushButton.cpp \ widgets/NotifyingTabBar.cpp \ widgets/Panner.cpp \ widgets/PluginParameterBox.cpp \ widgets/PluginParameterDialog.cpp \ widgets/ProgressDialog.cpp \ widgets/PropertyBox.cpp \ widgets/PropertyStack.cpp \ widgets/RangeInputDialog.cpp \ widgets/SelectableLabel.cpp \ widgets/SubdividingMenu.cpp \ widgets/TextAbbrev.cpp \ widgets/Thumbwheel.cpp \ widgets/TipDialog.cpp \ widgets/TransformFinder.cpp \ widgets/WindowShapePreview.cpp \ widgets/WindowTypeSelector.cpp sonic-visualiser-2.3~repack1.orig/svgui/configure.ac0000644000175000017500000001063012252354725021355 0ustar miramira AC_INIT([SVgui], [2.1], cannam@all-day-breakfast.com) AC_CONFIG_SRCDIR(widgets/Fader.h) # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi AC_LANG_CPLUSPLUS AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_MKDIR_P AC_HEADER_STDC # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" PKG_PROG_PKG_CONFIG SV_CHECK_QT SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_DEBUG="-Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe" CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe" CXXFLAGS_MINIMAL="-g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build]) QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"]) if test x"$USER_CXXFLAGS" != x; then AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".]) AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.) CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen]) SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute]) SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute]) SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open]) SV_MODULE_REQUIRED([samplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new]) SV_MODULE_REQUIRED([vamp],[vamp >= 2.1],[vamp/vamp.h],[],[]) SV_MODULE_REQUIRED([vamphostsdk],[vamp-hostsdk >= 2.5],[vamp-hostsdk/PluginLoader.h],[vamp-hostsdk],[libvamphostsdk_v_2_5_present]) SV_MODULE_REQUIRED([rubberband],[rubberband],[rubberband/RubberBandStretcher.h],[rubberband],[rubberband_new]) SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new]) SV_MODULE_OPTIONAL([portaudio_2_0],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported]) SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open]) SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new]) SV_MODULE_OPTIONAL([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init]) SV_MODULE_OPTIONAL([oggz],[oggz >= 1.0.0],[oggz/oggz.h],[oggz],[oggz_run]) SV_MODULE_OPTIONAL([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new]) SV_MODULE_OPTIONAL([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init]) SV_MODULE_OPTIONAL([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new]) AC_SUBST(PERL) AC_SUBST(XARGS) AC_SUBST(MAKEDEPEND) AC_SUBST(SHA1SUM) AC_SUBST(CUT) AC_SUBST(CFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(CXXFLAGS_MINIMAL) AC_SUBST(HAVES) AC_SUBST(LIBS) AC_SUBST(CC) AC_SUBST(CXX) AC_SUBST(QMAKE_CONFIG) AC_CONFIG_FILES([config.pri]) AC_OUTPUT if ! $QMAKE -r svgui.pro; then AC_MSG_ERROR([qmake failed: Command was "$QMAKE -r"]) fi AC_MSG_NOTICE([ Configuration complete. Please check the above messages for any warnings that you might care about, and then run "make". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run "$QMAKE -r" again to regenerate the Makefile. ]) sonic-visualiser-2.3~repack1.orig/svgui/widgets/0000755000175000017500000000000012264464201020527 5ustar miramirasonic-visualiser-2.3~repack1.orig/svgui/widgets/Panner.h0000644000175000017500000001033312252354725022131 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PANNER_H_ #define _PANNER_H_ #include class Panner : public QWidget { Q_OBJECT public: Panner(QWidget *parent = 0); virtual ~Panner(); void setDefaultRectCentre(float, float); void setThumbColour(QColor colour); void setAlpha(int backgroundAlpha, int thumbAlpha); /** * Set the amount the scroll() function or mouse wheel movement * makes the panner rectangle move by. The default value of 0 * means to select a value automatically based on the dimensions * of the panner rectangle. */ void setScrollUnit(float unit); void getRectExtents(float &x0, float &y0, float &width, float &height); virtual QSize sizeHint() const; signals: /** * Emitted when the panned rectangle is dragged or otherwise * moved. Arguments are x0, y0, width and height of the rectangle * in the range 0 -> 1 as proportions of the width and height of * the whole widget. */ void rectExtentsChanged(float, float, float, float); /** * Emitted when the rectangle is dragged or otherwise moved (as * well as extentsChanged). Arguments are the centre coordinates * of the rectangle in the range 0 -> 1 as proportions of the * width and height of the whole widget. */ void rectCentreMoved(float, float); /** * Emitted when the panner is double-clicked (for the "customer" * code to pop up a value editing dialog, for example). */ void doubleClicked(); void mouseEntered(); void mouseLeft(); public slots: /** * Set the extents of the panned rectangle within the overall * panner widget. Coordinates are in the range 0 -> 1 in both axes, * with 0 at the top in the y axis. */ void setRectExtents(float x0, float y0, float width, float height); /** * Set the width of the panned rectangle as a fraction (0 -> 1) of * that of the whole panner widget. */ void setRectWidth(float width); /** * Set the height of the panned rectangle as a fraction (0 -> 1) * of that of the whole panner widget. */ void setRectHeight(float height); /** * Set the location of the centre of the panned rectangle on the x * axis, as a proportion (0 -> 1) of the width of the whole panner * widget. */ void setRectCentreX(float x); /** * Set the location of the centre of the panned rectangle on the y * axis, as a proportion (0 -> 1) of the height of the whole panner * widget. */ void setRectCentreY(float y); /** * Move up (if up is true) or down a bit. This is basically the * same action as rolling the mouse wheel one notch. */ void scroll(bool up); void resetToDefault(); protected: virtual void mousePressEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void wheelEvent(QWheelEvent *e); virtual void paintEvent(QPaintEvent *e); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); void normalise(); void emitAndUpdate(); float m_rectX; float m_rectY; float m_rectWidth; float m_rectHeight; float m_scrollUnit; float m_defaultCentreX; float m_defaultCentreY; bool m_defaultsSet; QColor m_thumbColour; int m_backgroundAlpha; int m_thumbAlpha; float centreX() const { return m_rectX + m_rectWidth/2; } float centreY() const { return m_rectY + m_rectHeight/2; } bool m_clicked; QPoint m_clickPos; float m_dragStartX; float m_dragStartY; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/NotifyingPushButton.cpp0000644000175000017500000000160012252354725025240 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "NotifyingPushButton.h" NotifyingPushButton::~NotifyingPushButton() { } void NotifyingPushButton::enterEvent(QEvent *e) { QPushButton::enterEvent(e); emit mouseEntered(); } void NotifyingPushButton::leaveEvent(QEvent *e) { QPushButton::enterEvent(e); emit mouseLeft(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/NotifyingCheckBox.cpp0000644000175000017500000000156212252354725024622 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "NotifyingCheckBox.h" NotifyingCheckBox::~NotifyingCheckBox() { } void NotifyingCheckBox::enterEvent(QEvent *e) { QCheckBox::enterEvent(e); emit mouseEntered(); } void NotifyingCheckBox::leaveEvent(QEvent *e) { QCheckBox::enterEvent(e); emit mouseLeft(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/SelectableLabel.cpp0000644000175000017500000000730512252354725024251 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "SelectableLabel.h" #include #include SelectableLabel::SelectableLabel(QWidget *p) : QLabel(p), m_selected(false) { setTextFormat(Qt::RichText); // setLineWidth(2); // setFixedWidth(480); setupStyle(); setOpenExternalLinks(true); } SelectableLabel::~SelectableLabel() { } void SelectableLabel::setUnselectedText(QString text) { if (m_unselectedText == text) return; m_unselectedText = text; if (!m_selected) { setText(m_unselectedText); resize(sizeHint()); } } void SelectableLabel::setSelectedText(QString text) { if (m_selectedText == text) return; m_selectedText = text; if (m_selected) { setText(m_selectedText); resize(sizeHint()); } } void SelectableLabel::setupStyle() { QPalette palette = QApplication::palette(); setTextInteractionFlags(Qt::LinksAccessibleByKeyboard | Qt::LinksAccessibleByMouse | Qt::TextSelectableByMouse); if (m_selected) { setWordWrap(true); setStyleSheet (QString("QLabel:hover { background: %1; color: %3; } " "QLabel:!hover { background: %2; color: %3 } " "QLabel { padding: 7px }") .arg(palette.mid().color().lighter(120).name()) .arg(palette.mid().color().lighter(140).name()) .arg(palette.text().color().name())); } else { setWordWrap(false); setStyleSheet (QString("QLabel:hover { background: %1; color: %3; } " "QLabel:!hover { background: %2; color: %3 } " "QLabel { padding: 7px }") .arg(palette.button().color().name()) .arg(palette.light().color().name()) .arg(palette.text().color().name())); } } void SelectableLabel::setSelected(bool s) { if (m_selected == s) return; m_selected = s; if (m_selected) { setText(m_selectedText); } else { setText(m_unselectedText); } setupStyle(); parentWidget()->resize(parentWidget()->sizeHint()); } void SelectableLabel::toggle() { setSelected(!m_selected); } void SelectableLabel::mousePressEvent(QMouseEvent *e) { m_swallowRelease = !m_selected; setSelected(true); QLabel::mousePressEvent(e); emit selectionChanged(); } void SelectableLabel::mouseDoubleClickEvent(QMouseEvent *e) { QLabel::mouseDoubleClickEvent(e); emit doubleClicked(); } void SelectableLabel::mouseReleaseEvent(QMouseEvent *e) { if (!m_swallowRelease) QLabel::mouseReleaseEvent(e); m_swallowRelease = false; } void SelectableLabel::enterEvent(QEvent *) { // cerr << "enterEvent" << endl; // QPalette palette = QApplication::palette(); // palette.setColor(QPalette::Window, Qt::gray); // setStyleSheet("background: gray"); // setPalette(palette); } void SelectableLabel::leaveEvent(QEvent *) { // cerr << "leaveEvent" << endl; // setStyleSheet("background: white"); // QPalette palette = QApplication::palette(); // palette.setColor(QPalette::Window, Qt::gray); // setPalette(palette); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/TipDialog.cpp0000644000175000017500000001744012252354725023123 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "TipDialog.h" #include #include #include #include #include #include #include #include #include #include #include TipDialog::TipDialog(QWidget *parent) : QDialog(parent), m_tipNumber(0), m_label(0), m_caption(tr("Tip of the Day")) { readTips(); QSettings settings; settings.beginGroup("TipOfTheDay"); if (!settings.value("showonstartup", true).toBool()) return; m_tipNumber = settings.value("nexttip", 0).toInt(); setWindowTitle(m_caption); QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *groupBox = new QGroupBox; // groupBox->setTitle(m_caption); grid->addWidget(groupBox, 0, 0); QGridLayout *subgrid = new QGridLayout; groupBox->setLayout(subgrid); m_label = new QLabel; subgrid->addWidget(m_label, 0, 0); m_label->setWordWrap(true); QHBoxLayout *hbox = new QHBoxLayout; grid->addLayout(hbox, 1, 0); QCheckBox *show = new QCheckBox(tr("Show tip on startup")); hbox->addWidget(show); hbox->addSpacing(20); hbox->addStretch(10); QPushButton *prev = new QPushButton(tr("<< Previous")); hbox->addWidget(prev); connect(prev, SIGNAL(clicked()), this, SLOT(previous())); QPushButton *next = new QPushButton(tr("Next >>")); hbox->addWidget(next); connect(next, SIGNAL(clicked()), this, SLOT(next())); QPushButton *close = new QPushButton(tr("Close")); hbox->addWidget(close); connect(close, SIGNAL(clicked()), this, SLOT(accept())); close->setDefault(true); showTip(); } TipDialog::~TipDialog() { } void TipDialog::next() { if (++m_tipNumber >= int(m_tips.size())) { //!!! The tips file should define where we loop back to -- the // first one at least is likely to be a generic welcome message m_tipNumber = 0; } showTip(); } void TipDialog::previous() { if (--m_tipNumber < 0) { m_tipNumber = m_tips.size() - 1; } showTip(); } void TipDialog::readTips() { SVDEBUG << "TipDialog::readTips" << endl; QString language = QLocale::system().name(); QString filename = QString(":i18n/tips_%1.xml").arg(language); if (!QFileInfo(filename).exists()) { QString base = language.section('_', 0, 0); filename = QString(":i18n/tips_%1.xml").arg(base); if (!QFileInfo(filename).exists()) { filename = QString(":i18n/tips.xml"); if (!QFileInfo(filename).exists()) return; } } QFile file(filename); SVDEBUG << "TipDialog::readTips from " << filename << endl; QXmlInputSource source(&file); TipFileParser parser(this); parser.parse(source); } void TipDialog::showTip() { if (m_tipNumber < int(m_tips.size())) { cerr << "Tip " << m_tipNumber << " is: " << m_tips[m_tipNumber] << endl; m_label->setText(m_tips[m_tipNumber]); } else { accept(); } int tn = m_tipNumber; if (++tn >= int(m_tips.size())) tn = 0; //!!! as above QSettings settings; settings.beginGroup("TipOfTheDay"); settings.setValue("nexttip", tn); } TipDialog::TipFileParser::TipFileParser(TipDialog *dialog) : m_dialog(dialog), m_inTip(false), m_inText(false), m_inHtml(false) { } TipDialog::TipFileParser::~TipFileParser() { } void TipDialog::TipFileParser::parse(QXmlInputSource &source) { QXmlSimpleReader reader; reader.setContentHandler(this); reader.setErrorHandler(this); reader.parse(source); } bool TipDialog::TipFileParser::startElement(const QString &, const QString &, const QString &qName, const QXmlAttributes &attributes) { QString name = qName.toLower(); SVDEBUG << "TipFileParser::startElement(" << name << ")" << endl; if (name == "tips") { QString caption = attributes.value("caption"); SVDEBUG << "TipFileParser::caption = " << caption << endl; if (caption != "") m_dialog->m_caption = caption; } else if (name == "tip") { if (m_inTip) { cerr << "WARNING: TipFileParser: nested elements" << endl; } m_inTip = true; } else if (name == "text") { if (m_inTip) { m_inText = true; cerr << "TipFileParser: adding new tip" << endl; m_dialog->m_tips.push_back(""); } else { cerr << "WARNING: TipFileParser: outside element" << endl; } } else if (name == "html") { if (m_inTip) { m_inHtml = true; cerr << "TipFileParser: adding new tip" << endl; m_dialog->m_tips.push_back(""); } else { cerr << "WARNING: TipFileParser: outside element" << endl; } } else if (m_inHtml) { m_dialog->m_tips[m_dialog->m_tips.size()-1] += "<" + qName; for (int i = 0; i < attributes.count(); ++i) { m_dialog->m_tips[m_dialog->m_tips.size()-1] += " " + attributes.qName(i) + "=\"" + attributes.value(i) + "\""; } m_dialog->m_tips[m_dialog->m_tips.size()-1] += ">"; } SVDEBUG << "TipFileParser::startElement done" << endl; return true; } bool TipDialog::TipFileParser::endElement(const QString &, const QString &, const QString &qName) { QString name = qName.toLower(); if (name == "text") { if (!m_inText) { cerr << "WARNING: TipFileParser: without " << endl; } m_inText = false; } else if (name == "html") { if (!m_inHtml) { cerr << "WARNING: TipFileParser: without " << endl; } m_inHtml = false; } else if (name == "tip") { if (m_inText) { cerr << "WARNING: TipFileParser: without " << endl; } else if (m_inHtml) { cerr << "WARNING: TipFileParser: without " << endl; } else if (!m_inTip) { cerr << "WARNING: TipFileParser: without " << endl; } m_inTip = false; } else if (m_inHtml) { m_dialog->m_tips[m_dialog->m_tips.size()-1] += ""; } return true; } bool TipDialog::TipFileParser::characters(const QString &text) { SVDEBUG << "TipFileParser::characters(" << text << ")" << endl; if (m_inText || m_inHtml) { m_dialog->m_tips[m_dialog->m_tips.size()-1] += text; } return true; } bool TipDialog::TipFileParser::error(const QXmlParseException &exception) { QString errorString = QString("ERROR: TipFileParser: %1 at line %2, column %3") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); cerr << errorString << endl; return QXmlDefaultHandler::error(exception); } bool TipDialog::TipFileParser::fatalError(const QXmlParseException &exception) { QString errorString = QString("FATAL ERROR: TipFileParser: %1 at line %2, column %3") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); cerr << errorString << endl; return QXmlDefaultHandler::fatalError(exception); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/NotifyingComboBox.cpp0000644000175000017500000000156212252354725024644 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "NotifyingComboBox.h" NotifyingComboBox::~NotifyingComboBox() { } void NotifyingComboBox::enterEvent(QEvent *e) { QComboBox::enterEvent(e); emit mouseEntered(); } void NotifyingComboBox::leaveEvent(QEvent *e) { QComboBox::enterEvent(e); emit mouseLeft(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/ClickableLabel.h0000644000175000017500000000176612252354725023531 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _CLICKABLE_LABEL_H_ #define _CLICKABLE_LABEL_H_ #include class ClickableLabel : public QLabel { Q_OBJECT public: ClickableLabel(const QString &text, QWidget *parent = 0) : QLabel(text, parent) { } ClickableLabel(QWidget *parent = 0) : QLabel(parent) { } ~ClickableLabel() { } signals: void clicked(); protected: virtual void mousePressEvent(QMouseEvent *) { emit clicked(); } }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/AudioDial.cpp0000644000175000017500000003347512252354725023110 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /** * A rotary dial widget. * * Based on an original design by Thorsten Wilms. * * Implemented as a widget for the Rosegarden MIDI and audio sequencer * and notation editor by Chris Cannam. * * Extracted into a standalone Qt3 widget by Pedro Lopez-Cabanillas * and adapted for use in QSynth. * * Ported to Qt4 by Chris Cannam. * * This file copyright 2003-2006 Chris Cannam, copyright 2005 Pedro * Lopez-Cabanillas, copyright 2006 Queen Mary, University of London. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. See the file * COPYING included with this distribution for more information. */ #include "AudioDial.h" #include "base/RangeMapper.h" #include #include #include #include #include #include #include #include #include #include "base/Profiler.h" //!!! Pedro updated his version to use my up/down response code from RG -- need to grab that code in preference to this version from Rui //------------------------------------------------------------------------- // AudioDial - Instance knob widget class. // #define AUDIO_DIAL_MIN (0.25 * M_PI) #define AUDIO_DIAL_MAX (1.75 * M_PI) #define AUDIO_DIAL_RANGE (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) //static int dialsExtant = 0; // Constructor. AudioDial::AudioDial(QWidget *parent) : QDial(parent), m_knobColor(Qt::black), m_meterColor(Qt::white), m_defaultValue(0), m_defaultMappedValue(0), m_mappedValue(0), m_noMappedUpdate(false), m_showTooltip(true), m_rangeMapper(0) { m_mouseDial = false; m_mousePressed = false; // ++dialsExtant; } // Destructor. AudioDial::~AudioDial (void) { delete m_rangeMapper; // --dialsExtant; } void AudioDial::setRangeMapper(RangeMapper *mapper) { // cerr << "AudioDial[" << this << "][\"" << objectName() << "\"::setRangeMapper(" << mapper << ") [current is " << m_rangeMapper << "] (have " << dialsExtant << " dials extant)" << endl; if (m_rangeMapper == mapper) return; if (!m_rangeMapper && mapper) { connect(this, SIGNAL(valueChanged(int)), this, SLOT(updateMappedValue(int))); } delete m_rangeMapper; m_rangeMapper = mapper; updateMappedValue(value()); } void AudioDial::paintEvent(QPaintEvent *) { Profiler profiler("AudioDial::paintEvent"); QPainter paint; float angle = AUDIO_DIAL_MIN // offset + (AUDIO_DIAL_RANGE * (float(QDial::value() - QDial::minimum()) / (float(QDial::maximum() - QDial::minimum())))); int degrees = int(angle * 180.0 / M_PI); int ns = notchSize(); int numTicks = 1 + (maximum() + ns - minimum()) / ns; QColor knobColor(m_knobColor); if (knobColor == Qt::black) knobColor = palette().window().color(); QColor meterColor(m_meterColor); if (!isEnabled()) meterColor = palette().mid().color(); else if (m_meterColor == Qt::white) meterColor = palette().highlight().color(); int m_size = width() < height() ? width() : height(); int scale = 1; int width = m_size - 2*scale; paint.begin(this); paint.setRenderHint(QPainter::Antialiasing, true); paint.translate(1, 1); QPen pen; QColor c; // Knob body and face... c = knobColor; pen.setColor(knobColor); pen.setWidth(scale * 2); pen.setCapStyle(Qt::FlatCap); paint.setPen(pen); paint.setBrush(c); int indent = (int)(width * 0.15 + 1); paint.drawEllipse(indent-1, indent-1, width-2*indent, width-2*indent); pen.setWidth(3 * scale); int pos = indent-1 + (width-2*indent) / 20; int darkWidth = (width-2*indent) * 3 / 4; while (darkWidth) { c = c.light(102); pen.setColor(c); paint.setPen(pen); paint.drawEllipse(pos, pos, darkWidth, darkWidth); if (!--darkWidth) break; paint.drawEllipse(pos, pos, darkWidth, darkWidth); if (!--darkWidth) break; paint.drawEllipse(pos, pos, darkWidth, darkWidth); ++pos; --darkWidth; } // Tick notches... if ( notchesVisible() ) { // cerr << "Notches visible" << endl; pen.setColor(palette().dark().color()); pen.setWidth(scale); paint.setPen(pen); for (int i = 0; i < numTicks; ++i) { int div = numTicks; if (div > 1) --div; drawTick(paint, AUDIO_DIAL_MIN + (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) * i / div, width, true); } } // The bright metering bit... c = meterColor; pen.setColor(c); pen.setWidth(indent); paint.setPen(pen); // cerr << "degrees " << degrees << ", gives us " << -(degrees - 45) * 16 << endl; int arcLen = -(degrees - 45) * 16; if (arcLen == 0) arcLen = -16; paint.drawArc(indent/2, indent/2, width-indent, width-indent, (180 + 45) * 16, arcLen); paint.setBrush(Qt::NoBrush); // Shadowing... pen.setWidth(scale); paint.setPen(pen); // Knob shadow... int shadowAngle = -720; c = knobColor.dark(); for (int arc = 120; arc < 2880; arc += 240) { pen.setColor(c); paint.setPen(pen); paint.drawArc(indent, indent, width-2*indent, width-2*indent, shadowAngle + arc, 240); paint.drawArc(indent, indent, width-2*indent, width-2*indent, shadowAngle - arc, 240); c = c.light(110); } // Scale shadow... shadowAngle = 2160; c = palette().dark().color(); for (int arc = 120; arc < 2880; arc += 240) { pen.setColor(c); paint.setPen(pen); paint.drawArc(scale/2, scale/2, width-scale, width-scale, shadowAngle + arc, 240); paint.drawArc(scale/2, scale/2, width-scale, width-scale, shadowAngle - arc, 240); c = c.light(108); } // Undraw the bottom part... pen.setColor(palette().background().color()); pen.setWidth(scale * 4); paint.setPen(pen); paint.drawArc(scale/2, scale/2, width-scale, width-scale, -45 * 16, -92 * 16); // Scale ends... pen.setColor(palette().dark().color()); pen.setWidth(scale); paint.setPen(pen); for (int i = 0; i < numTicks; ++i) { if (i != 0 && i != numTicks - 1) continue; int div = numTicks; if (div > 1) --div; drawTick(paint, AUDIO_DIAL_MIN + (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) * i / div, width, false); } // Pointer notch... float hyp = float(width) / 2.0; float len = hyp - indent; --len; float x0 = hyp; float y0 = hyp; float x = hyp - len * sin(angle); float y = hyp + len * cos(angle); c = palette().dark().color(); pen.setColor(isEnabled() ? c.dark(130) : c); pen.setWidth(scale * 2); paint.setPen(pen); paint.drawLine(int(x0), int(y0), int(x), int(y)); paint.end(); } void AudioDial::drawTick(QPainter &paint, float angle, int size, bool internal) { float hyp = float(size) / 2.0; float x0 = hyp - (hyp - 1) * sin(angle); float y0 = hyp + (hyp - 1) * cos(angle); // cerr << "drawTick: angle " << angle << ", size " << size << ", internal " << internal << endl; if (internal) { float len = hyp / 4; float x1 = hyp - (hyp - len) * sin(angle); float y1 = hyp + (hyp - len) * cos(angle); paint.drawLine(int(x0), int(y0), int(x1), int(y1)); } else { float len = hyp / 4; float x1 = hyp - (hyp + len) * sin(angle); float y1 = hyp + (hyp + len) * cos(angle); paint.drawLine(int(x0), int(y0), int(x1), int(y1)); } } void AudioDial::setKnobColor(const QColor& color) { m_knobColor = color; update(); } void AudioDial::setMeterColor(const QColor& color) { m_meterColor = color; update(); } void AudioDial::setMouseDial(bool mouseDial) { m_mouseDial = mouseDial; } void AudioDial::setDefaultValue(int defaultValue) { m_defaultValue = defaultValue; if (m_rangeMapper) { m_defaultMappedValue = m_rangeMapper->getValueForPosition(defaultValue); } } void AudioDial::setValue(int value) { QDial::setValue(value); updateMappedValue(value); } void AudioDial::setDefaultMappedValue(float value) { m_defaultMappedValue = value; if (m_rangeMapper) { m_defaultValue = m_rangeMapper->getPositionForValue(value); } } void AudioDial::setMappedValue(float mappedValue) { if (m_rangeMapper) { int newPosition = m_rangeMapper->getPositionForValue(mappedValue); bool changed = (m_mappedValue != mappedValue); m_mappedValue = mappedValue; m_noMappedUpdate = true; SVDEBUG << "AudioDial::setMappedValue(" << mappedValue << "): new position is " << newPosition << endl; if (newPosition != value()) { setValue(newPosition); } else if (changed) { emit valueChanged(newPosition); } m_noMappedUpdate = false; } else { setValue(int(mappedValue)); } } void AudioDial::setShowToolTip(bool show) { m_showTooltip = show; m_noMappedUpdate = true; updateMappedValue(value()); m_noMappedUpdate = false; } float AudioDial::mappedValue() const { if (m_rangeMapper) { // SVDEBUG << "AudioDial::mappedValue(): value = " << value() << ", mappedValue = " << m_mappedValue << endl; return m_mappedValue; } return value(); } void AudioDial::updateMappedValue(int value) { if (!m_noMappedUpdate) { if (m_rangeMapper) { m_mappedValue = m_rangeMapper->getValueForPosition(value); } else { m_mappedValue = value; } } if (m_showTooltip) { QString name = objectName(); QString unit = ""; QString text; if (m_rangeMapper) unit = m_rangeMapper->getUnit(); if (name != "") { text = tr("%1: %2%3").arg(name).arg(m_mappedValue).arg(unit); } else { text = tr("%2%3").arg(m_mappedValue).arg(unit); } setToolTip(text); } } void AudioDial::setToDefault() { if (m_rangeMapper) { setMappedValue(m_defaultMappedValue); return; } int dv = m_defaultValue; if (dv < minimum()) dv = minimum(); if (dv > maximum()) dv = maximum(); setValue(m_defaultValue); } // Alternate mouse behavior event handlers. void AudioDial::mousePressEvent(QMouseEvent *mouseEvent) { if (m_mouseDial) { QDial::mousePressEvent(mouseEvent); } else if (mouseEvent->button() == Qt::MidButton || ((mouseEvent->button() == Qt::LeftButton) && (mouseEvent->modifiers() & Qt::ControlModifier))) { setToDefault(); } else if (mouseEvent->button() == Qt::LeftButton) { m_mousePressed = true; m_posMouse = mouseEvent->pos(); } } void AudioDial::mouseDoubleClickEvent(QMouseEvent *mouseEvent) { //!!! needs a common base class with Thumbwheel if (m_mouseDial) { QDial::mouseDoubleClickEvent(mouseEvent); } else if (mouseEvent->button() != Qt::LeftButton) { return; } bool ok = false; if (m_rangeMapper) { float min = m_rangeMapper->getValueForPosition(minimum()); float max = m_rangeMapper->getValueForPosition(maximum()); if (min > max) { float tmp = min; min = max; max = tmp; } QString unit = m_rangeMapper->getUnit(); QString text; if (objectName() != "") { if (unit != "") { text = tr("New value for %1, from %2 to %3 %4:") .arg(objectName()).arg(min).arg(max).arg(unit); } else { text = tr("New value for %1, from %2 to %3:") .arg(objectName()).arg(min).arg(max); } } else { if (unit != "") { text = tr("Enter a new value from %1 to %2 %3:") .arg(min).arg(max).arg(unit); } else { text = tr("Enter a new value from %1 to %2:") .arg(min).arg(max); } } float newValue = QInputDialog::getDouble (this, tr("Enter new value"), text, m_mappedValue, min, max, 4, &ok); if (ok) { setMappedValue(newValue); } } else { int newPosition = QInputDialog::getInt (this, tr("Enter new value"), tr("Enter a new value from %1 to %2:") .arg(minimum()).arg(maximum()), value(), minimum(), maximum(), singleStep(), &ok); if (ok) { setValue(newPosition); } } } void AudioDial::mouseMoveEvent(QMouseEvent *mouseEvent) { if (m_mouseDial) { QDial::mouseMoveEvent(mouseEvent); } else if (m_mousePressed) { const QPoint& posMouse = mouseEvent->pos(); int v = QDial::value() + (posMouse.x() - m_posMouse.x()) + (m_posMouse.y() - posMouse.y()); if (v > QDial::maximum()) v = QDial::maximum(); else if (v < QDial::minimum()) v = QDial::minimum(); m_posMouse = posMouse; QDial::setValue(v); } } void AudioDial::mouseReleaseEvent(QMouseEvent *mouseEvent) { if (m_mouseDial) { QDial::mouseReleaseEvent(mouseEvent); } else if (m_mousePressed) { m_mousePressed = false; } } void AudioDial::enterEvent(QEvent *e) { QDial::enterEvent(e); emit mouseEntered(); } void AudioDial::leaveEvent(QEvent *e) { QDial::enterEvent(e); emit mouseLeft(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/LabelCounterInputDialog.h0000644000175000017500000000213412252354725025425 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _LABEL_COUNTER_INPUT_DIALOG_H_ #define _LABEL_COUNTER_INPUT_DIALOG_H_ #include #include "data/model/Labeller.h" class LabelCounterInputDialog : public QDialog { Q_OBJECT public: LabelCounterInputDialog(Labeller *labeller, QWidget *parent); virtual ~LabelCounterInputDialog(); protected slots: void counterChanged(int); void secondCounterChanged(int); void cancelClicked(); protected: Labeller *m_labeller; int m_origCounter; int m_origSecondCounter; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/NotifyingTabBar.h0000644000175000017500000000203612252354725023731 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _NOTIFYING_TAB_BAR_H_ #define _NOTIFYING_TAB_BAR_H_ #include class NotifyingTabBar : public QTabBar { Q_OBJECT public: NotifyingTabBar(QWidget *parent = 0); virtual ~NotifyingTabBar(); signals: void mouseEntered(); void mouseLeft(); void activeTabClicked(); protected: virtual void mousePressEvent(QMouseEvent *); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/Fader.cpp0000644000175000017500000001460712252354725022272 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /** * Horizontal audio fader and meter widget. * * Based on the vertical fader and meter widget from the Hydrogen drum * machine. (Any poor taste that has crept in during the * modifications for this application is entirely my own, however.) * The following copyright notice applies to code from this file, and * also to the files in icons/fader_*.png (also modified by me). --cc */ /** * Hydrogen * Copyright(c) 2002-2005 by Alex >Comix< Cominu [comix@users.sourceforge.net] * http://www.hydrogen-music.org */ #include "Fader.h" #include "base/AudioLevel.h" #include #include #include #include #include #include #include Fader::Fader(QWidget *parent, bool withoutKnob) : QWidget(parent), m_withoutKnob(withoutKnob), m_value(1.0), m_peakLeft(0.0), m_peakRight(0.0), m_mousePressed(false) { setMinimumSize(116, 23); setMaximumSize(116, 23); resize(116, 23); QString background_path = ":/icons/fader_background.png"; bool ok = m_back.load(background_path); if (ok == false) { cerr << "Fader: Error loading pixmap" << endl; } QString leds_path = ":/icons/fader_leds.png"; ok = m_leds.load(leds_path); if (ok == false) { cerr << "Error loading pixmap" << endl; } QString knob_path = ":/icons/fader_knob.png"; ok = m_knob.load(knob_path); if (ok == false) { cerr << "Error loading pixmap" << endl; } QString clip_path = ":/icons/fader_knob_red.png"; ok = m_clip.load(clip_path); if (ok == false) { cerr << "Error loading pixmap" << endl; } } Fader::~Fader() { } void Fader::mouseMoveEvent(QMouseEvent *ev) { if (ev->button() == Qt::MidButton) { setValue(1.0); emit valueChanged(1.0); update(); ev->accept(); return; } if (!m_mousePressed) return; int x = ev->x(); int diff = x - m_mousePressX; if (diff == 0) return; int vx = AudioLevel::multiplier_to_fader (m_mousePressValue, getMaxX(), AudioLevel::LongFader); vx += diff; if (vx > getMaxX()) vx = getMaxX(); if (vx < 0) vx = 0; float fval = AudioLevel::fader_to_multiplier (vx, getMaxX(), AudioLevel::LongFader); setValue(fval); emit valueChanged(fval); ev->accept(); } void Fader::mouseReleaseEvent(QMouseEvent *ev) { if (m_mousePressed) { mouseMoveEvent(ev); m_mousePressed = false; } } void Fader::mouseDoubleClickEvent(QMouseEvent *) { bool ok = false; float min = AudioLevel::fader_to_dB (0, getMaxX(), AudioLevel::LongFader); float max = AudioLevel::fader_to_dB (getMaxX(), getMaxX(), AudioLevel::LongFader); float deft = AudioLevel::multiplier_to_dB(m_value); float dB = QInputDialog::getDouble (this, tr("Enter new fader level"), tr("New fader level, from %1 to %2 dBFS:").arg(min).arg(max), deft, min, max, 3, &ok); if (ok) { float value = AudioLevel::dB_to_multiplier(dB); setValue(value); emit valueChanged(value); update(); } } void Fader::mousePressEvent(QMouseEvent *ev) { if (ev->button() == Qt::MidButton || ((ev->button() == Qt::LeftButton) && (ev->modifiers() & Qt::ControlModifier))) { setValue(1.0); emit valueChanged(1.0); update(); return; } if (ev->button() != Qt::LeftButton) return; m_mousePressed = true; m_mousePressX = ev->x(); m_mousePressValue = getValue(); } void Fader::wheelEvent(QWheelEvent *ev) { ev->accept(); //!!! needs improvement if (ev->delta() > 0) { setValue(m_value * 1.1); } else { setValue(m_value / 1.1); } update(); emit valueChanged(getValue()); } void Fader::enterEvent(QEvent *) { emit mouseEntered(); } void Fader::leaveEvent(QEvent *) { emit mouseLeft(); } void Fader::setValue(float v) { float max = AudioLevel::dB_to_multiplier(10.0); if (v > max) { v = max; } else if (v < 0.0) { v = 0.0; } if (m_value != v) { m_value = v; float db = AudioLevel::multiplier_to_dB(m_value); QString text; if (db <= AudioLevel::DB_FLOOR) { text = tr("Level: Off"); } else { text = tr("Level: %1%2.%3%4 dB") .arg(db < 0.0 ? "-" : "") .arg(abs(int(db))) .arg(abs(int(db * 10.0) % 10)) .arg(abs(int(db * 100.0) % 10)); } cerr << "Fader: setting tooltip to \"" << text << "\"" << endl; QWidget::setToolTip(text); update(); } } float Fader::getValue() { return m_value; } void Fader::setPeakLeft(float peak) { if (this->m_peakLeft != peak) { this->m_peakLeft = peak; update(); } } void Fader::setPeakRight(float peak) { if (this->m_peakRight != peak) { this->m_peakRight = peak; update(); } } void Fader::paintEvent(QPaintEvent *) { QPainter painter(this); // background painter.drawPixmap(rect(), m_back, QRect(0, 0, 116, 23)); int offset_L = AudioLevel::multiplier_to_fader(m_peakLeft, 116, AudioLevel::IEC268LongMeter); painter.drawPixmap(QRect(0, 0, offset_L, 11), m_leds, QRect(0, 0, offset_L, 11)); int offset_R = AudioLevel::multiplier_to_fader(m_peakRight, 116, AudioLevel::IEC268LongMeter); painter.drawPixmap(QRect(0, 11, offset_R, 11), m_leds, QRect(0, 11, offset_R, 11)); if (m_withoutKnob == false) { static const uint knob_width = 29; static const uint knob_height = 9; int x = AudioLevel::multiplier_to_fader(m_value, 116 - knob_width, AudioLevel::LongFader); bool clipping = (m_peakLeft > 1.0 || m_peakRight > 1.0); painter.drawPixmap(QRect(x, 7, knob_width, knob_height), clipping ? m_clip : m_knob, QRect(0, 0, knob_width, knob_height)); } } int Fader::getMaxX() const { return 116 - 12; } sonic-visualiser-2.3~repack1.orig/svgui/widgets/SubdividingMenu.h0000644000175000017500000000461712252354725024012 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SUBDIVIDING_MENU_H_ #define _SUBDIVIDING_MENU_H_ #include #include #include #include /** * A menu that divides its entries into submenus, alphabetically. For * menus that may contain a very large or small number of named items * (e.g. plugins). * * The menu needs to be told, before any of the actions are added, * what the set of entry strings will be, so it can determine a * reasonable categorisation. Do this by calling the setEntries() * method. If it isn't practical to do this in advance, then add the * entries and call entriesAdded() afterwards instead. */ class SubdividingMenu : public QMenu { Q_OBJECT public: SubdividingMenu(size_t lowerLimit = 0, size_t upperLimit = 0, QWidget *parent = 0); SubdividingMenu(const QString &title, size_t lowerLimit = 0, size_t upperLimit = 0, QWidget *parent = 0); virtual ~SubdividingMenu(); void setEntries(const std::set &entries); void entriesAdded(); // Action names and strings passed to addAction and addMenu must // appear in the set previously given to setEntries. If you want // to use a different string, use the two-argument method and pass // the entry string (used to determine which submenu the action // ends up on) as the first argument. virtual void addAction(QAction *); virtual QAction *addAction(const QString &); virtual void addAction(const QString &entry, QAction *); virtual void addMenu(QMenu *); virtual QMenu *addMenu(const QString &); virtual void addMenu(const QString &entry, QMenu *); protected: std::map m_nameToChunkMenuMap; size_t m_lowerLimit; size_t m_upperLimit; bool m_entriesSet; std::map m_pendingEntries; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/Panner.cpp0000644000175000017500000001357112252354725022473 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Panner.h" #include #include #include #include #include #include Panner::Panner(QWidget *parent) : QWidget(parent), m_rectX(0), m_rectY(0), m_rectWidth(1), m_rectHeight(1), m_scrollUnit(0), m_defaultCentreX(0), m_defaultCentreY(0), m_defaultsSet(false), m_thumbColour(palette().highlightedText().color()), m_backgroundAlpha(255), m_thumbAlpha(255), m_clicked(false) { } Panner::~Panner() { } void Panner::setAlpha(int backgroundAlpha, int thumbAlpha) { m_backgroundAlpha = backgroundAlpha; m_thumbAlpha = thumbAlpha; } void Panner::setScrollUnit(float unit) { m_scrollUnit = unit; } void Panner::scroll(bool up) { float unit = m_scrollUnit; if (unit == 0.f) { unit = float(m_rectHeight) / (6 * float(height())); if (unit < 0.01) unit = 0.01; } if (!up) { m_rectY += unit; } else { m_rectY -= unit; } normalise(); emitAndUpdate(); } void Panner::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::MidButton || ((e->button() == Qt::LeftButton) && (e->modifiers() & Qt::ControlModifier))) { resetToDefault(); } else if (e->button() == Qt::LeftButton) { m_clicked = true; m_clickPos = e->pos(); m_dragStartX = m_rectX; m_dragStartY = m_rectY; } } void Panner::mouseDoubleClickEvent(QMouseEvent *e) { if (e->button() != Qt::LeftButton) { return; } emit doubleClicked(); } void Panner::mouseMoveEvent(QMouseEvent *e) { if (!m_clicked) return; float dx = float(e->pos().x() - m_clickPos.x()) / float(width()); float dy = float(e->pos().y() - m_clickPos.y()) / float(height()); m_rectX = m_dragStartX + dx; m_rectY = m_dragStartY + dy; normalise(); repaint(); emit rectExtentsChanged(m_rectX, m_rectY, m_rectWidth, m_rectHeight); emit rectCentreMoved(centreX(), centreY()); } void Panner::mouseReleaseEvent(QMouseEvent *e) { if (!m_clicked) return; mouseMoveEvent(e); m_clicked = false; } void Panner::wheelEvent(QWheelEvent *e) { scroll(e->delta() > 0); } void Panner::enterEvent(QEvent *) { emit mouseEntered(); } void Panner::leaveEvent(QEvent *) { emit mouseLeft(); } void Panner::paintEvent(QPaintEvent *) { QPainter paint(this); paint.setRenderHint(QPainter::Antialiasing, false); QColor bg(palette().background().color()); bg.setAlpha(m_backgroundAlpha); paint.setPen(palette().dark().color()); paint.setBrush(bg); paint.drawRect(0, 0, width()-1, height()-1); QColor hl(m_thumbColour); hl.setAlpha(m_thumbAlpha); paint.setBrush(hl); int rw = lrintf((width() - 1) * m_rectWidth); int rh = lrintf((height() - 1) * m_rectHeight); if (rw < 2) rw = 2; if (rh < 2) rh = 2; paint.drawRect(lrintf(width() * m_rectX), lrintf(height() * m_rectY), rw, rh); } void Panner::normalise() { if (m_rectWidth > 1.0) m_rectWidth = 1.0; if (m_rectHeight > 1.0) m_rectHeight = 1.0; if (m_rectX + m_rectWidth > 1.0) m_rectX = 1.0 - m_rectWidth; if (m_rectX < 0) m_rectX = 0; if (m_rectY + m_rectHeight > 1.0) m_rectY = 1.0 - m_rectHeight; if (m_rectY < 0) m_rectY = 0; if (!m_defaultsSet) { m_defaultCentreX = centreX(); m_defaultCentreY = centreY(); m_defaultsSet = true; } } void Panner::emitAndUpdate() { emit rectExtentsChanged(m_rectX, m_rectY, m_rectWidth, m_rectHeight); emit rectCentreMoved(centreX(), centreY()); update(); } void Panner::getRectExtents(float &x0, float &y0, float &width, float &height) { x0 = m_rectX; y0 = m_rectY; width = m_rectWidth; height = m_rectHeight; } void Panner::setRectExtents(float x0, float y0, float width, float height) { // SVDEBUG << "Panner::setRectExtents(" << x0 << ", " << y0 << ", " // << width << ", " << height << ")" << endl; if (m_rectX == x0 && m_rectY == y0 && m_rectWidth == width && m_rectHeight == height) { return; } m_rectX = x0; m_rectY = y0; m_rectWidth = width; m_rectHeight = height; normalise(); emitAndUpdate(); } void Panner::setRectWidth(float width) { if (m_rectWidth == width) return; m_rectWidth = width; normalise(); emitAndUpdate(); } void Panner::setRectHeight(float height) { if (m_rectHeight == height) return; m_rectHeight = height; normalise(); emitAndUpdate(); } void Panner::setRectCentreX(float x) { float x0 = x - m_rectWidth/2; if (x0 == m_rectX) return; m_rectX = x0; normalise(); emitAndUpdate(); } void Panner::setRectCentreY(float y) { float y0 = y - m_rectHeight/2; if (y0 == m_rectY) return; m_rectY = y0; normalise(); emitAndUpdate(); } QSize Panner::sizeHint() const { return QSize(30, 30); } void Panner::setDefaultRectCentre(float cx, float cy) { m_defaultCentreX = cx; m_defaultCentreY = cy; m_defaultsSet = true; } void Panner::resetToDefault() { float x0 = m_defaultCentreX - m_rectWidth/2; float y0 = m_defaultCentreY - m_rectHeight/2; if (x0 == m_rectX && y0 == m_rectY) return; m_rectX = x0; m_rectY = y0; normalise(); emitAndUpdate(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/LayerTreeDialog.h0000644000175000017500000000212512252354725023722 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _LAYER_TREE_DIALOG_H_ #define _LAYER_TREE_DIALOG_H_ #include class ModelMetadataModel; class LayerTreeModel; class PaneStack; class QTreeView; class QTableView; class LayerTreeDialog : public QDialog { Q_OBJECT public: LayerTreeDialog(PaneStack *stack, QWidget *parent = 0); ~LayerTreeDialog(); protected: PaneStack *m_paneStack; ModelMetadataModel *m_modelModel; QTableView *m_modelView; LayerTreeModel *m_layerModel; QTreeView *m_layerView; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/KeyReference.h0000644000175000017500000000340712252354725023261 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _KEY_REFERENCE_H_ #define _KEY_REFERENCE_H_ #include #include #include #include class QAction; class QTextEdit; class QDialog; class QAbstractButton; class KeyReference : public QObject { Q_OBJECT public: KeyReference(); virtual ~KeyReference(); void setCategory(QString category); void registerShortcut(QAction *, QString overrideName = ""); void registerAlternativeShortcut(QAction *, QString alternative); void registerShortcut(QString actionName, QString shortcut, QString tipText); void registerAlternativeShortcut(QString actionName, QString alternative); void show(); void hide(); protected slots: void dialogButtonClicked(QAbstractButton *); protected: struct KeyDetails { QString actionName; QString shortcut; QString tip; std::vector alternatives; }; typedef std::vector KeyList; typedef std::map CategoryMap; typedef std::vector CategoryList; QString m_currentCategory; CategoryMap m_map; CategoryList m_categoryOrder; QTextEdit *m_text; QDialog *m_dialog; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/PropertyStack.h0000644000175000017500000000354112252354725023523 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PROPERTY_STACK_H_ #define _PROPERTY_STACK_H_ #include #include #include class Layer; class View; class PropertyBox; class PropertyContainer; class PropertyStack : public QTabWidget { Q_OBJECT public: PropertyStack(QWidget *parent, View *client); View *getClient() { return m_client; } bool containsContainer(PropertyContainer *container) const; int getContainerIndex(PropertyContainer *container) const; signals: void viewSelected(View *client); void propertyContainerSelected(View *client, PropertyContainer *container); void contextHelpChanged(const QString &); public slots: void propertyContainerAdded(PropertyContainer *); void propertyContainerRemoved(PropertyContainer *); void propertyContainerPropertyChanged(PropertyContainer *); void propertyContainerPropertyRangeChanged(PropertyContainer *); void propertyContainerNameChanged(PropertyContainer *); void showLayer(bool); void mouseEnteredTabBar(); void mouseLeftTabBar(); void activeTabClicked(); protected slots: void selectedContainerChanged(int); protected: View *m_client; std::vector m_boxes; void repopulate(); void updateValues(PropertyContainer *); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/Thumbwheel.cpp0000644000175000017500000003263412252354725023355 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Thumbwheel.h" #include "base/RangeMapper.h" #include "base/Profiler.h" #include #include #include #include #include #include #include #include Thumbwheel::Thumbwheel(Qt::Orientation orientation, QWidget *parent) : QWidget(parent), m_min(0), m_max(100), m_default(50), m_value(50), m_mappedValue(50), m_noMappedUpdate(false), m_rotation(0.5), m_orientation(orientation), m_speed(1.0), m_tracking(true), m_showScale(true), m_clicked(false), m_atDefault(true), m_clickRotation(m_rotation), m_showTooltip(true), m_rangeMapper(0) { } Thumbwheel::~Thumbwheel() { delete m_rangeMapper; } void Thumbwheel::setRangeMapper(RangeMapper *mapper) { if (m_rangeMapper == mapper) return; if (!m_rangeMapper && mapper) { connect(this, SIGNAL(valueChanged(int)), this, SLOT(updateMappedValue(int))); } delete m_rangeMapper; m_rangeMapper = mapper; updateMappedValue(getValue()); } void Thumbwheel::setShowToolTip(bool show) { m_showTooltip = show; m_noMappedUpdate = true; updateMappedValue(getValue()); m_noMappedUpdate = false; } void Thumbwheel::setMinimumValue(int min) { if (m_min == min) return; m_min = min; if (m_max <= m_min) m_max = m_min + 1; if (m_value < m_min) m_value = m_min; if (m_value > m_max) m_value = m_max; m_rotation = float(m_value - m_min) / float(m_max - m_min); update(); } int Thumbwheel::getMinimumValue() const { return m_min; } void Thumbwheel::setMaximumValue(int max) { if (m_max == max) return; m_max = max; if (m_min >= m_max) m_min = m_max - 1; if (m_value < m_min) m_value = m_min; if (m_value > m_max) m_value = m_max; m_rotation = float(m_value - m_min) / float(m_max - m_min); update(); } int Thumbwheel::getMaximumValue() const { return m_max; } void Thumbwheel::setDefaultValue(int deft) { if (m_default == deft) return; m_default = deft; if (m_atDefault) { setValue(m_default); m_atDefault = true; // setValue unsets this m_cache = QImage(); emit valueChanged(getValue()); } } void Thumbwheel::setMappedValue(float mappedValue) { if (m_rangeMapper) { int newValue = m_rangeMapper->getPositionForValue(mappedValue); bool changed = (m_mappedValue != mappedValue); m_mappedValue = mappedValue; m_noMappedUpdate = true; // SVDEBUG << "Thumbwheel::setMappedValue(" << mappedValue << "): new value is " << newValue << " (visible " << isVisible() << ")" << endl; if (newValue != getValue()) { setValue(newValue); changed = true; m_cache = QImage(); } if (changed) emit valueChanged(newValue); m_noMappedUpdate = false; } else { int v = int(mappedValue); if (v != getValue()) { setValue(v); m_cache = QImage(); emit valueChanged(v); } } } int Thumbwheel::getDefaultValue() const { return m_default; } void Thumbwheel::setValue(int value) { // SVDEBUG << "Thumbwheel::setValue(" << value << ") (from " << m_value // << ", rotation " << m_rotation << ")" << " (visible " << isVisible() << ")" << endl; if (m_value != value) { m_atDefault = false; if (value < m_min) value = m_min; if (value > m_max) value = m_max; m_value = value; } m_rotation = float(m_value - m_min) / float(m_max - m_min); m_cache = QImage(); if (isVisible()) update(); } void Thumbwheel::resetToDefault() { if (m_default == m_value) return; setValue(m_default); m_atDefault = true; m_cache = QImage(); emit valueChanged(getValue()); } int Thumbwheel::getValue() const { return m_value; } float Thumbwheel::getMappedValue() const { if (m_rangeMapper) { // SVDEBUG << "Thumbwheel::getMappedValue(): value = " << getValue() << ", mappedValue = " << m_mappedValue << endl; return m_mappedValue; } return getValue(); } void Thumbwheel::updateMappedValue(int value) { if (!m_noMappedUpdate) { if (m_rangeMapper) { m_mappedValue = m_rangeMapper->getValueForPosition(value); } else { m_mappedValue = value; } } if (m_showTooltip) { QString name = objectName(); QString unit = ""; QString text; if (m_rangeMapper) unit = m_rangeMapper->getUnit(); if (name != "") { text = tr("%1: %2%3").arg(name).arg(m_mappedValue).arg(unit); } else { text = tr("%2%3").arg(m_mappedValue).arg(unit); } setToolTip(text); } } void Thumbwheel::scroll(bool up) { int step = lrintf(m_speed); if (step == 0) step = 1; if (up) { setValue(m_value + step); } else { setValue(m_value - step); } emit valueChanged(getValue()); } void Thumbwheel::setSpeed(float speed) { m_speed = speed; } float Thumbwheel::getSpeed() const { return m_speed; } void Thumbwheel::setTracking(bool tracking) { m_tracking = tracking; } bool Thumbwheel::getTracking() const { return m_tracking; } void Thumbwheel::setShowScale(bool showScale) { m_showScale = showScale; } bool Thumbwheel::getShowScale() const { return m_showScale; } void Thumbwheel::enterEvent(QEvent *) { emit mouseEntered(); } void Thumbwheel::leaveEvent(QEvent *) { emit mouseLeft(); } void Thumbwheel::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::MidButton || ((e->button() == Qt::LeftButton) && (e->modifiers() & Qt::ControlModifier))) { resetToDefault(); } else if (e->button() == Qt::LeftButton) { m_clicked = true; m_clickPos = e->pos(); m_clickRotation = m_rotation; } } void Thumbwheel::mouseDoubleClickEvent(QMouseEvent *mouseEvent) { //!!! needs a common base class with AudioDial (and Panner?) if (mouseEvent->button() != Qt::LeftButton) { return; } bool ok = false; if (m_rangeMapper) { float min = m_rangeMapper->getValueForPosition(m_min); float max = m_rangeMapper->getValueForPosition(m_max); if (min > max) { float tmp = min; min = max; max = tmp; } QString unit = m_rangeMapper->getUnit(); QString text; if (objectName() != "") { if (unit != "") { text = tr("New value for %1, from %2 to %3 %4:") .arg(objectName()).arg(min).arg(max).arg(unit); } else { text = tr("New value for %1, from %2 to %3:") .arg(objectName()).arg(min).arg(max); } } else { if (unit != "") { text = tr("Enter a new value from %1 to %2 %3:") .arg(min).arg(max).arg(unit); } else { text = tr("Enter a new value from %1 to %2:") .arg(min).arg(max); } } float newValue = QInputDialog::getDouble (this, tr("Enter new value"), text, m_mappedValue, min, max, 4, &ok); if (ok) { setMappedValue(newValue); } } else { int newValue = QInputDialog::getInt (this, tr("Enter new value"), tr("Enter a new value from %1 to %2:") .arg(m_min).arg(m_max), getValue(), m_min, m_max, 1, &ok); if (ok) { setValue(newValue); } } } void Thumbwheel::mouseMoveEvent(QMouseEvent *e) { if (!m_clicked) return; int dist = 0; if (m_orientation == Qt::Horizontal) { dist = e->x() - m_clickPos.x(); } else { dist = e->y() - m_clickPos.y(); } float rotation = m_clickRotation + (m_speed * dist) / 100; if (rotation < 0.f) rotation = 0.f; if (rotation > 1.f) rotation = 1.f; int value = lrintf(m_min + (m_max - m_min) * m_rotation); if (value != m_value) { setValue(value); if (m_tracking) emit valueChanged(getValue()); m_rotation = rotation; } else if (fabsf(rotation - m_rotation) > 0.001) { m_rotation = rotation; repaint(); } } void Thumbwheel::mouseReleaseEvent(QMouseEvent *e) { if (!m_clicked) return; bool reallyTracking = m_tracking; m_tracking = true; mouseMoveEvent(e); m_tracking = reallyTracking; m_clicked = false; } void Thumbwheel::wheelEvent(QWheelEvent *e) { int step = lrintf(m_speed); if (step == 0) step = 1; if (e->delta() > 0) { setValue(m_value + step); } else { setValue(m_value - step); } emit valueChanged(getValue()); } void Thumbwheel::paintEvent(QPaintEvent *) { Profiler profiler("Thumbwheel::paintEvent"); if (!m_cache.isNull()) { QPainter paint(this); paint.drawImage(0, 0, m_cache); return; } Profiler profiler2("Thumbwheel::paintEvent (no cache)"); m_cache = QImage(size(), QImage::Format_ARGB32); m_cache.fill(Qt::transparent); int bw = 3; QRect subclip; if (m_orientation == Qt::Horizontal) { subclip = QRect(bw, bw+1, width() - bw*2, height() - bw*2 - 2); } else { subclip = QRect(bw+1, bw, width() - bw*2 - 2, height() - bw*2); } QPainter paint(&m_cache); paint.setClipRect(rect()); paint.fillRect(subclip, palette().background().color()); paint.setRenderHint(QPainter::Antialiasing, true); float w = width(); float w0 = 0.5; float w1 = w - 0.5; float h = height(); float h0 = 0.5; float h1 = h - 0.5; for (int i = bw-1; i >= 0; --i) { int grey = (i + 1) * (256 / (bw + 1)); QColor fc = QColor(grey, grey, grey); paint.setPen(fc); QPainterPath path; if (m_orientation == Qt::Horizontal) { path.moveTo(w0 + i, h0 + i + 2); path.quadTo(w/2, i * 1.25, w1 - i, h0 + i + 2); path.lineTo(w1 - i, h1 - i - 2); path.quadTo(w/2, h - i * 1.25, w0 + i, h1 - i - 2); path.closeSubpath(); } else { path.moveTo(w0 + i + 2, h0 + i); path.quadTo(i * 1.25, h/2, w0 + i + 2, h1 - i); path.lineTo(w1 - i - 2, h1 - i); path.quadTo(w - i * 1.25, h/2, w1 - i - 2, h0 + i); path.closeSubpath(); } paint.drawPath(path); } paint.setClipRect(subclip); float radians = m_rotation * 1.5f * M_PI; // cerr << "value = " << m_value << ", min = " << m_min << ", max = " << m_max << ", rotation = " << rotation << endl; w = (m_orientation == Qt::Horizontal ? width() : height()) - bw*2; // total number of notches on the entire wheel int notches = 25; // radius of the wheel including invisible part int radius = int(w / 2 + 2); for (int i = 0; i < notches; ++i) { float a0 = (2.f * M_PI * i) / notches + radians; float a1 = a0 + M_PI / (notches * 2); float a2 = (2.f * M_PI * (i + 1)) / notches + radians; float depth = cosf((a0 + a2) / 2); if (depth < 0) continue; float x0 = radius * sinf(a0) + w/2; float x1 = radius * sinf(a1) + w/2; float x2 = radius * sinf(a2) + w/2; if (x2 < 0 || x0 > w) continue; if (x0 < 0) x0 = 0; if (x2 > w) x2 = w; x0 += bw; x1 += bw; x2 += bw; int grey = lrintf(120 * depth); QColor fc = QColor(grey, grey, grey); QColor oc = palette().highlight().color(); paint.setPen(fc); if (m_showScale) { paint.setBrush(oc); float prop; if (i >= notches / 4) { prop = float(notches - (((i - float(notches) / 4.f) * 4.f) / 3.f)) / notches; } else { prop = 0.f; } if (m_orientation == Qt::Horizontal) { paint.drawRect(QRectF(x1, height() - (height() - bw*2) * prop - bw, x2 - x1, height() * prop)); } else { paint.drawRect(QRectF(bw, x1, (width() - bw*2) * prop, x2 - x1)); } } paint.setPen(fc); paint.setBrush(palette().background().color()); if (m_orientation == Qt::Horizontal) { paint.drawRect(QRectF(x0, bw, x1 - x0, height() - bw*2)); } else { paint.drawRect(QRectF(bw, x0, width() - bw*2, x1 - x0)); } } QPainter paint2(this); paint2.drawImage(0, 0, m_cache); } QSize Thumbwheel::sizeHint() const { if (m_orientation == Qt::Horizontal) { return QSize(80, 12); } else { return QSize(12, 80); } } sonic-visualiser-2.3~repack1.orig/svgui/widgets/MIDIFileImportDialog.h0000644000175000017500000000213012252354725024537 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _MIDI_FILE_IMPORT_DIALOG_H_ #define _MIDI_FILE_IMPORT_DIALOG_H_ #include #include "data/fileio/MIDIFileReader.h" class MIDIFileImportDialog : public QObject, public MIDIFileImportPreferenceAcquirer { Q_OBJECT public: MIDIFileImportDialog(QWidget *parent = 0); virtual TrackPreference getTrackImportPreference (QStringList trackNames, bool haveSomePercussion, QString &singleTrack) const; virtual void showError(QString error); protected: QWidget *m_parent; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/ActivityLog.cpp0000644000175000017500000000427112252354725023503 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ActivityLog.h" #include #include #include #include #include #include #include #include ActivityLog::ActivityLog() : QDialog() { setWindowTitle(tr("Activity Log")); QGridLayout *layout = new QGridLayout; setLayout(layout); layout->addWidget(new QLabel(tr("

Activity Log lists your interactions and other events within %1.

").arg(QApplication::applicationName())), 0, 0); m_listView = new QListView; m_model = new QStringListModel; m_listView->setModel(m_model); layout->addWidget(m_listView, 1, 0); layout->setRowStretch(1, 10); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); connect(bb, SIGNAL(rejected()), this, SLOT(hide())); layout->addWidget(bb, 2, 0); } ActivityLog::~ActivityLog() { } void ActivityLog::activityHappened(QString name) { name = name.replace("&", ""); // SVDEBUG << "ActivityLog::activityHappened(" << name << ")" << endl; if (name == m_prevName) { // cerr << "(ignoring duplicate)" << endl; return; } m_prevName = name; int row = m_model->rowCount(); name = tr("%1: %2").arg(QTime::currentTime().toString()).arg(name); m_model->insertRows(row, 1); QModelIndex ix = m_model->index(row, 0); m_model->setData(ix, name); if (isVisible()) m_listView->scrollTo(ix); } void ActivityLog::scrollToEnd() { if (m_model->rowCount() == 0 || !isVisible()) return; QModelIndex ix = m_model->index(m_model->rowCount()-1, 0); m_listView->scrollTo(ix); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/TextAbbrev.h0000644000175000017500000001016412252354725022756 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TEXT_ABBREV_H_ #define _TEXT_ABBREV_H_ #include #include class QFontMetrics; class TextAbbrev { public: enum Policy { ElideEnd, ElideEndAndCommonPrefixes, ElideStart, ElideMiddle }; /** * Abbreviate the given text to the given maximum length * (including ellipsis), using the given abbreviation policy. If * fuzzy is true, the text will be left alone if it is "not much * more than" the maximum length. * * If ellipsis is non-empty, it will be used to show elisions in * preference to the default (which is "..."). */ static QString abbreviate(QString text, int maxLength, Policy policy = ElideEnd, bool fuzzy = true, QString ellipsis = ""); /** * Abbreviate the given text to the given maximum painted width, * using the given abbreviation policy. maxWidth is also modified * so as to return the painted width of the abbreviated text. * * If ellipsis is non-empty, it will be used to show elisions in * preference to the default (which is tr("...")). */ static QString abbreviate(QString text, const QFontMetrics &metrics, int &maxWidth, Policy policy = ElideEnd, QString ellipsis = ""); /** * Abbreviate all of the given texts to the given maximum length, * using the given abbreviation policy. If fuzzy is true, texts * that are "not much more than" the maximum length will be left * alone. * * If ellipsis is non-empty, it will be used to show elisions in * preference to the default (which is tr("...")). */ static QStringList abbreviate(const QStringList &texts, int maxLength, Policy policy = ElideEndAndCommonPrefixes, bool fuzzy = true, QString ellipsis = ""); /** * Abbreviate all of the given texts to the given maximum painted * width, using the given abbreviation policy. maxWidth is also * modified so as to return the maximum painted width of the * abbreviated texts. * * If ellipsis is non-empty, it will be used to show elisions in * preference to the default (which is tr("...")). */ static QStringList abbreviate(const QStringList &texts, const QFontMetrics &metrics, int &maxWidth, Policy policy = ElideEndAndCommonPrefixes, QString ellipsis = ""); protected: static QString getDefaultEllipsis(); static int getFuzzLength(QString ellipsis); static int getFuzzWidth(const QFontMetrics &metrics, QString ellipsis); static QString abbreviateTo(QString text, int characters, Policy policy, QString ellipsis); static QStringList elidePrefixes(const QStringList &texts, int targetReduction, QString ellipsis); static QStringList elidePrefixes(const QStringList &texts, const QFontMetrics &metrics, int targetWidthReduction, QString ellipsis); static int getPrefixLength(const QStringList &texts); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/ListInputDialog.h0000644000175000017500000000314712252354725023766 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _LIST_INPUT_DIALOG_H_ #define _LIST_INPUT_DIALOG_H_ #include #include #include #include class QRadioButton; class QLabel; /** * Like QInputDialog::getItem(), except that it offers the items as a * set of radio buttons instead of in a single combo box. */ class ListInputDialog : public QDialog { Q_OBJECT public: ListInputDialog(QWidget *parent, const QString &title, const QString &label, const QStringList &list, int current = 0); virtual ~ListInputDialog(); void setItemAvailability(int item, bool available); void setFootnote(QString footnote); QString getCurrentString() const; static QString getItem(QWidget *parent, const QString &title, const QString &label, const QStringList &list, int current = 0, bool *ok = 0); protected: QStringList m_strings; std::vector m_radioButtons; QLabel *m_footnote; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/LayerTree.h0000644000175000017500000000713312252354725022606 0ustar miramira /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _LAYER_TREE_H_ #define _LAYER_TREE_H_ #include #include class PaneStack; class View; class Pane; class Layer; class PropertyContainer; class Model; class ModelMetadataModel : public QAbstractItemModel { Q_OBJECT public: ModelMetadataModel(PaneStack *stack, bool waveModelsOnly, QObject *parent = 0); virtual ~ModelMetadataModel(); QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; protected slots: void paneAdded(); void paneDeleted(); void propertyContainerAdded(PropertyContainer *); void propertyContainerRemoved(PropertyContainer *); void propertyContainerSelected(PropertyContainer *); void propertyContainerPropertyChanged(PropertyContainer *); void playParametersAudibilityChanged(bool); void paneLayerModelChanged(); void rebuildModelSet(); protected: PaneStack *m_stack; bool m_waveModelsOnly; int m_modelTypeColumn; int m_modelNameColumn; int m_modelMakerColumn; int m_modelSourceColumn; int m_columnCount; std::set m_models; }; class LayerTreeModel : public QAbstractItemModel { Q_OBJECT public: LayerTreeModel(PaneStack *stack, QObject *parent = 0); virtual ~LayerTreeModel(); QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; protected slots: void paneAdded(); void paneAboutToBeDeleted(Pane *); void propertyContainerAdded(PropertyContainer *); void propertyContainerRemoved(PropertyContainer *); void propertyContainerSelected(PropertyContainer *); void propertyContainerPropertyChanged(PropertyContainer *); void paneLayerModelChanged(); void playParametersAudibilityChanged(bool); protected: PaneStack *m_stack; std::set m_deletedPanes; int m_layerNameColumn; int m_layerVisibleColumn; int m_layerPlayedColumn; int m_modelNameColumn; int m_columnCount; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/CSVFormatDialog.h0000644000175000017500000000302212252354725023627 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _CSV_FORMAT_DIALOG_H_ #define _CSV_FORMAT_DIALOG_H_ #include "data/fileio/CSVFormat.h" class QTableWidget; class QComboBox; class QLabel; #include class CSVFormatDialog : public QDialog { Q_OBJECT public: CSVFormatDialog(QWidget *parent, CSVFormat initialFormat, int maxDisplayCols = 5); ~CSVFormatDialog(); CSVFormat getFormat() const; protected slots: void timingTypeChanged(int type); void sampleRateChanged(QString); void windowSizeChanged(QString); void columnPurposeChanged(int purpose); void updateModelLabel(); protected: CSVFormat m_format; int m_maxDisplayCols; QComboBox *m_timingTypeCombo; QLabel *m_sampleRateLabel; QComboBox *m_sampleRateCombo; QLabel *m_windowSizeLabel; QComboBox *m_windowSizeCombo; QLabel *m_modelLabel; QList m_columnPurposeCombos; int m_fuzzyColumn; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/NotifyingPushButton.h0000644000175000017500000000221712252354725024712 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _NOTIFYING_PUSH_BUTTON_H_ #define _NOTIFYING_PUSH_BUTTON_H_ #include /** * Very trivial enhancement to QPushButton to make it emit signals when * the mouse enters and leaves (for context help). */ class NotifyingPushButton : public QPushButton { Q_OBJECT public: NotifyingPushButton(QWidget *parent = 0) : QPushButton(parent) { } virtual ~NotifyingPushButton(); signals: void mouseEntered(); void mouseLeft(); protected: virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/ItemEditDialog.cpp0000644000175000017500000002443212252354725024072 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ItemEditDialog.h" #include #include #include #include #include #include #include #include #include #include // for FLT_MIN/MAX ItemEditDialog::ItemEditDialog(size_t sampleRate, int options, QString valueUnits, QWidget *parent) : QDialog(parent), m_sampleRate(sampleRate), m_frameTimeSpinBox(0), m_realTimeSecsSpinBox(0), m_realTimeUSecsSpinBox(0), m_frameDurationSpinBox(0), m_realDurationSecsSpinBox(0), m_realDurationUSecsSpinBox(0), m_valueSpinBox(0), m_textField(0) { QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *timeBox = 0; QGroupBox *valueBox = 0; QGridLayout *subgrid = 0; int row = 0, subrow = 0; size_t singleStep = RealTime::frame2RealTime(2, sampleRate).usec() - 1; if ((options & ShowTime) || (options & ShowDuration)) { timeBox = new QGroupBox; timeBox->setTitle(tr("Timing")); grid->addWidget(timeBox, row, 0); subgrid = new QGridLayout; timeBox->setLayout(subgrid); ++row; } if (options & ShowTime) { subgrid->addWidget(new QLabel(tr("Time:")), subrow, 0); m_frameTimeSpinBox = new QSpinBox; m_frameTimeSpinBox->setMaximum(INT_MAX); m_frameTimeSpinBox->setSuffix(tr(" frames")); subgrid->addWidget(m_frameTimeSpinBox, subrow, 1, 1, 2); connect(m_frameTimeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(frameTimeChanged(int))); ++subrow; m_realTimeSecsSpinBox = new QSpinBox; m_realTimeSecsSpinBox->setMaximum(999999); m_realTimeSecsSpinBox->setSuffix(tr(" sec")); subgrid->addWidget(m_realTimeSecsSpinBox, subrow, 1); connect(m_realTimeSecsSpinBox, SIGNAL(valueChanged(int)), this, SLOT(realTimeSecsChanged(int))); m_realTimeUSecsSpinBox = new QSpinBox; m_realTimeUSecsSpinBox->setMaximum(999999); m_realTimeUSecsSpinBox->setSuffix(tr(" usec")); m_realTimeUSecsSpinBox->setSingleStep(singleStep); subgrid->addWidget(m_realTimeUSecsSpinBox, subrow, 2); connect(m_realTimeUSecsSpinBox, SIGNAL(valueChanged(int)), this, SLOT(realTimeUSecsChanged(int))); ++subrow; } if (options & ShowDuration) { subgrid->addWidget(new QLabel(tr("Duration:")), subrow, 0); m_frameDurationSpinBox = new QSpinBox; m_frameDurationSpinBox->setMaximum(INT_MAX); m_frameDurationSpinBox->setSuffix(tr(" frames")); subgrid->addWidget(m_frameDurationSpinBox, subrow, 1, 1, 2); connect(m_frameDurationSpinBox, SIGNAL(valueChanged(int)), this, SLOT(frameDurationChanged(int))); ++subrow; m_realDurationSecsSpinBox = new QSpinBox; m_realDurationSecsSpinBox->setMaximum(999999); m_realDurationSecsSpinBox->setSuffix(tr(" sec")); subgrid->addWidget(m_realDurationSecsSpinBox, subrow, 1); connect(m_realDurationSecsSpinBox, SIGNAL(valueChanged(int)), this, SLOT(realDurationSecsChanged(int))); m_realDurationUSecsSpinBox = new QSpinBox; m_realDurationUSecsSpinBox->setMaximum(999999); m_realDurationUSecsSpinBox->setSuffix(tr(" usec")); m_realDurationUSecsSpinBox->setSingleStep(singleStep); subgrid->addWidget(m_realDurationUSecsSpinBox, subrow, 2); connect(m_realDurationUSecsSpinBox, SIGNAL(valueChanged(int)), this, SLOT(realDurationUSecsChanged(int))); ++subrow; } if ((options & ShowValue) || (options & ShowText)) { valueBox = new QGroupBox; valueBox->setTitle(tr("Properties")); grid->addWidget(valueBox, row, 0); subgrid = new QGridLayout; valueBox->setLayout(subgrid); ++row; } subrow = 0; if (options & ShowValue) { subgrid->addWidget(new QLabel(tr("Value:")), subrow, 0); m_valueSpinBox = new QDoubleSpinBox; m_valueSpinBox->setSuffix(QString(" %1").arg(valueUnits)); m_valueSpinBox->setDecimals(10); m_valueSpinBox->setMinimum(-1e10); m_valueSpinBox->setMaximum(1e10); connect(m_valueSpinBox, SIGNAL(valueChanged(double)), this, SLOT(valueChanged(double))); subgrid->addWidget(m_valueSpinBox, subrow, 1); ++subrow; } if (options & ShowText) { subgrid->addWidget(new QLabel(tr("Text:")), subrow, 0); m_textField = new QLineEdit; connect(m_textField, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString))); subgrid->addWidget(m_textField, subrow, 1); ++subrow; } if (options & ShowText) { m_textField->setFocus(Qt::OtherFocusReason); } else if (options & ShowValue) { m_valueSpinBox->setFocus(Qt::OtherFocusReason); } QDialogButtonBox *bb = new QDialogButtonBox(Qt::Horizontal); grid->addWidget(bb, row, 0, 1, 2); QPushButton *ok = new QPushButton(tr("OK")); m_resetButton = new QPushButton(tr("Reset")); QPushButton *cancel = new QPushButton(tr("Cancel")); bb->addButton(ok, QDialogButtonBox::AcceptRole); bb->addButton(m_resetButton, QDialogButtonBox::ResetRole); bb->addButton(cancel, QDialogButtonBox::RejectRole); connect(ok, SIGNAL(clicked()), this, SLOT(accept())); connect(m_resetButton, SIGNAL(clicked()), this, SLOT(reset())); connect(cancel, SIGNAL(clicked()), this, SLOT(reject())); m_resetButton->setEnabled(false); } void ItemEditDialog::setFrameTime(long frame) { if (!m_frameTimeSpinBox) return; RealTime rt(RealTime::frame2RealTime(frame, m_sampleRate)); m_realTimeSecsSpinBox->setValue(rt.sec); m_realTimeUSecsSpinBox->setValue(rt.usec()); m_frameTimeSpinBox->setValue(frame); m_defaultFrame = frame; m_resetButton->setEnabled(false); } long ItemEditDialog::getFrameTime() const { return m_frameTimeSpinBox->value(); } void ItemEditDialog::setRealTime(RealTime rt) { setFrameTime(RealTime::realTime2Frame(rt, m_sampleRate)); } RealTime ItemEditDialog::getRealTime() const { return RealTime::frame2RealTime(getFrameTime(), m_sampleRate); } void ItemEditDialog::setFrameDuration(long duration) { if (!m_frameDurationSpinBox) return; RealTime rt(RealTime::frame2RealTime(duration, m_sampleRate)); m_realDurationSecsSpinBox->setValue(rt.sec); m_realDurationUSecsSpinBox->setValue(rt.usec()); m_frameDurationSpinBox->setValue(duration); m_defaultDuration = duration; m_resetButton->setEnabled(false); } long ItemEditDialog::getFrameDuration() const { return m_frameDurationSpinBox->value(); } void ItemEditDialog::setRealDuration(RealTime rt) { setFrameDuration(RealTime::realTime2Frame(rt, m_sampleRate)); } RealTime ItemEditDialog::getRealDuration() const { return RealTime::frame2RealTime(getFrameDuration(), m_sampleRate); } void ItemEditDialog::setValue(float v) { if (!m_valueSpinBox) return; m_valueSpinBox->setValue(v); m_defaultValue = v; m_resetButton->setEnabled(false); } float ItemEditDialog::getValue() const { return m_valueSpinBox->value(); } void ItemEditDialog::setText(QString text) { if (!m_textField) return; m_textField->setText(text); m_defaultText = text; m_resetButton->setEnabled(false); } QString ItemEditDialog::getText() const { return m_textField->text(); } void ItemEditDialog::frameTimeChanged(int i) { m_realTimeSecsSpinBox->blockSignals(true); m_realTimeUSecsSpinBox->blockSignals(true); RealTime rt(RealTime::frame2RealTime(i, m_sampleRate)); m_realTimeSecsSpinBox->setValue(rt.sec); m_realTimeUSecsSpinBox->setValue(rt.usec()); m_realTimeSecsSpinBox->blockSignals(false); m_realTimeUSecsSpinBox->blockSignals(false); m_resetButton->setEnabled(true); } void ItemEditDialog::realTimeSecsChanged(int i) { RealTime rt = getRealTime(); rt.sec = i; size_t frame = RealTime::realTime2Frame(rt, m_sampleRate); m_frameTimeSpinBox->setValue(frame); m_resetButton->setEnabled(true); } void ItemEditDialog::realTimeUSecsChanged(int i) { RealTime rt = getRealTime(); rt.nsec = i * 1000; size_t frame = RealTime::realTime2Frame(rt, m_sampleRate); m_frameTimeSpinBox->setValue(frame); m_resetButton->setEnabled(true); } void ItemEditDialog::frameDurationChanged(int i) { m_realDurationSecsSpinBox->blockSignals(true); m_realDurationUSecsSpinBox->blockSignals(true); RealTime rt(RealTime::frame2RealTime(i, m_sampleRate)); m_realDurationSecsSpinBox->setValue(rt.sec); m_realDurationUSecsSpinBox->setValue(rt.usec()); m_realDurationSecsSpinBox->blockSignals(false); m_realDurationUSecsSpinBox->blockSignals(false); m_resetButton->setEnabled(true); } void ItemEditDialog::realDurationSecsChanged(int i) { RealTime rt = getRealDuration(); rt.sec = i; size_t frame = RealTime::realTime2Frame(rt, m_sampleRate); m_frameDurationSpinBox->setValue(frame); m_resetButton->setEnabled(true); } void ItemEditDialog::realDurationUSecsChanged(int i) { RealTime rt = getRealDuration(); rt.nsec = i * 1000; size_t frame = RealTime::realTime2Frame(rt, m_sampleRate); m_frameDurationSpinBox->setValue(frame); m_resetButton->setEnabled(true); } void ItemEditDialog::valueChanged(double) { m_resetButton->setEnabled(true); } void ItemEditDialog::textChanged(QString) { m_resetButton->setEnabled(true); } void ItemEditDialog::reset() { setFrameTime(m_defaultFrame); setFrameDuration(m_defaultDuration); setValue(m_defaultValue); setText(m_defaultText); m_resetButton->setEnabled(false); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/ProgressDialog.cpp0000644000175000017500000000512412252354725024167 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ProgressDialog.h" #include #include #include ProgressDialog::ProgressDialog(QString message, bool cancellable, int timeBeforeShow, QWidget *parent) : m_showTimer(0), m_timerElapsed(false), m_cancelled(false) { m_dialog = new QProgressDialog(message, cancellable ? tr("Cancel") : 0, 0, 100, parent); if (timeBeforeShow > 0) { m_dialog->hide(); m_showTimer = new QTimer; connect(m_showTimer, SIGNAL(timeout()), this, SLOT(showTimerElapsed())); m_showTimer->setSingleShot(true); m_showTimer->start(timeBeforeShow); } else { m_dialog->show(); m_dialog->raise(); m_timerElapsed = true; } if (cancellable) { connect(m_dialog, SIGNAL(canceled()), this, SLOT(canceled())); } } ProgressDialog::~ProgressDialog() { delete m_showTimer; delete m_dialog; } bool ProgressDialog::isDefinite() const { return (m_dialog->maximum() > 0); } void ProgressDialog::setDefinite(bool definite) { if (definite) m_dialog->setMaximum(100); else m_dialog->setMaximum(0); } void ProgressDialog::setMessage(QString text) { m_dialog->setLabelText(text); } void ProgressDialog::canceled() { m_cancelled = true; emit cancelled(); } bool ProgressDialog::wasCancelled() const { return m_cancelled; } void ProgressDialog::showTimerElapsed() { m_timerElapsed = true; if (m_dialog->value() > 0) { emit showing(); m_dialog->show(); } qApp->processEvents(); } void ProgressDialog::setProgress(int percentage) { if (percentage > m_dialog->value()) { m_dialog->setValue(percentage); if (percentage >= 100 && isDefinite()) { m_dialog->hide(); } else if (m_timerElapsed && !m_dialog->isVisible()) { emit showing(); m_dialog->show(); m_dialog->raise(); } qApp->processEvents(); } } sonic-visualiser-2.3~repack1.orig/svgui/widgets/ProgressDialog.h0000644000175000017500000000260212252354725023632 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007-2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PROGRESS_DIALOG_H_ #include "base/ProgressReporter.h" class QProgressDialog; class QTimer; class ProgressDialog : public ProgressReporter { Q_OBJECT public: ProgressDialog(QString message, bool cancellable, int timeBeforeShow = 0, QWidget *parent = 0); virtual ~ProgressDialog(); virtual bool isDefinite() const; virtual void setDefinite(bool definite); virtual bool wasCancelled() const; signals: void showing(); void cancelled(); public slots: virtual void setMessage(QString text); virtual void setProgress(int percentage); protected slots: virtual void showTimerElapsed(); void canceled(); protected: QProgressDialog *m_dialog; QTimer *m_showTimer; bool m_timerElapsed; bool m_cancelled; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/InteractiveFileFinder.h0000644000175000017500000000277712252354725025130 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _INTERACTIVE_FILE_FINDER_H_ #define _INTERACTIVE_FILE_FINDER_H_ #include "data/fileio/FileFinder.h" #include #include class InteractiveFileFinder : public QObject, public FileFinder { Q_OBJECT public: virtual ~InteractiveFileFinder(); QString getOpenFileName(FileType type, QString fallbackLocation = ""); QString getSaveFileName(FileType type, QString fallbackLocation = ""); void registerLastOpenedFilePath(FileType type, QString path); QString find(FileType type, QString location, QString lastKnownLocation = ""); static InteractiveFileFinder *getInstance() { return &m_instance; } protected: InteractiveFileFinder(); static InteractiveFileFinder m_instance; QString findRelative(QString location, QString relativeTo); QString locateInteractive(FileType type, QString thing); QString m_lastLocatedLocation; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/PluginParameterBox.cpp0000644000175000017500000003130312252354725025011 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PluginParameterBox.h" #include "AudioDial.h" #include "plugin/PluginXml.h" #include "plugin/RealTimePluginInstance.h" // for PortHint stuff #include "base/RangeMapper.h" #include #include #include #include #include #include #include #include #include PluginParameterBox::PluginParameterBox(Vamp::PluginBase *plugin, QWidget *parent) : QFrame(parent), m_plugin(plugin), m_programCombo(0) { m_layout = new QGridLayout; setLayout(m_layout); populate(); } PluginParameterBox::~PluginParameterBox() { } void PluginParameterBox::populate() { Vamp::PluginBase::ParameterList params = m_plugin->getParameterDescriptors(); m_programs = m_plugin->getPrograms(); m_params.clear(); if (params.empty() && m_programs.empty()) { m_layout->addWidget (new QLabel(tr("This plugin has no adjustable parameters.")), 0, 0); } int offset = 0; if (!m_programs.empty()) { std::string currentProgram = m_plugin->getCurrentProgram(); m_programCombo = new QComboBox; m_programCombo->setMaxVisibleItems (m_programs.size() < 25 ? m_programs.size() : 20); for (size_t i = 0; i < m_programs.size(); ++i) { m_programCombo->addItem(m_programs[i].c_str()); if (m_programs[i] == currentProgram) { m_programCombo->setCurrentIndex(i); } } m_layout->addWidget(new QLabel(tr("Program")), 0, 0); m_layout->addWidget(m_programCombo, 0, 1, 1, 2); connect(m_programCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(programComboChanged(const QString &))); offset = 1; } for (size_t i = 0; i < params.size(); ++i) { QString identifier = params[i].identifier.c_str(); QString name = params[i].name.c_str(); QString unit = params[i].unit.c_str(); float min = params[i].minValue; float max = params[i].maxValue; float deft = params[i].defaultValue; float value = m_plugin->getParameter(params[i].identifier); int hint = PortHint::NoHint; RealTimePluginInstance *rtpi = dynamic_cast (m_plugin); if (rtpi) { hint = rtpi->getParameterDisplayHint(i); } float qtz = 0.0; if (params[i].isQuantized) qtz = params[i].quantizeStep; // cerr << "PluginParameterBox: hint = " << hint << ", min = " << min << ", max = " // << max << ", qtz = " << qtz << endl; std::vector valueNames = params[i].valueNames; // construct an integer range int imin = 0, imax = 100; if (!(hint & PortHint::Logarithmic)) { if (qtz > 0.0) { imax = lrintf((max - min) / qtz); } else { qtz = (max - min) / 100.0; } } //!!! would be nice to ensure the default value corresponds to // an integer! QLabel *label = new QLabel(name); if (params[i].description != "") { label->setToolTip(params[i].description.c_str()); } m_layout->addWidget(label, i + offset, 0); ParamRec rec; rec.param = params[i]; rec.dial = 0; rec.spin = 0; rec.check = 0; rec.combo = 0; if (params[i].isQuantized && !valueNames.empty()) { QComboBox *combobox = new QComboBox; combobox->setObjectName(identifier); for (unsigned int j = 0; j < valueNames.size(); ++j) { combobox->addItem(valueNames[j].c_str()); if ((unsigned int)(lrintf(fabsf((value - min) / qtz))) == j) { combobox->setCurrentIndex(j); } } connect(combobox, SIGNAL(activated(int)), this, SLOT(dialChanged(int))); m_layout->addWidget(combobox, i + offset, 1, 1, 2); rec.combo = combobox; } else if (min == 0.0 && max == 1.0 && qtz == 1.0) { QCheckBox *checkbox = new QCheckBox; checkbox->setObjectName(identifier); checkbox->setCheckState(value < 0.5 ? Qt::Unchecked : Qt::Checked); connect(checkbox, SIGNAL(stateChanged(int)), this, SLOT(checkBoxChanged(int))); m_layout->addWidget(checkbox, i + offset, 2); rec.check = checkbox; } else { AudioDial *dial = new AudioDial; dial->setObjectName(name); dial->setMinimum(imin); dial->setMaximum(imax); dial->setPageStep(1); dial->setNotchesVisible((imax - imin) <= 12); //!!! dial->setDefaultValue(lrintf((deft - min) / qtz)); // dial->setValue(lrintf((value - min) / qtz)); dial->setFixedWidth(32); dial->setFixedHeight(32); RangeMapper *rm = 0; if (hint & PortHint::Logarithmic) { rm = new LogRangeMapper(imin, imax, min, max, unit); } else { rm = new LinearRangeMapper(imin, imax, min, max, unit); } dial->setRangeMapper(rm); dial->setDefaultValue(rm->getPositionForValue(deft)); dial->setValue(rm->getPositionForValue(value)); dial->setShowToolTip(true); connect(dial, SIGNAL(valueChanged(int)), this, SLOT(dialChanged(int))); m_layout->addWidget(dial, i + offset, 1); QDoubleSpinBox *spinbox = new QDoubleSpinBox; spinbox->setObjectName(identifier); spinbox->setMinimum(min); spinbox->setMaximum(max); spinbox->setSuffix(QString(" %1").arg(unit)); if (qtz != 0) spinbox->setSingleStep(qtz); spinbox->setValue(value); spinbox->setDecimals(4); connect(spinbox, SIGNAL(valueChanged(double)), this, SLOT(spinBoxChanged(double))); m_layout->addWidget(spinbox, i + offset, 2); rec.dial = dial; rec.spin = spinbox; } m_params[identifier] = rec; m_nameMap[name] = identifier; } } void PluginParameterBox::dialChanged(int ival) { QObject *obj = sender(); QString identifier = obj->objectName(); if (m_params.find(identifier) == m_params.end() && m_nameMap.find(identifier) != m_nameMap.end()) { identifier = m_nameMap[identifier]; } if (m_params.find(identifier) == m_params.end()) { cerr << "WARNING: PluginParameterBox::dialChanged: Unknown parameter \"" << identifier << "\"" << endl; return; } Vamp::PluginBase::ParameterDescriptor params = m_params[identifier].param; float min = params.minValue; float max = params.maxValue; float newValue; float qtz = 0.0; if (params.isQuantized) qtz = params.quantizeStep; AudioDial *ad = dynamic_cast(obj); if (ad && ad->rangeMapper()) { newValue = ad->mappedValue(); if (newValue < min) newValue = min; if (newValue > max) newValue = max; if (qtz != 0.0) { ival = lrintf((newValue - min) / qtz); newValue = min + ival * qtz; } } else { if (qtz == 0.0) { qtz = (max - min) / 100.0; } newValue = min + ival * qtz; } // SVDEBUG << "PluginParameterBox::dialChanged: newValue = " << newValue << endl; QDoubleSpinBox *spin = m_params[identifier].spin; if (spin) { spin->blockSignals(true); spin->setValue(newValue); spin->blockSignals(false); } // SVDEBUG << "setting plugin parameter \"" << identifier << "\" to value " << newValue << endl; m_plugin->setParameter(identifier.toStdString(), newValue); updateProgramCombo(); emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString()); } void PluginParameterBox::checkBoxChanged(int state) { QObject *obj = sender(); QString identifier = obj->objectName(); if (m_params.find(identifier) == m_params.end() && m_nameMap.find(identifier) != m_nameMap.end()) { identifier = m_nameMap[identifier]; } if (m_params.find(identifier) == m_params.end()) { cerr << "WARNING: PluginParameterBox::checkBoxChanged: Unknown parameter \"" << identifier << "\"" << endl; return; } Vamp::PluginBase::ParameterDescriptor params = m_params[identifier].param; if (state) m_plugin->setParameter(identifier.toStdString(), 1.0); else m_plugin->setParameter(identifier.toStdString(), 0.0); updateProgramCombo(); emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString()); } void PluginParameterBox::spinBoxChanged(double value) { QObject *obj = sender(); QString identifier = obj->objectName(); if (m_params.find(identifier) == m_params.end() && m_nameMap.find(identifier) != m_nameMap.end()) { identifier = m_nameMap[identifier]; } if (m_params.find(identifier) == m_params.end()) { cerr << "WARNING: PluginParameterBox::spinBoxChanged: Unknown parameter \"" << identifier << "\"" << endl; return; } Vamp::PluginBase::ParameterDescriptor params = m_params[identifier].param; float min = params.minValue; float max = params.maxValue; float qtz = 0.0; if (params.isQuantized) qtz = params.quantizeStep; if (qtz > 0.0) { int step = lrintf((value - min) / qtz); value = min + step * qtz; } int imax = 100; if (qtz > 0.0) { imax = lrintf((max - min) / qtz); } else { qtz = (max - min) / 100.0; } int ival = lrintf((value - min) / qtz); AudioDial *dial = m_params[identifier].dial; if (dial) { dial->blockSignals(true); if (dial->rangeMapper()) { dial->setMappedValue(value); } else { dial->setValue(ival); } dial->blockSignals(false); } SVDEBUG << "setting plugin parameter \"" << identifier << "\" to value " << value << endl; m_plugin->setParameter(identifier.toStdString(), value); updateProgramCombo(); emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString()); } void PluginParameterBox::programComboChanged(const QString &newProgram) { m_plugin->selectProgram(newProgram.toStdString()); for (std::map::iterator i = m_params.begin(); i != m_params.end(); ++i) { Vamp::PluginBase::ParameterDescriptor ¶m = i->second.param; float value = m_plugin->getParameter(param.identifier); if (i->second.spin) { i->second.spin->blockSignals(true); i->second.spin->setValue(value); i->second.spin->blockSignals(false); } if (i->second.dial) { float min = param.minValue; float max = param.maxValue; float qtz = 0.0; if (param.isQuantized) qtz = param.quantizeStep; if (qtz == 0.0) { qtz = (max - min) / 100.0; } i->second.dial->blockSignals(true); i->second.dial->setValue(lrintf((value - min) / qtz)); i->second.dial->blockSignals(false); } if (i->second.combo) { i->second.combo->blockSignals(true); i->second.combo->setCurrentIndex(lrintf(value)); i->second.combo->blockSignals(false); } if (i->second.check) { i->second.check->blockSignals(true); i->second.check->setCheckState(value < 0.5 ? Qt::Unchecked : Qt::Checked); i->second.check->blockSignals(false); } } emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString()); } void PluginParameterBox::updateProgramCombo() { if (!m_programCombo || m_programs.empty()) return; std::string currentProgram = m_plugin->getCurrentProgram(); for (size_t i = 0; i < m_programs.size(); ++i) { if (m_programs[i] == currentProgram) { m_programCombo->setCurrentIndex(i); } } } sonic-visualiser-2.3~repack1.orig/svgui/widgets/ModelDataTableDialog.cpp0000644000175000017500000002207712252354725025173 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ModelDataTableDialog.h" #include "data/model/ModelDataTableModel.h" #include "data/model/TabularModel.h" #include "data/model/Model.h" #include "CommandHistory.h" #include "IconLoader.h" #include #include #include #include #include #include #include #include #include #include #include #include ModelDataTableDialog::ModelDataTableDialog(TabularModel *model, QString title, QWidget *parent) : QMainWindow(parent), m_currentRow(0), m_trackPlayback(true) { setWindowTitle(tr("Data Editor")); QToolBar *toolbar; toolbar = addToolBar(tr("Playback Toolbar")); m_playToolbar = toolbar; toolbar = addToolBar(tr("Play Mode Toolbar")); IconLoader il; QAction *action = new QAction(il.load("playfollow"), tr("Track Playback"), this); action->setStatusTip(tr("Toggle tracking of playback position")); action->setCheckable(true); action->setChecked(m_trackPlayback); connect(action, SIGNAL(triggered()), this, SLOT(togglePlayTracking())); toolbar->addAction(action); toolbar = addToolBar(tr("Edit Toolbar")); action = new QAction(il.load("datainsert"), tr("Insert New Item"), this); action->setShortcut(tr("Insert")); action->setStatusTip(tr("Insert a new item")); connect(action, SIGNAL(triggered()), this, SLOT(insertRow())); toolbar->addAction(action); action = new QAction(il.load("datadelete"), tr("Delete Selected Items"), this); action->setShortcut(tr("Delete")); action->setStatusTip(tr("Delete the selected item or items")); connect(action, SIGNAL(triggered()), this, SLOT(deleteRows())); toolbar->addAction(action); CommandHistory::getInstance()->registerToolbar(toolbar); /* action = new QAction(il.load("dataedit"), tr("Edit Selected Item"), this); action->setShortcut(tr("Edit")); action->setStatusTip(tr("Edit the selected item")); connect(action, SIGNAL(triggered()), this, SLOT(editRow())); toolbar->addAction(action); */ QFrame *mainFrame = new QFrame; setCentralWidget(mainFrame); QGridLayout *grid = new QGridLayout; mainFrame->setLayout(grid); QGroupBox *box = new QGroupBox; if (title != "") { box->setTitle(title); } else { box->setTitle(tr("Data in Layer")); } grid->addWidget(box, 0, 0); grid->setRowStretch(0, 15); QGridLayout *subgrid = new QGridLayout; box->setLayout(subgrid); subgrid->setSpacing(0); subgrid->setMargin(5); subgrid->addWidget(new QLabel(tr("Find:")), 1, 0); subgrid->addWidget(new QLabel(tr(" ")), 1, 1); m_find = new QLineEdit; subgrid->addWidget(m_find, 1, 2); connect(m_find, SIGNAL(textChanged(const QString &)), this, SLOT(searchTextChanged(const QString &))); connect(m_find, SIGNAL(returnPressed()), this, SLOT(searchRepeated())); m_tableView = new QTableView; subgrid->addWidget(m_tableView, 0, 0, 1, 3); m_tableView->setSortingEnabled(true); m_tableView->sortByColumn(0, Qt::AscendingOrder); m_table = new ModelDataTableModel(model); m_tableView->setModel(m_table); m_tableView->horizontalHeader()->setStretchLastSection(true); connect(m_tableView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(viewClicked(const QModelIndex &))); connect(m_tableView, SIGNAL(pressed(const QModelIndex &)), this, SLOT(viewPressed(const QModelIndex &))); connect(m_tableView->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(currentChanged(const QModelIndex &, const QModelIndex &))); connect(m_table, SIGNAL(addCommand(Command *)), this, SLOT(addCommand(Command *))); connect(m_table, SIGNAL(currentChanged(const QModelIndex &)), this, SLOT(currentChangedThroughResort(const QModelIndex &))); connect(m_table, SIGNAL(modelRemoved()), this, SLOT(modelRemoved())); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); connect(bb, SIGNAL(rejected()), this, SLOT(close())); grid->addWidget(bb, 2, 0); grid->setRowStretch(2, 0); QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = available.width() / 3; int height = available.height() / 2; if (height < 370) { if (available.height() > 500) height = 370; } if (width < 650) { if (available.width() > 750) width = 650; else if (width < 500) { if (available.width() > 650) width = 500; } } resize(width, height); } ModelDataTableDialog::~ModelDataTableDialog() { delete m_table; } void ModelDataTableDialog::userScrolledToFrame(unsigned long frame) { QModelIndex index = m_table->getModelIndexForFrame(frame); makeCurrent(index.row()); } void ModelDataTableDialog::playbackScrolledToFrame(unsigned long frame) { if (m_trackPlayback) { QModelIndex index = m_table->getModelIndexForFrame(frame); makeCurrent(index.row()); } } void ModelDataTableDialog::searchTextChanged(const QString &text) { QModelIndex mi = m_table->findText(text); if (mi.isValid()) { makeCurrent(mi.row()); m_tableView->selectionModel()->setCurrentIndex (mi, QItemSelectionModel::ClearAndSelect); } } void ModelDataTableDialog::searchRepeated() { QModelIndex mi = m_table->findText(m_find->text()); if (mi.isValid()) { makeCurrent(mi.row()); m_tableView->selectionModel()->setCurrentIndex (mi, QItemSelectionModel::ClearAndSelect); } } void ModelDataTableDialog::makeCurrent(int row) { int rh = m_tableView->height() / m_tableView->rowHeight(0); int topRow = row - rh/4; if (topRow < 0) topRow = 0; // should only scroll if the desired row is not currently visible // should only select if no part of the desired row is currently selected // cerr << "rh = " << rh << ", row = " << row << ", scrolling to " // << topRow << endl; int pos = m_tableView->rowViewportPosition(row); if (pos < 0 || pos >= m_tableView->height() - rh) { m_tableView->scrollTo(m_table->index(topRow, 0)); } bool haveRowSelected = false; for (int i = 0; i < m_table->columnCount(); ++i) { if (m_tableView->selectionModel()->isSelected(m_table->index(row, i))) { haveRowSelected = true; break; } } if (!haveRowSelected) { m_tableView->selectionModel()->setCurrentIndex (m_table->index(row, 0), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } } void ModelDataTableDialog::viewClicked(const QModelIndex &index) { // SVDEBUG << "ModelDataTableDialog::viewClicked: " << index.row() << ", " << index.column() << endl; emit scrollToFrame(m_table->getFrameForModelIndex(index)); } void ModelDataTableDialog::viewPressed(const QModelIndex &index) { // SVDEBUG << "ModelDataTableDialog::viewPressed: " << index.row() << ", " << index.column() << endl; } void ModelDataTableDialog::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { // SVDEBUG << "ModelDataTableDialog::currentChanged: from " // << previous.row() << ", " << previous.column() // << " to " << current.row() << ", " << current.column() // << endl; m_currentRow = current.row(); m_table->setCurrentRow(m_currentRow); } void ModelDataTableDialog::insertRow() { m_table->insertRow(m_currentRow); } void ModelDataTableDialog::deleteRows() { // not efficient while (m_tableView->selectionModel()->hasSelection()) { m_table->removeRow (m_tableView->selectionModel()->selection().indexes().begin()->row()); } } void ModelDataTableDialog::editRow() { } void ModelDataTableDialog::addCommand(Command *command) { CommandHistory::getInstance()->addCommand(command, false, true); } void ModelDataTableDialog::togglePlayTracking() { m_trackPlayback = !m_trackPlayback; } void ModelDataTableDialog::currentChangedThroughResort(const QModelIndex &index) { // SVDEBUG << "ModelDataTableDialog::currentChangedThroughResort: row = " << index.row() << endl; // m_tableView->scrollTo(index); makeCurrent(index.row()); } void ModelDataTableDialog::modelRemoved() { close(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/LayerTreeDialog.cpp0000644000175000017500000000615112252354725024260 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "LayerTreeDialog.h" #include "LayerTree.h" #include "view/PaneStack.h" #include #include #include #include #include #include #include #include LayerTreeDialog::LayerTreeDialog(PaneStack *stack, QWidget *parent) : QDialog(parent), m_paneStack(stack) { setWindowTitle(tr("Layer Summary")); QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *modelBox = new QGroupBox; modelBox->setTitle(tr("Audio Data Sources")); grid->addWidget(modelBox, 0, 0); grid->setRowStretch(0, 15); QGridLayout *subgrid = new QGridLayout; modelBox->setLayout(subgrid); subgrid->setSpacing(0); subgrid->setMargin(5); m_modelView = new QTableView; subgrid->addWidget(m_modelView); m_modelView->verticalHeader()->hide(); #if (QT_VERSION >= 0x050000) m_modelView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); #else m_modelView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); #endif m_modelView->setShowGrid(false); m_modelModel = new ModelMetadataModel(m_paneStack, true); m_modelView->setModel(m_modelModel); QGroupBox *layerBox = new QGroupBox; layerBox->setTitle(tr("Panes and Layers")); grid->addWidget(layerBox, 1, 0); grid->setRowStretch(1, 20); subgrid = new QGridLayout; layerBox->setLayout(subgrid); subgrid->setSpacing(0); subgrid->setMargin(5); m_layerView = new QTreeView; #if (QT_VERSION >= 0x050000) m_layerView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); #else m_layerView->header()->setResizeMode(QHeaderView::ResizeToContents); #endif subgrid->addWidget(m_layerView); m_layerModel = new LayerTreeModel(m_paneStack); m_layerView->setModel(m_layerModel); m_layerView->expandAll(); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); grid->addWidget(bb, 2, 0); grid->setRowStretch(2, 0); QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = available.width() / 2; int height = available.height() / 3; if (height < 370) { if (available.height() > 500) height = 370; } if (width < 500) { if (available.width() > 650) width = 500; } resize(width, height); } LayerTreeDialog::~LayerTreeDialog() { delete m_layerModel; } sonic-visualiser-2.3~repack1.orig/svgui/widgets/CSVFormatDialog.cpp0000644000175000017500000002706312252354725024175 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "CSVFormatDialog.h" #include "layer/LayerFactory.h" #include "TextAbbrev.h" #include #include #include #include #include #include #include #include #include #include #include "base/Debug.h" CSVFormatDialog::CSVFormatDialog(QWidget *parent, CSVFormat format, int maxDisplayCols) : QDialog(parent), m_format(format), m_maxDisplayCols(maxDisplayCols), m_fuzzyColumn(-1) { setModal(true); setWindowTitle(tr("Select Data Format")); QGridLayout *layout = new QGridLayout; int row = 0; layout->addWidget(new QLabel(tr("Please select the correct data format for this file.")), row++, 0, 1, 4); QFrame *exampleFrame = new QFrame; exampleFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); exampleFrame->setLineWidth(2); QGridLayout *exampleLayout = new QGridLayout; exampleLayout->setSpacing(4); exampleFrame->setLayout(exampleLayout); QPalette palette = exampleFrame->palette(); palette.setColor(QPalette::Window, palette.color(QPalette::Base)); exampleFrame->setPalette(palette); QFont fp; fp.setPointSize(fp.pointSize() * 0.9); // fp.setFixedPitch(true); // fp.setStyleHint(QFont::TypeWriter); // fp.setFamily("Monospaced"); int columns = format.getColumnCount(); QList example = m_format.getExample(); for (int i = 0; i < columns; ++i) { QComboBox *cpc = new QComboBox; m_columnPurposeCombos.push_back(cpc); exampleLayout->addWidget(cpc, 0, i); connect(cpc, SIGNAL(activated(int)), this, SLOT(columnPurposeChanged(int))); if (i == m_maxDisplayCols && columns > i + 2) { m_fuzzyColumn = i; cpc->addItem(tr("")); cpc->addItem(tr("Values")); cpc->setCurrentIndex (m_format.getColumnPurpose(i-1) == CSVFormat::ColumnUnknown ? 0 : 1); exampleLayout->addWidget(new QLabel(tr("(%1 more)").arg(columns - i)), 1, i); break; } // NB must be in the same order as the CSVFormat::ColumnPurpose enum cpc->addItem(tr("")); // ColumnUnknown cpc->addItem(tr("Time")); // ColumnStartTime cpc->addItem(tr("End time")); // ColumnEndTime cpc->addItem(tr("Duration")); // ColumnDuration cpc->addItem(tr("Value")); // ColumnValue cpc->addItem(tr("Label")); // ColumnLabel cpc->setCurrentIndex(int(m_format.getColumnPurpose(i))); for (int j = 0; j < example.size() && j < 6; ++j) { QLabel *label = new QLabel; label->setTextFormat(Qt::PlainText); QString text = TextAbbrev::abbreviate(example[j][i], 35); label->setText(text); label->setFont(fp); label->setPalette(palette); label->setIndent(8); exampleLayout->addWidget(label, j+1, i); } } layout->addWidget(exampleFrame, row, 0, 1, 4); layout->setColumnStretch(3, 10); layout->setRowStretch(row++, 10); layout->addWidget(new QLabel(tr("Timing is specified:")), row, 0); m_timingTypeCombo = new QComboBox; m_timingTypeCombo->addItem(tr("Explicitly, in seconds")); m_timingTypeCombo->addItem(tr("Explicitly, in audio sample frames")); m_timingTypeCombo->addItem(tr("Implicitly: rows are equally spaced in time")); layout->addWidget(m_timingTypeCombo, row++, 1, 1, 2); connect(m_timingTypeCombo, SIGNAL(activated(int)), this, SLOT(timingTypeChanged(int))); m_timingTypeCombo->setCurrentIndex (m_format.getTimingType() == CSVFormat::ExplicitTiming ? m_format.getTimeUnits() == CSVFormat::TimeSeconds ? 0 : 1 : 2); m_sampleRateLabel = new QLabel(tr("Audio sample rate (Hz):")); layout->addWidget(m_sampleRateLabel, row, 0); size_t sampleRates[] = { 8000, 11025, 12000, 22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000 }; m_sampleRateCombo = new QComboBox; for (size_t i = 0; i < sizeof(sampleRates) / sizeof(sampleRates[0]); ++i) { m_sampleRateCombo->addItem(QString("%1").arg(sampleRates[i])); if (sampleRates[i] == m_format.getSampleRate()) { m_sampleRateCombo->setCurrentIndex(i); } } m_sampleRateCombo->setEditable(true); layout->addWidget(m_sampleRateCombo, row++, 1); connect(m_sampleRateCombo, SIGNAL(activated(QString)), this, SLOT(sampleRateChanged(QString))); connect(m_sampleRateCombo, SIGNAL(editTextChanged(QString)), this, SLOT(sampleRateChanged(QString))); m_windowSizeLabel = new QLabel(tr("Frame increment between rows:")); layout->addWidget(m_windowSizeLabel, row, 0); m_windowSizeCombo = new QComboBox; for (int i = 0; i <= 16; ++i) { int value = 1 << i; m_windowSizeCombo->addItem(QString("%1").arg(value)); if (value == int(m_format.getWindowSize())) { m_windowSizeCombo->setCurrentIndex(i); } } m_windowSizeCombo->setEditable(true); layout->addWidget(m_windowSizeCombo, row++, 1); connect(m_windowSizeCombo, SIGNAL(activated(QString)), this, SLOT(windowSizeChanged(QString))); connect(m_windowSizeCombo, SIGNAL(editTextChanged(QString)), this, SLOT(windowSizeChanged(QString))); m_modelLabel = new QLabel; QFont f(m_modelLabel->font()); f.setItalic(true); m_modelLabel->setFont(f); layout->addWidget(m_modelLabel, row++, 0, 1, 4); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(bb, row++, 0, 1, 4); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); setLayout(layout); timingTypeChanged(m_timingTypeCombo->currentIndex()); updateModelLabel(); } CSVFormatDialog::~CSVFormatDialog() { } CSVFormat CSVFormatDialog::getFormat() const { return m_format; } void CSVFormatDialog::updateModelLabel() { LayerFactory *f = LayerFactory::getInstance(); QString s; switch (m_format.getModelType()) { case CSVFormat::OneDimensionalModel: s = f->getLayerPresentationName(LayerFactory::TimeInstants); break; case CSVFormat::TwoDimensionalModel: s = f->getLayerPresentationName(LayerFactory::TimeValues); break; case CSVFormat::TwoDimensionalModelWithDuration: s = f->getLayerPresentationName(LayerFactory::Regions); break; case CSVFormat::ThreeDimensionalModel: s = f->getLayerPresentationName(LayerFactory::Colour3DPlot); break; } m_modelLabel->setText("\n" + tr("Data will be displayed in a %1 layer.").arg(s)); } void CSVFormatDialog::timingTypeChanged(int type) { switch (type) { case 0: m_format.setTimingType(CSVFormat::ExplicitTiming); m_format.setTimeUnits(CSVFormat::TimeSeconds); m_sampleRateCombo->setEnabled(false); m_sampleRateLabel->setEnabled(false); m_windowSizeCombo->setEnabled(false); m_windowSizeLabel->setEnabled(false); break; case 1: m_format.setTimingType(CSVFormat::ExplicitTiming); m_format.setTimeUnits(CSVFormat::TimeAudioFrames); m_sampleRateCombo->setEnabled(true); m_sampleRateLabel->setEnabled(true); m_windowSizeCombo->setEnabled(false); m_windowSizeLabel->setEnabled(false); break; case 2: m_format.setTimingType(CSVFormat::ImplicitTiming); m_format.setTimeUnits(CSVFormat::TimeWindows); m_sampleRateCombo->setEnabled(true); m_sampleRateLabel->setEnabled(true); m_windowSizeCombo->setEnabled(true); m_windowSizeLabel->setEnabled(true); break; } } void CSVFormatDialog::sampleRateChanged(QString rateString) { bool ok = false; int sampleRate = rateString.toInt(&ok); if (ok) m_format.setSampleRate(sampleRate); } void CSVFormatDialog::windowSizeChanged(QString sizeString) { bool ok = false; int size = sizeString.toInt(&ok); if (ok) m_format.setWindowSize(size); } void CSVFormatDialog::columnPurposeChanged(int p) { QObject *o = sender(); QComboBox *cb = qobject_cast(o); if (!cb) return; CSVFormat::ColumnPurpose purpose = (CSVFormat::ColumnPurpose)p; bool haveStartTime = false; bool haveDuration = false; int valueCount = 0; for (int i = 0; i < m_columnPurposeCombos.size(); ++i) { CSVFormat::ColumnPurpose cp = m_format.getColumnPurpose(i); bool thisChanged = (cb == m_columnPurposeCombos[i]); if (thisChanged) { cerr << "i == " << i << ", fuzzy == " << m_fuzzyColumn << ", p == " << p << endl; if (i == m_fuzzyColumn) { for (int j = i; j < m_format.getColumnCount(); ++j) { if (p == 0) { // Ignore m_format.setColumnPurpose(j, CSVFormat::ColumnUnknown); } else { // Value m_format.setColumnPurpose(j, CSVFormat::ColumnValue); ++valueCount; } } continue; } cp = purpose; } else { if (i == m_fuzzyColumn) continue; // We can only have one ColumnStartTime column, and only // one of either ColumnDuration or ColumnEndTime if (purpose == CSVFormat::ColumnStartTime) { if (cp == purpose) { cp = CSVFormat::ColumnValue; } } else if (purpose == CSVFormat::ColumnDuration || purpose == CSVFormat::ColumnEndTime) { if (cp == CSVFormat::ColumnDuration || cp == CSVFormat::ColumnEndTime) { cp = CSVFormat::ColumnValue; } } // And we can only have one label if (purpose == CSVFormat::ColumnLabel) { if (cp == purpose) { cp = CSVFormat::ColumnUnknown; } } } if (cp == CSVFormat::ColumnStartTime) { haveStartTime = true; } if (cp == CSVFormat::ColumnEndTime || cp == CSVFormat::ColumnDuration) { haveDuration = true; } if (cp == CSVFormat::ColumnValue) { ++valueCount; } m_columnPurposeCombos[i]->setCurrentIndex(int(cp)); m_format.setColumnPurpose(i, cp); } if (!haveStartTime) { m_timingTypeCombo->setCurrentIndex(2); timingTypeChanged(2); } if (haveStartTime && haveDuration) { m_format.setModelType(CSVFormat::TwoDimensionalModelWithDuration); } else { if (valueCount > 1) { m_format.setModelType(CSVFormat::ThreeDimensionalModel); } else if (valueCount > 0) { m_format.setModelType(CSVFormat::TwoDimensionalModel); } else { m_format.setModelType(CSVFormat::OneDimensionalModel); } } updateModelLabel(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/Fader.h0000644000175000017500000000411012252354725021723 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef FADER_H #define FADER_H /** * Horizontal audio fader and meter widget. * Based on the vertical fader and meter widget from: * * Hydrogen * Copyright(c) 2002-2005 by Alex >Comix< Cominu [comix@users.sourceforge.net] * http://www.hydrogen-music.org */ #include #include #include #include #include #include #include #include "base/Debug.h" class Fader : public QWidget { Q_OBJECT public: Fader(QWidget *parent, bool withoutKnob = false); ~Fader(); void setValue(float newValue); float getValue(); void setPeakLeft(float); float getPeakLeft() { return m_peakLeft; } void setPeakRight(float); float getPeakRight() { return m_peakRight; } signals: void valueChanged(float); // 0.0 -> 1.0 void mouseEntered(); void mouseLeft(); protected: virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseDoubleClickEvent(QMouseEvent *ev); virtual void mouseMoveEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); virtual void wheelEvent( QWheelEvent *ev ); virtual void paintEvent(QPaintEvent *ev); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); int getMaxX() const; bool m_withoutKnob; float m_value; float m_peakLeft; float m_peakRight; bool m_mousePressed; int m_mousePressX; float m_mousePressValue; QPixmap m_back; QPixmap m_leds; QPixmap m_knob; QPixmap m_clip; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/PropertyBox.cpp0000644000175000017500000006243712252354725023552 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PropertyBox.h" #include "PluginParameterDialog.h" #include "base/PropertyContainer.h" #include "base/PlayParameters.h" #include "base/PlayParameterRepository.h" #include "layer/Layer.h" #include "layer/ColourDatabase.h" #include "base/UnitDatabase.h" #include "base/RangeMapper.h" #include "plugin/RealTimePluginFactory.h" #include "plugin/RealTimePluginInstance.h" #include "plugin/PluginXml.h" #include "AudioDial.h" #include "LEDButton.h" #include "IconLoader.h" #include "NotifyingCheckBox.h" #include "NotifyingComboBox.h" #include "NotifyingPushButton.h" #include "ColourNameDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include //#define DEBUG_PROPERTY_BOX 1 PropertyBox::PropertyBox(PropertyContainer *container) : m_container(container), m_showButton(0), m_playButton(0) { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << "(\"" << container->getPropertyContainerName() << "\" at " << container << ")]::PropertyBox" << endl; #endif m_mainBox = new QVBoxLayout; setLayout(m_mainBox); // m_nameWidget = new QLabel; // m_mainBox->addWidget(m_nameWidget); // m_nameWidget->setText(container->objectName()); m_mainWidget = new QWidget; m_mainBox->addWidget(m_mainWidget); m_mainBox->insertStretch(2, 10); m_viewPlayFrame = 0; populateViewPlayFrame(); m_layout = new QGridLayout; m_layout->setMargin(0); m_mainWidget->setLayout(m_layout); PropertyContainer::PropertyList properties = m_container->getProperties(); blockSignals(true); size_t i; for (i = 0; i < properties.size(); ++i) { updatePropertyEditor(properties[i]); } blockSignals(false); m_layout->setRowStretch(m_layout->rowCount(), 10); connect(UnitDatabase::getInstance(), SIGNAL(unitDatabaseChanged()), this, SLOT(unitDatabaseChanged())); connect(ColourDatabase::getInstance(), SIGNAL(colourDatabaseChanged()), this, SLOT(colourDatabaseChanged())); #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << "]::PropertyBox returning" << endl; #endif } PropertyBox::~PropertyBox() { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << "]::~PropertyBox" << endl; #endif } void PropertyBox::populateViewPlayFrame() { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox(" << m_container << ")::populateViewPlayFrame" << endl; #endif if (m_viewPlayFrame) { delete m_viewPlayFrame; m_viewPlayFrame = 0; } if (!m_container) return; Layer *layer = dynamic_cast(m_container); if (layer) { disconnect(layer, SIGNAL(modelReplaced()), this, SLOT(populateViewPlayFrame())); connect(layer, SIGNAL(modelReplaced()), this, SLOT(populateViewPlayFrame())); } PlayParameters *params = m_container->getPlayParameters(); if (!params && !layer) return; m_viewPlayFrame = new QFrame; m_viewPlayFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); m_mainBox->addWidget(m_viewPlayFrame); QHBoxLayout *layout = new QHBoxLayout; m_viewPlayFrame->setLayout(layout); layout->setMargin(layout->margin() / 2); #ifdef DEBUG_PROPERTY_BOX SVDEBUG << "PropertyBox::populateViewPlayFrame: container " << m_container << " (name " << m_container->getPropertyContainerName() << ") params " << params << endl; #endif if (layer) { QLabel *showLabel = new QLabel(tr("Show")); layout->addWidget(showLabel); layout->setAlignment(showLabel, Qt::AlignVCenter); m_showButton = new LEDButton(Qt::blue); layout->addWidget(m_showButton); connect(m_showButton, SIGNAL(stateChanged(bool)), this, SIGNAL(showLayer(bool))); connect(m_showButton, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_showButton, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); layout->setAlignment(m_showButton, Qt::AlignVCenter); } if (params) { QLabel *playLabel = new QLabel(tr("Play")); layout->addWidget(playLabel); layout->setAlignment(playLabel, Qt::AlignVCenter); m_playButton = new LEDButton(Qt::darkGreen); m_playButton->setState(!params->isPlayMuted()); layout->addWidget(m_playButton); connect(m_playButton, SIGNAL(stateChanged(bool)), this, SLOT(playAudibleButtonChanged(bool))); connect(m_playButton, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(m_playButton, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); connect(params, SIGNAL(playAudibleChanged(bool)), this, SLOT(playAudibleChanged(bool))); layout->setAlignment(m_playButton, Qt::AlignVCenter); layout->insertStretch(-1, 10); if (params->getPlayPluginId() != "") { QPushButton *pluginButton = new QPushButton(QIcon(":icons/faders.png"), ""); pluginButton->setFixedWidth(24); pluginButton->setFixedHeight(24); layout->addWidget(pluginButton); connect(pluginButton, SIGNAL(clicked()), this, SLOT(editPlugin())); } AudioDial *gainDial = new AudioDial; layout->addWidget(gainDial); gainDial->setMeterColor(Qt::darkRed); gainDial->setMinimum(-50); gainDial->setMaximum(50); gainDial->setPageStep(1); gainDial->setFixedWidth(24); gainDial->setFixedHeight(24); gainDial->setNotchesVisible(false); gainDial->setDefaultValue(0); gainDial->setObjectName(tr("Playback Gain")); gainDial->setRangeMapper(new LinearRangeMapper (-50, 50, -25, 25, tr("dB"))); gainDial->setShowToolTip(true); connect(gainDial, SIGNAL(valueChanged(int)), this, SLOT(playGainDialChanged(int))); connect(params, SIGNAL(playGainChanged(float)), this, SLOT(playGainChanged(float))); connect(this, SIGNAL(changePlayGainDial(int)), gainDial, SLOT(setValue(int))); connect(gainDial, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(gainDial, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); playGainChanged(params->getPlayGain()); layout->setAlignment(gainDial, Qt::AlignVCenter); AudioDial *panDial = new AudioDial; layout->addWidget(panDial); panDial->setMeterColor(Qt::darkGreen); panDial->setMinimum(-50); panDial->setMaximum(50); panDial->setPageStep(1); panDial->setFixedWidth(24); panDial->setFixedHeight(24); panDial->setNotchesVisible(false); panDial->setToolTip(tr("Playback Pan / Balance")); panDial->setDefaultValue(0); panDial->setObjectName(tr("Playback Pan / Balance")); panDial->setShowToolTip(true); connect(panDial, SIGNAL(valueChanged(int)), this, SLOT(playPanDialChanged(int))); connect(params, SIGNAL(playPanChanged(float)), this, SLOT(playPanChanged(float))); connect(this, SIGNAL(changePlayPanDial(int)), panDial, SLOT(setValue(int))); connect(panDial, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(panDial, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); playPanChanged(params->getPlayPan()); layout->setAlignment(panDial, Qt::AlignVCenter); } else { layout->insertStretch(-1, 10); } } void PropertyBox::updatePropertyEditor(PropertyContainer::PropertyName name, bool rangeChanged) { PropertyContainer::PropertyType type = m_container->getPropertyType(name); int row = m_layout->rowCount(); int min = 0, max = 0, value = 0, deflt = 0; value = m_container->getPropertyRangeAndValue(name, &min, &max, &deflt); bool have = (m_propertyControllers.find(name) != m_propertyControllers.end()); QString groupName = m_container->getPropertyGroupName(name); QString propertyLabel = m_container->getPropertyLabel(name); QString iconName = m_container->getPropertyIconName(name); #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox[" << this << "(\"" << m_container->getPropertyContainerName() << "\")]"; cerr << "::updatePropertyEditor(\"" << name << "\"):"; cerr << " value " << value << ", have " << have << ", group \"" << groupName << "\"" << endl; #endif bool inGroup = (groupName != QString()); if (!have) { if (inGroup) { if (m_groupLayouts.find(groupName) == m_groupLayouts.end()) { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: adding label \"" << groupName << "\" and frame for group for \"" << name << "\"" << endl; #endif m_layout->addWidget(new QLabel(groupName, m_mainWidget), row, 0); QFrame *frame = new QFrame(m_mainWidget); m_layout->addWidget(frame, row, 1, 1, 2); m_groupLayouts[groupName] = new QGridLayout; m_groupLayouts[groupName]->setMargin(0); frame->setLayout(m_groupLayouts[groupName]); } } else { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: adding label \"" << propertyLabel << "\"" << endl; #endif m_layout->addWidget(new QLabel(propertyLabel, m_mainWidget), row, 0); } } switch (type) { case PropertyContainer::ToggleProperty: { QAbstractButton *button = 0; if (have) { button = dynamic_cast(m_propertyControllers[name]); assert(button); } else { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: creating new checkbox" << endl; #endif if (iconName != "") { button = new NotifyingPushButton(); button->setCheckable(true); QIcon icon(IconLoader().load(iconName)); button->setIcon(icon); button->setObjectName(name); button->setFixedSize(QSize(18, 18)); } else { button = new NotifyingCheckBox(); button->setObjectName(name); } connect(button, SIGNAL(toggled(bool)), this, SLOT(propertyControllerChanged(bool))); connect(button, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(button, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); if (inGroup) { button->setToolTip(propertyLabel); m_groupLayouts[groupName]->addWidget (button, 0, m_groupLayouts[groupName]->columnCount()); } else { m_layout->addWidget(button, row, 1, 1, 2); } m_propertyControllers[name] = button; } if (button->isChecked() != (value > 0)) { button->blockSignals(true); button->setChecked(value > 0); button->blockSignals(false); } break; } case PropertyContainer::RangeProperty: { AudioDial *dial; if (have) { dial = dynamic_cast(m_propertyControllers[name]); assert(dial); if (rangeChanged) { dial->blockSignals(true); dial->setMinimum(min); dial->setMaximum(max); dial->setRangeMapper(m_container->getNewPropertyRangeMapper(name)); dial->blockSignals(false); } } else { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: creating new dial" << endl; #endif dial = new AudioDial(); dial->setObjectName(name); dial->setMinimum(min); dial->setMaximum(max); dial->setPageStep(1); dial->setNotchesVisible((max - min) <= 12); dial->setDefaultValue(deflt); dial->setRangeMapper(m_container->getNewPropertyRangeMapper(name)); dial->setShowToolTip(true); connect(dial, SIGNAL(valueChanged(int)), this, SLOT(propertyControllerChanged(int))); connect(dial, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(dial, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); if (inGroup) { dial->setFixedWidth(24); dial->setFixedHeight(24); m_groupLayouts[groupName]->addWidget (dial, 0, m_groupLayouts[groupName]->columnCount()); } else { dial->setFixedWidth(32); dial->setFixedHeight(32); m_layout->addWidget(dial, row, 1); QLabel *label = new QLabel(m_mainWidget); connect(dial, SIGNAL(valueChanged(int)), label, SLOT(setNum(int))); label->setNum(value); m_layout->addWidget(label, row, 2); } m_propertyControllers[name] = dial; } if (dial->value() != value) { dial->blockSignals(true); dial->setValue(value); dial->blockSignals(false); } break; } case PropertyContainer::ValueProperty: case PropertyContainer::UnitsProperty: case PropertyContainer::ColourProperty: { NotifyingComboBox *cb; if (have) { cb = dynamic_cast(m_propertyControllers[name]); assert(cb); } else { #ifdef DEBUG_PROPERTY_BOX cerr << "PropertyBox: creating new combobox" << endl; #endif cb = new NotifyingComboBox(); cb->setObjectName(name); cb->setDuplicatesEnabled(false); } if (!have || rangeChanged) { cb->blockSignals(true); cb->clear(); cb->setEditable(false); if (type == PropertyContainer::ValueProperty) { for (int i = min; i <= max; ++i) { cb->addItem(m_container->getPropertyValueLabel(name, i)); } } else if (type == PropertyContainer::UnitsProperty) { QStringList units = UnitDatabase::getInstance()->getKnownUnits(); for (int i = 0; i < units.size(); ++i) { cb->addItem(units[i]); } cb->setEditable(true); } else { // ColourProperty //!!! should be a proper colour combobox class that // manages its own Add New Colour entry... ColourDatabase *db = ColourDatabase::getInstance(); for (size_t i = 0; i < db->getColourCount(); ++i) { QString name = db->getColourName(i); cb->addItem(db->getExamplePixmap(i, QSize(12, 12)), name); } cb->addItem(tr("Add New Colour...")); } cb->blockSignals(false); if (cb->count() < 20 && cb->count() > cb->maxVisibleItems()) { cb->setMaxVisibleItems(cb->count()); } } if (!have) { connect(cb, SIGNAL(activated(int)), this, SLOT(propertyControllerChanged(int))); connect(cb, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); connect(cb, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); if (inGroup) { cb->setToolTip(propertyLabel); m_groupLayouts[groupName]->addWidget (cb, 0, m_groupLayouts[groupName]->columnCount()); } else { m_layout->addWidget(cb, row, 1, 1, 2); } m_propertyControllers[name] = cb; } cb->blockSignals(true); if (type == PropertyContainer::ValueProperty || type == PropertyContainer::ColourProperty) { if (cb->currentIndex() != value) { cb->setCurrentIndex(value); } } else { QString unit = UnitDatabase::getInstance()->getUnitById(value); if (cb->currentText() != unit) { for (int i = 0; i < cb->count(); ++i) { if (cb->itemText(i) == unit) { cb->setCurrentIndex(i); break; } } } } cb->blockSignals(false); #ifdef Q_OS_MAC // Crashes on startup without this, for some reason cb->setMinimumSize(QSize(10, 10)); #endif break; } default: break; } } void PropertyBox::propertyContainerPropertyChanged(PropertyContainer *pc) { if (pc != m_container) return; #ifdef DEBUG_PROPERTY_BOX SVDEBUG << "PropertyBox::propertyContainerPropertyChanged" << endl; #endif PropertyContainer::PropertyList properties = m_container->getProperties(); size_t i; blockSignals(true); for (i = 0; i < properties.size(); ++i) { updatePropertyEditor(properties[i]); } blockSignals(false); } void PropertyBox::propertyContainerPropertyRangeChanged(PropertyContainer *) { blockSignals(true); PropertyContainer::PropertyList properties = m_container->getProperties(); for (size_t i = 0; i < properties.size(); ++i) { updatePropertyEditor(properties[i], true); } blockSignals(false); } void PropertyBox::unitDatabaseChanged() { cerr << "PropertyBox[" << this << "]: unitDatabaseChanged" << endl; blockSignals(true); // cerr << "my container is " << m_container << endl; // cerr << "my container's name is... " << endl; // cerr << m_container->objectName() << endl; PropertyContainer::PropertyList properties = m_container->getProperties(); for (size_t i = 0; i < properties.size(); ++i) { if (m_container->getPropertyType(properties[i]) == PropertyContainer::UnitsProperty) { updatePropertyEditor(properties[i]); } } blockSignals(false); } void PropertyBox::colourDatabaseChanged() { blockSignals(true); PropertyContainer::PropertyList properties = m_container->getProperties(); for (size_t i = 0; i < properties.size(); ++i) { if (m_container->getPropertyType(properties[i]) == PropertyContainer::ColourProperty) { updatePropertyEditor(properties[i], true); } } blockSignals(false); } void PropertyBox::propertyControllerChanged(bool on) { propertyControllerChanged(on ? 1 : 0); } void PropertyBox::propertyControllerChanged(int value) { QObject *obj = sender(); QString name = obj->objectName(); #ifdef DEBUG_PROPERTY_BOX SVDEBUG << "PropertyBox::propertyControllerChanged(" << name << ", " << value << ")" << endl; #endif PropertyContainer::PropertyType type = m_container->getPropertyType(name); Command *c = 0; if (type == PropertyContainer::UnitsProperty) { NotifyingComboBox *cb = dynamic_cast(obj); if (cb) { QString unit = cb->currentText(); c = m_container->getSetPropertyCommand (name, UnitDatabase::getInstance()->getUnitId(unit)); } } else if (type == PropertyContainer::ColourProperty) { if (value == int(ColourDatabase::getInstance()->getColourCount())) { addNewColour(); if (value == int(ColourDatabase::getInstance()->getColourCount())) { propertyContainerPropertyChanged(m_container); return; } } c = m_container->getSetPropertyCommand(name, value); } else if (type != PropertyContainer::InvalidProperty) { c = m_container->getSetPropertyCommand(name, value); } if (c) CommandHistory::getInstance()->addCommand(c, true, true); updateContextHelp(obj); } void PropertyBox::addNewColour() { QColor newColour = QColorDialog::getColor(); if (!newColour.isValid()) return; ColourNameDialog dialog(tr("Name New Colour"), tr("Enter a name for the new colour:"), newColour, newColour.name(), this); dialog.showDarkBackgroundCheckbox(tr("Prefer black background for this colour")); if (dialog.exec() == QDialog::Accepted) { //!!! command ColourDatabase *db = ColourDatabase::getInstance(); int index = db->addColour(newColour, dialog.getColourName()); db->setUseDarkBackground(index, dialog.isDarkBackgroundChecked()); } } void PropertyBox::playAudibleChanged(bool audible) { m_playButton->setState(audible); } void PropertyBox::playAudibleButtonChanged(bool audible) { PlayParameters *params = m_container->getPlayParameters(); if (!params) return; if (params->isPlayAudible() != audible) { PlayParameterRepository::EditCommand *command = new PlayParameterRepository::EditCommand(params); command->setPlayAudible(audible); CommandHistory::getInstance()->addCommand(command, true, true); } } void PropertyBox::playGainChanged(float gain) { int dialValue = lrint(log10(gain) * 20.0); if (dialValue < -50) dialValue = -50; if (dialValue > 50) dialValue = 50; emit changePlayGainDial(dialValue); } void PropertyBox::playGainDialChanged(int dialValue) { QObject *obj = sender(); PlayParameters *params = m_container->getPlayParameters(); if (!params) return; float gain = pow(10, float(dialValue) / 20.0); if (params->getPlayGain() != gain) { PlayParameterRepository::EditCommand *command = new PlayParameterRepository::EditCommand(params); command->setPlayGain(gain); CommandHistory::getInstance()->addCommand(command, true, true); } updateContextHelp(obj); } void PropertyBox::playPanChanged(float pan) { int dialValue = lrint(pan * 50.0); if (dialValue < -50) dialValue = -50; if (dialValue > 50) dialValue = 50; emit changePlayPanDial(dialValue); } void PropertyBox::playPanDialChanged(int dialValue) { QObject *obj = sender(); PlayParameters *params = m_container->getPlayParameters(); if (!params) return; float pan = float(dialValue) / 50.0; if (pan < -1.0) pan = -1.0; if (pan > 1.0) pan = 1.0; if (params->getPlayPan() != pan) { PlayParameterRepository::EditCommand *command = new PlayParameterRepository::EditCommand(params); command->setPlayPan(pan); CommandHistory::getInstance()->addCommand(command, true, true); } updateContextHelp(obj); } void PropertyBox::editPlugin() { //!!! should probably just emit and let something else do this PlayParameters *params = m_container->getPlayParameters(); if (!params) return; QString pluginId = params->getPlayPluginId(); QString configurationXml = params->getPlayPluginConfiguration(); PlayParameterRepository::EditCommand *command = new PlayParameterRepository::EditCommand(params); RealTimePluginFactory *factory = RealTimePluginFactory::instanceFor(pluginId); if (!factory) return; RealTimePluginInstance *instance = factory->instantiatePlugin(pluginId, 0, 0, 48000, 1024, 1); if (!instance) return; PluginXml(instance).setParametersFromXml(configurationXml); PluginParameterDialog *dialog = new PluginParameterDialog(instance); connect(dialog, SIGNAL(pluginConfigurationChanged(QString)), this, SLOT(pluginConfigurationChanged(QString))); if (dialog->exec() == QDialog::Accepted) { QString newConfiguration = PluginXml(instance).toXmlString(); command->setPlayPluginConfiguration(newConfiguration); CommandHistory::getInstance()->addCommand(command, true); } else { delete command; // restore in case we mucked about with the configuration // as a consequence of signals from the dialog params->setPlayPluginConfiguration(configurationXml); } delete dialog; delete instance; } void PropertyBox::pluginConfigurationChanged(QString configurationXml) { PlayParameters *params = m_container->getPlayParameters(); if (!params) return; params->setPlayPluginConfiguration(configurationXml); } void PropertyBox::layerVisibilityChanged(bool visible) { if (m_showButton) m_showButton->setState(visible); } void PropertyBox::mouseEnteredWidget() { updateContextHelp(sender()); } void PropertyBox::updateContextHelp(QObject *o) { QWidget *w = dynamic_cast(o); if (!w) return; if (!m_container) return; QString cname = m_container->getPropertyContainerName(); if (cname == "") return; QString wname = w->objectName(); QString extraText; AudioDial *dial = dynamic_cast(w); if (dial) { float mv = dial->mappedValue(); QString unit = ""; if (dial->rangeMapper()) unit = dial->rangeMapper()->getUnit(); if (unit != "") { extraText = tr(" (current value: %1%2)").arg(mv).arg(unit); } else { extraText = tr(" (current value: %1)").arg(mv); } } if (w == m_showButton) { emit contextHelpChanged(tr("Toggle Visibility of %1").arg(cname)); } else if (w == m_playButton) { emit contextHelpChanged(tr("Toggle Playback of %1").arg(cname)); } else if (wname == "") { return; } else if (dynamic_cast(w)) { emit contextHelpChanged(tr("Toggle %1 property of %2") .arg(wname).arg(cname)); } else { emit contextHelpChanged(tr("Adjust %1 property of %2%3") .arg(wname).arg(cname).arg(extraText)); } } void PropertyBox::mouseLeftWidget() { if (!(QApplication::mouseButtons() & Qt::LeftButton)) { emit contextHelpChanged(""); } } sonic-visualiser-2.3~repack1.orig/svgui/widgets/TransformFinder.h0000644000175000017500000000326612252354725024020 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TRANSFORM_FINDER_H_ #define _TRANSFORM_FINDER_H_ #include #include #include "transform/Transform.h" #include "transform/TransformFactory.h" class QVBoxLayout; class QScrollArea; class QLabel; class SelectableLabel; class QWidget; class QTimer; class TransformFinder : public QDialog { Q_OBJECT public: TransformFinder(QWidget *parent = 0); ~TransformFinder(); TransformId getTransform() const; protected slots: void searchTextChanged(const QString &); void selectedLabelChanged(); void labelDoubleClicked(); void timeout(); void up(); void down(); protected: QLabel *m_infoLabel; QLabel *m_beforeSearchLabel; QLabel *m_noResultsLabel; QScrollArea *m_resultsScroll; QWidget *m_resultsFrame; QVBoxLayout *m_resultsLayout; std::vector m_labels; TransformId m_selectedTransform; QTimer *m_timer; void setupBeforeSearchLabel(); QString m_newSearchText; typedef std::vector SortedResults; SortedResults m_sortedResults; int m_upToDateCount; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/LEDButton.cpp0000644000175000017500000001753012252354725023047 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the KDE libraries. Copyright (c) 1998-2004 Jrg Habenicht, Richard J Moore, Chris Cannam and others, distributed under the GNU Lesser General Public License. Ported to Qt4 by Chris Cannam. */ #include "LEDButton.h" #include #include #include #include #include class LEDButton::LEDButtonPrivate { friend class LEDButton; int dark_factor; QColor offcolor; QPixmap *off_map; QPixmap *on_map; }; LEDButton::LEDButton(QWidget *parent) : QWidget(parent), led_state(true) { QColor col(Qt::green); d = new LEDButton::LEDButtonPrivate; d->dark_factor = 300; d->offcolor = col.dark(300); d->off_map = 0; d->on_map = 0; setColor(col); } LEDButton::LEDButton(const QColor& col, QWidget *parent) : QWidget(parent), led_state(true) { d = new LEDButton::LEDButtonPrivate; d->dark_factor = 300; d->offcolor = col.dark(300); d->off_map = 0; d->on_map = 0; setColor(col); } LEDButton::LEDButton(const QColor& col, bool state, QWidget *parent) : QWidget(parent), led_state(state) { d = new LEDButton::LEDButtonPrivate; d->dark_factor = 300; d->offcolor = col.dark(300); d->off_map = 0; d->on_map = 0; setColor(col); } LEDButton::~LEDButton() { delete d->off_map; delete d->on_map; delete d; } void LEDButton::mousePressEvent(QMouseEvent *e) { cerr << "LEDButton(" << this << ")::mousePressEvent" << endl; if (e->buttons() & Qt::LeftButton) { toggle(); bool newState = state(); SVDEBUG << "emitting new state " << newState << endl; emit stateChanged(newState); } } void LEDButton::enterEvent(QEvent *) { emit mouseEntered(); } void LEDButton::leaveEvent(QEvent *) { emit mouseLeft(); } void LEDButton::paintEvent(QPaintEvent *) { QPainter paint; QColor color; QBrush brush; QPen pen; // First of all we want to know what area should be updated // Initialize coordinates, width, and height of the LED int width = this->width(); // Make sure the LED is round! if (width > this->height()) width = this->height(); width -= 2; // leave one pixel border if (width < 0) width = 0; QPixmap *tmpMap = 0; if (led_state) { if (d->on_map) { if (d->on_map->size() == size()) { paint.begin(this); paint.drawPixmap(0, 0, *d->on_map); paint.end(); return; } else { delete d->on_map; d->on_map = 0; } } } else { if (d->off_map) { if (d->off_map->size() == size()) { paint.begin(this); paint.drawPixmap(0, 0, *d->off_map); paint.end(); return; } else { delete d->off_map; d->off_map = 0; } } } int scale = 1; width *= scale; tmpMap = new QPixmap(width, width); tmpMap->fill(palette().background().color()); paint.begin(tmpMap); paint.setRenderHint(QPainter::Antialiasing, true); // Set the color of the LED according to given parameters color = (led_state) ? led_color : d->offcolor; // Set the brush to SolidPattern, this fills the entire area // of the ellipse which is drawn first brush.setStyle(Qt::SolidPattern); brush.setColor(color); paint.setBrush(brush); // Draws a "flat" LED with the given color: paint.drawEllipse( scale, scale, width - scale*2, width - scale*2 ); // Draw the bright light spot of the LED now, using modified "old" // painter routine taken from KDEUIs LEDButton widget: // Setting the new width of the pen is essential to avoid "pixelized" // shadow like it can be observed with the old LED code pen.setWidth( 2 * scale ); // shrink the light on the LED to a size about 2/3 of the complete LED int pos = width/5 + 1; int light_width = width; light_width *= 2; light_width /= 3; // Calculate the LEDs "light factor": int light_quote = (130*2/(light_width?light_width:1))+100; // Now draw the bright spot on the LED: while (light_width) { color = color.light( light_quote ); // make color lighter pen.setColor( color ); // set color as pen color paint.setPen( pen ); // select the pen for drawing paint.drawEllipse( pos, pos, light_width, light_width ); // draw the ellipse (circle) light_width--; if (!light_width) break; paint.drawEllipse( pos, pos, light_width, light_width ); light_width--; if (!light_width) break; paint.drawEllipse( pos, pos, light_width, light_width ); pos++; light_width--; } // Drawing of bright spot finished, now draw a thin border // around the LED which resembles a shadow with light coming // from the upper left. // pen.setWidth( 2 * scale + 1 ); // ### shouldn't this value be smaller for smaller LEDs? pen.setWidth(2 * scale); brush.setStyle(Qt::NoBrush); paint.setBrush(brush); // This avoids filling of the ellipse // Set the initial color value to colorGroup().light() (bright) and start // drawing the shadow border at 45 (45*16 = 720). int angle = -720; color = palette().light().color(); for (int arc = 120; arc < 2880; arc += 240) { pen.setColor(color); paint.setPen(pen); int w = width - pen.width()/2 - scale + 1; paint.drawArc(pen.width()/2 + 1, pen.width()/2 + 1, w - 2, w - 2, angle + arc, 240); paint.drawArc(pen.width()/2 + 1, pen.width()/2 + 1, w - 2, w - 2, angle - arc, 240); color = color.dark(110); //FIXME: this should somehow use the contrast value } // end for ( angle = 720; angle < 6480; angle += 160 ) paint.end(); // // painting done QPixmap *&dest = led_state ? d->on_map : d->off_map; if (scale > 1) { QImage i = tmpMap->toImage(); width /= scale; delete tmpMap; dest = new QPixmap(QPixmap::fromImage (i.scaled(width, width, Qt::KeepAspectRatio, Qt::SmoothTransformation))); } else { dest = tmpMap; } paint.begin(this); paint.drawPixmap(0, 0, *dest); paint.end(); } bool LEDButton::state() const { return led_state; } QColor LEDButton::color() const { return led_color; } void LEDButton::setState( bool state ) { if (led_state != state) { led_state = state; update(); } } void LEDButton::toggleState() { led_state = (led_state == true) ? false : true; // setColor(led_color); update(); } void LEDButton::setColor(const QColor& col) { if(led_color!=col) { led_color = col; d->offcolor = col.dark(d->dark_factor); delete d->on_map; d->on_map = 0; delete d->off_map; d->off_map = 0; update(); } } void LEDButton::setDarkFactor(int darkfactor) { if (d->dark_factor != darkfactor) { d->dark_factor = darkfactor; d->offcolor = led_color.dark(darkfactor); update(); } } int LEDButton::darkFactor() const { return d->dark_factor; } void LEDButton::toggle() { toggleState(); } void LEDButton::on() { setState(true); } void LEDButton::off() { setState(false); } QSize LEDButton::sizeHint() const { return QSize(17, 17); } QSize LEDButton::minimumSizeHint() const { return QSize(17, 17); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/NotifyingTabBar.cpp0000644000175000017500000000220412252354725024261 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "NotifyingTabBar.h" #include NotifyingTabBar::NotifyingTabBar(QWidget *parent) : QTabBar(parent) { } NotifyingTabBar::~NotifyingTabBar() { } void NotifyingTabBar::mousePressEvent(QMouseEvent *e) { int i = currentIndex(); QTabBar::mousePressEvent(e); if (currentIndex() == i) { emit activeTabClicked(); } } void NotifyingTabBar::enterEvent(QEvent *e) { QTabBar::enterEvent(e); emit mouseEntered(); } void NotifyingTabBar::leaveEvent(QEvent *e) { QTabBar::enterEvent(e); emit mouseLeft(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/WindowTypeSelector.cpp0000644000175000017500000000601112252354725025051 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "WindowTypeSelector.h" #include "WindowShapePreview.h" #include #include #include "base/Preferences.h" WindowTypeSelector::WindowTypeSelector(WindowType defaultType, QWidget *parent) : QFrame(parent), m_windowType(WindowType(999)) { QVBoxLayout *layout = new QVBoxLayout; layout->setMargin(0); setLayout(layout); // The WindowType enum is in rather a ragbag order -- reorder it here // in a more sensible order m_windows = new WindowType[9]; m_windows[0] = HanningWindow; m_windows[1] = HammingWindow; m_windows[2] = BlackmanWindow; m_windows[3] = BlackmanHarrisWindow; m_windows[4] = NuttallWindow; m_windows[5] = GaussianWindow; m_windows[6] = ParzenWindow; m_windows[7] = BartlettWindow; m_windows[8] = RectangularWindow; Preferences *prefs = Preferences::getInstance(); m_windowShape = new WindowShapePreview; m_windowCombo = new QComboBox; int min = 0, max = 0, deflt = 0, i = 0; int window = int(defaultType); if (window == 999) { window = prefs->getPropertyRangeAndValue("Window Type", &min, &max, &deflt); } int index = 0; for (i = 0; i <= 8; ++i) { m_windowCombo->addItem(prefs->getPropertyValueLabel("Window Type", m_windows[i])); if (m_windows[i] == window) index = i; } m_windowCombo->setCurrentIndex(index); layout->addWidget(m_windowShape); layout->addWidget(m_windowCombo); connect(m_windowCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(windowIndexChanged(int))); windowIndexChanged(index); } WindowTypeSelector::~WindowTypeSelector() { delete[] m_windows; } WindowType WindowTypeSelector::getWindowType() const { return m_windowType; } void WindowTypeSelector::setWindowType(WindowType type) { if (type == m_windowType) return; int index; for (index = 0; index <= 8; ++index) { if (m_windows[index] == type) break; } if (index <= 8) m_windowCombo->setCurrentIndex(index); m_windowType = type; m_windowShape->setWindowType(m_windowType); } void WindowTypeSelector::windowIndexChanged(int index) { WindowType type = m_windows[index]; if (type == m_windowType) return; m_windowType = type; m_windowShape->setWindowType(m_windowType); emit windowTypeChanged(type); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/NotifyingComboBox.h0000644000175000017500000000217512252354725024312 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _NOTIFYING_COMBO_BOX_H_ #define _NOTIFYING_COMBO_BOX_H_ #include /** * Very trivial enhancement to QComboBox to make it emit signals when * the mouse enters and leaves (for context help). */ class NotifyingComboBox : public QComboBox { Q_OBJECT public: NotifyingComboBox(QWidget *parent = 0) : QComboBox(parent) { } virtual ~NotifyingComboBox(); signals: void mouseEntered(); void mouseLeft(); protected: virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/LEDButton.h0000644000175000017500000000421212252354725022505 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the KDE libraries. Copyright (c) 1998-2004 Jrg Habenicht, Richard J Moore and others, distributed under the GNU Lesser General Public License. Ported to Qt4 by Chris Cannam. The original KDE widget comes in round and rectangular and flat, raised, and sunken variants. This version retains only the round sunken variant. This version also implements a simple button API. */ #ifndef _LED_BUTTON_H_ #define _LED_BUTTON_H_ #include #include "base/Debug.h" class QColor; class LEDButton : public QWidget { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor) Q_PROPERTY(int darkFactor READ darkFactor WRITE setDarkFactor) public: LEDButton(QWidget *parent = 0); LEDButton(const QColor &col, QWidget *parent = 0); LEDButton(const QColor& col, bool state, QWidget *parent = 0); ~LEDButton(); bool state() const; QColor color() const; int darkFactor() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; signals: void stateChanged(bool); void mouseEntered(); void mouseLeft(); public slots: void toggle(); void on(); void off(); void setState(bool); void toggleState(); void setColor(const QColor& color); void setDarkFactor(int darkfactor); protected: void paintEvent(QPaintEvent *); void mousePressEvent(QMouseEvent *); void enterEvent(QEvent *); void leaveEvent(QEvent *); bool led_state; QColor led_color; class LEDButtonPrivate; LEDButtonPrivate *d; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/LayerTree.cpp0000644000175000017500000004265012252354725023144 0ustar miramira /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "LayerTree.h" #include "view/PaneStack.h" #include "base/PlayParameters.h" #include "view/Pane.h" #include "layer/Layer.h" #include "data/model/Model.h" #include "data/model/WaveFileModel.h" #include #include ModelMetadataModel::ModelMetadataModel(PaneStack *stack, bool waveModelsOnly, QObject *parent) : QAbstractItemModel(parent), m_stack(stack), m_waveModelsOnly(waveModelsOnly) { if (m_waveModelsOnly) { m_modelTypeColumn = -1; m_modelNameColumn = 0; m_modelMakerColumn = 1; m_modelSourceColumn = 2; m_columnCount = 3; } else { m_modelTypeColumn = 0; m_modelNameColumn = 1; m_modelMakerColumn = 2; m_modelSourceColumn = 3; m_columnCount = 4; } connect(stack, SIGNAL(paneAdded()), this, SLOT(paneAdded())); connect(stack, SIGNAL(paneDeleted()), this, SLOT(paneDeleted())); for (int i = 0; i < stack->getPaneCount(); ++i) { Pane *pane = stack->getPane(i); if (!pane) continue; connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)), this, SLOT(propertyContainerAdded(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)), this, SLOT(propertyContainerRemoved(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerSelected(PropertyContainer *)), this, SLOT(propertyContainerSelected(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(pane, SIGNAL(layerModelChanged()), this, SLOT(paneLayerModelChanged())); } rebuildModelSet(); } ModelMetadataModel::~ModelMetadataModel() { } void ModelMetadataModel::rebuildModelSet() { std::set unfound = m_models; for (int i = 0; i < m_stack->getPaneCount(); ++i) { Pane *pane = m_stack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; Model *model = layer->getModel(); if (!model) continue; if (m_waveModelsOnly) { if (!dynamic_cast(model)) continue; } if (m_models.find(model) == m_models.end()) { connect(model, SIGNAL(aboutToBeDeleted()), this, SLOT(rebuildModelSet())); m_models.insert(model); } else { unfound.erase(model); } } } for (std::set::iterator i = unfound.begin(); i != unfound.end(); ++i) { m_models.erase(*i); } SVDEBUG << "ModelMetadataModel::rebuildModelSet: " << m_models.size() << " models" << endl; } void ModelMetadataModel::paneAdded() { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::paneDeleted() { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::paneLayerModelChanged() { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::propertyContainerAdded(PropertyContainer *) { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::propertyContainerRemoved(PropertyContainer *) { rebuildModelSet(); emit layoutChanged(); } void ModelMetadataModel::propertyContainerSelected(PropertyContainer *) { } void ModelMetadataModel::propertyContainerPropertyChanged(PropertyContainer *pc) { } void ModelMetadataModel::playParametersAudibilityChanged(bool a) { } QVariant ModelMetadataModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); QObject *obj = static_cast(index.internalPointer()); int row = index.row(), col = index.column(); //!!! not exactly the ideal use of a std::set std::set::iterator itr = m_models.begin(); for (int i = 0; i < row && itr != m_models.end(); ++i, ++itr); if (itr == m_models.end()) return QVariant(); Model *model = *itr; if (role != Qt::DisplayRole) { if (m_waveModelsOnly && col == m_modelNameColumn && role == Qt::DecorationRole) { // There is no meaningful icon for a model, in general -- // the icons we have represent layer types and it would be // misleading to use them for models. However, if we're // only showing wave models, we use the waveform icon just // for decorative purposes. return QVariant(QIcon(QString(":/icons/waveform.png"))); } return QVariant(); } if (col == m_modelTypeColumn) { return QVariant(model->getTypeName()); } else if (col == m_modelNameColumn) { return QVariant(model->objectName()); } else if (col == m_modelMakerColumn) { return QVariant(model->getMaker()); } else if (col == m_modelSourceColumn) { return QVariant(model->getLocation()); } return QVariant(); } bool ModelMetadataModel::setData(const QModelIndex &index, const QVariant &value, int role) { return false; } Qt::ItemFlags ModelMetadataModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = Qt::ItemIsEnabled; return flags; } QVariant ModelMetadataModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { if (section == m_modelTypeColumn) return QVariant(tr("Type")); else if (section == m_modelNameColumn) return QVariant(tr("Name")); else if (section == m_modelMakerColumn) return QVariant(tr("Maker")); else if (section == m_modelSourceColumn) return QVariant(tr("Source")); } return QVariant(); } QModelIndex ModelMetadataModel::index(int row, int column, const QModelIndex &parent) const { if (!parent.isValid()) { if (row >= m_models.size()) return QModelIndex(); return createIndex(row, column, (void *)0); } return QModelIndex(); } QModelIndex ModelMetadataModel::parent(const QModelIndex &index) const { return QModelIndex(); } int ModelMetadataModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) return m_models.size(); return 0; } int ModelMetadataModel::columnCount(const QModelIndex &parent) const { return m_columnCount; } LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) : QAbstractItemModel(parent), m_stack(stack) { m_layerNameColumn = 0; m_layerVisibleColumn = 1; m_layerPlayedColumn = 2; m_modelNameColumn = 3; m_columnCount = 4; connect(stack, SIGNAL(paneAdded()), this, SLOT(paneAdded())); connect(stack, SIGNAL(paneAboutToBeDeleted(Pane *)), this, SLOT(paneAboutToBeDeleted(Pane *))); for (int i = 0; i < stack->getPaneCount(); ++i) { Pane *pane = stack->getPane(i); if (!pane) continue; connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)), this, SLOT(propertyContainerAdded(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)), this, SLOT(propertyContainerRemoved(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerSelected(PropertyContainer *)), this, SLOT(propertyContainerSelected(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(pane, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(pane, SIGNAL(layerModelChanged()), this, SLOT(paneLayerModelChanged())); for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; PlayParameters *params = layer->getPlayParameters(); if (!params) continue; connect(params, SIGNAL(playAudibleChanged(bool)), this, SLOT(playParametersAudibilityChanged(bool))); } } } LayerTreeModel::~LayerTreeModel() { } void LayerTreeModel::paneAdded() { emit layoutChanged(); } void LayerTreeModel::paneAboutToBeDeleted(Pane *pane) { cerr << "paneDeleted: " << pane << endl; m_deletedPanes.insert(pane); emit layoutChanged(); } void LayerTreeModel::propertyContainerAdded(PropertyContainer *) { emit layoutChanged(); } void LayerTreeModel::propertyContainerRemoved(PropertyContainer *) { emit layoutChanged(); } void LayerTreeModel::propertyContainerSelected(PropertyContainer *) { emit layoutChanged(); } void LayerTreeModel::paneLayerModelChanged() { emit layoutChanged(); } void LayerTreeModel::propertyContainerPropertyChanged(PropertyContainer *pc) { for (int i = 0; i < m_stack->getPaneCount(); ++i) { Pane *pane = m_stack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { if (pane->getLayer(j) == pc) { emit dataChanged(createIndex(pane->getLayerCount() - j - 1, m_layerNameColumn, pane), createIndex(pane->getLayerCount() - j - 1, m_modelNameColumn, pane)); } } } } void LayerTreeModel::playParametersAudibilityChanged(bool a) { PlayParameters *params = dynamic_cast(sender()); if (!params) return; SVDEBUG << "LayerTreeModel::playParametersAudibilityChanged(" << params << "," << a << ")" << endl; for (int i = 0; i < m_stack->getPaneCount(); ++i) { Pane *pane = m_stack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!layer) continue; if (layer->getPlayParameters() == params) { SVDEBUG << "LayerTreeModel::playParametersAudibilityChanged(" << params << "," << a << "): row " << pane->getLayerCount() - j - 1 << ", col " << 2 << endl; emit dataChanged(createIndex(pane->getLayerCount() - j - 1, m_layerPlayedColumn, pane), createIndex(pane->getLayerCount() - j - 1, m_layerPlayedColumn, pane)); } } } } QVariant LayerTreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); QObject *obj = static_cast(index.internalPointer()); int row = index.row(), col = index.column(); Pane *pane = dynamic_cast(obj); if (!pane) { if (col == 0 && row < m_stack->getPaneCount()) { switch (role) { case Qt::DisplayRole: return QVariant(QString("Pane %1").arg(row + 1)); case Qt::DecorationRole: return QVariant(QIcon(QString(":/icons/pane.png"))); default: break; } } } if (pane && pane->getLayerCount() > row) { Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1); if (layer) { if (col == m_layerNameColumn) { switch (role) { case Qt::DisplayRole: return QVariant(layer->objectName()); case Qt::DecorationRole: return QVariant (QIcon(QString(":/icons/%1.png") .arg(layer->getPropertyContainerIconName()))); default: break; } } else if (col == m_layerVisibleColumn) { if (role == Qt::CheckStateRole) { return QVariant(layer->isLayerDormant(pane) ? Qt::Unchecked : Qt::Checked); } else if (role == Qt::TextAlignmentRole) { return QVariant(Qt::AlignHCenter); } } else if (col == m_layerPlayedColumn) { if (role == Qt::CheckStateRole) { PlayParameters *params = layer->getPlayParameters(); if (params) return QVariant(params->isPlayMuted() ? Qt::Unchecked : Qt::Checked); else return QVariant(); } else if (role == Qt::TextAlignmentRole) { return QVariant(Qt::AlignHCenter); } } else if (col == m_modelNameColumn) { Model *model = layer->getModel(); if (model && role == Qt::DisplayRole) { return QVariant(model->objectName()); } } } } return QVariant(); } bool LayerTreeModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid()) return false; QObject *obj = static_cast(index.internalPointer()); int row = index.row(), col = index.column(); Pane *pane = dynamic_cast(obj); if (!pane || pane->getLayerCount() <= row) return false; Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1); if (!layer) return false; if (col == m_layerVisibleColumn) { if (role == Qt::CheckStateRole) { layer->showLayer(pane, value.toInt() == Qt::Checked); emit dataChanged(index, index); return true; } } else if (col == m_layerPlayedColumn) { if (role == Qt::CheckStateRole) { PlayParameters *params = layer->getPlayParameters(); if (params) { params->setPlayMuted(value.toInt() == Qt::Unchecked); emit dataChanged(index, index); return true; } } } return false; } Qt::ItemFlags LayerTreeModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = Qt::ItemIsEnabled; if (!index.isValid()) return flags; if (index.column() == m_layerVisibleColumn || index.column() == m_layerPlayedColumn) { flags |= Qt::ItemIsUserCheckable; } else if (index.column() == 0) { flags |= Qt::ItemIsSelectable; } return flags; } QVariant LayerTreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { if (section == m_layerNameColumn) return QVariant(tr("Layer")); else if (section == m_layerVisibleColumn) return QVariant(tr("Shown")); else if (section == m_layerPlayedColumn) return QVariant(tr("Played")); else if (section == m_modelNameColumn) return QVariant(tr("Model")); } return QVariant(); } QModelIndex LayerTreeModel::index(int row, int column, const QModelIndex &parent) const { // cell for a pane contains row, column, pane stack // -> its parent is the invalid cell // cell for a layer contains row, column, pane // -> its parent is row, column, pane stack (which identify the pane) if (!parent.isValid()) { if (row >= m_stack->getPaneCount() || column > 0) return QModelIndex(); return createIndex(row, column, m_stack); } QObject *obj = static_cast(parent.internalPointer()); if (obj == m_stack) { Pane *pane = m_stack->getPane(parent.row()); if (!pane || parent.column() > 0) return QModelIndex(); return createIndex(row, column, pane); } return QModelIndex(); } QModelIndex LayerTreeModel::parent(const QModelIndex &index) const { QObject *obj = static_cast(index.internalPointer()); if (m_deletedPanes.find(obj) != m_deletedPanes.end()) { // m_deletedPanes.erase(obj); return QModelIndex(); } Pane *pane = dynamic_cast(obj); if (pane) { int index = m_stack->getPaneIndex(pane); if (index >= 0) return createIndex(index, 0, m_stack); } return QModelIndex(); } int LayerTreeModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) return m_stack->getPaneCount(); QObject *obj = static_cast(parent.internalPointer()); if (obj == m_stack) { Pane *pane = m_stack->getPane(parent.row()); if (!pane || parent.column() > 0) return 0; return pane->getLayerCount(); } return 0; } int LayerTreeModel::columnCount(const QModelIndex &parent) const { if (!parent.isValid()) return m_columnCount; QObject *obj = static_cast(parent.internalPointer()); if (obj == m_stack) return m_columnCount; // row for a layer return 1; } sonic-visualiser-2.3~repack1.orig/svgui/widgets/IconLoader.h0000644000175000017500000000147012252354725022727 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _ICON_LOADER_H_ #define _ICON_LOADER_H_ #include class IconLoader { public: IconLoader() { } virtual ~IconLoader() { } QIcon load(QString name); QPixmap loadPixmap(QString name); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/SelectableLabel.h0000644000175000017500000000265212252354725023716 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SELECTABLE_LABEL_H_ #define _SELECTABLE_LABEL_H_ #include class SelectableLabel : public QLabel { Q_OBJECT public: SelectableLabel(QWidget *parent = 0); virtual ~SelectableLabel(); void setSelectedText(QString); void setUnselectedText(QString); bool isSelected() const { return m_selected; } signals: void selectionChanged(); void doubleClicked(); public slots: void setSelected(bool); void toggle(); protected: virtual void mousePressEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); void setupStyle(); QString m_selectedText; QString m_unselectedText; bool m_selected; bool m_swallowRelease; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/PluginParameterBox.h0000644000175000017500000000334312252354725024461 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PLUGIN_PARAMETER_BOX_H_ #define _PLUGIN_PARAMETER_BOX_H_ #include #include #include class AudioDial; class QDoubleSpinBox; class QCheckBox; class QGridLayout; class QComboBox; class PluginParameterBox : public QFrame { Q_OBJECT public: PluginParameterBox(Vamp::PluginBase *, QWidget *parent = 0); ~PluginParameterBox(); Vamp::PluginBase *getPlugin() { return m_plugin; } signals: void pluginConfigurationChanged(QString); protected slots: void dialChanged(int); void spinBoxChanged(double); void checkBoxChanged(int); void programComboChanged(const QString &); protected: void populate(); void updateProgramCombo(); QGridLayout *m_layout; Vamp::PluginBase *m_plugin; struct ParamRec { AudioDial *dial; QDoubleSpinBox *spin; QCheckBox *check; QComboBox *combo; Vamp::PluginBase::ParameterDescriptor param; }; QComboBox *m_programCombo; std::map m_params; std::map m_nameMap; Vamp::PluginBase::ProgramList m_programs; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/PropertyStack.cpp0000644000175000017500000001643112252354725024060 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PropertyStack.h" #include "PropertyBox.h" #include "base/PropertyContainer.h" #include "view/View.h" #include "layer/Layer.h" #include "layer/LayerFactory.h" #include "widgets/NotifyingTabBar.h" #include "widgets/IconLoader.h" #include "base/Command.h" #include "widgets/CommandHistory.h" #include #include #include //#define DEBUG_PROPERTY_STACK 1 PropertyStack::PropertyStack(QWidget *parent, View *client) : QTabWidget(parent), m_client(client) { NotifyingTabBar *bar = new NotifyingTabBar(); bar->setDrawBase(false); connect(bar, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredTabBar())); connect(bar, SIGNAL(mouseLeft()), this, SLOT(mouseLeftTabBar())); connect(bar, SIGNAL(activeTabClicked()), this, SLOT(activeTabClicked())); setTabBar(bar); #if (QT_VERSION >= 0x0402) setElideMode(Qt::ElideNone); tabBar()->setUsesScrollButtons(true); tabBar()->setIconSize(QSize(16, 16)); #endif repopulate(); connect(this, SIGNAL(currentChanged(int)), this, SLOT(selectedContainerChanged(int))); connect(m_client, SIGNAL(propertyContainerAdded(PropertyContainer *)), this, SLOT(propertyContainerAdded(PropertyContainer *))); connect(m_client, SIGNAL(propertyContainerRemoved(PropertyContainer *)), this, SLOT(propertyContainerRemoved(PropertyContainer *))); connect(m_client, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); connect(m_client, SIGNAL(propertyContainerPropertyRangeChanged(PropertyContainer *)), this, SLOT(propertyContainerPropertyRangeChanged(PropertyContainer *))); connect(m_client, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), this, SLOT(propertyContainerNameChanged(PropertyContainer *))); connect(this, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)), m_client, SLOT(propertyContainerSelected(View *, PropertyContainer *))); } void PropertyStack::repopulate() { blockSignals(true); #ifdef DEBUG_PROPERTY_STACK SVDEBUG << "PropertyStack::repopulate" << endl; #endif while (count() > 0) { removeTab(0); } for (size_t i = 0; i < m_boxes.size(); ++i) { delete m_boxes[i]; } m_boxes.clear(); for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) { PropertyContainer *container = m_client->getPropertyContainer(i); QString name = container->getPropertyContainerName(); PropertyBox *box = new PropertyBox(container); connect(box, SIGNAL(showLayer(bool)), this, SLOT(showLayer(bool))); connect(box, SIGNAL(contextHelpChanged(const QString &)), this, SIGNAL(contextHelpChanged(const QString &))); Layer *layer = dynamic_cast(container); if (layer) { box->layerVisibilityChanged(!layer->isLayerDormant(m_client)); } QString shortName = name; if (layer) { shortName = LayerFactory::getInstance()->getLayerPresentationName (LayerFactory::getInstance()->getLayerType(layer)); if (layer->getLayerPresentationName() != "") { name = layer->getLayerPresentationName(); } } bool nameDiffers = (name != shortName); shortName = QString("&%1 %2").arg(i + 1).arg(shortName); QString iconName = container->getPropertyContainerIconName(); QIcon icon(IconLoader().load(iconName)); if (icon.isNull()) { addTab(box, shortName); if (nameDiffers) { setTabToolTip(i, name); } } else { addTab(box, icon, QString("&%1").arg(i + 1)); setTabToolTip(i, name); } m_boxes.push_back(box); } blockSignals(false); } bool PropertyStack::containsContainer(PropertyContainer *pc) const { for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) { PropertyContainer *container = m_client->getPropertyContainer(i); if (pc == container) return true; } return false; } int PropertyStack::getContainerIndex(PropertyContainer *pc) const { for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) { PropertyContainer *container = m_client->getPropertyContainer(i); if (pc == container) return i; } return false; } void PropertyStack::propertyContainerAdded(PropertyContainer *) { if (sender() != m_client) return; repopulate(); } void PropertyStack::propertyContainerRemoved(PropertyContainer *) { if (sender() != m_client) return; repopulate(); } void PropertyStack::propertyContainerPropertyChanged(PropertyContainer *pc) { Layer *layer = dynamic_cast(pc); for (unsigned int i = 0; i < m_boxes.size(); ++i) { if (pc == m_boxes[i]->getContainer()) { m_boxes[i]->propertyContainerPropertyChanged(pc); if (layer) { m_boxes[i]->layerVisibilityChanged (!layer->isLayerDormant(m_client)); } } } } void PropertyStack::propertyContainerPropertyRangeChanged(PropertyContainer *pc) { for (unsigned int i = 0; i < m_boxes.size(); ++i) { if (pc == m_boxes[i]->getContainer()) { m_boxes[i]->propertyContainerPropertyRangeChanged(pc); } } } void PropertyStack::propertyContainerNameChanged(PropertyContainer *) { if (sender() != m_client) return; repopulate(); } class ShowLayerCommand : public QObject, public Command { public: ShowLayerCommand(View *view, Layer *layer, bool show, QString name) : m_view(view), m_layer(layer), m_show(show), m_name(name) { } void execute() { m_layer->showLayer(m_view, m_show); } void unexecute() { m_layer->showLayer(m_view, !m_show); } QString getName() const { return m_name; } protected: View *m_view; Layer *m_layer; bool m_show; QString m_name; }; void PropertyStack::showLayer(bool show) { QObject *obj = sender(); for (unsigned int i = 0; i < m_boxes.size(); ++i) { if (obj == m_boxes[i]) { Layer *layer = dynamic_cast(m_boxes[i]->getContainer()); if (layer) { CommandHistory::getInstance()->addCommand (new ShowLayerCommand(m_client, layer, show, tr("Change Layer Visibility"))); return; } } } } void PropertyStack::selectedContainerChanged(int n) { if (n >= int(m_boxes.size())) return; emit propertyContainerSelected(m_client, m_boxes[n]->getContainer()); } void PropertyStack::mouseEnteredTabBar() { emit contextHelpChanged(tr("Click to change the current active layer")); } void PropertyStack::mouseLeftTabBar() { emit contextHelpChanged(""); } void PropertyStack::activeTabClicked() { emit viewSelected(m_client); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/RangeInputDialog.cpp0000644000175000017500000000622112252354725024436 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "RangeInputDialog.h" #include #include #include #include #include #include RangeInputDialog::RangeInputDialog(QString title, QString message, QString unit, float min, float max, QWidget *parent) : QDialog(parent) { QGridLayout *grid = new QGridLayout; setLayout(grid); setWindowTitle(title); QLabel *messageLabel = new QLabel; messageLabel->setText(message); grid->addWidget(messageLabel, 0, 0, 1, 5); m_rangeStart = new QDoubleSpinBox; m_rangeStart->setDecimals(4); m_rangeStart->setMinimum(min); m_rangeStart->setMaximum(max); m_rangeStart->setSuffix(unit); grid->addWidget(m_rangeStart, 1, 1); connect(m_rangeStart, SIGNAL(valueChanged(double)), this, SLOT(rangeStartChanged(double))); grid->addWidget(new QLabel(tr(" to ")), 1, 2); m_rangeEnd = new QDoubleSpinBox; m_rangeEnd->setDecimals(4); m_rangeEnd->setMinimum(min); m_rangeEnd->setMaximum(max); m_rangeEnd->setSuffix(unit); grid->addWidget(m_rangeEnd, 1, 3); connect(m_rangeEnd, SIGNAL(valueChanged(double)), this, SLOT(rangeEndChanged(double))); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); grid->addWidget(bb, 2, 0, 1, 5); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); } RangeInputDialog::~RangeInputDialog() { } void RangeInputDialog::getRange(float &min, float &max) { min = float(m_rangeStart->value()); max = float(m_rangeEnd->value()); if (min > max) { float tmp = min; min = max; max = tmp; } } void RangeInputDialog::setRange(float start, float end) { if (start > end) { float tmp = start; start = end; end = tmp; } blockSignals(true); m_rangeStart->setValue(start); m_rangeEnd->setValue(end); blockSignals(false); } void RangeInputDialog::rangeStartChanged(double min) { double max = m_rangeEnd->value(); if (min > max) { double tmp = min; min = max; max = tmp; } emit rangeChanged(float(min), float(max)); } void RangeInputDialog::rangeEndChanged(double max) { double min = m_rangeStart->value(); if (min > max) { double tmp = min; min = max; max = tmp; } emit rangeChanged(float(min), float(max)); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/RangeInputDialog.h0000644000175000017500000000241412252354725024103 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _RANGE_INPUT_DIALOG_H_ #define _RANGE_INPUT_DIALOG_H_ #include #include class QDoubleSpinBox; class RangeInputDialog : public QDialog { Q_OBJECT public: RangeInputDialog(QString title, QString message, QString unit, float min, float max, QWidget *parent = 0); virtual ~RangeInputDialog(); void getRange(float &start, float &end); signals: void rangeChanged(float start, float end); public slots: void setRange(float start, float end); protected slots: void rangeStartChanged(double); void rangeEndChanged(double); protected: QDoubleSpinBox *m_rangeStart; QDoubleSpinBox *m_rangeEnd; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/ImageDialog.h0000644000175000017500000000314112252354725023047 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _IMAGE_DIALOG_H_ #define _IMAGE_DIALOG_H_ #include #include class QLineEdit; class QLabel; class QPushButton; class FileSource; class ImageDialog : public QDialog { Q_OBJECT public: ImageDialog(QString title, QString image = "", QString label = "", QWidget *parent = 0); virtual ~ImageDialog(); QString getImage(); QPixmap getPixmap(); QString getLabel(); signals: void imageChanged(QString image); void labelChanged(QString label); public slots: void setImage(QString image); void setLabel(QString label); void updatePreview(); protected slots: void browseClicked(); void imageEditEdited(const QString &); void imageEditEdited(); protected: void resizeEvent(QResizeEvent *); QLineEdit *m_imageEdit; QLineEdit *m_labelEdit; QLabel *m_imagePreview; QString m_loadedImageFile; QPixmap m_loadedImage; QPushButton *m_okButton; FileSource *m_remoteFile; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/TipDialog.h0000644000175000017500000000410112252354725022556 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TIP_DIALOG_H_ #define _TIP_DIALOG_H_ #include #include #include #include #include "base/Debug.h" class QLabel; class QXmlInputSource; class TipDialog : public QDialog { Q_OBJECT public: TipDialog(QWidget *parent = 0); virtual ~TipDialog(); bool isOK() { return !m_tips.empty(); } protected slots: void previous(); void next(); protected: int m_tipNumber; QLabel *m_label; QString m_caption; std::vector m_tips; void readTips(); void showTip(); class TipFileParser : public QXmlDefaultHandler { public: TipFileParser(TipDialog *dialog); virtual ~TipFileParser(); void parse(QXmlInputSource &source); virtual bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes& atts); virtual bool characters(const QString &); virtual bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName); bool error(const QXmlParseException &exception); bool fatalError(const QXmlParseException &exception); protected: TipDialog *m_dialog; bool m_inTip; bool m_inText; bool m_inHtml; }; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/TextAbbrev.cpp0000644000175000017500000001666412252354725023324 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "TextAbbrev.h" #include #include #include QString TextAbbrev::getDefaultEllipsis() { return "..."; } int TextAbbrev::getFuzzLength(QString ellipsis) { int len = ellipsis.length(); if (len < 3) return len + 3; else if (len > 5) return len + 5; else return len * 2; } int TextAbbrev::getFuzzWidth(const QFontMetrics &metrics, QString ellipsis) { int width = metrics.width(ellipsis); return width * 2; } QString TextAbbrev::abbreviateTo(QString text, int characters, Policy policy, QString ellipsis) { switch (policy) { case ElideEnd: case ElideEndAndCommonPrefixes: text = text.left(characters) + ellipsis; break; case ElideStart: text = ellipsis + text.right(characters); break; case ElideMiddle: if (characters > 2) { text = text.left(characters/2 + 1) + ellipsis + text.right(characters - (characters/2 + 1)); } else { text = text.left(characters) + ellipsis; } break; } return text; } QString TextAbbrev::abbreviate(QString text, int maxLength, Policy policy, bool fuzzy, QString ellipsis) { if (ellipsis == "") ellipsis = getDefaultEllipsis(); int fl = (fuzzy ? getFuzzLength(ellipsis) : 0); if (maxLength <= ellipsis.length()) maxLength = ellipsis.length() + 1; if (text.length() <= maxLength + fl) return text; int truncated = maxLength - ellipsis.length(); return abbreviateTo(text, truncated, policy, ellipsis); } QString TextAbbrev::abbreviate(QString text, const QFontMetrics &metrics, int &maxWidth, Policy policy, QString ellipsis) { if (ellipsis == "") ellipsis = getDefaultEllipsis(); int tw = metrics.width(text); if (tw <= maxWidth) { maxWidth = tw; return text; } int truncated = text.length(); QString original = text; while (tw > maxWidth && truncated > 1) { truncated--; if (truncated > ellipsis.length()) { text = abbreviateTo(original, truncated, policy, ellipsis); } else { break; } tw = metrics.width(text); } maxWidth = tw; return text; } QStringList TextAbbrev::abbreviate(const QStringList &texts, int maxLength, Policy policy, bool fuzzy, QString ellipsis) { if (policy == ElideEndAndCommonPrefixes && texts.size() > 1) { if (ellipsis == "") ellipsis = getDefaultEllipsis(); int fl = (fuzzy ? getFuzzLength(ellipsis) : 0); if (maxLength <= ellipsis.length()) maxLength = ellipsis.length() + 1; int maxOrigLength = 0; for (int i = 0; i < texts.size(); ++i) { int len = texts[i].length(); if (len > maxOrigLength) maxOrigLength = len; } if (maxOrigLength <= maxLength + fl) return texts; return abbreviate(elidePrefixes (texts, maxOrigLength - maxLength, ellipsis), maxLength, ElideEnd, fuzzy, ellipsis); } QStringList results; for (int i = 0; i < texts.size(); ++i) { results.push_back (abbreviate(texts[i], maxLength, policy, fuzzy, ellipsis)); } return results; } QStringList TextAbbrev::abbreviate(const QStringList &texts, const QFontMetrics &metrics, int &maxWidth, Policy policy, QString ellipsis) { if (policy == ElideEndAndCommonPrefixes && texts.size() > 1) { if (ellipsis == "") ellipsis = getDefaultEllipsis(); int maxOrigWidth = 0; for (int i = 0; i < texts.size(); ++i) { int w = metrics.width(texts[i]); if (w > maxOrigWidth) maxOrigWidth = w; } return abbreviate(elidePrefixes(texts, metrics, maxOrigWidth - maxWidth, ellipsis), metrics, maxWidth, ElideEnd, ellipsis); } QStringList results; int maxAbbrWidth = 0; for (int i = 0; i < texts.size(); ++i) { int width = maxWidth; QString abbr = abbreviate(texts[i], metrics, width, policy, ellipsis); if (width > maxAbbrWidth) maxAbbrWidth = width; results.push_back(abbr); } maxWidth = maxAbbrWidth; return results; } QStringList TextAbbrev::elidePrefixes(const QStringList &texts, int targetReduction, QString ellipsis) { if (texts.empty()) return texts; int plen = getPrefixLength(texts); int fl = getFuzzLength(ellipsis); if (plen < fl) return texts; QString prefix = texts[0].left(plen); int truncated = plen; if (plen >= targetReduction + fl) { truncated = plen - targetReduction; } else { truncated = fl; } prefix = abbreviate(prefix, truncated, ElideEnd, false, ellipsis); QStringList results; for (int i = 0; i < texts.size(); ++i) { results.push_back (prefix + texts[i].right(texts[i].length() - plen)); } return results; } QStringList TextAbbrev::elidePrefixes(const QStringList &texts, const QFontMetrics &metrics, int targetWidthReduction, QString ellipsis) { if (texts.empty()) return texts; int plen = getPrefixLength(texts); int fl = getFuzzLength(ellipsis); if (plen < fl) return texts; QString prefix = texts[0].left(plen); int pwid = metrics.width(prefix); int twid = pwid - targetWidthReduction; if (twid < metrics.width(ellipsis) * 2) twid = metrics.width(ellipsis) * 2; prefix = abbreviate(prefix, metrics, twid, ElideEnd, ellipsis); QStringList results; for (int i = 0; i < texts.size(); ++i) { results.push_back (prefix + texts[i].right(texts[i].length() - plen)); } return results; } static bool havePrefix(QString prefix, const QStringList &texts) { for (int i = 1; i < texts.size(); ++i) { if (!texts[i].startsWith(prefix)) return false; } return true; } int TextAbbrev::getPrefixLength(const QStringList &texts) { QString reference = texts[0]; if (reference == "" || havePrefix(reference, texts)) { return reference.length(); } int candidate = reference.length(); QString splitChars(";:,./#-!()$_+=[]{}\\"); while (--candidate > 1) { if (splitChars.contains(reference[candidate])) { if (havePrefix(reference.left(candidate), texts)) { break; } } } // SVDEBUG << "TextAbbrev::getPrefixLength: prefix length is " << candidate << endl; // for (int i = 0; i < texts.size(); ++i) { // cerr << texts[i].left(candidate) << "|" << texts[i].right(texts[i].length() - candidate) << endl; // } return candidate; } sonic-visualiser-2.3~repack1.orig/svgui/widgets/LabelCounterInputDialog.cpp0000644000175000017500000000515612252354725025767 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "LabelCounterInputDialog.h" #include #include #include #include #include LabelCounterInputDialog::LabelCounterInputDialog(Labeller *labeller, QWidget *parent) : QDialog(parent), m_labeller(labeller) { setWindowTitle(tr("Set Counters")); QGridLayout *layout = new QGridLayout(this); QLabel *label = new QLabel(tr("Fine counter (beats):")); layout->addWidget(label, 1, 0); label = new QLabel(tr("Coarse counter (bars):")); layout->addWidget(label, 0, 0); QSpinBox *counter = new QSpinBox; counter->setMinimum(-10); counter->setMaximum(10000); counter->setSingleStep(1); m_origSecondCounter = m_labeller->getSecondLevelCounterValue(); counter->setValue(m_origSecondCounter); connect(counter, SIGNAL(valueChanged(int)), this, SLOT(secondCounterChanged(int))); layout->addWidget(counter, 0, 1); counter = new QSpinBox; counter->setMinimum(-10); counter->setMaximum(10000); counter->setSingleStep(1); m_origCounter = m_labeller->getCounterValue(); counter->setValue(m_origCounter); connect(counter, SIGNAL(valueChanged(int)), this, SLOT(counterChanged(int))); layout->addWidget(counter, 1, 1); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(bb, 2, 0, 1, 2); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(cancelClicked())); } LabelCounterInputDialog::~LabelCounterInputDialog() { } void LabelCounterInputDialog::counterChanged(int value) { m_labeller->setCounterValue(value); } void LabelCounterInputDialog::secondCounterChanged(int value) { m_labeller->setSecondLevelCounterValue(value); } void LabelCounterInputDialog::cancelClicked() { m_labeller->setCounterValue(m_origCounter); m_labeller->setSecondLevelCounterValue(m_origSecondCounter); reject(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/AudioDial.h0000644000175000017500000001104712252354725022544 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_DIAL_H_ #define _AUDIO_DIAL_H_ /** * A rotary dial widget. * * Based on an original design by Thorsten Wilms. * * Implemented as a widget for the Rosegarden MIDI and audio sequencer * and notation editor by Chris Cannam. * * Extracted into a standalone Qt3 widget by Pedro Lopez-Cabanillas * and adapted for use in QSynth. * * Ported to Qt4 by Chris Cannam. * * This file copyright 2003-2006 Chris Cannam, copyright 2005 Pedro * Lopez-Cabanillas, copyright 2006 Queen Mary, University of London. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. See the file * COPYING included with this distribution for more information. */ #include #include class RangeMapper; /** * AudioDial is a nicer-looking QDial that by default reacts to mouse * movement on horizontal and vertical axes instead of in a radial * motion. Move the mouse up or right to increment the value, down or * left to decrement it. AudioDial also responds to the mouse wheel. * * The programming interface for this widget is compatible with QDial, * with the addition of properties for the knob colour and meter * colour and a boolean property mouseDial that determines whether to * respond to radial mouse motion in the same way as QDial (the * default is no). */ class AudioDial : public QDial { Q_OBJECT Q_PROPERTY( QColor knobColor READ getKnobColor WRITE setKnobColor ) Q_PROPERTY( QColor meterColor READ getMeterColor WRITE setMeterColor ) Q_PROPERTY( bool mouseDial READ getMouseDial WRITE setMouseDial ) public: AudioDial(QWidget *parent = 0); ~AudioDial(); const QColor& getKnobColor() const { return m_knobColor; } const QColor& getMeterColor() const { return m_meterColor; } bool getMouseDial() const { return m_mouseDial; } void setRangeMapper(RangeMapper *mapper); // I take ownership, will delete const RangeMapper *rangeMapper() const { return m_rangeMapper; } float mappedValue() const; int defaultValue() const { return m_defaultValue; } void setShowToolTip(bool show); signals: void mouseEntered(); void mouseLeft(); public slots: /** * Set the colour of the knob. The default is to inherit the * colour from the widget's palette. */ void setKnobColor(const QColor &color); /** * Set the colour of the meter (the highlighted area around the * knob that shows the current value). The default is to inherit * the colour from the widget's palette. */ void setMeterColor(const QColor &color); /** * Specify that the dial should respond to radial mouse movements * in the same way as QDial. */ void setMouseDial(bool mouseDial); void setDefaultValue(int defaultValue); void setValue(int value); void setDefaultMappedValue(float mappedValue); void setMappedValue(float mappedValue); void setToDefault(); protected: void drawTick(QPainter &paint, float angle, int size, bool internal); virtual void paintEvent(QPaintEvent *); // Alternate mouse behavior event handlers. virtual void mousePressEvent(QMouseEvent *pMouseEvent); virtual void mouseMoveEvent(QMouseEvent *pMouseEvent); virtual void mouseReleaseEvent(QMouseEvent *pMouseEvent); virtual void mouseDoubleClickEvent(QMouseEvent *pMouseEvent); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); protected slots: void updateMappedValue(int value); private: QColor m_knobColor; QColor m_meterColor; int m_defaultValue; float m_defaultMappedValue; float m_mappedValue; bool m_noMappedUpdate; // Alternate mouse behavior tracking. bool m_mouseDial; bool m_mousePressed; QPoint m_posMouse; bool m_showTooltip; RangeMapper *m_rangeMapper; }; #endif // __AudioDial_h // end of AudioDial.h sonic-visualiser-2.3~repack1.orig/svgui/widgets/PropertyBox.h0000644000175000017500000000460312252354725023206 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PROPERTY_BOX_H_ #define _PROPERTY_BOX_H_ #include "base/PropertyContainer.h" #include #include class QLayout; class QWidget; class QGridLayout; class QVBoxLayout; class QLabel; class LEDButton; class PropertyBox : public QFrame { Q_OBJECT public: PropertyBox(PropertyContainer *); ~PropertyBox(); PropertyContainer *getContainer() { return m_container; } signals: void changePlayGainDial(int); void changePlayPanDial(int); void showLayer(bool); void contextHelpChanged(const QString &); public slots: void propertyContainerPropertyChanged(PropertyContainer *); void propertyContainerPropertyRangeChanged(PropertyContainer *); void pluginConfigurationChanged(QString); void layerVisibilityChanged(bool); protected slots: void propertyControllerChanged(int); void propertyControllerChanged(bool); void playAudibleChanged(bool); void playAudibleButtonChanged(bool); void playGainChanged(float); void playGainDialChanged(int); void playPanChanged(float); void playPanDialChanged(int); void populateViewPlayFrame(); void unitDatabaseChanged(); void colourDatabaseChanged(); void editPlugin(); void mouseEnteredWidget(); void mouseLeftWidget(); protected: void updatePropertyEditor(PropertyContainer::PropertyName, bool rangeChanged = false); void updateContextHelp(QObject *o); void addNewColour(); QLabel *m_nameWidget; QWidget *m_mainWidget; QGridLayout *m_layout; PropertyContainer *m_container; QFrame *m_viewPlayFrame; QVBoxLayout *m_mainBox; LEDButton *m_showButton; LEDButton *m_playButton; std::map m_groupLayouts; std::map m_propertyControllers; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/ColourNameDialog.cpp0000644000175000017500000000564412252354725024436 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ColourNameDialog.h" #include #include #include #include #include #include #include #include ColourNameDialog::ColourNameDialog(QString title, QString message, QColor colour, QString defaultName, QWidget *parent) : QDialog(parent), m_colour(colour) { setWindowTitle(title); QGridLayout *layout = new QGridLayout(this); QLabel *label = new QLabel(message, this); layout->addWidget(label, 0, 0, 1, 2); m_colourLabel = new QLabel(this); layout->addWidget(m_colourLabel, 1, 1); m_textField = new QLineEdit(defaultName, this); layout->addWidget(m_textField, 1, 0); connect(m_textField, SIGNAL(textChanged(const QString &)), this, SLOT(textChanged(const QString &))); m_darkBackground = new QCheckBox(this); layout->addWidget(m_darkBackground, 2, 0); m_darkBackground->setChecked (colour.red() + colour.green() + colour.blue() > 384); fillColourLabel(); connect(m_darkBackground, SIGNAL(stateChanged(int)), this, SLOT(darkBackgroundChanged(int))); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(bb, 3, 0, 1, 2); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); m_okButton = bb->button(QDialogButtonBox::Ok); m_okButton->setEnabled(defaultName != ""); } void ColourNameDialog::showDarkBackgroundCheckbox(QString text) { m_darkBackground->setText(text); m_darkBackground->show(); } bool ColourNameDialog::isDarkBackgroundChecked() const { return m_darkBackground->isChecked(); } void ColourNameDialog::darkBackgroundChanged(int) { fillColourLabel(); } void ColourNameDialog::textChanged(const QString &text) { m_okButton->setEnabled(text != ""); } void ColourNameDialog::fillColourLabel() { QPixmap pmap(20, 20); pmap.fill(m_darkBackground->isChecked() ? Qt::black : Qt::white); QPainter paint(&pmap); paint.setPen(m_colour); paint.setBrush(m_colour); paint.drawRect(2, 2, 15, 15); m_colourLabel->setPixmap(pmap); } QString ColourNameDialog::getColourName() const { return m_textField->text(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/WindowTypeSelector.h0000644000175000017500000000251512252354725024523 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _WINDOW_TYPE_SELECTOR_H_ #define _WINDOW_TYPE_SELECTOR_H_ #include #include "base/Window.h" class WindowShapePreview; class QComboBox; class WindowTypeSelector : public QFrame { Q_OBJECT public: WindowTypeSelector(WindowType defaultType = WindowType(999), // 999 -> get from preferences QWidget *parent = 0); virtual ~WindowTypeSelector(); WindowType getWindowType() const; signals: void windowTypeChanged(WindowType type); public slots: void setWindowType(WindowType type); protected slots: void windowIndexChanged(int index); protected: QComboBox *m_windowCombo; WindowShapePreview *m_windowShape; WindowType *m_windows; WindowType m_windowType; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/WindowShapePreview.h0000644000175000017500000000210212252354725024473 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _WINDOW_SHAPE_PREVIEW_H_ #define _WINDOW_SHAPE_PREVIEW_H_ #include #include "base/Window.h" class QLabel; class WindowShapePreview : public QFrame { Q_OBJECT public: WindowShapePreview(QWidget *parent = 0); virtual ~WindowShapePreview(); public slots: void setWindowType(WindowType type); protected: QLabel *m_windowTimeExampleLabel; QLabel *m_windowFreqExampleLabel; WindowType m_windowType; void updateLabels(); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/NotifyingCheckBox.h0000644000175000017500000000217512252354725024270 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _NOTIFYING_CHECK_BOX_H_ #define _NOTIFYING_CHECK_BOX_H_ #include /** * Very trivial enhancement to QCheckBox to make it emit signals when * the mouse enters and leaves (for context help). */ class NotifyingCheckBox : public QCheckBox { Q_OBJECT public: NotifyingCheckBox(QWidget *parent = 0) : QCheckBox(parent) { } virtual ~NotifyingCheckBox(); signals: void mouseEntered(); void mouseLeft(); protected: virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/ImageDialog.cpp0000644000175000017500000001400612252354725023404 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ImageDialog.h" #include #include #include #include #include #include #include #include #include #include #include "ProgressDialog.h" #include "data/fileio/FileSource.h" #include "InteractiveFileFinder.h" #include ImageDialog::ImageDialog(QString title, QString image, QString label, QWidget *parent) : QDialog(parent), m_imagePreview(0), m_remoteFile(0) { setWindowTitle(title); QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *databox = new QGroupBox(tr("Image")); QGridLayout *subgrid = new QGridLayout; databox->setLayout(subgrid); int row = 0; subgrid->addWidget(new QLabel(tr("Label:")), row, 0); m_labelEdit = new QLineEdit; subgrid->addWidget(m_labelEdit, row, 1, 1, 2); ++row; subgrid->addWidget(new QLabel(tr("File or URL:")), row, 0); m_imageEdit = new QLineEdit; subgrid->addWidget(m_imageEdit, row, 1, 1, 1); connect(m_imageEdit, SIGNAL(textEdited(const QString &)), this, SLOT(imageEditEdited(const QString &))); connect(m_imageEdit, SIGNAL(editingFinished()), this, SLOT(imageEditEdited())); QPushButton *browse = new QPushButton(tr("Browse...")); connect(browse, SIGNAL(clicked()), this, SLOT(browseClicked())); subgrid->addWidget(browse, row, 2, 1, 1); ++row; QGroupBox *previewbox = new QGroupBox(tr("Preview")); subgrid = new QGridLayout; previewbox->setLayout(subgrid); m_imagePreview = new QLabel; m_imagePreview->setAlignment(Qt::AlignCenter); subgrid->addWidget(m_imagePreview, 0, 0); m_imagePreview->setMinimumSize(QSize(100, 100)); QDesktopWidget *desktop = QApplication::desktop(); m_imagePreview->setMaximumSize(QSize((desktop->width() * 2) / 3, (desktop->height() * 2) / 3)); grid->addWidget(databox, 0, 0); grid->addWidget(previewbox, 1, 0); grid->setRowStretch(1, 10); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); grid->addWidget(bb, 2, 0, 1, 1); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); m_okButton = bb->button(QDialogButtonBox::Ok); m_okButton->setEnabled(false); if (image != "") setImage(image); if (label != "") setLabel(label); } ImageDialog::~ImageDialog() { delete m_remoteFile; } QString ImageDialog::getImage() { return m_loadedImageFile; } QPixmap ImageDialog::getPixmap() { return m_loadedImage; } QString ImageDialog::getLabel() { return m_labelEdit->text(); } void ImageDialog::setImage(QString image) { m_imageEdit->setText(image); updatePreview(); } void ImageDialog::setLabel(QString label) { m_labelEdit->setText(label); } void ImageDialog::resizeEvent(QResizeEvent *) { updatePreview(); } void ImageDialog::imageEditEdited(const QString &s) { if (s.startsWith("http:") || s.startsWith("ftp:")) { return; } updatePreview(); } void ImageDialog::imageEditEdited() { updatePreview(); } void ImageDialog::updatePreview() { if (!m_imagePreview) return; QString img = m_imageEdit->text(); m_okButton->setEnabled(img != ""); if (img != m_loadedImageFile) { QString fileName = img; delete m_remoteFile; m_remoteFile = 0; if (FileSource::isRemote(fileName)) { QUrl url(fileName); if (!FileSource::canHandleScheme(url)) { QMessageBox::critical(this, tr("Unsupported scheme in URL"), tr("The URL scheme \"%1\" is not supported") .arg(url.scheme())); } else { ProgressDialog dialog(tr("Opening image URL..."), true, 2000); m_remoteFile = new FileSource(url, &dialog); m_remoteFile->waitForData(); if (!m_remoteFile->isOK()) { QMessageBox::critical(this, tr("File download failed"), tr("Failed to download URL \"%1\": %2") .arg(url.toString()).arg(m_remoteFile->getErrorString())); delete m_remoteFile; m_remoteFile = 0; } else { fileName = m_remoteFile->getLocalFilename(); } } } // cerr << "image filename: \"" << fileName << "\"" << endl; m_loadedImage = QPixmap(fileName); m_loadedImageFile = img; } QSize sz(m_imagePreview->size()); int m = m_imagePreview->margin() * 2; sz -= QSize(m, m); if (m_loadedImage.isNull()) { m_imagePreview->setPixmap(QPixmap()); } else { m_imagePreview->setPixmap(m_loadedImage.scaled (sz, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } } void ImageDialog::browseClicked() { QString file = InteractiveFileFinder::getInstance()->getOpenFileName(FileFinder::ImageFile); if (file != "") { setImage(file); emit imageChanged(file); } } sonic-visualiser-2.3~repack1.orig/svgui/widgets/Thumbwheel.h0000644000175000017500000000511112252354725023010 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _THUMBWHEEL_H_ #define _THUMBWHEEL_H_ #include #include #include class RangeMapper; class Thumbwheel : public QWidget { Q_OBJECT public: Thumbwheel(Qt::Orientation orientation, QWidget *parent = 0); virtual ~Thumbwheel(); int getMinimumValue() const; int getMaximumValue() const; int getDefaultValue() const; float getSpeed() const; bool getTracking() const; bool getShowScale() const; int getValue() const; void setRangeMapper(RangeMapper *mapper); // I take ownership, will delete const RangeMapper *getRangeMapper() const { return m_rangeMapper; } float getMappedValue() const; void setShowToolTip(bool show); QSize sizeHint() const; signals: void valueChanged(int); void mouseEntered(); void mouseLeft(); public slots: void setMinimumValue(int min); void setMaximumValue(int max); void setDefaultValue(int deft); void setSpeed(float speed); void setTracking(bool tracking); void setShowScale(bool show); void setValue(int value); void setMappedValue(float mappedValue); void scroll(bool up); void resetToDefault(); protected slots: void updateMappedValue(int value); protected: virtual void mousePressEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void wheelEvent(QWheelEvent *e); virtual void paintEvent(QPaintEvent *e); virtual void enterEvent(QEvent *); virtual void leaveEvent(QEvent *); int m_min; int m_max; int m_default; int m_value; float m_mappedValue; bool m_noMappedUpdate; float m_rotation; Qt::Orientation m_orientation; float m_speed; bool m_tracking; bool m_showScale; bool m_clicked; bool m_atDefault; QPoint m_clickPos; float m_clickRotation; bool m_showTooltip; RangeMapper *m_rangeMapper; QImage m_cache; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/ColourNameDialog.h0000644000175000017500000000255312252354725024077 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _COLOUR_NAME_DIALOG_H_ #define _COLOUR_NAME_DIALOG_H_ #include #include #include class QLabel; class QLineEdit; class QCheckBox; class QPushButton; class ColourNameDialog : public QDialog { Q_OBJECT public: ColourNameDialog(QString title, QString message, QColor colour, QString defaultName, QWidget *parent = 0); void showDarkBackgroundCheckbox(QString text); QString getColourName() const; bool isDarkBackgroundChecked() const; protected slots: void darkBackgroundChanged(int); void textChanged(const QString &); protected: QColor m_colour; QLabel *m_colourLabel; QLineEdit *m_textField; QPushButton *m_okButton; QCheckBox *m_darkBackground; void fillColourLabel(); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/MIDIFileImportDialog.cpp0000644000175000017500000000424412252354725025102 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "MIDIFileImportDialog.h" #include #include MIDIFileImportDialog::MIDIFileImportDialog(QWidget *parent) : m_parent(parent) { } MIDIFileImportDialog::TrackPreference MIDIFileImportDialog::getTrackImportPreference(QStringList displayNames, bool haveSomePercussion, QString &singleTrack) const { QStringList available; QString allTracks = tr("Merge all tracks"); QString allNonPercussion = tr("Merge all non-percussion tracks"); singleTrack = ""; int nonTrackItems = 1; available << allTracks; if (haveSomePercussion) { available << allNonPercussion; ++nonTrackItems; } available << displayNames; bool ok = false; QString selected = QInputDialog::getItem (0, tr("Select track or tracks to import"), tr("Select track to import

You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.

Please select the track or merged tracks you wish to import:"), available, 0, false, &ok); if (!ok || selected.isEmpty()) return ImportNothing; TrackPreference pref; if (selected == allTracks) pref = MergeAllTracks; else if (selected == allNonPercussion) pref = MergeAllNonPercussionTracks; else { singleTrack = selected; pref = ImportSingleTrack; } return pref; } void MIDIFileImportDialog::showError(QString error) { QMessageBox::critical(0, tr("Error in MIDI file import"), error); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/PluginParameterDialog.h0000644000175000017500000000706012252354725025130 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PLUGIN_PARAMETER_DIALOG_H_ #define _PLUGIN_PARAMETER_DIALOG_H_ #include #include "base/Window.h" #include class PluginParameterBox; class QWidget; class QPushButton; class QLabel; class QGroupBox; class QComboBox; class QCheckBox; /** * A dialog for editing the parameters of a given plugin, using a * PluginParameterBox. This dialog does not contain any mechanism for * selecting the plugin in the first place. Note that the dialog * directly modifies the parameters of the plugin, so they will remain * modified even if the dialog is then cancelled. */ class PluginParameterDialog : public QDialog { Q_OBJECT public: PluginParameterDialog(Vamp::PluginBase *, QWidget *parent = 0); ~PluginParameterDialog(); void setChannelArrangement(int sourceChannels, int targetChannels, int defaultChannel); void setOutputLabel(QString output, QString description); void setMoreInfoUrl(QString url); void setShowProcessingOptions(bool showWindowSize, bool showFrequencyDomainOptions); void setCandidateInputModels(const QStringList &names, QString defaultName); void setShowSelectionOnlyOption(bool show); Vamp::PluginBase *getPlugin() { return m_plugin; } int getChannel() const { return m_channel; } QString getInputModel() const; bool getSelectionOnly() const; //!!! merge with PluginTransform::ExecutionContext void getProcessingParameters(size_t &blockSize) const; void getProcessingParameters(size_t &stepSize, size_t &blockSize, WindowType &windowType) const; int exec(); signals: void pluginConfigurationChanged(QString); void inputModelChanged(QString); protected slots: void channelComboChanged(int); void blockSizeComboChanged(const QString &); void incrementComboChanged(const QString &); void windowTypeChanged(WindowType type); void advancedToggled(); void moreInfo(); void setAdvancedVisible(bool); void inputModelComboChanged(int); void selectionOnlyChanged(int); void dialogAccepted(); protected: Vamp::PluginBase *m_plugin; int m_channel; size_t m_stepSize; size_t m_blockSize; WindowType m_windowType; PluginParameterBox *m_parameterBox; QLabel *m_outputLabel; QLabel *m_outputValue; QLabel *m_outputDescription; QLabel *m_outputSpacer; QPushButton *m_moreInfo; QString m_moreInfoUrl; QGroupBox *m_channelBox; bool m_haveChannelBoxData; QGroupBox *m_windowBox; bool m_haveWindowBoxData; QGroupBox *m_inputModelBox; QComboBox *m_inputModels; QCheckBox *m_selectionOnly; QStringList m_inputModelList; QString m_currentInputModel; bool m_currentSelectionOnly; QPushButton *m_advancedButton; QWidget *m_advanced; bool m_advancedVisible; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/KeyReference.cpp0000644000175000017500000001242612252354725023615 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "KeyReference.h" #include #include #include #include #include #include #include KeyReference::KeyReference() : m_dialog(0) { } KeyReference::~KeyReference() { delete m_dialog; } void KeyReference::setCategory(QString category) { if (m_map.find(category) == m_map.end()) { m_categoryOrder.push_back(category); m_map[category] = KeyList(); } m_currentCategory = category; } void KeyReference::registerShortcut(QAction *action, QString overrideName) { QString name = action->text(); if (overrideName != "") name = overrideName; QString shortcut = action->shortcut().toString(); QString tip = action->statusTip(); registerShortcut(name, shortcut, tip); } void KeyReference::registerShortcut(QString name, QString shortcut, QString tip) { name.replace(tr("&"), ""); KeyList &list = m_map[m_currentCategory]; for (KeyList::iterator i = list.begin(); i != list.end(); ++i) { if (i->actionName == name) { i->shortcut = shortcut; i->tip = tip; i->alternatives.clear(); return; } } KeyDetails details; details.actionName = name; details.shortcut = shortcut; details.tip = tip; list.push_back(details); } void KeyReference::registerAlternativeShortcut(QAction *action, QString alternative) { QString name = action->text(); registerAlternativeShortcut(name, alternative); } void KeyReference::registerAlternativeShortcut(QString name, QString alternative) { name.replace(tr("&"), ""); KeyList &list = m_map[m_currentCategory]; for (KeyList::iterator i = list.begin(); i != list.end(); ++i) { if (i->actionName == name) { i->alternatives.push_back(alternative); return; } } } void KeyReference::show() { if (m_dialog) { m_dialog->show(); m_dialog->raise(); return; } QString text; QColor bgcolor = QApplication::palette().window().color(); bool darkbg = (bgcolor.red() + bgcolor.green() + bgcolor.blue() < 384); text += QString("

") .arg(darkbg ? "#121212" : "#e8e8e8"); for (CategoryList::iterator i = m_categoryOrder.begin(); i != m_categoryOrder.end(); ++i) { QString category = *i; KeyList &list = m_map[category]; text += QString("\n").arg(darkbg ? "#303030" : "#d0d0d0").arg(category); for (KeyList::iterator j = list.begin(); j != list.end(); ++j) { QString actionName = j->actionName; QString shortcut = j->shortcut; shortcut.replace(" ", " "); QString tip = j->tip; if (tip != "") tip = QString("%1").arg(tip); QString altdesc; if (!j->alternatives.empty()) { for (std::vector::iterator k = j->alternatives.begin(); k != j->alternatives.end(); ++k) { QString alt = *k; alt.replace(" ", " "); altdesc += tr("or %1").arg(alt); } altdesc = tr(" (%1)").arg(altdesc); } text += QString("\n") .arg(shortcut).arg(altdesc).arg(actionName).arg(tip); } } text += "

%2
 %1%2 %3%4
\n"; m_text = new QTextEdit; m_text->setHtml(text); m_text->setReadOnly(true); m_dialog = new QDialog; m_dialog->setWindowTitle(tr("Sonic Visualiser: Key and Mouse Reference")); QVBoxLayout *layout = new QVBoxLayout; m_dialog->setLayout(layout); layout->addWidget(m_text); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); connect(bb, SIGNAL(clicked(QAbstractButton *)), this, SLOT(dialogButtonClicked(QAbstractButton *))); layout->addWidget(bb); m_dialog->show(); QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = available.width() * 3 / 5; int height = available.height() * 2 / 3; if (height < 450) { if (available.height() > 500) height = 450; } if (width < 600) { if (available.width() > 650) width = 600; } m_dialog->resize(width, height); m_dialog->raise(); } void KeyReference::dialogButtonClicked(QAbstractButton *) { // only button is Close m_dialog->hide(); } void KeyReference::hide() { if (m_dialog) { m_dialog->hide(); } } sonic-visualiser-2.3~repack1.orig/svgui/widgets/ModelDataTableDialog.h0000644000175000017500000000363612252354725024640 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _MODEL_DATA_TABLE_DIALOG_H_ #define _MODEL_DATA_TABLE_DIALOG_H_ #include class TabularModel; class ModelDataTableModel; class QTableView; class QModelIndex; class Command; class QToolBar; class QLineEdit; class ModelDataTableDialog : public QMainWindow { Q_OBJECT public: ModelDataTableDialog(TabularModel *model, QString title, QWidget *parent =0); ~ModelDataTableDialog(); QToolBar *getPlayToolbar() { return m_playToolbar; } signals: void scrollToFrame(unsigned long frame); public slots: void userScrolledToFrame(unsigned long frame); void playbackScrolledToFrame(unsigned long frame); void addCommand(Command *); protected slots: void viewClicked(const QModelIndex &); void viewPressed(const QModelIndex &); void currentChanged(const QModelIndex &, const QModelIndex &); void currentChangedThroughResort(const QModelIndex &); void searchTextChanged(const QString &); void searchRepeated(); void insertRow(); void deleteRows(); void editRow(); void togglePlayTracking(); void modelRemoved(); protected: void makeCurrent(int row); ModelDataTableModel *m_table; QToolBar *m_playToolbar; QTableView *m_tableView; QLineEdit *m_find; int m_currentRow; bool m_trackPlayback; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/WindowShapePreview.cpp0000644000175000017500000001356312252354725025043 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "WindowShapePreview.h" #include #include #include #include #include #include #include "data/fft/FFTapi.h" #include #ifndef __GNUC__ #include #endif WindowShapePreview::WindowShapePreview(QWidget *parent) : QFrame(parent), m_windowType(WindowType(999)) { QHBoxLayout *layout = new QHBoxLayout; layout->setMargin(0); setLayout(layout); m_windowTimeExampleLabel = new QLabel; m_windowFreqExampleLabel = new QLabel; layout->addWidget(m_windowTimeExampleLabel); layout->addWidget(m_windowFreqExampleLabel); } WindowShapePreview::~WindowShapePreview() { } void WindowShapePreview::updateLabels() { int step = 24; int peak = 48; int w = step * 4, h = 64; WindowType type = m_windowType; Window windower = Window(type, step * 2); QPixmap timeLabel(w, h + 1); timeLabel.fill(Qt::white); QPainter timePainter(&timeLabel); QPainterPath path; path.moveTo(0, h - peak + 1); path.lineTo(w, h - peak + 1); timePainter.setPen(Qt::gray); timePainter.setRenderHint(QPainter::Antialiasing, true); timePainter.drawPath(path); path = QPainterPath(); #ifdef __GNUC__ float acc[w]; #else float *acc = (float *)alloca(w * sizeof(float)); #endif for (int i = 0; i < w; ++i) acc[i] = 0.f; for (int j = 0; j < 3; ++j) { for (int i = 0; i < step * 2; ++i) { acc[j * step + i] += windower.getValue(i); } } for (int i = 0; i < w; ++i) { int y = h - int(peak * acc[i] + 0.001) + 1; if (i == 0) path.moveTo(i, y); else path.lineTo(i, y); } timePainter.drawPath(path); timePainter.setRenderHint(QPainter::Antialiasing, false); path = QPainterPath(); timePainter.setPen(Qt::black); for (int i = 0; i < step * 2; ++i) { int y = h - int(peak * windower.getValue(i) + 0.001) + 1; if (i == 0) path.moveTo(i + step, float(y)); else path.lineTo(i + step, float(y)); } if (type == RectangularWindow) { timePainter.drawPath(path); path = QPainterPath(); } timePainter.setRenderHint(QPainter::Antialiasing, true); path.addRect(0, 0, w, h + 1); timePainter.drawPath(path); QFont font; font.setPixelSize(10); font.setItalic(true); timePainter.setFont(font); QString label = tr("V / time"); timePainter.drawText(w - timePainter.fontMetrics().width(label) - 4, timePainter.fontMetrics().ascent() + 1, label); m_windowTimeExampleLabel->setPixmap(timeLabel); int fw = 100; QPixmap freqLabel(fw, h + 1); freqLabel.fill(Qt::white); QPainter freqPainter(&freqLabel); path = QPainterPath(); int fftsize = 512; float *input = (float *)fftf_malloc(fftsize * sizeof(float)); fftf_complex *output = (fftf_complex *)fftf_malloc(fftsize * sizeof(fftf_complex)); fftf_plan plan = fftf_plan_dft_r2c_1d(fftsize, input, output, FFTW_ESTIMATE); for (int i = 0; i < fftsize; ++i) input[i] = 0.f; for (int i = 0; i < step * 2; ++i) { input[fftsize/2 - step + i] = windower.getValue(i); } fftf_execute(plan); fftf_destroy_plan(plan); float maxdb = 0.f; float mindb = 0.f; bool first = true; for (int i = 0; i < fftsize/2; ++i) { float power = output[i][0] * output[i][0] + output[i][1] * output[i][1]; float db = mindb; if (power > 0) { db = 20 * log10(power); if (first || db > maxdb) maxdb = db; if (first || db < mindb) mindb = db; first = false; } } if (mindb > -80.f) mindb = -80.f; // -- no, don't use the actual mindb -- it's easier to compare // plots with a fixed min value mindb = -170.f; float maxval = maxdb + -mindb; // float ly = h - ((-80.f + -mindb) / maxval) * peak + 1; path.moveTo(0, h - peak + 1); path.lineTo(fw, h - peak + 1); freqPainter.setPen(Qt::gray); freqPainter.setRenderHint(QPainter::Antialiasing, true); freqPainter.drawPath(path); path = QPainterPath(); freqPainter.setPen(Qt::black); // cerr << "maxdb = " << maxdb << ", mindb = " << mindb << ", maxval = " <setPixmap(freqLabel); } void WindowShapePreview::setWindowType(WindowType type) { if (m_windowType == type) return; m_windowType = type; updateLabels(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/IconLoader.cpp0000644000175000017500000000656012252354725023267 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "IconLoader.h" #include #include #include #include static const char *autoInvertExceptions[] = { // These are the icons that look OK in their default colours, even // in a colour scheme with a black background. (They may also be // icons that would look worse if we tried to auto-invert them.) // If we have icons that look bad when auto-inverted but that are // not suitable for use without being inverted, we'll need to // supply inverted versions -- the loader will load xx_inverse.png // in preference to xx.png if a dark background is found.) "fileclose", "filenew-22", "filenew", "fileopen-22", "fileopen", "fileopenaudio", "fileopensession", "filesave-22", "filesave", "filesaveas-22", "filesaveas", "help", "editcut", "editcopy", "editpaste", "editdelete", "exit", "zoom-fit", "zoom-in", "zoom-out", "zoom" }; QIcon IconLoader::load(QString name) { QPixmap pmap(loadPixmap(name)); if (pmap.isNull()) return QIcon(); else return QIcon(pmap); } QPixmap IconLoader::loadPixmap(QString name) { QColor bg = QApplication::palette().window().color(); if (bg.red() + bg.green() + bg.blue() > 384) { // light background QPixmap pmap(QString(":icons/%1").arg(name)); if (pmap.isNull()) { pmap = QPixmap(QString(":icons/%1.png").arg(name)); } return pmap; } QPixmap pmap(QString(":icons/%1").arg(name)); if (pmap.isNull()) { pmap = QPixmap(QString(":icons/%1_inverse.png").arg(name)); if (pmap.isNull()) { pmap = QPixmap(QString(":icons/%1.png").arg(name)); } } if (pmap.isNull()) return pmap; for (int i = 0; i < sizeof(autoInvertExceptions)/ sizeof(autoInvertExceptions[0]); ++i) { if (autoInvertExceptions[i] == name) { return pmap; } } // No suitable inverted icon found for black background; try to // auto-invert the default one QImage img = pmap.toImage().convertToFormat(QImage::Format_ARGB32); for (int y = 0; y < img.height(); ++y) { for (int x = 0; x < img.width(); ++x) { QRgb rgba = img.pixel(x, y); QColor colour = QColor (qRed(rgba), qGreen(rgba), qBlue(rgba), qAlpha(rgba)); int alpha = colour.alpha(); if (colour.saturation() < 5 && colour.alpha() > 10) { colour.setHsv(colour.hue(), colour.saturation(), 255 - colour.value()); colour.setAlpha(alpha); img.setPixel(x, y, colour.rgba()); } } } pmap = QPixmap::fromImage(img); return pmap; } sonic-visualiser-2.3~repack1.orig/svgui/widgets/SubdividingMenu.cpp0000644000175000017500000002063312252354725024341 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "SubdividingMenu.h" #include #include "base/Debug.h" using std::set; using std::map; SubdividingMenu::SubdividingMenu(size_t lowerLimit, size_t upperLimit, QWidget *parent) : QMenu(parent), m_lowerLimit(lowerLimit ? lowerLimit : 14), m_upperLimit(upperLimit ? upperLimit : (m_lowerLimit * 5) / 2), m_entriesSet(false) { } SubdividingMenu::SubdividingMenu(const QString &title, size_t lowerLimit, size_t upperLimit, QWidget *parent) : QMenu(title, parent), m_lowerLimit(lowerLimit ? lowerLimit : 14), m_upperLimit(upperLimit ? upperLimit : (m_lowerLimit * 5) / 2), m_entriesSet(false) { } SubdividingMenu::~SubdividingMenu() { for (map::iterator i = m_pendingEntries.begin(); i != m_pendingEntries.end(); ++i) { delete i->second; } } void SubdividingMenu::setEntries(const std::set &entries) { m_entriesSet = true; size_t total = entries.size(); if (total < m_upperLimit) return; size_t count = 0; QMenu *chunkMenu = new QMenu(); chunkMenu->setTearOffEnabled(isTearOffEnabled()); QString firstNameInChunk; QChar firstInitialInChunk; bool discriminateStartInitial = false; for (set::const_iterator j = entries.begin(); j != entries.end(); ++j) { // SVDEBUG << "SubdividingMenu::setEntries: j -> " << j->toStdString() << endl; m_nameToChunkMenuMap[*j] = chunkMenu; set::iterator k = j; ++k; QChar initial = (*j)[0]; if (count == 0) { firstNameInChunk = *j; firstInitialInChunk = initial; } // cerr << "count = "<< count << ", upper limit = " << m_upperLimit << endl; bool lastInChunk = (k == entries.end() || (count >= m_lowerLimit-1 && (count == m_upperLimit || (*k)[0] != initial))); ++count; if (lastInChunk) { bool discriminateEndInitial = (k != entries.end() && (*k)[0] == initial); bool initialsEqual = (firstInitialInChunk == initial); QString from = QString("%1").arg(firstInitialInChunk); if (discriminateStartInitial || (discriminateEndInitial && initialsEqual)) { from = firstNameInChunk.left(3); } QString to = QString("%1").arg(initial); if (discriminateEndInitial || (discriminateStartInitial && initialsEqual)) { to = j->left(3); } QString menuText; if (from == to) menuText = from; else menuText = tr("%1 - %2").arg(from).arg(to); discriminateStartInitial = discriminateEndInitial; chunkMenu->setTitle(menuText); QMenu::addMenu(chunkMenu); chunkMenu = new QMenu(); chunkMenu->setTearOffEnabled(isTearOffEnabled()); count = 0; } } if (count == 0) delete chunkMenu; } void SubdividingMenu::entriesAdded() { if (m_entriesSet) { cerr << "ERROR: SubdividingMenu::entriesAdded: setEntries was also called -- should use one mechanism or the other, but not both" << endl; return; } set entries; for (map::const_iterator i = m_pendingEntries.begin(); i != m_pendingEntries.end(); ++i) { entries.insert(i->first); } setEntries(entries); for (map::iterator i = m_pendingEntries.begin(); i != m_pendingEntries.end(); ++i) { QMenu *menu = dynamic_cast(i->second); if (menu) { addMenu(i->first, menu); continue; } QAction *action = dynamic_cast(i->second); if (action) { addAction(i->first, action); continue; } } m_pendingEntries.clear(); } void SubdividingMenu::addAction(QAction *action) { QString name = action->text(); if (!m_entriesSet) { m_pendingEntries[name] = action; return; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addAction(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; QMenu::addAction(action); return; } // SVDEBUG << "SubdividingMenu::addAction(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; m_nameToChunkMenuMap[name]->addAction(action); } QAction * SubdividingMenu::addAction(const QString &name) { if (!m_entriesSet) { QAction *action = new QAction(name, this); m_pendingEntries[name] = action; return action; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addAction(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; return QMenu::addAction(name); } // SVDEBUG << "SubdividingMenu::addAction(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; return m_nameToChunkMenuMap[name]->addAction(name); } void SubdividingMenu::addAction(const QString &name, QAction *action) { if (!m_entriesSet) { m_pendingEntries[name] = action; return; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addAction(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; QMenu::addAction(action); return; } // SVDEBUG << "SubdividingMenu::addAction(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; m_nameToChunkMenuMap[name]->addAction(action); } void SubdividingMenu::addMenu(QMenu *menu) { QString name = menu->title(); if (!m_entriesSet) { m_pendingEntries[name] = menu; return; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; QMenu::addMenu(menu); return; } // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; m_nameToChunkMenuMap[name]->addMenu(menu); } QMenu * SubdividingMenu::addMenu(const QString &name) { if (!m_entriesSet) { QMenu *menu = new QMenu(name, this); menu->setTearOffEnabled(isTearOffEnabled()); m_pendingEntries[name] = menu; return menu; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; return QMenu::addMenu(name); } // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; return m_nameToChunkMenuMap[name]->addMenu(name); } void SubdividingMenu::addMenu(const QString &name, QMenu *menu) { if (!m_entriesSet) { m_pendingEntries[name] = menu; return; } if (m_nameToChunkMenuMap.find(name) == m_nameToChunkMenuMap.end()) { // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): not found in name-to-chunk map, adding to main menu" << endl; QMenu::addMenu(menu); return; } // SVDEBUG << "SubdividingMenu::addMenu(" << name << "): found in name-to-chunk map for menu " << m_nameToChunkMenuMap[name]->title() << endl; m_nameToChunkMenuMap[name]->addMenu(menu); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/widgets.pro0000644000175000017500000000504012252354725022724 0ustar miramiraTEMPLATE = lib SV_UNIT_PACKAGES = vamp-hostsdk fftw3f load(../prf/sv.prf) CONFIG += sv staticlib qt thread warn_on stl rtti exceptions QT += xml TARGET = svwidgets DEPENDPATH += . .. INCLUDEPATH += . .. OBJECTS_DIR = tmp_obj MOC_DIR = tmp_moc # Input HEADERS += ActivityLog.h \ AudioDial.h \ ClickableLabel.h \ ColourNameDialog.h \ CommandHistory.h \ CSVFormatDialog.h \ Fader.h \ InteractiveFileFinder.h \ IconLoader.h \ ImageDialog.h \ ItemEditDialog.h \ KeyReference.h \ LabelCounterInputDialog.h \ LayerTree.h \ LayerTreeDialog.h \ LEDButton.h \ ListInputDialog.h \ MIDIFileImportDialog.h \ ModelDataTableDialog.h \ NotifyingCheckBox.h \ NotifyingComboBox.h \ NotifyingPushButton.h \ NotifyingTabBar.h \ Panner.h \ PluginParameterBox.h \ PluginParameterDialog.h \ ProgressDialog.h \ PropertyBox.h \ PropertyStack.h \ RangeInputDialog.h \ SelectableLabel.h \ SubdividingMenu.h \ TextAbbrev.h \ Thumbwheel.h \ TipDialog.h \ TransformFinder.h \ WindowShapePreview.h \ WindowTypeSelector.h SOURCES += ActivityLog.cpp \ AudioDial.cpp \ ColourNameDialog.cpp \ CommandHistory.cpp \ CSVFormatDialog.cpp \ Fader.cpp \ InteractiveFileFinder.cpp \ IconLoader.cpp \ ImageDialog.cpp \ ItemEditDialog.cpp \ KeyReference.cpp \ LabelCounterInputDialog.cpp \ LayerTree.cpp \ LayerTreeDialog.cpp \ LEDButton.cpp \ ListInputDialog.cpp \ MIDIFileImportDialog.cpp \ ModelDataTableDialog.cpp \ NotifyingCheckBox.cpp \ NotifyingComboBox.cpp \ NotifyingPushButton.cpp \ NotifyingTabBar.cpp \ Panner.cpp \ PluginParameterBox.cpp \ PluginParameterDialog.cpp \ ProgressDialog.cpp \ PropertyBox.cpp \ PropertyStack.cpp \ RangeInputDialog.cpp \ SelectableLabel.cpp \ SubdividingMenu.cpp \ TextAbbrev.cpp \ Thumbwheel.cpp \ TipDialog.cpp \ TransformFinder.cpp \ WindowShapePreview.cpp \ WindowTypeSelector.cpp sonic-visualiser-2.3~repack1.orig/svgui/widgets/TransformFinder.cpp0000644000175000017500000003274612252354725024360 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "TransformFinder.h" #include "base/XmlExportable.h" #include "transform/TransformFactory.h" #include "SelectableLabel.h" #include #include #include #include #include #include #include #include #include #include TransformFinder::TransformFinder(QWidget *parent) : QDialog(parent), m_resultsFrame(0), m_resultsLayout(0) { setWindowTitle(tr("Find a Transform")); QGridLayout *mainGrid = new QGridLayout; mainGrid->setVerticalSpacing(0); setLayout(mainGrid); mainGrid->addWidget(new QLabel(tr("Find:")), 0, 0); QLineEdit *searchField = new QLineEdit; mainGrid->addWidget(searchField, 0, 1); connect(searchField, SIGNAL(textChanged(const QString &)), this, SLOT(searchTextChanged(const QString &))); // m_infoLabel = new QLabel(tr("Type in this box to search descriptions of available and known transforms")); m_infoLabel = new QLabel; mainGrid->addWidget(m_infoLabel, 1, 1); m_resultsScroll = new QScrollArea; mainGrid->addWidget(m_resultsScroll, 2, 0, 1, 2); mainGrid->setRowStretch(2, 10); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); mainGrid->addWidget(bb, 3, 0, 1, 2); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); m_resultsFrame = new QWidget; QPalette palette = m_resultsFrame->palette(); palette.setColor(QPalette::Window, palette.color(QPalette::Base)); m_resultsFrame->setPalette(palette); m_resultsScroll->setPalette(palette); m_resultsLayout = new QVBoxLayout; m_resultsLayout->setSpacing(0); m_resultsLayout->setContentsMargins(0, 0, 0, 0); m_resultsFrame->setLayout(m_resultsLayout); m_resultsScroll->setWidget(m_resultsFrame); m_resultsFrame->show(); m_noResultsLabel = new QLabel(tr("
  No results found")); m_resultsLayout->addWidget(m_noResultsLabel); m_noResultsLabel->hide(); m_beforeSearchLabel = new QLabel; m_resultsLayout->addWidget(m_beforeSearchLabel); m_beforeSearchLabel->hide(); QAction *up = new QAction(tr("Up"), this); up->setShortcut(tr("Up")); connect(up, SIGNAL(triggered()), this, SLOT(up())); addAction(up); QAction *down = new QAction(tr("Down"), this); down->setShortcut(tr("Down")); connect(down, SIGNAL(triggered()), this, SLOT(down())); addAction(down); QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); int width = available.width() / 2; int height = available.height() / 2; if (height < 450) { if (available.height() > 500) height = 450; } if (width < 600) { if (available.width() > 650) width = 600; } resize(width, height); raise(); setupBeforeSearchLabel(); m_upToDateCount = 0; m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); m_timer->start(30); } TransformFinder::~TransformFinder() { } void TransformFinder::setupBeforeSearchLabel() { bool haveInstalled = TransformFactory::getInstance()->haveInstalledTransforms(); bool haveUninstalled = TransformFactory::getInstance()->haveUninstalledTransforms(); m_beforeSearchLabel->setWordWrap(true); m_beforeSearchLabel->setOpenExternalLinks(true); m_beforeSearchLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse); m_beforeSearchLabel->setMargin(12); m_beforeSearchLabel->setFixedWidth(this->width() - 40); QString base = tr("

Type some text into the search box to search the descriptions of:

  • All currently installed Vamp audio feature extraction plugins
  • All currently installed LADSPA audio effects plugins
  • Vamp plugins that are not currently installed but that have descriptions published via the semantic web
"); QString nopull = tr("Unable to retrieve published descriptions from network!"); QString noinst = tr("No plugins are currently installed!"); if (haveInstalled) { if (haveUninstalled) { m_beforeSearchLabel->setText(base); } else { m_beforeSearchLabel->setText (base + tr("

%1
Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.
Only the descriptions of installed plugins will be searched.").arg(nopull)); } } else { if (haveUninstalled) { m_beforeSearchLabel->setText (base + tr("

%1
Only the published descriptions of Vamp feature extraction plugins will be searched.").arg(noinst)); } else { m_beforeSearchLabel->setText (base + tr("

%1
%2
Perhaps the network connection is down, or services are responding too slowly.
No search results will be available.").arg(noinst).arg(nopull)); } } m_beforeSearchLabel->show(); m_resultsFrame->resize(m_resultsFrame->sizeHint()); } void TransformFinder::searchTextChanged(const QString &text) { // cerr << "text is " << text << endl; m_newSearchText = text; } void TransformFinder::timeout() { int maxResults = 60; if (m_newSearchText != "") { QString text = m_newSearchText; m_newSearchText = ""; QStringList keywords = text.split(' ', QString::SkipEmptyParts); TransformFactory::SearchResults results = TransformFactory::getInstance()->search(keywords); // cerr << results.size() << " result(s)..." << endl; std::set sorted; sorted.clear(); for (TransformFactory::SearchResults::const_iterator j = results.begin(); j != results.end(); ++j) { sorted.insert(j->second); } m_sortedResults.clear(); for (std::set::const_iterator j = sorted.end(); j != sorted.begin(); ) { --j; m_sortedResults.push_back(*j); if (m_sortedResults.size() == maxResults) break; } if (m_sortedResults.empty()) m_selectedTransform = ""; else m_selectedTransform = m_sortedResults.begin()->key; m_upToDateCount = 0; for (int j = m_labels.size(); j > m_sortedResults.size(); ) { m_labels[--j]->hide(); } m_beforeSearchLabel->hide(); if (m_sortedResults.empty()) { m_noResultsLabel->show(); m_resultsFrame->resize(m_resultsFrame->sizeHint()); } else { m_noResultsLabel->hide(); } if (m_sortedResults.size() < sorted.size()) { m_infoLabel->setText (tr("Found %n description(s) containing %1, showing the first %2 only", 0, sorted.size()).arg(text).arg(m_sortedResults.size())); } else { m_infoLabel->setText (tr("Found %n description(s) containing %1", 0, sorted.size()).arg(text)); } return; } if (m_upToDateCount >= m_sortedResults.size()) return; while (m_upToDateCount < m_sortedResults.size()) { int i = m_upToDateCount; // cerr << "sorted size = " << m_sortedResults.size() << endl; TransformDescription desc; TransformId tid = m_sortedResults[i].key; TransformFactory *factory = TransformFactory::getInstance(); TransformFactory::TransformInstallStatus status = factory->getTransformInstallStatus(tid); QString suffix; if (status == TransformFactory::TransformInstalled) { desc = factory->getTransformDescription(tid); } else { desc = factory->getUninstalledTransformDescription(tid); suffix = tr(" (not installed)"); } QString labelText; labelText += tr("%1%2
") .arg(XmlExportable::encodeEntities(desc.name)) .arg(suffix); labelText += "..."; for (TextMatcher::Match::FragmentMap::const_iterator k = m_sortedResults[i].fragments.begin(); k != m_sortedResults[i].fragments.end(); ++k) { labelText += k->second; labelText += "... "; } labelText += tr(""); QString selectedText; selectedText += tr("%1%2
") .arg(XmlExportable::encodeEntities (desc.name == "" ? desc.identifier : desc.name)) .arg(suffix); if (desc.longDescription != "") { selectedText += tr("%1") .arg(XmlExportable::encodeEntities(desc.longDescription)); } else if (desc.description != "") { selectedText += tr("%1") .arg(XmlExportable::encodeEntities(desc.description)); } selectedText += tr(""); if (desc.type != TransformDescription::UnknownType) { selectedText += tr("
      — Plugin type: %1") .arg(XmlExportable::encodeEntities(factory->getTransformTypeName(desc.type))); } if (desc.category != "") { selectedText += tr("
      — Category: %1") .arg(XmlExportable::encodeEntities(desc.category)); } selectedText += tr("
      — System identifier: %1") .arg(XmlExportable::encodeEntities(desc.identifier)); if (desc.infoUrl != "") { selectedText += tr("
      — More information: %1") .arg(desc.infoUrl); } selectedText += tr("
"); if (i >= m_labels.size()) { SelectableLabel *label = new SelectableLabel(m_resultsFrame); m_resultsLayout->addWidget(label); connect(label, SIGNAL(selectionChanged()), this, SLOT(selectedLabelChanged())); connect(label, SIGNAL(doubleClicked()), this, SLOT(labelDoubleClicked())); QPalette palette = label->palette(); label->setPalette(palette); m_labels.push_back(label); } m_labels[i]->setObjectName(desc.identifier); m_labels[i]->setFixedWidth(this->width() - 40); m_labels[i]->setUnselectedText(labelText); // cerr << "selected text: " << selectedText << endl; m_labels[i]->setSelectedText(selectedText); m_labels[i]->setSelected(m_selectedTransform == desc.identifier); if (!m_labels[i]->isVisible()) m_labels[i]->show(); ++m_upToDateCount; if (i == 0) break; } m_resultsFrame->resize(m_resultsFrame->sizeHint()); } void TransformFinder::selectedLabelChanged() { QObject *s = sender(); m_selectedTransform = ""; for (int i = 0; i < m_labels.size(); ++i) { if (!m_labels[i]->isVisible()) continue; if (m_labels[i] == s) { if (m_labels[i]->isSelected()) { m_selectedTransform = m_labels[i]->objectName(); } } else { if (m_labels[i]->isSelected()) { m_labels[i]->setSelected(false); } } } cerr << "selectedLabelChanged: selected transform is now \"" << m_selectedTransform << "\"" << endl; } void TransformFinder::labelDoubleClicked() { // The first click should have selected the label already if (TransformFactory::getInstance()->getTransformInstallStatus (m_selectedTransform) == TransformFactory::TransformInstalled) { accept(); } } TransformId TransformFinder::getTransform() const { return m_selectedTransform; } void TransformFinder::up() { for (int i = 0; i < m_labels.size(); ++i) { if (!m_labels[i]->isVisible()) continue; if (m_labels[i]->objectName() == m_selectedTransform) { if (i > 0) { m_labels[i]->setSelected(false); m_labels[i-1]->setSelected(true); m_selectedTransform = m_labels[i-1]->objectName(); } return; } } } void TransformFinder::down() { for (int i = 0; i < m_labels.size(); ++i) { if (!m_labels[i]->isVisible()) continue; if (m_labels[i]->objectName() == m_selectedTransform) { if (i+1 < m_labels.size() && m_labels[i+1]->isVisible()) { m_labels[i]->setSelected(false); m_labels[i+1]->setSelected(true); m_selectedTransform = m_labels[i+1]->objectName(); } return; } } } sonic-visualiser-2.3~repack1.orig/svgui/widgets/CommandHistory.cpp0000644000175000017500000003166412252354725024213 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor, copyright 2000-2006 Chris Cannam, distributed under the GNU General Public License. This file contains traces of the KCommandHistory class from the KDE project, copyright 2000 Werner Trobin and David Faure and distributed under the GNU Lesser General Public License. */ #include "CommandHistory.h" #include "base/Command.h" #include #include #include #include #include #include #include #include //#define DEBUG_COMMAND_HISTORY 1 CommandHistory *CommandHistory::m_instance = 0; CommandHistory::CommandHistory() : m_undoLimit(50), m_redoLimit(50), m_menuLimit(15), m_savedAt(0), m_currentCompound(0), m_executeCompound(false), m_currentBundle(0), m_bundling(false), m_bundleTimer(0), m_bundleTimeout(3000) { m_undoAction = new QAction(QIcon(":/icons/undo.png"), tr("&Undo"), this); m_undoAction->setShortcut(tr("Ctrl+Z")); m_undoAction->setStatusTip(tr("Undo the last editing operation")); connect(m_undoAction, SIGNAL(triggered()), this, SLOT(undo())); m_undoMenuAction = new QAction(QIcon(":/icons/undo.png"), tr("&Undo"), this); connect(m_undoMenuAction, SIGNAL(triggered()), this, SLOT(undo())); m_undoMenu = new QMenu(tr("&Undo")); m_undoMenuAction->setMenu(m_undoMenu); connect(m_undoMenu, SIGNAL(triggered(QAction *)), this, SLOT(undoActivated(QAction*))); m_redoAction = new QAction(QIcon(":/icons/redo.png"), tr("Re&do"), this); m_redoAction->setShortcut(tr("Ctrl+Shift+Z")); m_redoAction->setStatusTip(tr("Redo the last operation that was undone")); connect(m_redoAction, SIGNAL(triggered()), this, SLOT(redo())); m_redoMenuAction = new QAction(QIcon(":/icons/redo.png"), tr("Re&do"), this); connect(m_redoMenuAction, SIGNAL(triggered()), this, SLOT(redo())); m_redoMenu = new QMenu(tr("Re&do")); m_redoMenuAction->setMenu(m_redoMenu); connect(m_redoMenu, SIGNAL(triggered(QAction *)), this, SLOT(redoActivated(QAction*))); } CommandHistory::~CommandHistory() { m_savedAt = -1; clearStack(m_undoStack); clearStack(m_redoStack); delete m_undoMenu; delete m_redoMenu; } CommandHistory * CommandHistory::getInstance() { if (!m_instance) m_instance = new CommandHistory(); return m_instance; } void CommandHistory::clear() { #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::clear()" << endl; #endif closeBundle(); m_savedAt = -1; clearStack(m_undoStack); clearStack(m_redoStack); updateActions(); } void CommandHistory::registerMenu(QMenu *menu) { menu->addAction(m_undoAction); menu->addAction(m_redoAction); } void CommandHistory::registerToolbar(QToolBar *toolbar) { toolbar->addAction(m_undoMenuAction); toolbar->addAction(m_redoMenuAction); } void CommandHistory::addCommand(Command *command) { if (!command) return; if (m_currentCompound) { addToCompound(command, m_executeCompound); return; } addCommand(command, true); } void CommandHistory::addCommand(Command *command, bool execute, bool bundle) { if (!command) return; #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::addCommand: " << command->getName() << " of type " << typeid(*command).name() << " at " << command << ": execute = " << execute << ", bundle = " << bundle << " (m_currentCompound = " << m_currentCompound << ", m_currentBundle = " << m_currentBundle << ")" << endl; #endif if (m_currentCompound) { addToCompound(command, execute); return; } if (bundle) { addToBundle(command, execute); return; } else if (m_currentBundle) { closeBundle(); } #ifdef DEBUG_COMMAND_HISTORY if (!m_redoStack.empty()) { SVDEBUG << "CommandHistory::clearing redo stack" << endl; } #endif // We can't redo after adding a command clearStack(m_redoStack); // can we reach savedAt? if ((int)m_undoStack.size() < m_savedAt) m_savedAt = -1; // nope m_undoStack.push(command); clipCommands(); if (execute) { command->execute(); } // Emit even if we aren't executing the command, because // someone must have executed it for this to make any sense emit commandExecuted(); emit commandExecuted(command); if (!m_bundling) emit activity(command->getName()); updateActions(); } void CommandHistory::addToBundle(Command *command, bool execute) { if (m_currentBundle) { if (!command || (command->getName() != m_currentBundleName)) { #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::addToBundle: " << command->getName() << ": closing current bundle" << endl; #endif closeBundle(); } } if (!command) return; if (!m_currentBundle) { #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::addToBundle: " << command->getName() << ": creating new bundle" << endl; #endif // need to addCommand before setting m_currentBundle, as addCommand // with bundle false will reset m_currentBundle to 0 MacroCommand *mc = new BundleCommand(command->getName()); m_bundling = true; addCommand(mc, false); m_bundling = false; m_currentBundle = mc; m_currentBundleName = command->getName(); } #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::addToBundle: " << command->getName() << ": adding to bundle" << endl; #endif if (execute) command->execute(); m_currentBundle->addCommand(command); // Emit even if we aren't executing the command, because // someone must have executed it for this to make any sense emit commandExecuted(); emit commandExecuted(command); updateActions(); delete m_bundleTimer; m_bundleTimer = new QTimer(this); connect(m_bundleTimer, SIGNAL(timeout()), this, SLOT(bundleTimerTimeout())); m_bundleTimer->start(m_bundleTimeout); } void CommandHistory::closeBundle() { #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::closeBundle" << endl; #endif if (m_currentBundle) emit activity(m_currentBundle->getName()); m_currentBundle = 0; m_currentBundleName = ""; } void CommandHistory::bundleTimerTimeout() { #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::bundleTimerTimeout: bundle is " << m_currentBundle << endl; #endif closeBundle(); } void CommandHistory::addToCompound(Command *command, bool execute) { #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::addToCompound: " << command->getName() << endl; #endif if (!m_currentCompound) { SVDEBUG << "CommandHistory::addToCompound: ERROR: no compound operation in progress!" << endl; return; } if (execute) command->execute(); m_currentCompound->addCommand(command); } void CommandHistory::startCompoundOperation(QString name, bool execute) { if (m_currentCompound) { SVDEBUG << "CommandHistory::startCompoundOperation: ERROR: compound operation already in progress!" << endl; cerr << "(name is " << m_currentCompound->getName() << ")" << endl; return; } closeBundle(); m_currentCompound = new MacroCommand(name); m_executeCompound = execute; } void CommandHistory::endCompoundOperation() { if (!m_currentCompound) { SVDEBUG << "CommandHistory::endCompoundOperation: ERROR: no compound operation in progress!" << endl; return; } MacroCommand *toAdd = m_currentCompound; m_currentCompound = 0; if (toAdd->haveCommands()) { // We don't execute the macro command here, because we have // been executing the individual commands as we went along if // m_executeCompound was true. addCommand(toAdd, false); } } void CommandHistory::addExecutedCommand(Command *command) { addCommand(command, false); } void CommandHistory::addCommandAndExecute(Command *command) { addCommand(command, true); } void CommandHistory::undo() { if (m_undoStack.empty()) return; #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::undo()" << endl; #endif closeBundle(); Command *command = m_undoStack.top(); command->unexecute(); emit commandExecuted(); emit commandUnexecuted(command); emit activity(tr("Undo %1").arg(command->getName())); m_redoStack.push(command); m_undoStack.pop(); clipCommands(); updateActions(); if ((int)m_undoStack.size() == m_savedAt) emit documentRestored(); } void CommandHistory::redo() { if (m_redoStack.empty()) return; #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::redo()" << endl; #endif closeBundle(); Command *command = m_redoStack.top(); command->execute(); emit commandExecuted(); emit commandExecuted(command); emit activity(tr("Redo %1").arg(command->getName())); m_undoStack.push(command); m_redoStack.pop(); // no need to clip updateActions(); if ((int)m_undoStack.size() == m_savedAt) emit documentRestored(); } void CommandHistory::setUndoLimit(int limit) { if (limit > 0 && limit != m_undoLimit) { m_undoLimit = limit; clipCommands(); } } void CommandHistory::setRedoLimit(int limit) { if (limit > 0 && limit != m_redoLimit) { m_redoLimit = limit; clipCommands(); } } void CommandHistory::setMenuLimit(int limit) { m_menuLimit = limit; updateActions(); } void CommandHistory::setBundleTimeout(int ms) { m_bundleTimeout = ms; } void CommandHistory::documentSaved() { closeBundle(); m_savedAt = m_undoStack.size(); } void CommandHistory::clipCommands() { if ((int)m_undoStack.size() > m_undoLimit) { m_savedAt -= (m_undoStack.size() - m_undoLimit); } clipStack(m_undoStack, m_undoLimit); clipStack(m_redoStack, m_redoLimit); } void CommandHistory::clipStack(CommandStack &stack, int limit) { int i; if ((int)stack.size() > limit) { CommandStack tempStack; for (i = 0; i < limit; ++i) { #ifdef DEBUG_COMMAND_HISTORY Command *command = stack.top(); SVDEBUG << "CommandHistory::clipStack: Saving recent command: " << command->getName() << " at " << command << endl; #endif tempStack.push(stack.top()); stack.pop(); } clearStack(stack); for (i = 0; i < m_undoLimit; ++i) { stack.push(tempStack.top()); tempStack.pop(); } } } void CommandHistory::clearStack(CommandStack &stack) { while (!stack.empty()) { Command *command = stack.top(); // Not safe to call getName() on a command about to be deleted #ifdef DEBUG_COMMAND_HISTORY SVDEBUG << "CommandHistory::clearStack: About to delete command " << command << endl; #endif delete command; stack.pop(); } } void CommandHistory::undoActivated(QAction *action) { int pos = m_actionCounts[action]; for (int i = 0; i <= pos; ++i) { undo(); } } void CommandHistory::redoActivated(QAction *action) { int pos = m_actionCounts[action]; for (int i = 0; i <= pos; ++i) { redo(); } } void CommandHistory::updateActions() { m_actionCounts.clear(); for (int undo = 0; undo <= 1; ++undo) { QAction *action(undo ? m_undoAction : m_redoAction); QAction *menuAction(undo ? m_undoMenuAction : m_redoMenuAction); QMenu *menu(undo ? m_undoMenu : m_redoMenu); CommandStack &stack(undo ? m_undoStack : m_redoStack); if (stack.empty()) { QString text(undo ? tr("Nothing to undo") : tr("Nothing to redo")); action->setEnabled(false); action->setText(text); menuAction->setEnabled(false); menuAction->setText(text); } else { action->setEnabled(true); menuAction->setEnabled(true); QString commandName = stack.top()->getName(); commandName.replace(QRegExp("&"), ""); QString text = (undo ? tr("&Undo %1") : tr("Re&do %1")) .arg(commandName); action->setText(text); menuAction->setText(text); } menu->clear(); CommandStack tempStack; int j = 0; while (j < m_menuLimit && !stack.empty()) { Command *command = stack.top(); tempStack.push(command); stack.pop(); QString commandName = command->getName(); commandName.replace(QRegExp("&"), ""); QString text; if (undo) text = tr("&Undo %1").arg(commandName); else text = tr("Re&do %1").arg(commandName); QAction *action = menu->addAction(text); m_actionCounts[action] = j++; } while (!tempStack.empty()) { stack.push(tempStack.top()); tempStack.pop(); } } } sonic-visualiser-2.3~repack1.orig/svgui/widgets/ListInputDialog.cpp0000644000175000017500000000531012252354725024313 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ListInputDialog.h" #include #include #include #include #include #include #include ListInputDialog::ListInputDialog(QWidget *parent, const QString &title, const QString &labelText, const QStringList &list, int current) : QDialog(parent), m_strings(list) { setWindowTitle(title); QVBoxLayout *vbox = new QVBoxLayout(this); QLabel *label = new QLabel(labelText, this); vbox->addWidget(label); vbox->addStretch(1); int count = 0; for (QStringList::const_iterator i = list.begin(); i != list.end(); ++i) { QRadioButton *radio = new QRadioButton(*i); if (current == count++) radio->setChecked(true); m_radioButtons.push_back(radio); vbox->addWidget(radio); } vbox->addStretch(1); m_footnote = new QLabel; vbox->addWidget(m_footnote); m_footnote->hide(); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); vbox->addWidget(bb); connect(bb, SIGNAL(accepted()), this, SLOT(accept())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); } ListInputDialog::~ListInputDialog() { } QString ListInputDialog::getCurrentString() const { for (size_t i = 0; i < m_radioButtons.size(); ++i) { if (m_radioButtons[i]->isChecked()) { return m_strings[i]; } } return ""; } void ListInputDialog::setItemAvailability(int item, bool available) { m_radioButtons[item]->setEnabled(available); } void ListInputDialog::setFootnote(QString footnote) { m_footnote->setText(footnote); m_footnote->show(); } QString ListInputDialog::getItem(QWidget *parent, const QString &title, const QString &label, const QStringList &list, int current, bool *ok) { ListInputDialog dialog(parent, title, label, list, current); bool accepted = (dialog.exec() == QDialog::Accepted); if (ok) *ok = accepted; return dialog.getCurrentString(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/PluginParameterDialog.cpp0000644000175000017500000004764312252354725025476 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PluginParameterDialog.h" #include "PluginParameterBox.h" #include "WindowTypeSelector.h" #include "TextAbbrev.h" #include "IconLoader.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "base/Debug.h" PluginParameterDialog::PluginParameterDialog(Vamp::PluginBase *plugin, QWidget *parent) : QDialog(parent), m_plugin(plugin), m_channel(-1), m_stepSize(0), m_blockSize(0), m_windowType(HanningWindow), m_parameterBox(0), m_selectionOnly(false) { setWindowTitle(tr("Plugin Parameters")); QGridLayout *grid = new QGridLayout; setLayout(grid); QGroupBox *pluginBox = new QGroupBox; pluginBox->setTitle(plugin->getType().c_str()); grid->addWidget(pluginBox, 0, 0); QGridLayout *subgrid = new QGridLayout; pluginBox->setLayout(subgrid); subgrid->setSpacing(0); subgrid->setMargin(10); QFont boldFont(pluginBox->font()); boldFont.setBold(true); QFont italicFont(pluginBox->font()); italicFont.setItalic(true); QLabel *nameLabel = new QLabel(plugin->getName().c_str()); nameLabel->setWordWrap(true); nameLabel->setFont(boldFont); QLabel *makerLabel = new QLabel(plugin->getMaker().c_str()); makerLabel->setWordWrap(true); int version = plugin->getPluginVersion(); QLabel *versionLabel = new QLabel(QString("%1").arg(version)); versionLabel->setWordWrap(true); QLabel *copyrightLabel = new QLabel(plugin->getCopyright().c_str()); copyrightLabel->setWordWrap(true); // QLabel *typeLabel = new QLabel(plugin->getType().c_str()); // typeLabel->setWordWrap(true); // typeLabel->setFont(boldFont); QLabel *descriptionLabel = 0; if (plugin->getDescription() != "") { descriptionLabel = new QLabel(plugin->getDescription().c_str()); descriptionLabel->setWordWrap(true); descriptionLabel->setFont(italicFont); } int row = 0; QLabel *label = new QLabel(tr("Name:")); label->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(label, row, 0); subgrid->addWidget(nameLabel, row, 1); m_moreInfo = new QPushButton; m_moreInfo->setIcon(IconLoader().load("info")); m_moreInfo->setFixedSize(QSize(16, 16)); connect(m_moreInfo, SIGNAL(clicked()), this, SLOT(moreInfo())); subgrid->addWidget(m_moreInfo, row, 2, Qt::AlignTop | Qt::AlignRight); m_moreInfo->hide(); row++; if (descriptionLabel) { // label = new QLabel(tr("Description:")); // label->setAlignment(Qt::AlignTop | Qt::AlignLeft); // subgrid->addWidget(label, row, 0); subgrid->addWidget(descriptionLabel, row, 1, 1, 2); row++; } if (version >= 0) { label = new QLabel(tr("Version:")); label->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(label, row, 0); subgrid->addWidget(versionLabel, row, 1); row++; } // label = new QLabel(tr("Type:")); // label->setAlignment(Qt::AlignTop | Qt::AlignLeft); // subgrid->addWidget(label, row, 0); // subgrid->addWidget(typeLabel, row, 1); // row++; label = new QLabel(tr("Maker:")); label->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(label, row, 0); subgrid->addWidget(makerLabel, row, 1); row++; label = new QLabel(tr("Copyright: ")); label->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(label, row, 0); subgrid->addWidget(copyrightLabel, row, 1); row++; m_outputSpacer = new QLabel; subgrid->addWidget(m_outputSpacer, row, 0); m_outputSpacer->setFixedHeight(7); m_outputSpacer->hide(); row++; m_outputLabel = new QLabel(tr("Output:")); m_outputLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft); subgrid->addWidget(m_outputLabel, row, 0); m_outputValue = new QLabel; m_outputValue->setFont(boldFont); subgrid->addWidget(m_outputValue, row, 1); m_outputLabel->hide(); m_outputValue->hide(); row++; m_outputDescription = new QLabel; m_outputDescription->setFont(italicFont); subgrid->addWidget(m_outputDescription, row, 1); m_outputDescription->hide(); row++; subgrid->setColumnStretch(1, 2); m_inputModelBox = new QGroupBox; m_inputModelBox->setTitle(tr("Input Material")); grid->addWidget(m_inputModelBox, 1, 0); m_inputModels = new QComboBox; QVBoxLayout *inputLayout = new QVBoxLayout; m_inputModelBox->setLayout(inputLayout); inputLayout->addWidget(m_inputModels); m_inputModels->hide(); m_selectionOnly = new QCheckBox(tr("Restrict to selection extents")); inputLayout->addWidget(m_selectionOnly); m_selectionOnly->hide(); m_inputModelBox->hide(); QGroupBox *paramBox = new QGroupBox; paramBox->setTitle(tr("Plugin Parameters")); grid->addWidget(paramBox, 2, 0); grid->setRowStretch(2, 10); QHBoxLayout *paramLayout = new QHBoxLayout; paramLayout->setMargin(0); paramBox->setLayout(paramLayout); QScrollArea *scroll = new QScrollArea; scroll->setWidgetResizable(true); scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scroll->setFrameShape(QFrame::NoFrame); paramLayout->addWidget(scroll); m_parameterBox = new PluginParameterBox(m_plugin); connect(m_parameterBox, SIGNAL(pluginConfigurationChanged(QString)), this, SIGNAL(pluginConfigurationChanged(QString))); scroll->setWidget(m_parameterBox); m_advanced = new QFrame; QVBoxLayout *advancedLayout = new QVBoxLayout; advancedLayout->setMargin(0); m_advanced->setLayout(advancedLayout); grid->addWidget(m_advanced, 3, 0); m_channelBox = new QGroupBox; m_channelBox->setTitle(tr("Channels")); advancedLayout->addWidget(m_channelBox); m_channelBox->setVisible(false); m_haveChannelBoxData = false; m_windowBox = new QGroupBox; m_windowBox->setTitle(tr("Processing")); advancedLayout->addWidget(m_windowBox); m_windowBox->setVisible(false); m_haveWindowBoxData = false; QHBoxLayout *hbox = new QHBoxLayout; grid->addLayout(hbox, 4, 0); m_advancedVisible = false; m_advancedButton = new QPushButton(tr("Advanced >>")); m_advancedButton->setCheckable(true); connect(m_advancedButton, SIGNAL(clicked()), this, SLOT(advancedToggled())); QSettings settings; settings.beginGroup("PluginParameterDialog"); m_advancedVisible = settings.value("advancedvisible", false).toBool(); settings.endGroup(); m_advanced->hide(); hbox->addWidget(m_advancedButton); m_advancedButton->hide(); QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); hbox->addWidget(bb); connect(bb, SIGNAL(accepted()), this, SLOT(dialogAccepted())); connect(bb, SIGNAL(rejected()), this, SLOT(reject())); bb->button(QDialogButtonBox::Ok)->setDefault(true); setAdvancedVisible(m_advancedVisible); } PluginParameterDialog::~PluginParameterDialog() { } int PluginParameterDialog::exec() { show(); setAdvancedVisible(m_advancedVisible); return QDialog::exec(); } void PluginParameterDialog::setOutputLabel(QString text, QString description) { if (text == "") { m_outputSpacer->hide(); m_outputLabel->hide(); m_outputValue->hide(); m_outputDescription->hide(); } else { m_outputSpacer->show(); m_outputValue->setText(text); m_outputValue->setWordWrap(true); m_outputDescription->setText(description); m_outputDescription->setWordWrap(true); m_outputLabel->show(); m_outputValue->show(); if (description != "") { m_outputDescription->show(); } else { m_outputDescription->hide(); } } } void PluginParameterDialog::setMoreInfoUrl(QString moreInfoUrl) { m_moreInfoUrl = moreInfoUrl; if (m_moreInfoUrl != "") { m_moreInfo->show(); } else { m_moreInfo->hide(); } } void PluginParameterDialog::setChannelArrangement(int sourceChannels, int targetChannels, int defaultChannel) { m_channel = defaultChannel; if (sourceChannels != targetChannels) { // At the moment we can only cope with the case where // sourceChannels > targetChannels and targetChannels == 1 if (sourceChannels < targetChannels) { QMessageBox::warning (parentWidget(), tr("Channel mismatch"), tr("This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly.").arg(targetChannels).arg(sourceChannels).arg(sourceChannels != 1 ? tr("are") : tr("is")), QMessageBox::Ok, QMessageBox::NoButton); } else { if (m_haveChannelBoxData) { cerr << "WARNING: PluginParameterDialog::setChannelArrangement: Calling more than once on same dialog is not currently implemented" << endl; return; } QVBoxLayout *channelLayout = new QVBoxLayout; m_channelBox->setLayout(channelLayout); if (targetChannels != 1) { channelLayout->addWidget (new QLabel(tr("This plugin accepts no more than %1 input channels,\nbut %2 are available. Only the first %3 will be used.\n") .arg(targetChannels) .arg(sourceChannels) .arg(targetChannels))); } else { channelLayout->addWidget(new QLabel(tr("This plugin only has a single channel input,\nbut the source has %1 channels.").arg(sourceChannels))); QComboBox *channelCombo = new QComboBox; channelCombo->addItem(tr("Use mean of source channels")); for (int i = 0; i < sourceChannels; ++i) { channelCombo->addItem(tr("Use channel %1 only").arg(i + 1)); } connect(channelCombo, SIGNAL(activated(int)), this, SLOT(channelComboChanged(int))); channelLayout->addWidget(channelCombo); } m_channelBox->setVisible(true); m_haveChannelBoxData = true; m_advancedButton->show(); } } setAdvancedVisible(m_advancedVisible); } void PluginParameterDialog::setShowProcessingOptions(bool showWindowSize, bool showFrequencyDomainOptions) { if (m_haveWindowBoxData) { cerr << "WARNING: PluginParameterDialog::setShowProcessingOptions: Calling more than once on same dialog is not currently implemented" << endl; return; } if (showWindowSize) { Vamp::Plugin *fePlugin = dynamic_cast(m_plugin); if (!fePlugin) fePlugin = dynamic_cast(m_plugin); if (!fePlugin) fePlugin = dynamic_cast(m_plugin); int size = 1024; int increment = 1024; if (fePlugin) { size = fePlugin->getPreferredBlockSize(); cerr << "Feature extraction plugin \"" << fePlugin->getName() << "\" reports preferred block size as " << size << endl; if (size == 0) size = 1024; increment = fePlugin->getPreferredStepSize(); if (increment == 0) { if (fePlugin->getInputDomain() == Vamp::Plugin::TimeDomain) { increment = size; } else { increment = size/2; } } } QGridLayout *windowLayout = new QGridLayout; m_windowBox->setLayout(windowLayout); if (showFrequencyDomainOptions) { windowLayout->addWidget(new QLabel(tr("Window size:")), 0, 0); } else { windowLayout->addWidget(new QLabel(tr("Audio frames per block:")), 0, 0); } cerr << "size: " << size << ", increment: " << increment << endl; QComboBox *blockSizeCombo = new QComboBox; blockSizeCombo->setEditable(true); bool found = false; for (int i = 0; i < 14; ++i) { int val = 1 << (i + 3); blockSizeCombo->addItem(QString("%1").arg(val)); if (val == size) { blockSizeCombo->setCurrentIndex(i); found = true; } } if (!found) { blockSizeCombo->addItem(QString("%1").arg(size)); blockSizeCombo->setCurrentIndex(blockSizeCombo->count() - 1); } blockSizeCombo->setValidator(new QIntValidator(1, int(pow(2., 18)), this)); connect(blockSizeCombo, SIGNAL(editTextChanged(const QString &)), this, SLOT(blockSizeComboChanged(const QString &))); windowLayout->addWidget(blockSizeCombo, 0, 1); windowLayout->addWidget(new QLabel(tr("Window increment:")), 1, 0); QComboBox *incrementCombo = new QComboBox; incrementCombo->setEditable(true); found = false; for (int i = 0; i < 14; ++i) { int val = 1 << (i + 3); incrementCombo->addItem(QString("%1").arg(val)); if (val == increment) { incrementCombo->setCurrentIndex(i); found = true; } } if (!found) { incrementCombo->addItem(QString("%1").arg(increment)); incrementCombo->setCurrentIndex(incrementCombo->count() - 1); } incrementCombo->setValidator(new QIntValidator(1, int(pow(2., 18)), this)); connect(incrementCombo, SIGNAL(editTextChanged(const QString &)), this, SLOT(incrementComboChanged(const QString &))); windowLayout->addWidget(incrementCombo, 1, 1); if (showFrequencyDomainOptions) { windowLayout->addWidget(new QLabel(tr("Window shape:")), 2, 0); WindowTypeSelector *windowTypeSelector = new WindowTypeSelector; connect(windowTypeSelector, SIGNAL(windowTypeChanged(WindowType)), this, SLOT(windowTypeChanged(WindowType))); windowLayout->addWidget(windowTypeSelector, 2, 1); } m_windowBox->setVisible(true); m_haveWindowBoxData = true; m_advancedButton->show(); } setAdvancedVisible(m_advancedVisible); } void PluginParameterDialog::setCandidateInputModels(const QStringList &models, QString defaultModel) { m_inputModels->clear(); QSettings settings; settings.beginGroup("PluginParameterDialog"); QString lastModel = settings.value("lastinputmodel").toString(); settings.endGroup(); if (defaultModel == "") defaultModel = lastModel; m_inputModels->show(); m_inputModelList = models; m_inputModels->addItems(TextAbbrev::abbreviate(models, 80)); m_inputModels->setCurrentIndex(0); if (defaultModel != "") { for (int i = 0; i < models.size(); ++i) { if (defaultModel == models[i]) { m_inputModels->setCurrentIndex(i); m_currentInputModel = models[i]; break; } } } connect(m_inputModels, SIGNAL(activated(int)), this, SLOT(inputModelComboChanged(int))); m_inputModelBox->show(); } void PluginParameterDialog::setShowSelectionOnlyOption(bool show) { if (!show) { m_selectionOnly->hide(); if (!m_inputModels->isVisible()) m_inputModelBox->hide(); return; } QSettings settings; settings.beginGroup("PluginParameterDialog"); bool lastSelectionOnly = settings.value("lastselectiononly", false).toBool(); settings.endGroup(); m_selectionOnly->setChecked(lastSelectionOnly); m_currentSelectionOnly = lastSelectionOnly; connect(m_selectionOnly, SIGNAL(stateChanged(int)), this, SLOT(selectionOnlyChanged(int))); m_selectionOnly->show(); m_inputModelBox->show(); } QString PluginParameterDialog::getInputModel() const { return m_currentInputModel; } bool PluginParameterDialog::getSelectionOnly() const { return m_currentSelectionOnly; } void PluginParameterDialog::getProcessingParameters(size_t &blockSize) const { blockSize = m_blockSize; return; } void PluginParameterDialog::getProcessingParameters(size_t &stepSize, size_t &blockSize, WindowType &windowType) const { stepSize = m_stepSize; blockSize = m_blockSize; windowType = m_windowType; return; } void PluginParameterDialog::blockSizeComboChanged(const QString &text) { m_blockSize = text.toInt(); cerr << "Block size changed to " << m_blockSize << endl; } void PluginParameterDialog::incrementComboChanged(const QString &text) { m_stepSize = text.toInt(); //!!! rename increment to step size throughout cerr << "Increment changed to " << m_stepSize << endl; } void PluginParameterDialog::windowTypeChanged(WindowType type) { m_windowType = type; } void PluginParameterDialog::moreInfo() { if (m_moreInfoUrl != "") { QDesktopServices::openUrl(QUrl(m_moreInfoUrl)); } } void PluginParameterDialog::advancedToggled() { setAdvancedVisible(!m_advancedVisible); } void PluginParameterDialog::setAdvancedVisible(bool visible) { // m_advanced->setVisible(visible); if (visible) { m_advancedButton->setText(tr("Advanced <<")); m_advancedButton->setChecked(true); m_advanced->show(); } else { m_advanced->hide(); m_advancedButton->setText(tr("Advanced >>")); m_advancedButton->setChecked(false); } // cerr << "resize to " << sizeHint().width() << " x " << sizeHint().height() << endl; // setMinimumHeight(sizeHint().height()); adjustSize(); // (sizeHint()); m_advancedVisible = visible; QSettings settings; settings.beginGroup("PluginParameterDialog"); settings.setValue("advancedvisible", visible); settings.endGroup(); // if (visible) setMaximumHeight(sizeHint().height()); // adjustSize(); } void PluginParameterDialog::channelComboChanged(int index) { m_channel = index - 1; } void PluginParameterDialog::inputModelComboChanged(int index) { if (index >= m_inputModelList.size()) return; m_currentInputModel = m_inputModelList[index]; emit inputModelChanged(m_currentInputModel); } void PluginParameterDialog::selectionOnlyChanged(int state) { if (state == Qt::Checked) { m_currentSelectionOnly = true; } else { m_currentSelectionOnly = false; } } void PluginParameterDialog::dialogAccepted() { QSettings settings; settings.beginGroup("PluginParameterDialog"); if (m_inputModels->isVisible()) { settings.setValue("lastinputmodel", getInputModel()); } if (m_selectionOnly->isVisible()) { settings.setValue("lastselectiononly", getSelectionOnly()); } settings.endGroup(); accept(); } sonic-visualiser-2.3~repack1.orig/svgui/widgets/InteractiveFileFinder.cpp0000644000175000017500000004133712252354725025456 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "InteractiveFileFinder.h" #include "data/fileio/FileSource.h" #include "data/fileio/AudioFileReaderFactory.h" #include "data/fileio/DataFileReaderFactory.h" #include "rdf/RDFImporter.h" #include "rdf/RDFExporter.h" #include #include #include #include #include #include #include InteractiveFileFinder InteractiveFileFinder::m_instance; InteractiveFileFinder::InteractiveFileFinder() : m_lastLocatedLocation("") { SVDEBUG << "Registering interactive file finder" << endl; FileFinder::registerFileFinder(this); } InteractiveFileFinder::~InteractiveFileFinder() { } QString InteractiveFileFinder::getOpenFileName(FileType type, QString fallbackLocation) { QString settingsKey; QString lastPath = fallbackLocation; QString title = tr("Select file"); QString filter = tr("All files (*.*)"); switch (type) { case SessionFile: settingsKey = "sessionpath"; title = tr("Select a session file"); filter = tr("Sonic Visualiser session files (*.sv)\nRDF files (%1)\nAll files (*.*)").arg(RDFImporter::getKnownExtensions()); break; case AudioFile: settingsKey = "audiopath"; title = "Select an audio file"; filter = tr("Audio files (%1)\nAll files (*.*)") .arg(AudioFileReaderFactory::getKnownExtensions()); break; case LayerFile: settingsKey = "layerpath"; filter = tr("All supported files (%1 %2)\nSonic Visualiser Layer XML files (*.svl)\nComma-separated data files (*.csv)\nSpace-separated .lab files (*.lab)\nRDF files (%2)\nMIDI files (*.mid)\nText files (*.txt)\nAll files (*.*)") .arg(DataFileReaderFactory::getKnownExtensions()) .arg(RDFImporter::getKnownExtensions()); break; case LayerFileNoMidi: settingsKey = "layerpath"; filter = tr("All supported files (%1 %2)\nSonic Visualiser Layer XML files (*.svl)\nComma-separated data files (*.csv)\nSpace-separated .lab files (*.lab)\nRDF files (%2)\nText files (*.txt)\nAll files (*.*)") .arg(DataFileReaderFactory::getKnownExtensions()) .arg(RDFImporter::getKnownExtensions()); break; case SessionOrAudioFile: settingsKey = "lastpath"; filter = tr("All supported files (*.sv %1 %2)\nSonic Visualiser session files (*.sv)\nAudio files (%2)\nRDF files (%1)\nAll files (*.*)") .arg(RDFImporter::getKnownExtensions()) .arg(AudioFileReaderFactory::getKnownExtensions()); break; case ImageFile: settingsKey = "imagepath"; { QStringList fmts; QList formats = QImageReader::supportedImageFormats(); for (QList::iterator i = formats.begin(); i != formats.end(); ++i) { fmts.push_back(QString("*.%1") .arg(QString::fromLocal8Bit(*i).toLower())); } filter = tr("Image files (%1)\nAll files (*.*)").arg(fmts.join(" ")); } break; case CSVFile: settingsKey = "layerpath"; filter = tr("Comma-separated data files (*.csv)\nSpace-separated .lab files (*.lab)\nText files (*.txt)\nAll files (*.*)"); break; case AnyFile: settingsKey = "lastpath"; filter = tr("All supported files (*.sv %1 %2 %3)\nSonic Visualiser session files (*.sv)\nAudio files (%1)\nLayer files (%2)\nRDF files (%3)\nAll files (*.*)") .arg(AudioFileReaderFactory::getKnownExtensions()) .arg(DataFileReaderFactory::getKnownExtensions()) .arg(RDFImporter::getKnownExtensions()); break; }; if (lastPath == "") { char *home = getenv("HOME"); if (home) lastPath = home; else lastPath = "."; } else if (QFileInfo(lastPath).isDir()) { lastPath = QFileInfo(lastPath).canonicalPath(); } else { lastPath = QFileInfo(lastPath).absoluteDir().canonicalPath(); } QSettings settings; settings.beginGroup("FileFinder"); lastPath = settings.value(settingsKey, lastPath).toString(); QString path = ""; // Use our own QFileDialog just for symmetry with getSaveFileName below QFileDialog dialog; dialog.setNameFilters(filter.split('\n')); dialog.setWindowTitle(title); dialog.setDirectory(lastPath); dialog.setAcceptMode(QFileDialog::AcceptOpen); dialog.setFileMode(QFileDialog::ExistingFile); if (dialog.exec()) { QStringList files = dialog.selectedFiles(); if (!files.empty()) path = *files.begin(); QFileInfo fi(path); if (!fi.exists()) { QMessageBox::critical(0, tr("File does not exist"), tr("File not found

File \"%1\" does not exist").arg(path)); path = ""; } else if (!fi.isReadable()) { QMessageBox::critical(0, tr("File is not readable"), tr("File is not readable

File \"%1\" can not be read").arg(path)); path = ""; } else if (fi.isDir()) { QMessageBox::critical(0, tr("Directory selected"), tr("Directory selected

File \"%1\" is a directory").arg(path)); path = ""; } else if (!fi.isFile()) { QMessageBox::critical(0, tr("Non-file selected"), tr("Not a file

Path \"%1\" is not a file").arg(path)); path = ""; } else if (fi.size() == 0) { QMessageBox::critical(0, tr("File is empty"), tr("File is empty

File \"%1\" is empty").arg(path)); path = ""; } } if (path != "") { settings.setValue(settingsKey, QFileInfo(path).absoluteDir().canonicalPath()); } return path; } QString InteractiveFileFinder::getSaveFileName(FileType type, QString fallbackLocation) { QString settingsKey; QString lastPath = fallbackLocation; QString title = tr("Select file"); QString filter = tr("All files (*.*)"); switch (type) { case SessionFile: settingsKey = "savesessionpath"; title = tr("Select a session file"); filter = tr("Sonic Visualiser session files (*.sv)\nAll files (*.*)"); break; case AudioFile: settingsKey = "saveaudiopath"; title = "Select an audio file"; title = tr("Select a file to export to"); filter = tr("WAV audio files (*.wav)\nAll files (*.*)"); break; case LayerFile: settingsKey = "savelayerpath"; title = tr("Select a file to export to"); filter = tr("Sonic Visualiser Layer XML files (*.svl)\nComma-separated data files (*.csv)\nRDF/Turtle files (%1)\nMIDI files (*.mid)\nText files (*.txt)\nAll files (*.*)").arg(RDFExporter::getSupportedExtensions()); break; case LayerFileNoMidi: settingsKey = "savelayerpath"; title = tr("Select a file to export to"); filter = tr("Sonic Visualiser Layer XML files (*.svl)\nComma-separated data files (*.csv)\nRDF/Turtle files (%1)\nText files (*.txt)\nAll files (*.*)").arg(RDFExporter::getSupportedExtensions()); break; case SessionOrAudioFile: cerr << "ERROR: Internal error: InteractiveFileFinder::getSaveFileName: SessionOrAudioFile cannot be used here" << endl; abort(); case ImageFile: settingsKey = "saveimagepath"; title = tr("Select a file to export to"); filter = tr("Portable Network Graphics files (*.png)\nAll files (*.*)"); break; case CSVFile: settingsKey = "savelayerpath"; title = tr("Select a file to export to"); filter = tr("Comma-separated data files (*.csv)\nText files (*.txt)\nAll files (*.*)"); break; case AnyFile: cerr << "ERROR: Internal error: InteractiveFileFinder::getSaveFileName: AnyFile cannot be used here" << endl; abort(); }; if (lastPath == "") { char *home = getenv("HOME"); if (home) lastPath = home; else lastPath = "."; } else if (QFileInfo(lastPath).isDir()) { lastPath = QFileInfo(lastPath).canonicalPath(); } else { lastPath = QFileInfo(lastPath).absoluteDir().canonicalPath(); } QSettings settings; settings.beginGroup("FileFinder"); lastPath = settings.value(settingsKey, lastPath).toString(); QString path = ""; // Use our own QFileDialog instead of static functions, as we may // need to adjust the file extension based on the selected filter QFileDialog dialog; dialog.setNameFilters(filter.split('\n')); dialog.setWindowTitle(title); dialog.setDirectory(lastPath); dialog.setAcceptMode(QFileDialog::AcceptSave); dialog.setFileMode(QFileDialog::AnyFile); dialog.setConfirmOverwrite(false); // we'll do that if (type == SessionFile) { dialog.setDefaultSuffix("sv"); } else if (type == AudioFile) { dialog.setDefaultSuffix("wav"); } else if (type == ImageFile) { dialog.setDefaultSuffix("png"); } else if (type == CSVFile) { dialog.setDefaultSuffix("csv"); } bool good = false; while (!good) { path = ""; if (!dialog.exec()) break; QStringList files = dialog.selectedFiles(); if (files.empty()) break; path = *files.begin(); QFileInfo fi(path); cerr << "type = " << type << ", suffix = " << fi.suffix() << endl; if ((type == LayerFile || type == LayerFileNoMidi) && fi.suffix() == "") { QString expectedExtension; QString selectedFilter = dialog.selectedNameFilter(); if (selectedFilter.contains(".svl")) { expectedExtension = "svl"; } else if (selectedFilter.contains(".txt")) { expectedExtension = "txt"; } else if (selectedFilter.contains(".csv")) { expectedExtension = "csv"; } else if (selectedFilter.contains(".mid")) { expectedExtension = "mid"; } else if (selectedFilter.contains(".ttl")) { expectedExtension = "ttl"; } cerr << "expected extension = " << expectedExtension << endl; if (expectedExtension != "") { path = QString("%1.%2").arg(path).arg(expectedExtension); fi = QFileInfo(path); } } if (fi.isDir()) { QMessageBox::critical(0, tr("Directory selected"), tr("Directory selected

File \"%1\" is a directory").arg(path)); continue; } if (fi.exists()) { if (QMessageBox::question(0, tr("File exists"), tr("File exists

The file \"%1\" already exists.\nDo you want to overwrite it?").arg(path), QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok) { continue; } } good = true; } if (path != "") { settings.setValue(settingsKey, QFileInfo(path).absoluteDir().canonicalPath()); } return path; } void InteractiveFileFinder::registerLastOpenedFilePath(FileType type, QString path) { QString settingsKey; switch (type) { case SessionFile: settingsKey = "sessionpath"; break; case AudioFile: settingsKey = "audiopath"; break; case LayerFile: settingsKey = "layerpath"; break; case LayerFileNoMidi: settingsKey = "layerpath"; break; case SessionOrAudioFile: settingsKey = "lastpath"; break; case ImageFile: settingsKey = "imagepath"; break; case CSVFile: settingsKey = "layerpath"; break; case AnyFile: settingsKey = "lastpath"; break; } if (path != "") { QSettings settings; settings.beginGroup("FileFinder"); path = QFileInfo(path).absoluteDir().canonicalPath(); settings.setValue(settingsKey, path); settings.setValue("lastpath", path); } } QString InteractiveFileFinder::find(FileType type, QString location, QString lastKnownLocation) { if (FileSource::canHandleScheme(location)) { if (FileSource(location).isAvailable()) { SVDEBUG << "InteractiveFileFinder::find: ok, it's available... returning" << endl; return location; } } if (QFileInfo(location).exists()) return location; QString foundAt = ""; if ((foundAt = findRelative(location, lastKnownLocation)) != "") { return foundAt; } if ((foundAt = findRelative(location, m_lastLocatedLocation)) != "") { return foundAt; } return locateInteractive(type, location); } QString InteractiveFileFinder::findRelative(QString location, QString relativeTo) { if (relativeTo == "") return ""; SVDEBUG << "Looking for \"" << location << "\" next to \"" << relativeTo << "\"..." << endl; QString fileName; QString resolved; if (FileSource::isRemote(location)) { fileName = QUrl(location).path().section('/', -1, -1, QString::SectionSkipEmpty); } else { if (QUrl(location).scheme() == "file") { location = QUrl(location).toLocalFile(); } fileName = QFileInfo(location).fileName(); } if (FileSource::isRemote(relativeTo)) { resolved = QUrl(relativeTo).resolved(fileName).toString(); if (!FileSource(resolved).isAvailable()) resolved = ""; cerr << "resolved: " << resolved << endl; } else { if (QUrl(relativeTo).scheme() == "file") { relativeTo = QUrl(relativeTo).toLocalFile(); } resolved = QFileInfo(relativeTo).dir().filePath(fileName); if (!QFileInfo(resolved).exists() || !QFileInfo(resolved).isFile() || !QFileInfo(resolved).isReadable()) { resolved = ""; } } return resolved; } QString InteractiveFileFinder::locateInteractive(FileType type, QString thing) { QString question; if (type == AudioFile) { question = tr("File not found

Audio file \"%1\" could not be opened.\nDo you want to locate it?"); } else { question = tr("File not found

File \"%1\" could not be opened.\nDo you want to locate it?"); } QString path = ""; bool done = false; while (!done) { int rv = QMessageBox::question (0, tr("Failed to open file"), question.arg(thing), tr("Locate file..."), tr("Use URL..."), tr("Cancel"), 0, 2); switch (rv) { case 0: // Locate file if (QFileInfo(thing).dir().exists()) { path = QFileInfo(thing).dir().canonicalPath(); } path = getOpenFileName(type, path); done = (path != ""); break; case 1: // Use URL { bool ok = false; path = QInputDialog::getText (0, tr("Use URL"), tr("Please enter the URL to use for this file:"), QLineEdit::Normal, "", &ok); if (ok && path != "") { if (FileSource(path).isAvailable()) { done = true; } else { QMessageBox::critical (0, tr("Failed to open location"), tr("Failed to open location

URL \"%1\" could not be opened").arg(path)); path = ""; } } break; } case 2: // Cancel path = ""; done = true; break; } } if (path != "") m_lastLocatedLocation = path; return path; } sonic-visualiser-2.3~repack1.orig/svgui/widgets/CommandHistory.h0000644000175000017500000001573212252354725023656 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor, copyright 2000-2006 Chris Cannam, distributed under the GNU General Public License. This file contains traces of the KCommandHistory class from the KDE project, copyright 2000 Werner Trobin and David Faure and distributed under the GNU Lesser General Public License. */ #ifndef _MULTI_VIEW_COMMAND_HISTORY_H_ #define _MULTI_VIEW_COMMAND_HISTORY_H_ #include #include #include #include #include class Command; class MacroCommand; class QAction; class QMenu; class QToolBar; class QTimer; /** * The CommandHistory class stores a list of executed commands and * maintains Undo and Redo actions synchronised with those commands. * * CommandHistory allows you to associate more than one Undo and Redo * menu or toolbar with the same command history, and it keeps them * all up-to-date at once. This makes it effective in systems where * multiple views may be editing the same data. */ class CommandHistory : public QObject { Q_OBJECT public: virtual ~CommandHistory(); static CommandHistory *getInstance(); void clear(); void registerMenu(QMenu *menu); void registerToolbar(QToolBar *toolbar); /** * Add a command to the command history. * * The command will normally be executed before being added; but * if a compound operation is in use (see startCompoundOperation * below), the execute status of the compound operation will * determine whether the command is executed or not. */ void addCommand(Command *command); /** * Add a command to the command history. * * If execute is true, the command will be executed before being * added. Otherwise it will be assumed to have been already * executed -- a command should not be added to the history unless * its work has actually been done somehow! * * If a compound operation is in use (see startCompoundOperation * below), the execute value passed to this method will override * the execute status of the compound operation. In this way it's * possible to have a compound operation mixing both to-execute * and pre-executed commands. * * If bundle is true, the command will be a candidate for bundling * with any adjacent bundleable commands that have the same name, * into a single compound command. This is useful for small * commands that may be executed repeatedly altering the same data * (e.g. type text, set a parameter) whose number and extent is * not known in advance. The bundle parameter will be ignored if * a compound operation is already in use. */ void addCommand(Command *command, bool execute, bool bundle = false); /// Return the maximum number of items in the undo history. int getUndoLimit() const { return m_undoLimit; } /// Set the maximum number of items in the undo history. void setUndoLimit(int limit); /// Return the maximum number of items in the redo history. int getRedoLimit() const { return m_redoLimit; } /// Set the maximum number of items in the redo history. void setRedoLimit(int limit); /// Return the maximum number of items visible in undo and redo menus. int getMenuLimit() const { return m_menuLimit; } /// Set the maximum number of items in the menus. void setMenuLimit(int limit); /// Return the time after which a bundle will be closed if nothing is added. int getBundleTimeout() const { return m_bundleTimeout; } /// Set the time after which a bundle will be closed if nothing is added. void setBundleTimeout(int msec); /// Start recording commands to batch up into a single compound command. void startCompoundOperation(QString name, bool execute); /// Finish recording commands and store the compound command. void endCompoundOperation(); public slots: /** * Checkpoint function that should be called when the document is * saved. If the undo/redo stack later returns to the point at * which the document was saved, the documentRestored signal will * be emitted. */ virtual void documentSaved(); /** * Add a command to the history that has already been executed, * without executing it again. Equivalent to addCommand(command, false). */ void addExecutedCommand(Command *); /** * Add a command to the history and also execute it. Equivalent * to addCommand(command, true). */ void addCommandAndExecute(Command *); void undo(); void redo(); protected slots: void undoActivated(QAction *); void redoActivated(QAction *); void bundleTimerTimeout(); signals: /** * Emitted whenever a command has just been executed or * unexecuted, whether by addCommand, undo, or redo. */ void commandExecuted(); /** * Emitted whenever a command has just been executed, whether by * addCommand or redo. */ void commandExecuted(Command *); /** * Emitted whenever a command has just been unexecuted, whether by * addCommand or undo. */ void commandUnexecuted(Command *); /** * Emitted when the undo/redo stack has reached the same state at * which the documentSaved slot was last called. */ void documentRestored(); /** * Emitted when some activity happened (for activity logging). */ void activity(QString); protected: CommandHistory(); static CommandHistory *m_instance; QAction *m_undoAction; QAction *m_redoAction; QAction *m_undoMenuAction; QAction *m_redoMenuAction; QMenu *m_undoMenu; QMenu *m_redoMenu; std::map m_actionCounts; typedef std::stack CommandStack; CommandStack m_undoStack; CommandStack m_redoStack; int m_undoLimit; int m_redoLimit; int m_menuLimit; int m_savedAt; MacroCommand *m_currentCompound; bool m_executeCompound; void addToCompound(Command *command, bool execute); MacroCommand *m_currentBundle; bool m_bundling; QString m_currentBundleName; QTimer *m_bundleTimer; int m_bundleTimeout; void addToBundle(Command *command, bool execute); void closeBundle(); void updateActions(); void clipCommands(); void clipStack(CommandStack &stack, int limit); void clearStack(CommandStack &stack); }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/ItemEditDialog.h0000644000175000017500000000443012252354725023533 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _ITEM_EDIT_DIALOG_H_ #define _ITEM_EDIT_DIALOG_H_ #include #include #include "base/RealTime.h" class QSpinBox; class QDoubleSpinBox; class QLineEdit; class ItemEditDialog : public QDialog { Q_OBJECT public: enum { ShowTime = 1 << 0, ShowDuration = 1 << 1, ShowValue = 1 << 2, ShowText = 1 << 3 }; ItemEditDialog(size_t sampleRate, int options, QString valueUnits = "", QWidget *parent = 0); void setFrameTime(long frame); long getFrameTime() const; void setRealTime(RealTime rt); RealTime getRealTime() const; void setFrameDuration(long frame); long getFrameDuration() const; void setRealDuration(RealTime rt); RealTime getRealDuration() const; void setValue(float value); float getValue() const; void setText(QString text); QString getText() const; protected slots: void frameTimeChanged(int); void realTimeSecsChanged(int); void realTimeUSecsChanged(int); void frameDurationChanged(int); void realDurationSecsChanged(int); void realDurationUSecsChanged(int); void valueChanged(double); void textChanged(QString); void reset(); protected: size_t m_sampleRate; long m_defaultFrame; long m_defaultDuration; float m_defaultValue; QString m_defaultText; QSpinBox *m_frameTimeSpinBox; QSpinBox *m_realTimeSecsSpinBox; QSpinBox *m_realTimeUSecsSpinBox; QSpinBox *m_frameDurationSpinBox; QSpinBox *m_realDurationSecsSpinBox; QSpinBox *m_realDurationUSecsSpinBox; QDoubleSpinBox *m_valueSpinBox; QLineEdit *m_textField; QPushButton *m_resetButton; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/widgets/ActivityLog.h0000644000175000017500000000175412252354725023153 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _ACTIVITY_LOG_H_ #define _ACTIVITY_LOG_H_ #include #include class QListView; class QStringListModel; class ActivityLog : public QDialog { Q_OBJECT public: ActivityLog(); ~ActivityLog(); public slots: void activityHappened(QString); void scrollToEnd(); private: QListView *m_listView; QStringListModel *m_model; QString m_prevName; }; #endif sonic-visualiser-2.3~repack1.orig/svgui/configure0000755000175000017500000076356712252354725021026 0ustar miramira#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for SVgui 2.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: cannam@all-day-breakfast.com about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='SVgui' PACKAGE_TARNAME='svgui' PACKAGE_VERSION='2.1' PACKAGE_STRING='SVgui 2.1' PACKAGE_BUGREPORT='cannam@all-day-breakfast.com' PACKAGE_URL='' ac_unique_file="widgets/Fader.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS QMAKE_CONFIG HAVES CXXFLAGS_MINIMAL CUT SHA1SUM MAKEDEPEND XARGS PERL id3tag_LIBS id3tag_CFLAGS mad_LIBS mad_CFLAGS fishsound_LIBS fishsound_CFLAGS oggz_LIBS oggz_CFLAGS lrdf_LIBS lrdf_CFLAGS libpulse_LIBS libpulse_CFLAGS JACK_LIBS JACK_CFLAGS portaudio_2_0_LIBS portaudio_2_0_CFLAGS liblo_LIBS liblo_CFLAGS rubberband_LIBS rubberband_CFLAGS vamphostsdk_LIBS vamphostsdk_CFLAGS vamp_LIBS vamp_CFLAGS samplerate_LIBS samplerate_CFLAGS sndfile_LIBS sndfile_CFLAGS fftw3f_LIBS fftw3f_CFLAGS fftw3_LIBS fftw3_CFLAGS bz2_LIBS bz2_CFLAGS QMAKE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG EGREP GREP CXXCPP MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM ac_ct_CXX CXXFLAGS CXX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR bz2_CFLAGS bz2_LIBS fftw3_CFLAGS fftw3_LIBS fftw3f_CFLAGS fftw3f_LIBS sndfile_CFLAGS sndfile_LIBS samplerate_CFLAGS samplerate_LIBS vamp_CFLAGS vamp_LIBS vamphostsdk_CFLAGS vamphostsdk_LIBS rubberband_CFLAGS rubberband_LIBS liblo_CFLAGS liblo_LIBS portaudio_2_0_CFLAGS portaudio_2_0_LIBS JACK_CFLAGS JACK_LIBS libpulse_CFLAGS libpulse_LIBS lrdf_CFLAGS lrdf_LIBS oggz_CFLAGS oggz_LIBS fishsound_CFLAGS fishsound_LIBS mad_CFLAGS mad_LIBS id3tag_CFLAGS id3tag_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures SVgui 2.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/svgui] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of SVgui 2.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debug support [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path bz2_CFLAGS C compiler flags for bz2, overriding pkg-config bz2_LIBS linker flags for bz2, overriding pkg-config fftw3_CFLAGS C compiler flags for fftw3, overriding pkg-config fftw3_LIBS linker flags for fftw3, overriding pkg-config fftw3f_CFLAGS C compiler flags for fftw3f, overriding pkg-config fftw3f_LIBS linker flags for fftw3f, overriding pkg-config sndfile_CFLAGS C compiler flags for sndfile, overriding pkg-config sndfile_LIBS linker flags for sndfile, overriding pkg-config samplerate_CFLAGS C compiler flags for samplerate, overriding pkg-config samplerate_LIBS linker flags for samplerate, overriding pkg-config vamp_CFLAGS C compiler flags for vamp, overriding pkg-config vamp_LIBS linker flags for vamp, overriding pkg-config vamphostsdk_CFLAGS C compiler flags for vamphostsdk, overriding pkg-config vamphostsdk_LIBS linker flags for vamphostsdk, overriding pkg-config rubberband_CFLAGS C compiler flags for rubberband, overriding pkg-config rubberband_LIBS linker flags for rubberband, overriding pkg-config liblo_CFLAGS C compiler flags for liblo, overriding pkg-config liblo_LIBS linker flags for liblo, overriding pkg-config portaudio_2_0_CFLAGS C compiler flags for portaudio_2_0, overriding pkg-config portaudio_2_0_LIBS linker flags for portaudio_2_0, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config libpulse_CFLAGS C compiler flags for libpulse, overriding pkg-config libpulse_LIBS linker flags for libpulse, overriding pkg-config lrdf_CFLAGS C compiler flags for lrdf, overriding pkg-config lrdf_LIBS linker flags for lrdf, overriding pkg-config oggz_CFLAGS C compiler flags for oggz, overriding pkg-config oggz_LIBS linker flags for oggz, overriding pkg-config fishsound_CFLAGS C compiler flags for fishsound, overriding pkg-config fishsound_LIBS linker flags for fishsound, overriding pkg-config mad_CFLAGS C compiler flags for mad, overriding pkg-config mad_LIBS linker flags for mad, overriding pkg-config id3tag_CFLAGS C compiler flags for id3tag, overriding pkg-config id3tag_LIBS linker flags for id3tag, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF SVgui configure 2.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to cannam@all-day-breakfast.com ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by SVgui $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake.exe", so it can be a program name with args. set dummy qmake.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then as_fn_error $? " Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. " "$LINENO" 5 fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&5 $as_echo "$as_me: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&2;} esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_DEBUG="-Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe" CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe" CXXFLAGS_MINIMAL="-g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; { $as_echo "$as_me:${as_lineno-$LINENO}: enabling debug build" >&5 $as_echo "$as_me: enabling debug build" >&6;} QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG" fi if test x"$USER_CXXFLAGS" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&5 $as_echo "$as_me: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Overriding default compiler flags with the above user setting." >&5 $as_echo "$as_me: Overriding default compiler flags with the above user setting." >&6;} CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done SV_MODULE_MODULE=bz2 SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=bzlib.h SV_MODULE_LIB=bz2 SV_MODULE_FUNC=BZ2_bzReadOpen SV_MODULE_HAVE=HAVE_$(echo bz2 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$bz2_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $bz2_CFLAGS" LIBS="$LIBS $bz2_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bz2" >&5 $as_echo_n "checking for bz2... " >&6; } if test -n "$bz2_CFLAGS"; then pkg_cv_bz2_CFLAGS="$bz2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$bz2_LIBS"; then pkg_cv_bz2_LIBS="$bz2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then bz2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else bz2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$bz2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else bz2_CFLAGS=$pkg_cv_bz2_CFLAGS bz2_LIBS=$pkg_cv_bz2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $bz2_CFLAGS";LIBS="$LIBS $bz2_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3 SV_MODULE_VERSION_TEST="fftw3 >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3 SV_MODULE_FUNC=fftw_execute SV_MODULE_HAVE=HAVE_$(echo fftw3 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS" LIBS="$LIBS $fftw3_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3" >&5 $as_echo_n "checking for fftw3... " >&6; } if test -n "$fftw3_CFLAGS"; then pkg_cv_fftw3_CFLAGS="$fftw3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3_LIBS"; then pkg_cv_fftw3_LIBS="$fftw3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3_CFLAGS=$pkg_cv_fftw3_CFLAGS fftw3_LIBS=$pkg_cv_fftw3_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS";LIBS="$LIBS $fftw3_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3f SV_MODULE_VERSION_TEST="fftw3f >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3f SV_MODULE_FUNC=fftwf_execute SV_MODULE_HAVE=HAVE_$(echo fftw3f | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3f_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS" LIBS="$LIBS $fftw3f_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3f" >&5 $as_echo_n "checking for fftw3f... " >&6; } if test -n "$fftw3f_CFLAGS"; then pkg_cv_fftw3f_CFLAGS="$fftw3f_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3f_LIBS"; then pkg_cv_fftw3f_LIBS="$fftw3f_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3f_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3f_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3f_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3f_CFLAGS=$pkg_cv_fftw3f_CFLAGS fftw3f_LIBS=$pkg_cv_fftw3f_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS";LIBS="$LIBS $fftw3f_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sndfile SV_MODULE_VERSION_TEST="sndfile >= 1.0.16" SV_MODULE_HEADER=sndfile.h SV_MODULE_LIB=sndfile SV_MODULE_FUNC=sf_open SV_MODULE_HAVE=HAVE_$(echo sndfile | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sndfile_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS" LIBS="$LIBS $sndfile_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sndfile" >&5 $as_echo_n "checking for sndfile... " >&6; } if test -n "$sndfile_CFLAGS"; then pkg_cv_sndfile_CFLAGS="$sndfile_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sndfile_LIBS"; then pkg_cv_sndfile_LIBS="$sndfile_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sndfile_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sndfile_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sndfile_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sndfile_CFLAGS=$pkg_cv_sndfile_CFLAGS sndfile_LIBS=$pkg_cv_sndfile_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS";LIBS="$LIBS $sndfile_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=samplerate SV_MODULE_VERSION_TEST="samplerate >= 0.1.2" SV_MODULE_HEADER=samplerate.h SV_MODULE_LIB=samplerate SV_MODULE_FUNC=src_new SV_MODULE_HAVE=HAVE_$(echo samplerate | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$samplerate_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS" LIBS="$LIBS $samplerate_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for samplerate" >&5 $as_echo_n "checking for samplerate... " >&6; } if test -n "$samplerate_CFLAGS"; then pkg_cv_samplerate_CFLAGS="$samplerate_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$samplerate_LIBS"; then pkg_cv_samplerate_LIBS="$samplerate_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then samplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else samplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$samplerate_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else samplerate_CFLAGS=$pkg_cv_samplerate_CFLAGS samplerate_LIBS=$pkg_cv_samplerate_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS";LIBS="$LIBS $samplerate_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=vamp SV_MODULE_VERSION_TEST="vamp >= 2.1" SV_MODULE_HEADER=vamp/vamp.h SV_MODULE_LIB= SV_MODULE_FUNC= SV_MODULE_HAVE=HAVE_$(echo vamp | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$vamp_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $vamp_CFLAGS" LIBS="$LIBS $vamp_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vamp" >&5 $as_echo_n "checking for vamp... " >&6; } if test -n "$vamp_CFLAGS"; then pkg_cv_vamp_CFLAGS="$vamp_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamp_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$vamp_LIBS"; then pkg_cv_vamp_LIBS="$vamp_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamp_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then vamp_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else vamp_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$vamp_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else vamp_CFLAGS=$pkg_cv_vamp_CFLAGS vamp_LIBS=$pkg_cv_vamp_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $vamp_CFLAGS";LIBS="$LIBS $vamp_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=vamphostsdk SV_MODULE_VERSION_TEST="vamp-hostsdk >= 2.5" SV_MODULE_HEADER=vamp-hostsdk/PluginLoader.h SV_MODULE_LIB=vamp-hostsdk SV_MODULE_FUNC=libvamphostsdk_v_2_5_present SV_MODULE_HAVE=HAVE_$(echo vamphostsdk | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$vamphostsdk_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $vamphostsdk_CFLAGS" LIBS="$LIBS $vamphostsdk_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vamphostsdk" >&5 $as_echo_n "checking for vamphostsdk... " >&6; } if test -n "$vamphostsdk_CFLAGS"; then pkg_cv_vamphostsdk_CFLAGS="$vamphostsdk_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamphostsdk_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$vamphostsdk_LIBS"; then pkg_cv_vamphostsdk_LIBS="$vamphostsdk_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamphostsdk_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then vamphostsdk_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else vamphostsdk_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$vamphostsdk_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else vamphostsdk_CFLAGS=$pkg_cv_vamphostsdk_CFLAGS vamphostsdk_LIBS=$pkg_cv_vamphostsdk_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $vamphostsdk_CFLAGS";LIBS="$LIBS $vamphostsdk_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=rubberband SV_MODULE_VERSION_TEST="rubberband" SV_MODULE_HEADER=rubberband/RubberBandStretcher.h SV_MODULE_LIB=rubberband SV_MODULE_FUNC=rubberband_new SV_MODULE_HAVE=HAVE_$(echo rubberband | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$rubberband_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS" LIBS="$LIBS $rubberband_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rubberband" >&5 $as_echo_n "checking for rubberband... " >&6; } if test -n "$rubberband_CFLAGS"; then pkg_cv_rubberband_CFLAGS="$rubberband_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$rubberband_LIBS"; then pkg_cv_rubberband_LIBS="$rubberband_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then rubberband_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else rubberband_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$rubberband_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else rubberband_CFLAGS=$pkg_cv_rubberband_CFLAGS rubberband_LIBS=$pkg_cv_rubberband_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS";LIBS="$LIBS $rubberband_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=liblo SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=lo/lo.h SV_MODULE_LIB=lo SV_MODULE_FUNC=lo_address_new SV_MODULE_HAVE=HAVE_$(echo liblo | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$liblo_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $liblo_CFLAGS" LIBS="$LIBS $liblo_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for liblo" >&5 $as_echo_n "checking for liblo... " >&6; } if test -n "$liblo_CFLAGS"; then pkg_cv_liblo_CFLAGS="$liblo_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$liblo_LIBS"; then pkg_cv_liblo_LIBS="$liblo_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then liblo_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else liblo_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$liblo_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else liblo_CFLAGS=$pkg_cv_liblo_CFLAGS liblo_LIBS=$pkg_cv_liblo_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $liblo_CFLAGS";LIBS="$LIBS $liblo_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=portaudio_2_0 SV_MODULE_VERSION_TEST="portaudio-2.0 >= 19" SV_MODULE_HEADER=portaudio.h SV_MODULE_LIB=portaudio SV_MODULE_FUNC=Pa_IsFormatSupported SV_MODULE_HAVE=HAVE_$(echo portaudio_2_0 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$portaudio_2_0_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS" LIBS="$LIBS $portaudio_2_0_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio_2_0" >&5 $as_echo_n "checking for portaudio_2_0... " >&6; } if test -n "$portaudio_2_0_CFLAGS"; then pkg_cv_portaudio_2_0_CFLAGS="$portaudio_2_0_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$portaudio_2_0_LIBS"; then pkg_cv_portaudio_2_0_LIBS="$portaudio_2_0_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$portaudio_2_0_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else portaudio_2_0_CFLAGS=$pkg_cv_portaudio_2_0_CFLAGS portaudio_2_0_LIBS=$pkg_cv_portaudio_2_0_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS";LIBS="$LIBS $portaudio_2_0_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=JACK SV_MODULE_VERSION_TEST="jack >= 0.100" SV_MODULE_HEADER=jack/jack.h SV_MODULE_LIB=jack SV_MODULE_FUNC=jack_client_open SV_MODULE_HAVE=HAVE_$(echo JACK | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$JACK_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $JACK_CFLAGS";LIBS="$LIBS $JACK_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=libpulse SV_MODULE_VERSION_TEST="libpulse >= 0.9" SV_MODULE_HEADER=pulse/pulseaudio.h SV_MODULE_LIB=pulse SV_MODULE_FUNC=pa_stream_new SV_MODULE_HAVE=HAVE_$(echo libpulse | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$libpulse_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS" LIBS="$LIBS $libpulse_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpulse" >&5 $as_echo_n "checking for libpulse... " >&6; } if test -n "$libpulse_CFLAGS"; then pkg_cv_libpulse_CFLAGS="$libpulse_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libpulse_LIBS"; then pkg_cv_libpulse_LIBS="$libpulse_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libpulse_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else libpulse_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libpulse_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else libpulse_CFLAGS=$pkg_cv_libpulse_CFLAGS libpulse_LIBS=$pkg_cv_libpulse_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS";LIBS="$LIBS $libpulse_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=lrdf SV_MODULE_VERSION_TEST="lrdf >= 0.2" SV_MODULE_HEADER=lrdf.h SV_MODULE_LIB=lrdf SV_MODULE_FUNC=lrdf_init SV_MODULE_HAVE=HAVE_$(echo lrdf | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$lrdf_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS" LIBS="$LIBS $lrdf_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrdf" >&5 $as_echo_n "checking for lrdf... " >&6; } if test -n "$lrdf_CFLAGS"; then pkg_cv_lrdf_CFLAGS="$lrdf_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$lrdf_LIBS"; then pkg_cv_lrdf_LIBS="$lrdf_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then lrdf_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else lrdf_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$lrdf_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else lrdf_CFLAGS=$pkg_cv_lrdf_CFLAGS lrdf_LIBS=$pkg_cv_lrdf_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS";LIBS="$LIBS $lrdf_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=oggz SV_MODULE_VERSION_TEST="oggz >= 1.0.0" SV_MODULE_HEADER=oggz/oggz.h SV_MODULE_LIB=oggz SV_MODULE_FUNC=oggz_run SV_MODULE_HAVE=HAVE_$(echo oggz | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$oggz_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $oggz_CFLAGS" LIBS="$LIBS $oggz_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oggz" >&5 $as_echo_n "checking for oggz... " >&6; } if test -n "$oggz_CFLAGS"; then pkg_cv_oggz_CFLAGS="$oggz_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$oggz_LIBS"; then pkg_cv_oggz_LIBS="$oggz_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then oggz_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else oggz_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$oggz_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else oggz_CFLAGS=$pkg_cv_oggz_CFLAGS oggz_LIBS=$pkg_cv_oggz_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $oggz_CFLAGS";LIBS="$LIBS $oggz_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=fishsound SV_MODULE_VERSION_TEST="fishsound >= 1.0.0" SV_MODULE_HEADER=fishsound/fishsound.h SV_MODULE_LIB=fishsound SV_MODULE_FUNC=fish_sound_new SV_MODULE_HAVE=HAVE_$(echo fishsound | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fishsound_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS" LIBS="$LIBS $fishsound_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fishsound" >&5 $as_echo_n "checking for fishsound... " >&6; } if test -n "$fishsound_CFLAGS"; then pkg_cv_fishsound_CFLAGS="$fishsound_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fishsound_LIBS"; then pkg_cv_fishsound_LIBS="$fishsound_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fishsound_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fishsound_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fishsound_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fishsound_CFLAGS=$pkg_cv_fishsound_CFLAGS fishsound_LIBS=$pkg_cv_fishsound_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS";LIBS="$LIBS $fishsound_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=mad SV_MODULE_VERSION_TEST="mad >= 0.15.0" SV_MODULE_HEADER=mad.h SV_MODULE_LIB=mad SV_MODULE_FUNC=mad_decoder_init SV_MODULE_HAVE=HAVE_$(echo mad | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$mad_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $mad_CFLAGS" LIBS="$LIBS $mad_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mad" >&5 $as_echo_n "checking for mad... " >&6; } if test -n "$mad_CFLAGS"; then pkg_cv_mad_CFLAGS="$mad_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$mad_LIBS"; then pkg_cv_mad_LIBS="$mad_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then mad_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else mad_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$mad_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else mad_CFLAGS=$pkg_cv_mad_CFLAGS mad_LIBS=$pkg_cv_mad_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $mad_CFLAGS";LIBS="$LIBS $mad_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=id3tag SV_MODULE_VERSION_TEST="id3tag >= 0.15.0" SV_MODULE_HEADER=id3tag.h SV_MODULE_LIB=id3tag SV_MODULE_FUNC=id3_tag_new SV_MODULE_HAVE=HAVE_$(echo id3tag | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$id3tag_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS" LIBS="$LIBS $id3tag_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for id3tag" >&5 $as_echo_n "checking for id3tag... " >&6; } if test -n "$id3tag_CFLAGS"; then pkg_cv_id3tag_CFLAGS="$id3tag_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$id3tag_LIBS"; then pkg_cv_id3tag_LIBS="$id3tag_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then id3tag_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else id3tag_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$id3tag_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else id3tag_CFLAGS=$pkg_cv_id3tag_CFLAGS id3tag_LIBS=$pkg_cv_id3tag_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS";LIBS="$LIBS $id3tag_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi ac_config_files="$ac_config_files config.pri" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by SVgui $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ SVgui config.status 2.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.pri") CONFIG_FILES="$CONFIG_FILES config.pri" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if ! $QMAKE -r svgui.pro; then as_fn_error $? "qmake failed: Command was \"$QMAKE -r\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&5 $as_echo "$as_me: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&6;} sonic-visualiser-2.3~repack1.orig/svgui/config.pri.in0000644000175000017500000000062112252354725021454 0ustar miramira CONFIG += @QMAKE_CONFIG@ DEFINES += @HAVES@ QMAKE_CC = @CC@ QMAKE_CXX = @CXX@ QMAKE_LINK = @CXX@ QMAKE_CFLAGS += @CFLAGS@ QMAKE_CXXFLAGS += @CXXFLAGS@ linux*:LIBS += -lasound macx*:DEFINES += HAVE_QUICKTIME macx*:LIBS += -framework QuickTime -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices LIBS += @LIBS@ sonic-visualiser-2.3~repack1.orig/svgui/COPYING0000644000175000017500000003543312252354725020132 0ustar miramira GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS sonic-visualiser-2.3~repack1.orig/i18n/0000755000175000017500000000000012264464201016503 5ustar miramirasonic-visualiser-2.3~repack1.orig/i18n/sonic-visualiser_ru.qm0000644000175000017500000043160412252354725023065 0ustar miramira->6q6HYIAJ 2J|J$}LD3LSWSW6kSWSWSWؐUXhvhnu{@2yO{K{ FF F4 F F]W%KW%Iw%N%w%%SSSCS>":eQ@0Q#gNt056+ݗ+T;~";~l;~ @U4rV,V)V7tVVVѲVnVV)W <&X|XPX1XXY%1Y%8Y%Y%Y%[Y%VY% WY\Y_Zg dZygZCYZsZzQ2[Qf\P\q\\]]s]^ _Xvf`GC7!`GCA`GCX`GC`Dd'd.d;(ddd)ddh|l<mgnxao3wNlxNa"|!}fӾ~\Q#wfs:3iVbqbM_Uj`Sm!. uEȐ֔ Z5H1z7eB=7eп7eIdS[ TAEe^flTnT=nhodrkRuz.i pMa(,P&7 Nɩ2U$16ޱr!_N%@ݞC`6痿Z縿o*ZBM!%n3nnN+Q#3i$Cu$)*83+4u9:nj>]M,Bjy*DNE^RY.yScU<RV:hWŽ](UmpzAqJs5t?sPv"9;vSz'q{n,q‚‚r‚‚2‚;ip<(nSyUϓ>Vwx{  "Ll:llߺECjvN ;#Z#V.;_1m`=mYJ=4 o9ʃw   &I8*wp._eE04br1xb 3*ZW5W6C993TjBOC$>DOuHOVKSogWKSoX$|X/BYZ>r?bKSog>~lkVp/T v_y#=yC;KSq$  2 "{KSq@:l[%[%̹{~-h{~8s{~X{~{~ {~Ҹ{~s%O%\ERD-g"&Ju-GTtk !*W ssg3O$%xp&D$ 'v,q,q,q - _2IdE3"*559=B>"|`ej{n}{$c&JcZ#-IAIPIII7gz666tn;l ;Du %,,!Xx~†K†Dƾe Ȣ^תdN^֔lZ|de7N#Y[VR,e}[w.nr R }B_]%/%/!%/%/%/>'((++,0K0K670K0K0K\0K%0K 583j8ZfK0kO|QsQsQ{V\\ZuF\#$\9um]^?.au.n:hhwk]r_v|KuqA|%~͈f$Az^,Dz !535#5ԛ,Y9,+t+[!8]Ǩz=/:~NdKȕ1!gY}@GQa%`,&,*Zġ8 ;Q˨|w ץN/SKg^Kgo୎)!୎,@N0LTiXeA!פikyB % +ZNtug"':_79݋9NvJ3r L.`ST5sSTSTRWW#<W\E1_,,_P^a1{eUeUeUeU٦jkOnlxu#dvtx}uLACS00ßcZARf  6?0+ ) w%w#]`` wR?9z|*g>˥˥֣P=$ AN2o3؃OܐCW|ARvR/J'PEeJy9یF ,q| >^H@5!כ 2#ϵa$ S)uC9 GқHBKKq+KObLqQ$Tl\W>|Ɯi¾ےsomBv e9ϗ)Z-c4hAg)M>7D [PT)u+ڎ Xre\9BCN:GR0${ёӁ|6Й:D'^j)"yTZ /EA1B2>(22s203~2M73BE(YI-)JT y +m 5  _ k  vA  Dc Op ּ )DV 2R% 8e : >H ?dro C*1 Mg NIBR S$4 S$ S$_ S5+ Sχ S V W , W 6 W Dz W  W  X b bS c c%h dg2 tP z^E* {г^ }h #7 #+ i T ÄT s'a 0JnG w5R ~o ~Ո { ^# 8 8 nS" O, O7 O Oȍ O  ͡ _߭  g ` Dj 9/ b9G > 9 ~ Y t< 6H 5' !nO= *$w +" -xX? 1 5#{ 58 54 9: 9:˦ 9ͳ ;f ?Hg ?$ C\ O^ X^2 _Y cl\ ed5"  $}Z .mv 2| _  ^Q _de w t5 I N+ N4 NP N N@ N, N֬ ȨW (Cd! Z J ֳ~^ ! ع,j ݅ڃ 9(  k W{0 y3A jqs A5 bB x D =V ? Ŕ -] 3ME ;.B F)7 N>u Pve RwC6 `B}M c$" dt8% dtڞ e o&(= rh yfg {WRp ~Ww ^cG %  s4- s s j fl "OX ~  C  pp ̺ oC Ҙ }d ޼[ n] x \ O No y! J -/ eZ & C *H l%D< d x !_ 'd" ' + -%* 5%Wy Ds @B Ifn K1 K OQ Q} RV/x RV RV< RV RV8 RV| RV S ) [y a a b. b |N b | h5 t) tO }y f : C r  'ޚ P  Z<N4 U m [n ̣ 7 z. V9 ?, yH ߣt ʧ= y I?m x  귓SD $ J @ `; t W4 )_> ) $ - 4UwB A S DY DY DY DZ DZ  OqTF P}T [a ]D ^B f$ iIO k$< k$[ lFs" o$5" p4} u0 z4S z= { ˗hZ P  S } ϫ Ʋš tc  ʼ? Fƻ ~ ƨԼ ǂ әN y !mH &~ z j  D` B,e- k T0x Bs?Hr& \X))[*[Ĩ[Ά%j*^.IDF{K>"h8hFk 4nM.o:Rrb/t*XWN(WN*r@tPf)P1jnu]V4C+](ph->Vܭ;?tYYW @_@SN:/ ySЯ @<O i$B VtH ^N1t"Ƥ|%s*-eO1 YLu??CS D8VJddLN O2'[m4^iiyjb&m{uT[W{sC#{sC&JCh$cojMSjGnV4L>T٣5<݉@Nttttxcpuc^+.õ.-i x %1: %2%1: %2 ActivityLogf<p>!?8A>: 2A5E ?@54?@8=OBKE 20<8 459AB289 A %1.</p>G

Activity Log lists your interactions and other events within %1.

 ActivityLog C@=0; 87<5=5=89 Activity Log ActivityLog >1028BL A;>9 %1 Add %1 LayerAddLayerCommandK@02=820=85 AlignmentAlignmentModel\!<5=0 :>MDD8F85=B0 @0ABO65=8O 2> 2@5<5=8 =0 %1 Change time-stretch factor to %1AudioCallbackPlaySource*>A?@>872545=85 >B %1 Play from %1AudioCallbackPlaySource,AB0=>2:0 2 ?>78F88 %1 Stop at %1AudioCallbackPlaySource%1: %2%3%1: %2%3 AudioDial%2%3%2%3 AudioDialL2548B5 =>2>5 7=0G5=85 >B %1 4> %2 %3:#Enter a new value from %1 to %2 %3: AudioDialF2548B5 =>2>5 7=0G5=85 >B %1 4> %2: Enter a new value from %1 to %2: AudioDial,2548B5 =>2>5 7=0G5=85Enter new value AudioDialP>2>5 7=0G5=85 4;O %1, >B %2 4> %3 %4:#New value for %1, from %2 to %3 %4: AudioDialJ>2>5 7=0G5=85 4;O %1, >B %2 4> %3: New value for %1, from %2 to %3: AudioDial (02B>)(auto)AudioTargetFactory*#AB@>9AB2> Core AudioCore Audio DeviceAudioTargetFactory62C:>20O :0@B0 ?> C<>;G0=8NDefault Soundcard DeviceAudioTargetFactoryJ3@0=8G8BL 2>A?@>872545=85 2K45;5=85<JACK Audio Connection KitAudioTargetFactory"!5@25@ PulseAudioPulseAudio ServerAudioTargetFactoryT 568< 4>102;5=8O 2 :>=5F =5 ?>445@68205BAOAppend mode not supportedBZipFileDeviceR5 C40;>AL >B:@KBL ?>B>: bzip2 4;O GB5=8O'Failed to open bzip2 stream for readingBZipFileDeviceR5 C40;>AL >B:@KBL ?>B>: bzip2 4;O 70?8A8'Failed to open bzip2 stream for writingBZipFileDeviceD5 C40;>AL >B:@KBL D09; 4;O GB5=8OFailed to open file for readingBZipFileDeviceD5 C40;>AL >B:@KBL D09; 4;O 70?8A8Failed to open file for writingBZipFileDeviceB!?>A>1 4>ABC?0 : D09;0< =5 C:070=File access mode not specifiedBZipFileDevice(-B>B D09; C65 >B:@KBFile is already openBZipFileDevice$09; =5 >B:@KB File not openBZipFileDevicen=CB@5==OO >H81:0 (=5 70:@K205BAO =8 GB5=85, =8 70?8AL)1Internal error (close for neither read nor write)BZipFileDevicez=CB@5==OO >H81:0 (=5 >B:@K205BAO =8 =0 GB5=85, =8 =0 70?8AL)0Internal error (open for neither read nor write)BZipFileDeviceB 568<K GB5=8O 8 70?8A8 >?@545;5=K#Read and write modes both specifiedBZipFileDeviceFH81:0 70:@KB8O GB5=8O ?>B>:0 bzip2bzip2 stream read close errorBZipFileDevice4H81:0 GB5=8O ?>B>:0 bzip2bzip2 stream read errorBZipFileDeviceHH81:0 70:@KB8O 70?8A8 2 ?>B>: bzip2bzip2 stream write close errorBZipFileDevice"%1 (%n 87<5=5=85)"%1 (%n 87<5=5=8O)"%1 (%n 87<5=5=89)%1 (%n change(s)) BundleCommandJ5 C40;>AL >B:@KBL D09; %1 4;O 70?8A8"Failed to open file %1 for writing CSVFileWriterB'0AB>B0 AM<?;8@>20=8O 72C:0 (F):Audio sample rate (Hz):CSVFormatDialog;8B5;L=>ABLDurationCSVFormatDialog 5B:0LabelCSVFormatDialog,K15@8B5 D>@<0B 40==KESelect Data FormatCSVFormatDialog @5<OTimeCSVFormatDialog=0G5=85ValueCSVFormatDialog1+/-1Colour3DPlotLayer<=58725AB=>> Colour3DPlotLayer1A>;NB=K9AbsoluteColour3DPlotLayer$A5340 =5?@>7@0G=> Always OpaqueColour3DPlotLayer8=KBinsColour3DPlotLayer&25BColourColour3DPlotLayer#A8;5=85GainColour3DPlotLayerD=25@B8@>20BL <0AHB01 ?> 25@B8:0;8Invert Vertical ScaleColour3DPlotLayer8=59=K9LinearColour3DPlotLayer>30@8D<8G5A:89LogColour3DPlotLayer*>@<0;87>20BL AB>;1FKNormalize ColumnsColour3DPlotLayer:>@<0;87>20BL 2848<CN >1;0ABLNormalize Visible AreaColour3DPlotLayer0AHB01ScaleColour3DPlotLayerF@5<O: %1 - %2 Bin: %3 =0G5=85: %4Time: %1 - %2 Bin: %3 Value: %4Colour3DPlotLayer1dBColour3DPlotLayer<=58725AB=>>  ColourMapper ?>;>A:CBanded ColourMapper'Q@=>5 =0 15;><Black on White ColourMapper!8=55 =0 GQ@=>< Blue on Black ColourMapper> C<>;G0=8NDefault ColourMapper$@C:B>2K9 A0;0B Fruit Salad ColourMapper>4A25B:0 Highlight ColourMapper@8=B5@Printer ColourMapper @0A=>5 =0 A8=5< Red on Blue ColourMapper 0:0BSunset ColourMapper5;>5 =0 GQ@=><White on Black ColourMapper Q;B>5 =0 GQ@=><Yellow on Black ColourMapper&B<5=8BL&UndoCommandHistory.&B<5=8BL 459AB285 %1&Undo %1CommandHistoryCtrl+Shift+Z Ctrl+Shift+ZCommandHistory Ctrl+ZCtrl+ZCommandHistory05B ?>2B>@O5<KE 459AB289Nothing to redoCommandHistory.5B >B<5=O5<KE 459AB289Nothing to undoCommandHistory5&@=CBLRe&doCommandHistory0>2B>&@8BL 459AB285 %1Re&do %1CommandHistory(>2B>@ 459AB28O %1Redo %1CommandHistoryF>2B>@8BL ?>A;54=55 459AB285 ?@02:8'Redo the last operation that was undoneCommandHistory(B<5=0 459AB28O %1Undo %1CommandHistoryDB<5=8BL ?>A;54=55 459AB285 ?@02:8Undo the last editing operationCommandHistory$5:>48@C5BAO %1...Decoding %1...CoreAudioFileReaderK1>@:0FrameDenseThreeDimensionalModel @5<OTimeDenseThreeDimensionalModel0G8AB8BL >A=>2=CN <>45;LClear main modelDocument6!45;0BL %1 >A=>2=>9 <>45;LNSet main model to %1Document %1 F%1 HzFFTModelFFTFFTFFTModel<22548B5 =>2K9 C@>25=L D5945@0Enter new fader levelFader*#@>25=L: %1%2.%3%4 1Level: %1%2.%3%4 dBFader#@>25=L: 2K:; Level: OffFaderP>2K9 C@>25=L D5945@0, >B %1 4> %2 dBFS:$New fader level, from %1 to %2 dBFS:FaderZ# @0AH8@5=8O "%1" =5B 2KE>40 A =0720=85< "%2"$Plugin "%1" has no output named "%2"!FeatureExtractionModelTransformer:# @0AH8@5=8O "%1" =5B 2KE>4>2Plugin "%1" has no outputs!FeatureExtractionModelTransformer&!:0G820=85 >B<5=5=>Download cancelled FileSource"!:0G8205BAO %1...Downloading %1... FileSourceB!:0G820=85 A FTP-A5@25@0 ?@5@20=>FTP download aborted FileSourceR5 C40;>AL ?><5=OBL =0 :>@@5:B=K9 :0B0;>3%Failed to change to correct directory FileSourceJ5 C40;>AL A>548=8BLAO A FTP-A5@25@><Failed to connect to FTP server FileSourceH5 C40;>AL A>740BL ;>:0;L=K9 D09; %1Failed to create local file %1 FileSource0$09; =5 A>45@68B 40==KE!File contains no data! FileSource25 C40;>AL 02B>@87>20BLAO Login failed FileSource45?>445@68205<0O AE5<0 URLUnsupported scheme in URL FileSource7<5=8BL 40==K5 Edit DataI@>A<>B@... Browse... ImageDialog>5 C40;>AL A:0G0BL URL "%1": %2Failed to download URL "%1": %2 ImageDialog.5 C40;>AL A:0G0BL D09;File download failed ImageDialog$09; 8;8 URL: File or URL: ImageDialog7>1@065=85Image ImageDialog 5B:0:Label: ImageDialogBB:@K205BAO 87>1@065=85 ?> URL...Opening image URL... ImageDialog@54?@>A<>B@Preview ImageDialog@!E5<0 URL "%1" =5 ?>445@68205BAO$The URL scheme "%1" is not supported ImageDialog45?>445@68205<0O AE5<0 URLUnsupported scheme in URL ImageDialog"#40;8B5 2K45;5=85Delete Selection ImageLayer(5@5B0I8BL 2K45;5=85Drag Selection ImageLayer ?@>F5AA5 In progress ImageLayer.5@5<5AB8BL 87>1@065=85 Move Image ImageLayer>20O B>G:0 New Point ImageLayerBB:@K205BAO 87>1@065=85 ?> URL...Opening image URL... ImageLayerAB028BLPaste ImageLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items? ImageLayer27<5=8BL @07<5@ 2K45;5=8OResize Selection ImageLayer&K1@0BL 87>1@065=85 Select image ImageLayer7<5=8BL 40==K5 Edit Data ImageModel(7<5=8BL 87>1@065=85 Edit Image ImageModelK1>@:0Frame ImageModel7>1@065=85Image ImageModel 5B:0Label ImageModel @5<OTime ImageModel58725AB=>Unknown ImageModelh<b>K1@0= :0B0;>3</b><p>$09; "%1" O2;O5BAO :0B0;>3><4Directory selected

File "%1" is a directoryInteractiveFileFinder<b>5 C40;>AL >B:@KBL <5AB>?>;>65=85</b><p>5 C40;>AL >B:@KBL URL "%1".=Failed to open location

URL "%1" could not be openedInteractiveFileFinder<b>$09; ACI5AB2C5B</b>$09; "%1" C65 ACI5AB2C5B. K E>B8B5 ?5@570?8A0BL 53>?OFile exists

The file "%1" already exists. Do you want to overwrite it?InteractiveFileFinderF<b>CAB>9 D09;</b><p>$09; "%1" ?CAB)File is empty

File "%1" is emptyInteractiveFileFindern<b>$09; =5G8B05<</b><p>$09; "%1" =5 <>65B 1KBL ?@>G8B0=7File is not readable

File "%1" can not be readInteractiveFileFinder<b>$09; =5 =0945=</b><p>5 C40;>AL >B:@KBL 72C:>2>9 D09; "%1". K E>B8B5 C:070BL 53> ?@>3@0<<5?VFile not found

Audio file "%1" could not be opened. Do you want to locate it?InteractiveFileFinder<b>$09; =5 =0945=</b><p>5 C40;>AL >B:@KBL D09; "%1". K E>B8B5 C:070BL 53> ?@>3@0<<5?PFile not found

File "%1" could not be opened. Do you want to locate it?InteractiveFileFinder^<b>$09; =5 =0945=</b><p>$09; "%1" =5 ACI5AB2C5B0File not found

File "%1" does not existInteractiveFileFinderb<b>-B> =5 D09;</b><p>CBL "%1" =5 O2;O5BAO D09;><+Not a file

Path "%1" is not a fileInteractiveFileFinderA5 D09;K (*.*)All files (*.*)InteractiveFileFinderA5 ?>445@68205<K5 B8?K D09;>2 (%1 %2) XML-D09;K A;>Q2 Sonic Visualiser (*.svl)  0745;Q==K5 70?OB>9 D09;K 40==KE (*.csv)  0745;Q==K5 ?@>15;>< D09;K .lab (*.lab) $09;K RDF (%2) $09;K MIDI (*.mid) "5:AB>2K5 D09;K (*.txt) A5 D09;K (*.*)All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinderA5 ?>445@68205<K5 B8?K D09;>2 (%1 %2) XML-D09;K A;>Q2 Sonic Visualiser (*.svl)  0745;Q==K5 70?OB>9 D09;K 40==KE (*.csv)  0745;Q==K5 ?@>15;>< D09;K .lab (*.lab) $09;K RDF (%2) "5:AB>2K5 D09;K (*.txt) A5 D09;K (*.*)All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*)InteractiveFileFinder0A5 ?>445@68205<K5 B8?K D09;>2 (*.sv %1 %2 %3) $09;K A50=A>2 Sonic Visualiser (*.sv) 2C:>2K5 D09;K (%1) $09;K A;>52 (%2) $09;K RDF (%3) A5 D09;K (*.*)All supported files (*.sv %1 %2 %3) Sonic Visualiser session files (*.sv) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*)InteractiveFileFinderA5 ?>445@68205<K5 B8?K D09;>2 (*.sv %1 %2) $09;K A50=A>2 Sonic Visualiser (*.sv) 2C:>2K5 D09;K (%2) $09;K RDF (%1) A5 D09;K (*.*)vAll supported files (*.sv %1 %2) Sonic Visualiser session files (*.sv) Audio files (%2) RDF files (%1) All files (*.*)InteractiveFileFinderF2C:>2K5 D09;K (%1) A5 D09;K (*.*) Audio files (%1) All files (*.*)InteractiveFileFinderB<5=8BLCancelInteractiveFileFinderK1@0= :0B0;>3Directory selectedInteractiveFileFinder.5 C40;>AL >B:@KBL D09;Failed to open fileInteractiveFileFinderB5 C40;>AL >B:@KBL <5AB>?>;>65=85Failed to open locationInteractiveFileFinder$$09; =5 ACI5AB2C5BFile does not existInteractiveFileFinder2"0:>9 D09; C65 ACI5AB2C5B File existsInteractiveFileFinder$09; ?CAB File is emptyInteractiveFileFinder$09; =5G8B05<File is not readableInteractiveFileFinderL$09;K 87>1@065=89 (%1) A5 D09;K (*.*) Image files (%1) All files (*.*)InteractiveFileFinder#:070BL D09;...Locate file...InteractiveFileFinderK1@0= =5 D09;Non-file selectedInteractiveFileFindert#:068B5 URL, :>B>@K9 1C45B 8A?>;L7>20BLAO 4;O MB>3> D09;0:*Please enter the URL to use for this file:InteractiveFileFindern$09;K Portable Network Graphics (*.png) A5 D09;K (*.*)7Portable Network Graphics files (*.png) All files (*.*)InteractiveFileFinderNK15@8B5 D09;, 2 :>B>@K9 M:A?>@B8@>20BLSelect a file to export toInteractiveFileFinder(K15@8B5 D09; A50=A0Select a session fileInteractiveFileFinderK15@8B5 D09; Select fileInteractiveFileFinder<XML-D09;K A;>Q2 Sonic Visualiser (*.svl)  0745;Q==K5 70?OB>9 40==K5 (*.csv) $09;K RDF/Turtle (%1) $09;K MIDI (*.mid) "5:AB>2K5 D09;K (*.txt) A5 D09;K (*.*)Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinderXML-D09;K A;>Q2 Sonic Visualiser (*.svl)  0745;Q==K5 70?OB>9 40==K5 (*.csv) $09;K RDF/Turtle (%1) "5:AB>2K5 D09;K (*.txt) A5 D09;K (*.*)Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*)InteractiveFileFinderj$09;K A50=A>2 Sonic Visualiser (*.sv) A5 D09;K (*.*)5Sonic Visualiser session files (*.sv) All files (*.*)InteractiveFileFinder$09;K A50=A>2 Sonic Visualiser (*.sv) $09;K RDF (%1) A5 D09;K (*.*)DSonic Visualiser session files (*.sv) RDF files (%1) All files (*.*)InteractiveFileFinder A?>;L7>20BL URLUse URLInteractiveFileFinder&A?>;L7>20BL URL... Use URL...InteractiveFileFinderT2C:>2K5 D09;K WAV (*.wav) A5 D09;K (*.*)'WAV audio files (*.wav) All files (*.*)InteractiveFileFinder 2K1>@>: framesItemEditDialogA secItemEditDialog <A usecItemEditDialogB<5=8BLCancelItemEditDialog;8B5;L=>ABL: Duration:ItemEditDialogOKItemEditDialog!2>9AB20 PropertiesItemEditDialog!1@>A8BLResetItemEditDialog "5:AB:Text:ItemEditDialog @5<O:Time:ItemEditDialog"09<8=3TimingItemEditDialog=0G5=85:Value:ItemEditDialog&& KeyReference"</b>&nbsp;(%1)<b> (%1) KeyReference2<i>8;8</i>&nbsp;<b>%1</b>or %1 KeyReferenceT!?@02:0 ?> 8A?>;L7>20=8N :;0280BC@K 8 <KH8)Sonic Visualiser: Key and Mouse Reference KeyReference.@C1K9 AGQBG8: (B0:BK):Coarse counter (bars):LabelCounterInputDialog,">G=K9 AGQBG8: (4>;8):Fine counter (beats):LabelCounterInputDialog&#AB0=>2:0 AGQBG8:>2 Set CountersLabelCounterInputDialog%1%1Labeller %1.%2%1.%2Labeller<><5@ 2K1>@:8 72C:>2>3> AM<?;0Audio sample frame numberLabeller&&8:;8G5A:89 AG5BG8:Cyclical counterLabellerZ&8:;8G5A:89 42CEC@>2=52K9 AG5BG8: (B0:B/4>;O)%Cyclical two-level counter (bar/beat)LabellerJ;8B5;L=>ABL ?>A;5 ?@54K4CI59 >B<5B:8 Duration since the previous itemLabellerB;8B5;L=>ABL 4> A;54CNI59 >B<5B:8Duration to the following itemLabeller57 =C<5@0F88 No numberingLabellerB0: 8 1;8609H89 ?@54K4CI89 >1J5:B!Same as the nearest previous itemLabeller@>AB>9 AG5BG8:Simple counterLabellert"5<? (bpm) =0 >A=>25 4;8B5;L=>AB8 ?>A;5 ?@54K4CI59 >B<5B:81Tempo (bpm) based on duration since previous itemLabellerl"5<? (bpm) =0 >A=>25 4;8B5;L=>AB8 4> A;54CNI59 >B<5B:8/Tempo (bpm) based on duration to following itemLabeller @5<O 2 A5:C=40ETime in secondsLabellerl=0G5=85, 872;5GQ==>5 87 <5B:8 >1J5:B0 (5A;8 2>7<>6=>)6Value extracted from the item's label (where possible)Labeller"&25B=>9 3D-3@0D8:Colour 3D PlotLayer#40;8BL 70<5@Delete MeasurementLayer7>1@065=8OImagesLayer!;>9LayerLayer!>740BL 70<5@Make MeasurementLayer>BKNotesLayer1;0AB8RegionsLayer8=59:0RulerLayer!?5:B@>3@0<<0 SpectrogramLayer !?5:B@SpectrumLayer "5:ABTextLayerB<5B:8 2@5<5=8 Time InstantsLayer =0G5=8O 2@5<5=8 Time ValuesLayer>;=>20O D>@<0WaveformLayer2AB>G=8:8 72C:>2KE 40==KEAudio Data SourcesLayerTreeDialog!2>4:0 ?> A;>N Layer SummaryLayerTreeDialog:=0 8 A;>8Panes and LayersLayerTreeDialog!;>9LayerLayerTreeModel >45;LModelLayerTreeModel>A?@872545=85PlayedLayerTreeModelB>1@065=85ShownLayerTreeModel<b>K15@8B5 8<?>@B8@C5<CN 4>@>6:C</b><p>K <>65B5 8<?>@B8@>20BL MB>B D09; ;8HL :0: >48=>G=K9 A;>9 0==>B0F88, => 2 D09;5 ;81> 1>;LH5 >4=>9 4>@>6:8, ;81> =>BK 2 1>;55 G5< >4=>< :0=0;5.<p>K15@8B5 >4=C 4>@>6:C 8;8 =5A:>;L:> >1J548=O5<KE 4>@>65: 4;O 8<?>@B0:Select track to import

You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.

Please select the track or merged tracks you wish to import:MIDIFileImportDialog:H81:0 ?@8 8<?>@B5 D09;0 MIDIError in MIDI file importMIDIFileImportDialogL1J548=8BL 2A5 =5?5@:CAA8>==K5 4>@>6:8Merge all non-percussion tracksMIDIFileImportDialog,1J548=8BL 2A5 4>@>6:8Merge all tracksMIDIFileImportDialog^K15@8B5 >4=C 8;8 =5A:>;L:> 4>@>65: 4;O 8<?>@B0 Select track or tracks to importMIDIFileImportDialog@  8A?>;L7C5B :0=0; ?5@:CAA88 GM - uses GM percussion channelMIDIFileReader%1 - vel %2 %1 - vel %2MIDIFileReader>?KB:0 ?>;CG8BL 87 4>@>6:8 1>;LH5 109B>2, G5< >6840;>AL (%1, 0 5ABL ;8HL %2)DAttempt to get more bytes than available on Track (%1, only have %2)MIDIFileReaderp>?KB:0 ?>;CG8BL 87 4>@>6:8 1>;LH5 109B>2, G5< >6840;>AL0Attempt to get more bytes than expected on TrackMIDIFileReader^>?KB:0 ?@>G8B0BL D09; MIDI ?>A;5 53> >:>=G0=8O"Attempt to read past MIDI file endMIDIFileReaderJ@8 GB5=88 >1=0@C65= :>=5F D09;0 MIDI*End of MIDI file encountered while readingMIDIFileReaderJ1=0@C65= =5:>@@5:B=K9 :>4 A>1KB8O %1Invalid event code %1 foundMIDIFileReaderT8 2 >4=>9 4>@>6:5 D09;0 MIDI "%1" =5B =>B(MIDI file "%1" has no notes in any trackMIDIFileReader">@>6:0 %1 (%2)%3Track %1 (%2)%3MIDIFileReader0>@>6:0 %1 (157 8<5=8)%3Track %1 (untitled)%3MIDIFileReader5?@028;L=0O 4;8B5;L=>ABL int-40==KE 2 ?>B>:5 MIDI (%1, 4>;6=> 1KBL %2);Wrong length for int data in MIDI stream (%1, should be %2)MIDIFileReader5?@028;L=0O 4;8B5;L=>ABL 1>;LH8E 40==KE 2 ?>B>:5 MIDI (%1, 4>;6=> 1KBL %2) =8 >48= D09; MIDI =5 >B:@KB(getMIDIByte called but no MIDI file openMIDIFileReaderx$C=:F8O getMIDIBytes 2K720=0, => =8 >48= D09; MIDI =5 >B:@KB)getMIDIBytes called but no MIDI file openMIDIFileReader$C=:F8O getNumberFromMIDIBytes 2K720=0, => =8 >48= D09; MIDI =5 >B:@KB3getNumberFromMIDIBytes called but no MIDI file openMIDIFileReader~$C=:F8O skipToNextTrack 2K720=0, => =8 >48= D09; MIDI =5 >B:@KB,skipToNextTrack called but no MIDI file openMIDIFileReaderE>4Input MIDIInput$5:>48@C5BAO %1...Decoding %1... MP3FileReader [\(<].*$ [\(<].*$ MainWindow%1 ?> :0B53>@88%1 by Category MainWindow*%1 ?> 8<5=8 A>740B5;O %1 by Maker MainWindow2%1 ?> =0720=8N @0AH8@5=8O%1 by Plugin Name MainWindow %1...%1... MainWindow%1: %1 {1:?}%1: %1 MainWindow %1: %2%1: %2 MainWindow@%1 F (@5AM<?;8@>20=85 4> %2 F)%1Hz (resampling to %2Hz) MainWindow&A5 :0=0;K &All Channels MainWindow&A5 &:0=0;K A2545=K&All Channels Mixed MainWindow!&:>?8@>20BL&Copy MainWindow.&#40;8BL 0:B82=K9 70<5@&Delete Current Measurement MainWindow&#40;8BL A;>9 &Delete Layer MainWindow#&40;8BL >:=> &Delete Pane MainWindow$&#40;8BL 2K1@0==>5&Delete Selected Items MainWindow&@02:0&Edit MainWindow@-&:A?>@B8@>20BL 72C:>2>9 D09;...&Export Audio File... MainWindow &$09;&File MainWindow&!?@02:0&Help MainWindow2& C:>2>4AB2> ?>;L7>20B5;O&Help Reference MainWindowRAB028BL &>B<5B:C 2 B>G:C 2>A?@>872545=8O$&Insert Instant at Playback Position MainWindow$5@5A:>G8BL 2&;52> &Jump Left MainWindow@&A?>;L7>20=85 :;0280BC@K 8 <KH8&Key and Mouse Reference MainWindow !&;>9&Layer MainWindow&!>740BL A50=A &New Session MainWindow&B:@KBL...&Open... MainWindow &:=>&Pane MainWindowAB&028BL&Paste MainWindow&0@0<5B@K...&Preferences... MainWindow &KE>4&Quit MainWindow0&5402=85 ?@5>1@07>20=8O&Recent Transforms MainWindow,&5@58<5=>20BL A;>9...&Rename Layer... MainWindow !>E@&0=8BL A50=A &Save Session MainWindow@&5>1@07>20=8O &Transform MainWindow&84&View MainWindow00 MainWindow11 MainWindow22 MainWindow33 MainWindow44 MainWindow55 MainWindow66 MainWindow88 MainWindow99 MainWindow;; MainWindowd</small><p><small>4@5A OSC 4;O MB>3> A50=A0: "%1"8

The OSC URL for this instance is: "%1" MainWindow<b>5 C40;>AL >B:@KBL D09;</b><p>5 C40;>AL >B:@KBL 72C:>2>9 D09; "%1"=File open failed

Audio file "%1" could not be opened MainWindowz<b>5 C40;>AL >B:@KBL D09;</b><p>5 C40;>AL >B:@KBL D09; "%1"7File open failed

File "%1" could not be opened MainWindow<b>5 C40;>AL >B:@KBL D09;</b><p>5 C40;>AL >B:@KBL D09; A;>O "%1"<File open failed

Layer file %1 could not be opened. MainWindow<b>5 C40;>AL >B:@KBL D09;</b><p>5 C40;>AL >B:@KBL D09; A50=A0 "%1"?File open failed

Session file "%1" could not be opened MainWindow<b>5 C40;>AL >B:@KBL AAK;:C</b><p>5 C40;>AL >B:@KBL D09; URL "%1", ?5@5B0I5==K9 2 >:=> ?@>3@0<<K <KHLN9Open failed

Dropped URL "%1" could not be opened MainWindow<b>5 C40;>AL >B:@KBL AAK;:C</b><p>5 C40;>AL >B:@KBL D09; 8;8 URL "%1"9Open failed

File or URL "%1" could not be opened MainWindow|<b>5 C40;>AL >B:@KBL AAK;:C</b><p>5 C40;>AL >B:@KBL URL "%1"1Open failed

URL "%1" could not be opened MainWindow<b>5 C40;>AL A>E@0=8BL D09;</b><p>5 C40;>AL A>E@0=8BL D09; A50=A0 "%1":Save failed

Session file "%1" could not be saved. MainWindowt<b>K15@8B5 F5;L 8<?>@B0</b><p>-B>B 4>:C<5=B RDF AAK;05BAO =0 >48= 8;8 1>;55 72C:>2KE D09;>2.<br># 20A C65 5ABL >48= 703@C65==K9 72C:>2>9 D09;.<br>'B> 2K E>B8B5 A45;0BL A =>2K<8 40==K<8?Select a target for import

This RDF document refers to one or more audio files.
You already have an audio waveform loaded.
What would you like to do with the new data? MainWindow<b>!50=A 87<5=8;AO</b><p>:B82=K9 A50=A 87<5=8;AO<br>K E>B8B5 A>E@0=8BL 53>?[Session modified

The current session has been modified.
Do you want to save it? MainWindow<br>! ?>445@6:>9 @0AH8@5=89 DSSI (API v%1) &copy; Chris Cannam, Steve Harris, Sean BoltonU
With DSSI plugin support (API v%1) © Chris Cannam, Steve Harris, Sean Bolton MainWindowJ<br>! FFTW3 &copy; Matteo Frigo 8 MIT*
With FFTW3 © Matteo Frigo and MIT MainWindowR<br>! FFTW3 v%1 &copy; Matteo Frigo 8 MIT.
With FFTW3 v%1 © Matteo Frigo and MIT MainWindowl<br>! 181;8>B5:>9 JACK &copy; Paul Davis 8 Jack O'QuinD
With JACK audio output library © Paul Davis and Jack O'Quin MainWindowt<br>! 181;8>B5:>9 JACK v%1 &copy; Paul Davis 8 Jack O'QuinH
With JACK audio output library v%1 © Paul Davis and Jack O'Quin MainWindow<br>! ?>445@6:>9 @0AH8@5=89 LADSPA (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld\
With LADSPA plugin support (API v%1) © Richard Furse, Paul Davis, Stefan Westerfeld MainWindowp<br>! 45:>45@>< MAD mp3 &copy; Underbit Technologies Inc9
With MAD mp3 decoder © Underbit Technologies Inc MainWindowx<br>! 45:>45@>< mp3 MAD v%1 &copy; Underbit Technologies Inc=
With MAD mp3 decoder v%1 © Underbit Technologies Inc MainWindowT<br>! 45:>45@>< Ogg &copy; CSIRO Australia0
With Ogg file decoder © CSIRO Australia MainWindow<br>! 45:>45@>< Ogg (oggz v%1, fishsound v%2) &copy; CSIRO AustraliaJ
With Ogg file decoder (oggz v%1, fishsound v%2) © CSIRO Australia MainWindowv<br>! 181;8>B5:>9 PortAudio &copy; Ross Bencina 8 Phil BurkI
With PortAudio audio output library © Ross Bencina and Phil Burk MainWindow<br>! 181;8>B5:>9 PulseAudio &copy; Lennart Poettering 8 Pierre OssmanT
With PulseAudio audio output library © Lennart Poettering and Pierre Ossman MainWindow<br>! 181;8>B5:>9 PulseAudio v%1 &copy; Lennart Poettering 8 Pierre OssmanX
With PulseAudio audio output library v%1 © Lennart Poettering and Pierre Ossman MainWindow<br>C E@0=8;8I5< 40==KE RDF Redland &copy; Dave Beckett 8 @8AB>;LA:89 C=825@A8B5BP
With Redland RDF datastore © Dave Beckett and the University of Bristol MainWindow<br>C E@0=8;8I5< 40==KE RDF Redland v%1 &copy; Dave Beckett 8 @8AB>;LA:89 C=825@A8B5BT
With Redland RDF datastore v%1 © Dave Beckett and the University of Bristol MainWindowF<br>! RtMidi &copy; Gary P. Scavone&
With RtMidi © Gary P. Scavone MainWindowJ<br>! Rubber Band &copy; Chris Cannam(
With Rubber Band © Chris Cannam MainWindowR<br>! Rubber Band v%1 &copy; Chris Cannam,
With Rubber Band v%1 © Chris Cannam MainWindow<br>! ?>445@6:>9 @0AH8@5=89 Vamp (API v%1, host SDK v%2) &copy; Chris CannamH
With Vamp plugin support (API v%1, host SDK v%2) © Chris Cannam MainWindow`<br>! liblo Lite OSC library &copy; Steve Harris3
With liblo Lite OSC library © Steve Harris MainWindowf<br>! 181;8>B5:>9 OSC liblo v%1 &copy; Steve Harris7
With liblo Lite OSC library v%1 © Steve Harris MainWindow\<br>! libsamplerate &copy; Erik de Castro Lopo1
With libsamplerate © Erik de Castro Lopo MainWindowd<br>! libsamplerate v%1 &copy; Erik de Castro Lopo5
With libsamplerate v%1 © Erik de Castro Lopo MainWindowV<br>! libsndfile &copy; Erik de Castro Lopo.
With libsndfile © Erik de Castro Lopo MainWindow^<br>! libsndfile v%1 &copy; Erik de Castro Lopo2
With libsndfile v%1 © Erik de Castro Lopo MainWindowJ<h3> ?@>3@0<<5 Sonic Visualiser</h3>

About Sonic Visualiser

 MainWindow<h3>>ABC?=0 1>;55 =>20O 25@A8O</h3><p>K 8A?>;L7C5B55 Sonic Visualiser 25@A88 %1, => C65 4>ABC?=0 25@A8O %3.</p><p>03;O=8B5 =0 <a href="http://sonicvisualiser.org/">A09B Sonic Visualiser</a> 70 ?>4@>1=>ABO<8.</p>

Newer version available

You are using version %1 of Sonic Visualiser, but version %3 is now available.

Please see the Sonic Visualiser website for more information.

 MainWindowT<p><small>%1 : :>=D83C@0F8O %2</small></p>+

%1 : %2 configuration

 MainWindow<p>Sonic Visualiser  ?@>3@0<<0 4;O ?@>A<>B@0 8 8AA;54>20=8O 72C:>70?8A59 A F5;LN A5<0=B8G5A:>3> 0=0;870 8 0==>B0F88 <C7K:8.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p>

Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.
http://www.sonicvisualiser.org/

 MainWindow8 ?@>3@0<<5 Sonic VisualiserAbout Sonic Visualiser MainWindow >1028BL >:=> %1 Add %1 Pane MainWindow6>1028BL &ACI5AB2CNI89 A;>9Add &Existing Layer MainWindow\>1028BL A?5:B>3@0<<C &<5;>48G5A:>3> 480?07>=0Add &Melodic Range Spectrogram MainWindow(>1028BL &=>2>5 >:=> Add &New Pane MainWindow2>1028BL ;8=59:C &2@5<5=8Add &Time Ruler MainWindow0>1028BL &2>;=>2CN D>@<C Add &Waveform MainWindow0>1028BL =>2K9 A;>9 %1Add New %1 Layer MainWindowL>1028BL A?5:B>3@0<<C &?8:>2>9 G0AB>BKAdd Pea&k Frequency Spectrogram MainWindow>1028BL B>G:C Add Point MainWindow.>1028BL &D@03<5=B A;>OAdd S&lice of Layer MainWindowJ>1028BL &3@0D8: A?5:B@0;L=>9 DC=:F88 Add Spectr&um MainWindow,>1028BL &A?5:B>3@0<<CAdd Spectro&gram MainWindowH>1028BL =>2K9 ?CAB>9 A;>9 B8?0 %1 Add a new empty layer of type %1 MainWindowL>1028BL =>2K9 A;>9 A G0AB>B>9 A?5:B@0,Add a new layer showing a frequency spectrum MainWindow`>1028BL =>2K9 A;>9 A >B>1@065=85< A?5:B@>3@0<<K%Add a new layer showing a spectrogram MainWindow>1028BL =>2K9 A;>9, >B>1@060NI89 A?5:B@>3@0<<C 4;O >17>@0 2KA>BK B>=0 =>BLAdd a new layer showing a spectrogram set up for an overview of note pitches MainWindow>1028BL =>2K9 A;>9, >B>1@060NI89 A?5:B@>3@0<<C 4;O >BA;56820=8O G0AB>BEAdd a new layer showing a spectrogram set up for tracking frequencies MainWindow<>1028BL =>2K9 A;>9 A ;8=59:>9$Add a new layer showing a time ruler MainWindowT>1028BL =>2K9 A;>9 A 284>< 2>;=>2>9 D>@<K'Add a new layer showing a waveform view MainWindowl>1028BL =>2>5 >:=>, A>45@60I55 B>;L:> ;8=59:C 2@5<5=8+Add a new pane containing only a time ruler MainWindowL>1028BL =>2>5 >:=> A G0AB>B>9 A?5:B@0+Add a new pane showing a frequency spectrum MainWindow`>1028BL =>2>5 >:=> A >B>1@065=85< A?5:B@>3@0<<K$Add a new pane showing a spectrogram MainWindow>1028BL =>2>5 >:=>, >B>1@060NI55 A?5:B@>3@0<<C 4;O >17>@0 2KA>BK B>=0 =>BKAdd a new pane showing a spectrogram set up for an overview of note pitches MainWindow>1028BL =>2>5 >:=>, >B>1@060NI55 A?5:B@>3@0<<C 4;O >BA;56820=8O G0AB>BDAdd a new pane showing a spectrogram set up for tracking frequencies MainWindowT>1028BL =>2>5 >:=> A 284>< 2>;=>2>9 D>@<K&Add a new pane showing a waveform view MainWindowH>1028BL MB8 40==K5 2 0:B82=K9 A50=A$Add this data to the current session MainWindowH7<5=8BL ?0@0<5B@K @01>BK ?@8;>65=8O"Adjust the application preferences MainWindowP7<5=8BL >1ICN 3@><:>ABL 2>A?@>872545=8O Adjust the master playback level MainWindowN7<5=8BL >1ICN A:>@>ABL 2>A?@>872545=8O Adjust the master playback speed MainWindow2K@>2=OBL ;8=59:8 2@5<5=8Align File Timelines MainWindowAlt+2;52>Alt+Left MainWindowAlt+2?@02> Alt+Right MainWindow85@53@C7:0 2 >1@01>B:5 72C:0Audio processing overload MainWindow 'Q@=K9Black MainWindow !8=89Blue MainWindow/@:>-A8=89 Bright Blue MainWindow/@:>-75;Q=K9 Bright Green MainWindow/@:>->@0=652K9 Bright Orange MainWindow/@:>-?C@?C@=K9 Bright Purple MainWindow/@:>-:@0A=K9 Bright Red MainWindow !=&OBL 2K45;5=85C&lear Selection MainWindow\52>7<>6=> M:A?>@B8@>20BL =5=>B=K5 A;>8 2 MIDI$Can't export non-note layers to MIDI MainWindow0=0; &%1 Channel &%1 MainWindow$G8AB8BL 2K45;5=85Clear the selection MainWindowJ3@0=8G8BL 2>A?@>872545=85 2K45;5=85<Constrain Playback to Selection MainWindowl!:>?8@>20BL 2K45;5=85 87 0:B82=>3> A;>O 2 1CD5@ >1<5=0:Copy the selection from the current layer to the clipboard MainWindow Ctrl+ACtrl+A MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindowCtrl+Home Ctrl+Home MainWindow Ctrl+ICtrl+I MainWindow Ctrl+LCtrl+L MainWindowCtrl+;52> Ctrl+Left MainWindow Ctrl+MCtrl+M MainWindow Ctrl+NCtrl+N MainWindow Ctrl+OCtrl+O MainWindowCtrl+PgDown Ctrl+PgDown MainWindowCtrl+PgUp Ctrl+PgUp MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+RCtrl+R MainWindowCtrl+?@02> Ctrl+Right MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+A Ctrl+Shift+A MainWindowCtrl+Shift+D Ctrl+Shift+D MainWindow Ctrl+Shift+EnterCtrl+Shift+Enter MainWindowCtrl+Shift+O Ctrl+Shift+O MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindow Ctrl+TCtrl+T MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindow&K@570BLCu&t MainWindowfK@570BL 2K45;5=85 87 0:B82=>3> A;>O 2 1CD5@ >1<5=09Cut the selection from the current layer to the clipboard MainWindow 07<5@ F8:;0 Cycle size MainWindowB;04:0Debug MainWindow:#<5=LH8BL <0AHB01 >B>1@065=8ODecrease the zoom level MainWindowDelDel MainWindowd#40;8BL >1J5:BK 2 0:B82=>< 2K45;5=88 B5:CI53> A;>O8Delete items in current selection from the current layer MainWindow*#40;8BL 0:B82=K9 A;>9!Delete the currently active layer MainWindow*#40;8BL 0:B82=>5 >:=> Delete the currently active pane MainWindowX#40;8BL 70<5@, =0E>4OI89AO ?>4 :C@A>@>< <KH88Delete the measurement currently under the mouse pointer MainWindow*B>1@065=85 M;5<5=B>2Display Features MainWindow=87Down MainWindow 8A>20=85Draw MainWindow>0@8A>20BL =>2K5 >1J5:BK 2 A;>5Draw new items in layer MainWindowEE MainWindow @02:0Edit MainWindow(7<5=8BL 40==K5 A;>OEdit Layer Data MainWindow0=5;L ?@02:8 Edit Toolbar MainWindow*7<5=8BL >1J5:BK A;>OEdit items in layer MainWindowN7<5=8BL 0:B82=K9 A;>9 :0: A5B:C 40==KE.Edit the currently active layer as a data grid MainWindow 540:B8@>20=85Editing MainWindow >=5FEnd MainWindow EnterEnter MainWindow !B5@:0Erase MainWindow(!B8@0BL >1J5:BK A;>OErase items from layer MainWindowEscEsc MainWindow@-:A?>@B8@>20BL A;>9 0==>B0F89...Export Annotation Layer... MainWindowH-:A?>@B8@>20BL 2 D09; 87>1@065=8O...Export Image File... MainWindowT-:A?>@B8@>20BL 2AQ >:=> 2 D09; 87>1@065=8O%Export a single pane to an image file MainWindow(-:A?>@B 72C:0 2 "%1"Export audio to "%1" MainWindow4-:A?>@B 87>1@065=8O 2 "%1"Export image to "%1" MainWindowB-:A?>@B8@>20BL 40==K5 A;>O 2 D09;Export layer data to a file MainWindow&-:A?>@B A;>O 2 "%1"Export layer to "%1" MainWindowR-:A?>@B8@>20BL =5A:>;L:> 72C:>2KE D09;>2 Export multiple audio files MainWindowR-:A?>@B8@>20BL 2K45;5==>5 2 72C:>2>9 D09;!Export selection as an audio file MainWindowP-:A?>@B8@>20BL B>;L:> 2K45;5==CN >1;0ABLExport the selected region only MainWindowr-:A?>@B8@>20BL 2K45;5==K5 >1;0AB8 2 @07=K5 72C:>2K5 D09;K/Export the selected regions into separate files MainWindow0-:A?>@B8@>20BL 2K45;5=85Export the selection extent MainWindowR-:A?>@B8@>20BL 2K45;5=85 (%1x%2 ?8:A5;>2)*Export the selection extent (%1x%2 pixels) MainWindowh-:A?>@B8@>20BL B>;L:> 2848<CN G0ABL (%1x%2 ?8:A5;>2)+Export the visible area only (%1x%2 pixels) MainWindowB-:A?>@B8@>20BL 25AL 72C:>2>9 D09;Export the whole audio file MainWindowP-:A?>@B8@>20BL 2AQ >:=> (%1x%2 ?8:A5;>2)$Export the whole pane (%1x%2 pixels) MainWindowFF MainWindowF1F1 MainWindowF11F11 MainWindowF2F2 MainWindowD5 C40;>AL @0AAG8B0BL 2K@02=820=85Failed to calculate alignment MainWindow.5 C40;>AL A>740BL A;>9Failed to generate layer MainWindowv5 C40;>AL >B:@KBL URL, ?5@5<5I5==K9 <KHLN 2 >:=> ?@>3@0<<KFailed to open dropped URL MainWindow.5 C40;>AL >B:@KBL D09;Failed to open file MainWindowJ5 C40;>AL >B:@KBL D09; %1 4;O 70?8A8"Failed to open file %1 for writing MainWindowB5 C40;>AL >B:@KBL <5AB>?>;>65=85Failed to open location MainWindow@5 C40;>AL ?>2B>@=> A>740BL A;>9Failed to regenerate layer MainWindow25 C40;>AL A>E@0=8BL D09;Failed to save file MainWindowJ5 C40;>AL A>E@0=8BL D09; 87>1@065=8OFailed to save image file MainWindowP5 C40;>AL A>E@0=8BL D09; 87>1@065=8O %1Failed to save image file %1 MainWindow05 C40;>AL 70?8A0BL D09;Failed to write file MainWindow"5@5<>B0BL 2?5@Q4 Fast Forward MainWindow&5@5<>B0BL 4> :>=F0Fast Forward to End MainWindow8?5@54 : ?5@2>9 AE>659 B>G:5Fast Forward to Similar Point MainWindowKAB@K9 2?5@54 Fast forward MainWindowl5@5<>B0BL 4> A;54CNI59 >B<5B:8 2@5<5=8 2 B5:CI5< A;>5:Fast forward to the next time instant in the current layer MainWindow&5@5<>B0BL 4> :>=F0Fast-forward to the end MainWindow0=5;L D09;>2 File Toolbar MainWindow6$09;K 8 C?@02;5=85 A50=A0<8File and Session Management MainWindow:09B8 MDD5:B B@0=AD>@<0F88...Find a Transform... MainWindowX$09; D@03<5=B0 %1 C65 ACI5AB2C5B, ?@5@K20=85)Fragment file %1 already exists, aborting MainWindowGG MainWindow5;Q=K9Green MainWindow!?@02:0Help MainWindow ><>9Home MainWindow@&<?>@B8@>20BL A;>9 0==>B0F89...Import Annotation &Layer... MainWindow`<?>@B8@>20BL 40==K5 A;>O 87 ACI5AB2CNI53> D09;0'Import layer data from an existing file MainWindow:#25;8G8BL <0AHB01 >B>1@065=8OIncrease the zoom level MainWindowXAB028BL >B<5B:8 2@5<5=8 ?> &:@0O< 2K45;5=8O(Insert Instants at Selection &Boundaries MainWindow6AB028BL >1J5:B 2 2K45;5=85Insert Item at Selection MainWindowAB028BL =>2CN >B<5B:C 2@5<5=8 2 B>G:C 2>A?@>872545=8O, ?@8 =5>1E>48<>AB8  2 =>2K9 A;>9WInsert a new time instant at the current playback position, in a new layer if necessary MainWindow&&5@5A:>G8BL 2?@02> J&ump Right MainWindowKK MainWindow ;52>Left MainWindow.>A?@>872545=85 2 F8:;5 Loop Playback MainWindow.>A?@>872545=85 2 F8:;5 Loop playback MainWindowMM MainWindow4K?>;=OBL 87<5@5=8O 2 A;>5Make measurements in layer MainWindow4#?@02;5=85 >:=0<8 8 A;>O<8Managing Panes and Layers MainWindow7<5@8B5;LMeasure MainWindowK1@0=> =5A:>;L:> >1;0AB59 8AE>4=>3> 72C:>2>3> D09;0. 0:CN 87 =8E 2K E>B8B5 M:A?>@B8@>20BL?UMultiple regions of the original audio file are selected. What do you want to export? MainWindowNN MainWindow5@5<5I5=85Navigate MainWindow*>2>5 8<O MB>3> A;>O:New name for this layer: MainWindow6>ABC?=0 1>;55 =>20O 25@A8ONewer version available MainWindowD8 >48= 72C:>2>9 D09; =5 703@C65=.No audio file loaded. MainWindow@8<5G0=85: 2AQ >:=> A;8H:>< H8@>:>, GB>1K A>E@0=8BL 53> :0: 87>1@065=85.BNote: the whole pane is too wide to be exported as a single image. MainWindow<!?>A>1 =C<5@0F88 =>2KE >B<5B>:Number New Instants with MainWindow4B:@KBL &<5AB>?>;>65=85...Open Lo&cation... MainWindow,B:@KBL <5AB>?>;>65=85 Open Location MainWindowVB:@KBL D09; A50=A0, 72C:>2>9 D09; 8;8 A;>9)Open a session file, audio file, or layer MainWindowB:@KBL >:=>, 2 :>B>@>< >B>1@078BAO 85@0@E8O >:>= 8 A;>52 0:B82=>3> A50=A0JOpen a window displaying the hierarchy of panes and layers in this session MainWindow\B:@KBL >:=> A> A?8A:>< 2A5E 459AB289 2 A50=A53Open a window listing interactions and other events MainWindow`B:@KBL 8;8 8<?>@B8@>20BL D09; A C40;Q==>3> C7;0'Open or import a file from a remote URL MainWindow@0=652K9Orange MainWindow.@>:@CB:0 8 ?5@5<5I5=85Panning and Navigation MainWindowbAB028BL A>45@68<>5 1CD5@0 >1<5=0 2 0:B82=K9 A;>9-Paste from the clipboard to the current layer MainWindow;O=CBL 2;52> Peek Left MainWindow;O=CBL 2?@02> Peek Right MainWindow PgDownPgDown MainWindowPgUpPgUp MainWindow:>A?@>8725AB8 / @8>AB0=>28BL Play / Pause MainWindow:0=5;L @568<0 2>A?@>872545=8OPlay Mode Toolbar MainWindow >A?@>&872545=85 Play&back MainWindow>A?@>872545=85Playback MainWindow2#A:>@5=85 2>A?@>872545=8OPlayback Speedup MainWindow,0=5;L 2>A?@>872545=8OPlayback Toolbar MainWindowP#?@02;5=85 2>A?@>872545=85< 8 ?5@5<>B:>9Playback and Transport Controls MainWindow>!:>@>ABL 2>A?@>872545=8O: %1%2%Playback speed: %1%2% MainWindowB!:>@>ABL 2>A?@>872545=8O: >1KG=0OPlayback speed: Normal MainWindowP2548B5 URL >B:@K205<>3> <5AB>?>;>65=8O:-Please enter the URL of the location to open: MainWindowC@?C@=K9Purple MainWindowRR MainWindow >2B>@=> >B:@KBLRe-open MainWindowp>2B>@=> >B:@KBL 0:B82=K9 8;8 =5402=> >B:@K202H89AO D09;0Re-open the current or most recently opened file MainWindow~>2B>@=> 70?CAB8BL A0<>5 ?>A;54=55 2K?>;=O2H55AO ?@5>1@07>20=85)Re-select the most recently run transform MainWindow@0A=K9Red MainWindow 5@A8ORelease MainWindow5@A8O %1 Release %1 MainWindow.5@A8O %1 :  540:F8O %2Release %1 : Revision %2 MainWindow$5@58<5=>20BL A;>9 Rename Layer MainWindow65@58<5=>20BL 0:B82=K9 A;>9!Rename the currently active layer MainWindow@5@5=C<5@>20BL 2K1@0==K5 >B<5B:8Renumber Selected Instants MainWindow0>2B>@8BL ?@5>1@07>20=85Repeat Transform MainWindow&1=C;5=85 AG5BG8:>2Reset Counters MainWindow:&>AAB0=>28BL >1KG=K9 <0AHB01Restore &Default Zoom MainWindow:>AAB0=>28BL >1KG=CN A:>@>ABLRestore Normal Speed MainWindowd>AAB0=>28BL 5AB5AB25==CN A:>@>ABL 2>A?@>872545=8O#Restore non-time-stretched playback MainWindowP>AAB0=>28BL >1KG=K9 <0AHB01 >B>1@065=8O%Restore the zoom level to the default MainWindow 5@5<>B0BL =0704Rewind MainWindow60704 : ?5@2>9 AE>659 B>G:5Rewind to Similar Point MainWindow&5@5<>B0BL 2 =0G0;>Rewind to Start MainWindown5@5<>B0BL 4> ?@54K4CI59 >B<5B:8 2@5<5=8 2 B5:CI5< A;>58Rewind to the previous time instant in the current layer MainWindow&5@5<>B0BL 2 =0G0;>Rewind to the start MainWindow ?@02>Right MainWindowH5A>>B25BAB285 G0AB>BK 48A:@5B870F88Sample rate mismatch MainWindow.!>E@0=8BL A50=A &:0:...Save Session &As... MainWindow4!>E@0=5=85 A50=A0 :0: "%1"Save session as "%1" MainWindow"@>:@CB8BL 2&;52> Scroll &Left MainWindow$@>:@CB8BL 2&?@02> Scroll &Right MainWindowF!45;0BL 1>;LH>9 H03 ?@>:@CB:8 2;52>.Scroll the current pane a big step to the left MainWindowH!45;0BL 1>;LH>9 H03 ?@>:@CB:8 2?@02>/Scroll the current pane a big step to the right MainWindow<@>:@CB8BL 0:B82=>5 >:=> 2;52>#Scroll the current pane to the left MainWindow>@>:@CB8BL 0:B82=>5 >:=> 2?@02>$Scroll the current pane to the right MainWindow09B8 MDD5:B B@0=AD>@<0F88 A@548 CAB0=>2;5==KE @0AH8@5=89 ?> =0720=8N 8;8 >?8A0=8NISearch for a transform from the installed plugins, by name or description MainWindowK45;5=85Select MainWindow&K45;8BL 2AQ Select &All MainWindow*K&45;8BL 2AQ 2848<>5Select &Visible Range MainWindowH#:068B5 M:A?>@B8@C5<K9 72C:>2>9 D09;Select audio file to export MainWindowrK45;8BL >B B5:CI59 B>G:8 2>A?@>872545=8O 4> :>=F0 A50=A0CSelect from the current playback position to the end of the session MainWindowtK45;8BL >B =0G0;0 A50=A0 4> B5:CI59 B>G:8 2>A?@>872545=8OESelect from the start of the session to the current playback position MainWindow K1@0BL 480?07>= Select ranges MainWindow:K45;8B5 >1;0ABL 4;O M:A?>@B0Select region to export MainWindow0K1@0BL F5;L 4;O 8<?>@B0Select target for import MainWindowl!45;0BL 2@5<5==>9 480?07>= @02=K< 0:B82=>9 H8@8=5 >:=0?Select the time range corresponding to the current window width MainWindowhK1@0BL 40==K5 ?> 2A59 4;8B5;L=>AB8 0:B82=>=@ A50=A00Select the whole duration of the current session MainWindow$K45;8BL 4> &:>=F0Select to &End MainWindow&K45;8BL 4> &=0G0;0Select to &Start MainWindowK45;5=85 Selection MainWindowJK45;5=85: %1 4> %2 (4;8B5;L=>ABL %3)!Selection: %1 to %2 (duration %3) MainWindow!50=A 87<5=5=Session modified MainWindow@#AB0=>28BL AG5BG8:8 =C<5@0F88...Set Numbering Counters... MainWindowb#AB0=>;28BL AG5BG8:8 4;O <5B>: =0 >A=>25 ?>4AG5B01Set the counters used for counter-based labelling MainWindowShift+Enter Shift+Enter MainWindowShift+Left Shift+Left MainWindowShift+PgDown Shift+PgDown MainWindowShift+PgUp Shift+PgUp MainWindowShift+Right Shift+Right MainWindow4>:07K20BL 2&A5 ?5@5:@KB8OShow &All Overlays MainWindow<>:07K20BL &<8=8<C< ?5@5:@KB89Show &Minimal Overlays MainWindow@5 ?>&:07K20BL ?5@5:@KB8O A>2A5<Show &No Overlays MainWindowD>:07K20BL &:>;QA0 <0AHB018@>20=8OShow &Zoom Wheels MainWindow2>:070BL &6C@=0; 459AB289Show Acti&vity Log MainWindow0&>:070BL A2>4:C ?> A;>NShow La&yer Summary MainWindow4>:07K20BL ?0=5;8 A&2>9AB2Show Property Bo&xes MainWindow8>:07K20BL AB0BCA=CN &AB@>:CShow Status &Bar MainWindow>:07K20BL :>=B5:AB=CN A?@02:C 2 AB0BCA=>9 AB@>:5, =0E>4OI59AO 2=87C >:=0 ?@>3@0<<KKShow context help information in the status bar at the bottom of the window MainWindown>:07K20BL ?0=5;8 A2>9AB2 A;>Q2 A1>:C >B >A=>2=>3> >:=0:07K20BL :>;QA0 4;O <0AHB018@>20=8O ?> 3>@87>=B0;8 8 25@B8:0;88Show thumbwheels for zooming horizontally and vertically MainWindow0<54;8BL Slow Down MainWindow&!>;> 0:B82=>3> >:=0Solo Current Pane MainWindowZ@8 2>A?@>872545=88 72CG8B ;8HL 0:B82=>5 >:=>%Solo the current pane during playback MainWindow @>15;Space MainWindow#A:>@8BLSpeed Up MainWindowt0?CAB8BL 8;8 >AB0=>28BL 2>A?@>872545=85 A B5:CI59 ?>78F880Start or stop playback from the current position MainWindow25@59B8 : A;54CNI5<C >:=CSwitch to Next Pane MainWindow45@59B8 : ?@54K4CI5<C >:=CSwitch to Previous Pane MainWindowTT MainWindowj 0AH8@8BL 2@5<O 2>A?@>872545=8O, =5 <5=OO 2KA>BC B>=0A?@>872545=8O, =5 <5=OO 2KA>BC B>=0;Time-stretch playback to speed it up without changing pitch MainWindow"K1>@ 8=AB@C<5=B0Tool Selection MainWindow&0=5;L 8=AB@C<5=B>2 Tools Toolbar MainWindowUU MainWindow(5:;0AA8D8F8@>20==K5 Unclassified MainWindow58725AB5=Unknown MainWindow25 2K?CI5=> : @540:F8O %1Unreleased : Revision %1 MainWindow 25@EUp MainWindowA?>;L7COUsing  MainWindow\848<0O >1;0ABL: >B %1 4> %2 (4;8B5;L=>ABL %3)Visible: %1 to %2 (duration %3) MainWindowWW MainWindow@54C?@5645=85Warning MainWindowZ0:>9 72C:>2>9 D09; 2K E>B8B5 M:A?>@B8@>20BL?,Which audio file do you want to export from? MainWindow0:CN >1;0ABL 8AE>4=>3> 72C:>2>3> D09;0 2K E>B8B5 M:A?>@B8@>20BL?@Which region from the original audio file do you want to export? MainWindow0:CN >1;0ABL B5:CI53> >:=0 2K E>B8B5 M:A?>@B8@>20BL :0: 87>1@065=85?CWhich region of the current pane do you want to export as an image? MainWindow 5;K9White MainWindow!With  MainWindow`! 8A?>;L7>20=85< Qt v%1 &copy; Nokia Corporation$With Qt v%1 © Nokia Corporation MainWindowXX MainWindowYY MainWindowZZ MainWindow"0AHB01 ?@>A<>B@0Zoom MainWindow@8&1;878BLZoom &In MainWindow&B40;8BL Zoom &Out MainWindow &#<5AB8BL 2 >:=5 Zoom to &Fit MainWindow"#2845BL 25AL D09;Zoom to show the whole file MainWindow[[ MainWindow]] MainWindow>http://www.sonicvisualiser.org/http://www.sonicvisualiser.org/ MainWindowfhttp://www.sonicvisualiser.org/doc/reference/%1/en/3http://www.sonicvisualiser.org/doc/reference/%1/en/ MainWindowll MainWindowoo MainWindowAs MainWindow (87<5=5=) (modified)MainWindowBase%1 (87<5=5=) %1 (modified)MainWindowBase %1: %2%1: %2MainWindowBase%1: %2 [%3] %1: %2 [%3]MainWindowBase<b>5 C40;>AL 8<?>@B8@>20BL RDF</b><p>5 C40;>AL 8<?>@B8@>20BL 40==K5 87 4>:C<5=B0 RDF "%1": %2</p>UFailed to import RDF

Importing data from RDF document at "%1" failed: %2

MainWindowBase<b>5772CG=K9 @568<</b><p>5 C40;>AL >B:@KBL 72C:>2>5 CAB@>9AB2> 4;O 2>A?@>872545=8O.<p>5 C40;>AL 02B><0B8G5A:8 >?@545;8BL 72C:>2>5 CAB@>9AB2>. 0 MB>B @07 ?@845BAO >1>9B8AL 157 2>A?@>872545=8O 72C:0.</p>No audio available

Could not open an audio device for playback.

Automatic audio device detection failed. Audio playback will not be available during this session.

MainWindowBase,<b>5772CG=K9 @568<</b><p>5 C40;>AL >B:@KBL ?@54?>G8B05<>5 72C:>2>5 CAB@>9AB2> (%1).<p>0 MB>B @07 ?@845BAO >1>9B8AL 157 2>A?@>872545=8O 72C:0.</p>No audio available

Failed to open your preferred audio device ("%1").

Audio playback will not be available during this session.

MainWindowBase~<b>5 C40;>AL A>E@0=8BL</b><p>5 C40;>AL 70?8A0BL D09; "%1": %25Save failed

Failed to write to file "%1": %2MainWindowBase:>1028BL >1J5:B 2 ?>78F8N %1AAdd Item at %1 sMainWindowBase>1028BL >:=>Add PaneMainWindowBase>1028BL B>G:C Add PointMainWindowBase<>1028BL B>G:C ?> >B<5B:5 %1 AAdd Point at %1 sMainWindowBaseL5 C40;>AL >B:@KBL 72C:>2>5 CAB@>9AB2>Couldn't open audio deviceMainWindowBaseK@570BLCutMainWindowBase#40;8BL >:=> Delete PaneMainWindowBase85 C40;>AL 8<?>@B8@>20BL RDFFailed to import RDFMainWindowBase05 C40;>AL 70?8A0BL D09;Failed to write fileMainWindowBase$<?>@B8@>20BL "%1" Import "%1"MainWindowBase,<?>@B D09;0 MIDI "%1"Import MIDI file "%1"MainWindowBase2<?>@B 4>:C<5=B0 RDF "%1"Import RDF document "%1"MainWindowBase6<?>@B 72C:>2>3> D09;0 "%1"Import audio file "%1"MainWindowBase4<?>@B XML-D09;0 A;>O "%1"Import layer XML file "%1"MainWindowBase0<?>@B D09;0 A50=A0 "%1"Import session file "%1"MainWindowBase8K?>;=O5BAO 8<?>@B 87 RDF...Importing from RDF...MainWindowBase6B:@K205BAO D09; 8;8 URL...Opening file or URL...MainWindowBaseJB:@K205BAO A?8A>: 2>A?@>872545=8O...Opening playlist...MainWindowBase(B:@K205BAO A50=A...Opening session...MainWindowBaseAB028BLPasteMainWindowBaseN>A?@>872>48BAO: %1 87 %2 (>AB0;>AL %3) Playing: %1 of %2 (%3 remaining)MainWindowBase#40;8BL >:=> Remove PaneMainWindowBase<H81:0 GB5=8O XML-D09;0 SV: %1SV XML file read error: %1MainWindowBase0K1@0BL F5;L 4;O 8<?>@B0Select target for importMainWindowBase  ModelDataTableDialog 540:B>@ 40==KE Data EditorModelDataTableDialog0==K5 2 A;>5 Data in LayerModelDataTableDialog#40;8BLDeleteModelDataTableDialog2#40;8BL 2K1@0==K5 >1J5:BKDelete Selected ItemsModelDataTableDialog2#40;8BL 2K1@0==K5 >1J5:BK!Delete the selected item or itemsModelDataTableDialog0=5;L ?@02:8 Edit ToolbarModelDataTableDialogA:0BL:Find:ModelDataTableDialogAB028BLInsertModelDataTableDialog*AB028BL =>2K9 >1J5:BInsert New ItemModelDataTableDialog*AB028BL =>2K9 >1J5:BInsert a new itemModelDataTableDialog:0=5;L @568<0 2>A?@>872545=8OPlay Mode ToolbarModelDataTableDialog,0=5;L 2>A?@>872545=8OPlayback ToolbarModelDataTableDialog`5@5:;NG8BL >BA;56820=85 ?>78F88 2>A?@>872545=8O$Toggle tracking of playback positionModelDataTableDialog65@5:;NG8BL 2>A?@>872545=85Track PlaybackModelDataTableDialog!>740B5;LMakerModelMetadataModel0720=85NameModelMetadataModelAB>G=8:SourceModelMetadataModel"8?TypeModelMetadataModel%1 <%2>%1 <%2>ModelTransformerFactory %1: %2%1: %2ModelTransformerFactory %1 %2%1 %2 NoteLayer%1 (%2, %3 F)%1 (%2, %3 Hz) NoteLayer%1F (%2, %3)%1 Hz (%2, %3) NoteLayer 2B>2K@02=820=85 Auto-Align NoteLayer.7<5=8BL 7=0G5=85 B>G:8Change Point Value NoteLayer.#40;8BL 2K1@0==K5 B>G:8Delete Selected Points NoteLayer 5@5B0I8BL B>G:C Drag Point NoteLayer(5@5B0I8BL 2K45;5=85Drag Selection NoteLayer 0@8A>20BL B>G:C Draw Point NoteLayer7<5=8BL B>G:C Edit Point NoteLayer!B5@5BL B>G:C Erase Point NoteLayer ?@>F5AA5 In progress NoteLayer8=59=K9Linear NoteLayer>30@8D<8G5A:89Log NoteLayer>BK MIDI MIDI Notes NoteLayer>20O B>G:0 New Point NoteLayer&5B ;>:0;L=KE B>G5:No local points NoteLayerAB028BLPaste NoteLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items? NoteLayer"5@5<5AB8BL B>G:CRelocate Point NoteLayer27<5=8BL @07<5@ 2K45;5=8OResize Selection NoteLayer0AHB01Scale NoteLayer48=8FK H:0;K Scale Units NoteLayerh@5<O: %1 KA>B0 B>=0: %2 ;8B5;L=>ABL: %3 5B:0: %4)Time: %1 Pitch: %2 Duration: %3 Label: %4 NoteLayerh@5<O: %1 KA>B0 B>=0: %2 ;8B5;L=>ABL: %3 57 <5B:8(Time: %1 Pitch: %2 Duration: %3 No label NoteLayer5@B. <0AHB01Vertical Scale NoteLayer;8B5;L=>ABLDuration NoteModel7<5=8BL 40==K5 Edit Data NoteModelK1>@:0Frame NoteModel 5B:0Label NoteModel#@>25=LLevel NoteModel>B0Note NoteModelKA>B0 B>=0Pitch NoteModel @5<OTime NoteModel58725AB=>Unknown NoteModel$5:>48@C5BAO %1...Decoding %1...OggVorbisFileReader)Q;:=8B5 8 ?>B0I8B5 4;O ?5@5<5I5=8O ?> >:=C; IQ;:=8B5 42064K 4;O A:0G:00Click and drag to navigate; double-click to jumpOverview 17>@OverviewOverview%1 - %2%1 - %2Pane%1 / %2 F%3 %1 / %2Hz%3Pane(R)(R)Pane(X)(X)PaneAlt+>;5A> Alt+WheelPane)Q;:=8B5 8 ?>B0I8B5 4;O A<5=K C@>2=O <0AHB018@>20=8O ?> 3>@87>=B0;82Click and drag to adjust the horizontal zoom levelPane)Q;:=8B5 8 ?>B0I8B5 4;O A<5=K C@>2=O <0AHB018@>20=8O ?> 25@B8:0;80Click and drag to adjust the vertical zoom levelPane)Q;:=8B5 8 ?>B0I8B5 4;O A<5=K 2848<>3> 480?07>=0 <0AHB018@>20=8O ?> 25@B8:0;8@Click and drag to adjust the visible range of the vertical scalePaneh)Q;:=8B5 8 ?>B0I8B5 2A5 >1J5:BK 2 2K45;5==>9 >1;0AB86Click and drag to move all items in the selected rangePaneh)Q;:=8B5 8 ?>B0I8B5 4;O ?5@5<5I5=8O 3@0=8F 2K45;5=8O-Click and drag to move the selection boundaryPaneV)Q;:=8B5 8 ?>B0I8B5 4;O ?5@5<5I5=8O ?> >:=CClick and drag to navigatePane)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O 480?07>=0; + Cmd  4;O 2K45;5=8O =5A:>;L:8E >1J5:B>2, + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=C^Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigatePane)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O 480?07>=0; + Ctrl  4;O 2K45;5=8O =5A:>;L:8E >1J5:B>2, + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=C_Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigatePanel)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O >1;0AB8; + Shift  4;O >B:;NG5=8O ?@8;8?0=8O : >1J5:B0<; + Cmd  4;O 2K45;5=8O =5A:>;L:8E >1J5:B>2, + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=CClick and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigatePanen)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O >1;0AB8; + Shift  4;O >B:;NG5=8O ?@8;8?0=8O : >1J5:B0<; + Ctrl  4;O 2K45;5=8O =5A:>;L:8E >1J5:B>2, + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=CClick and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigatePane)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O >1;0AB8; + Shift  4;O >B:;NG5=8O ?@8;8?0=8O : >1J5:B0<; + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=CaClick and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigatePane)Q;:=8B5 8 ?>B0I8B5 4;O 2K45;5=8O >1;0AB8; + A@54=OO :;028H0 <KH8  4;O ?5@5<5I5=8O ?> >:=CCClick and drag to select a range; middle-click and drag to navigatePane)5;:=8B5 ;52>9 :;028H59 <KH8 8 ?5@5B0I8B5 :C@A>@ 4;O A>740=8O =>2>3> >1J5:B0-Click left button and drag to create new itemPanen)Q;:=8B5 4;O 4>102;5=8O =>2>3> >1J5:B0 =0 0:B82=K9 A;>9+Click to add a new item in the active layerPaneCtrl+;52> Ctrl+LeftPaneCtrl+?@>:@CB:0 Ctrl+WheelPane:2>9=>9 I5;G>: ;52>9 :;028H59Double-Click LeftPane>2>9=>9 I5;G>: A@54=59 :;028H59Double-Click MiddlePane~5@5A:>G8BL 2?@02> 8;8 2;52> 2 7028A8<>AB8 >B ?>;>65=8O :C@A>@04Double-click middle button to relocate with any toolPane(5@5B0I8BL 2K45;5=85Drag SelectionPane 8A>20BLDrawPaneVA?>;L7>20=85 <KH8 A 8=AB@C<5=B>< @8A>20=8ODraw Tool Mouse ActionsPane7<5=8BLEditPane`A?>;L7>20=85 <KH8 A 8=AB@C<5=B>< @540:B8@>20=8OEdit Tool Mouse ActionsPane,2548B5 =>2K9 480?07>=Enter new rangePaneK45;8BL B>G=> Fine SelectPane4A?>;L7>20=85 <KH8 2 >:=0EGeneral Pane Mouse ActionsPane<>@87>=B0;L=>5 <0AHB018@>20=85Horizontal ZoomPane520O :;028H0LeftPane 7<5@8BL >1;0ABL Measure AreaPane7<5@8BL >1J5:B Measure ItemPaneVA?>;L7>20=85 <KH8 A 8=AB@C<5=B>< 87<5@5=8OMeasure Tool Mouse ActionsPane5=NMenuPane5@5<5AB8BLMovePane.=>65AB25==>5 2K45;5=85 Multi SelectPane5@5<5I5=85NavigatePaneVA?>;L7>20=85 <KH8 A 8=AB@C<5=B>< =02830F88Navigate Tool Mouse ActionsPanep>2K9 480?07>= >B>1@065=8O ?> 25@B8:0;8, >B %1 4> %2 %4:-New vertical display range, from %1 to %2 %4:Pane&5@5<5I5=85 A:0G:><RelocatePane!1@>A8BL C@>2=8 <0AHB018@>20=8O ?> 3>@87>=B0;8 8 25@B8:0;8 4> 8AE>4=KE 7=0G5=89;Reset horizontal and vertical zoom levels to their defaultsPane$7<5=8BL 2K45;5=85Resize SelectionPane@020O :;028H0RightPane0@>:@CG820BL >:=> A50=A0ScrollPane,@>:@CB:0 ?> 25@B8:0;8Scroll VerticallyPanejKAB@> ?5@5<5I0BLAO 2?@02> 8 2;52> ?> 2@5<5==>9 H:0;5)Scroll rapidly left or right in time axisPaneX@>:@CG820BL >B>1@065=85 ?> 25@B8:0;L=>9 >A8&Scroll up or down in the vertical axisPaneK45;8BLSelectPaneVA?>;L7>20=85 <KH8 A 8=AB@C<5=B>< 2K45;5=8OSelect Tool Mouse ActionsPaneShift+Left Shift+LeftPaneShift+?@>:@CB:0 Shift+WheelPane<>:070BL :>=B5:AB=>5 <5=N >:=0Show pane context menuPane,5:89 4;8==K9 ?@5D8:A:Some lengthy prefix:Pane85@B8:0;L=>5 <0AHB018@>20=85 Vertical ZoomPane >;5A>WheelPane>;5A>< 2=87 Wheel DownPane>;5A>< 225@EWheel UpPane60AHB018@>20=85 >B>1@065=8OZoomPane@81;878BLZoom InPaneB40;8BLZoom OutPane(5@B8:0;L=K9 <0AHB01Zoom VerticallyPane\0AHB018@>20BL >B>1@065=85 ?> 25@B8:0;L=>9 >A8#Zoom in or out in the vertical axisPaneT@81;865=85 8 >B40;5=85 ?> 2@5<5==>9 H:0;5Zoom in or out in time axisPane40AHB018@>20BL 2 2K45;5=85 Zoom to AreaPaneH>@@5:F8O ?0@0<5B@>2 2>A?@>872545=8OAdjust Playback ParametersPlayParameterRepository>!<5=0 3@><:>AB8 2>A?@>872545=8OChange Playback GainPlayParameterRepository\!<5=0 A>AB>O=8O ?@83;CH5==>AB8 2>A?@>872545=8OChange Playback Mute StatePlayParameterRepositoryD!<5=0 ?0=>@0<K ?@8 2>A?@>872545=88Change Playback PanPlayParameterRepository@!<5=0 @0AH8@5=8O 2>A?@>872545=8OChange Playback PluginPlayParameterRepositoryV!<5=0 ?0@0<5B@>2 @0AH8@5=8O 2>A?@>872545=8OConfigure Playback PluginPlayParameterRepository@>3@0<<0ProgramPluginParameterBoxZ# MB>3> @0AH8@5=8O =5B 87<5=O5<KE ?0@0<5B@>2.)This plugin has no adjustable parameters.PluginParameterBox5=LH5 << Advanced <<PluginParameterDialog>;LH5 >> Advanced >>PluginParameterDialog,K1>@>: 72C:0 =0 1;>::Audio frames per block:PluginParameterDialog(5A>2?045=85 :0=0;>2Channel mismatchPluginParameterDialog 0=0;KChannelsPluginParameterDialog$2B>@A:85 ?@020:  Copyright: PluginParameterDialog 2B>@:Maker:PluginParameterDialog0720=85:Name:PluginParameterDialog KE>4:Output:PluginParameterDialog(0@0<5B@K @0AH8@5=8OPlugin ParametersPluginParameterDialog1@01>B:0 ProcessingPluginParameterDialog ">;L:> 2K45;5=85Restrict to selection extentsPluginParameterDialog-B> @0AH8@5=85 ?@8=8<05B =5 1>;55 %1 :0=0;>2 =0 2E>45, => 4>ABC?=> F5;KE %2. ">;L:> ?5@2K5 %3 1C4CB 8A?>;L7>20=K. kThis plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. PluginParameterDialog-B> @0AH8@5=85 <>65B >1@010BK20BL B>;L:> >48= :0=0;, => C 8AB>G=8:0 %1 :0=0;>2.LThis plugin only has a single channel input, but the source has %1 channels.PluginParameterDialog-B><C @0AH8@5=8N =C6=> E>BO 1K %1 2E4=KE :0=0;>2s, => ;8HL %2 %3 4>ABC?=K. 5@>OB=>, @0AH8@5=85 =5 A@01>B05B :0: 4>;6=>.xThis plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly.PluginParameterDialog8A?>;L7>20BL B>;L:> :0=0; %1Use channel %1 onlyPluginParameterDialog^A?>;L7>20BL A@54=55 7=0G5=85 :0=0;>2 8AB>G=8:0Use mean of source channelsPluginParameterDialog5@A8O:Version:PluginParameterDialog(03:Window increment:PluginParameterDialog $>@<0: Window shape:PluginParameterDialog. 07<5@ >:>==>9 DC=:F88: Window size:PluginParameterDialogO2;ONBAOarePluginParameterDialogO2;O5BAOisPluginParameterDialog24 :04@0/A24 FPS Preferences25 :04@>2/A25 FPS Preferences30 :04@>2/A30 FPS Preferences,4 ?5@5AM<?;8@>20==0O4 x Oversampling PreferencesL4 ?5@5AM<?;8@>20==0O A 8=B5@?>;OF859#4 x Oversampling with interpolation Preferences50 :04@>2/A50 FPS Preferences60 :04@>2/A60 FPS Preferences0@54?>G8B05<K9 F25B D>=0Background colour preference Preferences;M:<5=0Blackman Preferences ;M:<5=0-%0@@8A0Blackman-Harris Preferences"5<=K9 D>=Dark background Preferences!0<K9 1KAB@K9Fastest Preferences@A?>;L7>20BL ?0@0<5B@K >:@C65=8OFollow desktop theme PreferencesJ53;L H@8DB0 4;O B5:AB>2KE ?5@5:@KB89Font size for text overlays Preferences8'0AB>B0 CA;>2=>9 =>BK O (A)Frequency of concert A Preferences0CAA>20Gaussian Preferences%0<<8=30Hamming Preferences %M==0Hann Preferences6KA>:>5 @07@5H5=85 (4> <:A) High resolution (to microsecond) Preferences&082KAH53> :0G5AB20Highest quality Preferences!25B;K9 D>=Light background Preferences*8=59=0O 8=B5@?>;OF8OLinear interpolation Preferences: 0A?>;>65=85 :0B0;>30 A :MH5<!Location for cache file directory Preferences5BNone PreferencesCBB0;;0Nuttall Preferencesn@>?CA:0BL 2@5<5==K5 D09;K 2 <5=N =5402=> >B:@K202H8EAO'Omit temporaries from Recent Files menu Preferences0@75=0Parzen PreferencesN"8? @5AM<?;8@>20=8O ?@8 2>A?@>872545=88Playback resampler type Preferences0@0<5B@K Preferences Preferences4=5H=89 284 ?0=5;8 A2>9AB2Property box layout Preferences@O<>C3>;L=0O Rectangular Preferences@ 5AM<?;8@>20BL D09;K ?@8 8<?>@B5$Resample mismatching files on import PreferencesV>:07K20BL ?0=5;L B>;L:> 4;O 0:B82=>3> >:=0Show box for current pane only Preferences>>:07K20BL ?0=5;8 4;O 2A5E >:>=Show boxes for all panes PreferencesP>:07K20BL 70AB02:C ?@8 AB0@B5 ?@>3@0<<KShow splash screen on startup Preferences\$>@<0 >:>==>9 DC=:F88 ?@8 A?5:B@0;L=>< 0=0;875Spectral analysis window shape PreferencesH=B5@?>;OF8O A?5:B@>3@0<<K ?> >A8 X:!Spectrogram x-axis interpolation: PreferencesB=B5@?>;OF8O >A8 Y A?5:B@>3@0<<K:!Spectrogram y-axis interpolation: Preferences1KG=K9Standard Preferences1KG=K9 (4> <A)Standard (to millisecond) Preferences4$>@<0B >B>1@065=8O 2@5<5=8Time display format Preferences"@5C3>;L=0O Triangular Preferences%1:%1:PreferencesDialog 1&;8: &AppearancePreferencesDialog &1I85&GeneralPreferencesDialog<b>"@51C5BAO ?5@570?CA: ?@>3@0<<K</b><p>5:>B>@K5 87<5=82H85AO ?0@0<5B@K =5 <>3CB 1KBL CGB5=K 157 ?5@570?CA:0 Sonic Visualiser.</p><p>025@H8B5 @01>BC A ?@>3@0<<>9 8 ?>2B>@=> 70?CAB8B5 55, GB>1K 2=5A5==K5 87<5=5=8O 2>7K<5;8 MDD5:B.</p>Restart required

One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.

Please exit and restart the application now if you want these changes to take effect immediately.

PreferencesDialog$<4><0H=89 :0B0;>3>PreferencesDialog&=0;87 Anal&ysisPreferencesDialog@8<5=8BLApplyPreferencesDialogB<5=8BLCancelPreferencesDialogOKPreferencesDialog6#AB@>9AB2> 2>A?@>872545=8O:Playback audio device:PreferencesDialog0@0<5B@K PreferencesPreferencesDialog$0@0<5B@K 87<5=5=KPreferences ChangedPreferencesDialogDK15@8B5 :0B0;>3 4;O E@0=5=8O :MH02Select a directory to create cache subdirectory inPreferencesDialog5:>B>@K5 ?0@0<5B@K @01>BK ?@>3@0<<K 1K;8 87<5=5=K, => =5 ?@8<5=5=K. @8<5=8BL 8E ?5@54 70:@KB85<?NSome preferences have been changed but not applied. Apply them before closing?PreferencesDialogB0@0<5B@K @01>BK Sonic Visualiser)Sonic Visualiser: Application PreferencesPreferencesDialogB<5=8BLCancelProgressDialog2 (B5:CI55 7=0G5=85: %1%2) (current value: %1%2) PropertyBox. (B5:CI55 7=0G5=85: %1) (current value: %1) PropertyBox,>1028BL =>2K9 F25B...Add New Colour... PropertyBox@!:>@@5:B8@>20BL %1 A2>9AB2> %2%3Adjust %1 property of %2%3 PropertyBox<2548B5 =0720=85 =>2>3> F25B0: Enter a name for the new colour: PropertyBox(09B5 F25BC =0720=85Name New Colour PropertyBox>A?@>8725AB8Play PropertyBox0#A8;5=85 2>A?@>872545=8O Playback Gain PropertyBoxF0=>@0<0/10;0=A ?@8 2>A?@>872545=88Playback Pan / Balance PropertyBoxN@54?>G8B0BL G5@=K9 D>= 4;O MB>3> F25B0'Prefer black background for this colour PropertyBox>:070BLShow PropertyBox45@5:;NG8BL %1 A2>9AB2> %2Toggle %1 property of %2 PropertyBox<5@5:;NG8BL 2>A?@>872545=85 %1Toggle Playback of %1 PropertyBox05@5:;NG8BL 2848<>ABL %1Toggle Visibility of %1 PropertyBox1dB PropertyBox,#AB0=>28BL A2>9AB2> %1Set %1 PropertyPropertyContainer;>6LfalsePropertyContainer=5BnoPropertyContainer2K:;offPropertyContainer2:;onPropertyContainer ?@0240truePropertyContainer40yesPropertyContainer45@5:;NG8BL 2848<>ABL A;>OChange Layer Visibility PropertyStackB)Q;:=8B5 4;O A<5=K 0:B82=>3> A;>O(Click to change the current active layer PropertyStack: Sonic Visualiser  ?@>3@0<<0 4;O ?@>A<>B@0 8 8AA;54>20=8O 72C:>2KE 40==KE A F5;LN A5<0=B8G5A:>3> 0=0;870 8 0==>B0F88 <C7K:8. A?>;L7>20=85: %1 [--no-audio] [--no-osc] [<D09;> ...] --no-audio: =5 ?KB0BLAO >B:@KBL CAB@>9AB2> 72C:>2>3> 2K2>40 --no-osc: =5 ?@54>AB02;OBL ?>@B Open Sound Control 4;O C40;Q==>3> C?@02;5=8O <D09;>: <>6=> C:070BL >48= 8 1>;55 D09;>2 Sonic Visualiser (.sv) 8 72C:>2KE D09;>2. w Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [ ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control : One or more Sonic Visualiser (.sv) and audio files may be provided.  QApplication Sonic VisualiserSonic Visualiser QApplication85 C40;>AL >B:@KBL D09; "%1"Failed to open file "%1"QFile.$09; "%1" =5 ACI5AB2C5BFile "%1" does not existQFileJ$09; 8;8 URL "%1" =5 <>3 1KBL ?>;CG5='File or URL "%1" could not be retrievedQFile<b>C6=K 72C:>2K5 40==K5</b><p>03@C78B5 E>BO 1K >48= 72C:>2>9 D09; ?5@54 8<?>@B>< 0==>B0F89\Audio required

Please load at least one audio file before importing annotation data QMessageBox.5 C40;>AL >B:@KBL D09;Failed to open file QMessageBoxH$09; 8;8 URL "%1" =5 <>3 1KBL >B:@KB$File or URL "%1" could not be opened QMessageBox$5:>48@C5BAO %1...Decoding %1...QuickTimeFileReader 4>  to RangeInputDialog %1 %2%1 %2 RegionLayer 2B>2K@02=820=85 Auto-Align RegionLayer "0:BKBars RegionLayer.7<5=8BL 7=0G5=85 B>G:8Change Point Value RegionLayer.#40;8BL 2K1@0==K5 B>G:8Delete Selected Points RegionLayer(5@5B0I8BL 2K45;5=85Drag Selection RegionLayer" 02=K5 ?@><56CB:8 Equal Spaced RegionLayer ?@>F5AA5 In progress RegionLayer8=59=K9Linear RegionLayer>30@8D<8G5A:89Log RegionLayer&5B ;>:0;L=KE B>G5:No local points RegionLayerAB028BLPaste RegionLayer"8? 3@0D8:0 Plot Type RegionLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items? RegionLayer27<5=8BL @07<5@ 2K45;5=8OResize Selection RegionLayer0AHB01Scale RegionLayer48=8FK H:0;K Scale Units RegionLayer!53<5=B0F8O Segmentation RegionLayerb@5<O: %1 =0G5=85: %2 ;8B5;L=>ABL: %3 5B:0: %4)Time: %1 Value: %2 Duration: %3 Label: %4 RegionLayerb@5<O: %1 =0G5=85: %2 ;8B5;L=>ABL: %3 57 <5B:8(Time: %1 Value: %2 Duration: %3 No label RegionLayer5@B. <0AHB01Vertical Scale RegionLayer;8B5;L=>ABLDuration RegionModel7<5=8BL 40==K5 Edit Data RegionModelK1>@:0Frame RegionModel 5B:0Label RegionModel1;0ABLRegion RegionModel @5<OTime RegionModel58725AB=>Unknown RegionModel=0G5=85Value RegionModel #40;8BL A;>9 %1 Delete %1 LayerRemoveLayerCommand* 5AM<?;8@>20=85 %1...Resampling %1...ResamplingWavFileReader6(<>45;L 872;5G5=0 2 SV-XML)(derived model in SV-XML) SVFileReader6B:@K205BAO D09; 8;8 URL...Opening file or URL... SVFileReader<=58725AB=>> SingleColourLayer&25BColourSingleColourLayer%1 - %2%1 - %2 SliceLayer-Inf-Inf SliceLayer0 10dB SliceLayer1A>;NB=K9Absolute SliceLayer N1K5Any SliceLayer8=KBins SliceLayer ;>:8Blocks SliceLayer &25B0Colours SliceLayer#A8;5=85Gain SliceLayer8=59=K9Linear SliceLayer 8=88Lines SliceLayer#A@54=Q==>Mean SliceLayer!G5BG8:Meter SliceLayer>@<0;87>20BL Normalize SliceLayer8:Peak SliceLayer"8? 3@0D8:0 Plot Type SliceLayer& 568< AM<?;8@>20=8O Sampling Mode SliceLayer0AHB01Scale SliceLayer(038Steps SliceLayer >@>3 Threshold SliceLayerP@5<O: %1 - %2 80?07>=: %3 AM<?;>2 (%4)$Time: %1 - %2 Range: %3 samples (%4) SliceLayer@5<O: %1 - %2 80?07>=: %3 AM<?;>2 (%4) 8=: %5 %6 7=0G5=85: %79Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 SliceLayer1dB SliceLayerx10x10 SliceLayer7<5=8BL 40==K5 Edit Data SparseModel>1028BL B>G:C Add PointSparseModel::AddPointCommand#40;8BL B>G:C Delete PointSparseModel::DeletePointCommand&5@5@07<5B8BL B>G:CRe-Label PointSparseModel::RelabelCommand7<5=8BL 40==K5 Edit DataSparseOneDimensionalModelK1>@:0FrameSparseOneDimensionalModel 5B:0LabelSparseOneDimensionalModel @5<OTimeSparseOneDimensionalModel58725AB=>UnknownSparseOneDimensionalModel7<5=8BL 40==K5 Edit DataSparseTimeValueModelK1>@:0FrameSparseTimeValueModel 5B:0LabelSparseTimeValueModel @5<OTimeSparseTimeValueModel58725AB=>UnknownSparseTimeValueModel=0G5=85ValueSparseTimeValueModel $070: %1 Phase: %1SpectrogramLayer $070: %1 - %2 Phase: %1 - %2SpectrogramLayerr%1'0AB>B0 18=>2: %2 - %3 F %4KA>B0 B>=0 18=>2: %5 - %6 1%1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 SpectrogramLayer^%1'0AB>B0 18=>2: %2 F %3KA>B0 B>=0 18=>2: %4 '%1Bin Frequency: %2 Hz %3Bin Pitch: %4 SpectrogramLayer %1 F%1HzSpectrogramLayer-Inf-InfSpectrogramLayer 1 F1 KHzSpectrogramLayer1,5 F1.5 KHzSpectrogramLayer 10 F10 HzSpectrogramLayer 10 F10 KHzSpectrogramLayer 100 F100 HzSpectrogramLayer 12 F12 KHzSpectrogramLayer 16 F16 KHzSpectrogramLayer 2 F2 KHzSpectrogramLayer 20 F20 HzSpectrogramLayer25 %25 %SpectrogramLayer 250 F250 HzSpectrogramLayer 4 F4 KHzSpectrogramLayer 40 F40 HzSpectrogramLayer 43 F43HzSpectrogramLayer50 %50 %SpectrogramLayer 500 F500 HzSpectrogramLayer 6 F6 KHzSpectrogramLayer75 %75 %SpectrogramLayer 8 F8 KHzSpectrogramLayer 87,5 %87.5 %SpectrogramLayer93,75 %93.75 %SpectrogramLayer<=58725AB=>> SpectrogramLayerA5 18=KAll BinsSpectrogramLayer8=KBinsSpectrogramLayer&25BColourSpectrogramLayer@0I5=85 F25B0Colour RotationSpectrogramLayer25 C40;>AL :MH8@>20BL FFTFFT cache failedSpectrogramLayer5 C40;>AL A>740BL FFT-<>45;L MB>9 A?5:B@>3@0<<K. 5@>OB=>, =5 E20B05B ?0<OB8 8;8 48A:>2>3> ?>@AB@0=AB20 4;O ?@>4>;65=8O.pFailed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue.SpectrogramLayer'0AB>BK FrequenciesSpectrogramLayer#A8;5=85GainSpectrogramLayer8=59=K9LinearSpectrogramLayer>30@8D<.LogSpectrogramLayer0:A. G0AB>B0 Max FrequencySpectrogramLayer!G5BG8:MeterSpectrogramLayer8=. G0AB>B0 Min FrequencySpectrogramLayer57 <0:A8<C<0No maxSpectrogramLayer57 <8=8<C<0No minSpectrogramLayer5BNoneSpectrogramLayer*>@<0;87>20BL AB>;1FKNormalize ColumnsSpectrogramLayer:>@<0;87>20BL 2848<CN >1;0ABLNormalize Visible AreaSpectrogramLayer8:>2K5 18=K Peak BinsSpectrogramLayer88:>20O G0AB>B0: %1 - %2 F Peak Frequency: %1 - %2 Hz SpectrogramLayer.8:>20O G0AB>B0: %1 F Peak Frequency: %1 Hz SpectrogramLayer08:>20O 2KA>B0 B>=0: %2 Peak Pitch: %2 SpectrogramLayer:8:>20O 2KA>B0 B>=0: %3 - %4 Peak Pitch: %3 - %4 SpectrogramLayer$070PhaseSpectrogramLayer0AHB01ScaleSpectrogramLayer >@>3 ThresholdSpectrogramLayer@5<O: %1  Time: %1 SpectrogramLayer@5<O: %1 - %2 Time: %1 - %2 SpectrogramLayer:=>WindowSpectrogramLayer5@5:@KB85 >:>=Window OverlapSpectrogramLayer 07<5@ >:=0 Window SizeSpectrogramLayer1dBSpectrogramLayer 1: %1dB: %1SpectrogramLayer1: %1 - %2 dB: %1 - %2SpectrogramLayer1dBVSpectrogramLayer 1^2dBV^2SpectrogramLayer%1%1 SpectrumLayerL%1 8=: %2 (%3) %4 7=0G5=85: %5 1: %6#%1 Bin: %2 (%3) %4 value: %5 dB: %6 SpectrumLayerF%1 8=: %2 (%3) =0G5=85: %4 1: %5 %1 Bin: %2 (%3) Value: %4 dB: %5 SpectrumLayer%1 - %2%1 - %2 SpectrumLayer%1 - %2 F %1 - %2 Hz SpectrumLayer %1 F%1 Hz SpectrumLayer-Inf-Inf SpectrumLayer25 %25 % SpectrumLayer50 %50 % SpectrumLayer75 %75 % SpectrumLayer 87,5 %87.5 % SpectrumLayer93,75 %93.75 % SpectrumLayer8=KBins SpectrumLayer#A@54=Q==>Mean SpectrumLayer 8G53>None SpectrumLayer8:Peak SpectrumLayer4>:07K20BL ?8:>2K5 G0AB>BKShow Peak Frequencies SpectrumLayer:=>Window SpectrumLayer5@5:@KB85 >:>=Window Overlap SpectrumLayer 07<5@ >:=0 Window Size SpectrumLayer%1 - %2%1 - %2SubdividingMenu<157 B5:AB0>  TextLayer"#40;8B5 2K45;5=85Delete Selection TextLayer 5@5B0I8B5 <5B:C Drag Label TextLayer(5@5B0I8B5 2K45;5=85Drag Selection TextLayerG8AB8BL <5B:C Empty Label TextLayer2548B5 <5B:C Enter label TextLayer#40;8BL B>G:C Erase Point TextLayer ?@>F5AA5 In progress TextLayer"5@5<5AB8B5 <5B:C Move Label TextLayer45@5<5AB8B5 ?> 3>@87>=B0;8Move Label Horizontally TextLayer05@5<5AB8B5 ?> 25@B8:0;8Move Label Vertically TextLayer>20O B>G:0 New Point TextLayerAB028BLPaste TextLayer42548B5 B5:AB =>2>9 <5B:8:Please enter a new label: TextLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items? TextLayer0!<5=8B5 @07<5@ 2K45;5=8OResize Selection TextLayer<@5<O: %1 KA>B0: %2 5B:0: %3Time: %1 Height: %2 Label: %3 TextLayer7<5=8BL 40==K5 Edit Data TextModelK1>@:0Frame TextModel KA>B0Height TextModel 5B:0Label TextModel "5:ABText TextModel @5<OTime TextModel58725AB=>Unknown TextModel%1: %2%3%1: %2%3 Thumbwheel%2%3%2%3 ThumbwheelL2548B5 =>2>5 7=0G5=85 >B %1 4> %2 %3:#Enter a new value from %1 to %2 %3: ThumbwheelF2548B5 =>2>5 7=0G5=85 >B %1 4> %2: Enter a new value from %1 to %2: Thumbwheel,2548B5 =>2>5 7=0G5=85Enter new value ThumbwheelL>2>5 7=0G5=85 4;O %1, >B %2 4> %3 %4:#New value for %1, from %2 to %3 %4: ThumbwheelF>2>5 7=0G5=85 4;O %1, >B %2 4> %3: New value for %1, from %2 to %3: Thumbwheel*>1028BL B>G:C 2 %1 AAdd Point at %1 sTimeInstantLayer"#40;8BL 2K45;5=85Delete SelectionTimeInstantLayer 5@5B0I8BL B>G:C Drag PointTimeInstantLayer(5@5B0I8BL 2K45;5=85Drag SelectionTimeInstantLayer 0@8A>20BL B>G:C Draw PointTimeInstantLayer7<5=8BL B>G:C Edit PointTimeInstantLayer#40;8BL B>G:C Erase PointTimeInstantLayer ?@>F5AA5 In progressTimeInstantLayer.5@5B0I8BL B>G:C : %1 AMove Point to %1 sTimeInstantLayer>20O B>G:0 New PointTimeInstantLayer&5B ;>:0;L=KE B>G5:No local pointsTimeInstantLayerAB028BLPasteTimeInstantLayer"8? 3@0D8:0 Plot TypeTimeInstantLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted instants?TimeInstantLayer27<5=8BL @07<5@ 2K45;5=8OResize SelectionTimeInstantLayer!53<5=B0F8O SegmentationTimeInstantLayer&@5<O: %1 5B:0: %2Time: %1 Label: %2TimeInstantLayer&@5<O: %1 57 <5B:8Time: %1 No labelTimeInstantLayer+/-1+/-1TimeValueLayer 2B>2K@02=820=85 Auto-AlignTimeValueLayer.7<5=8BL 7=0G5=85 B>G:8Change Point ValueTimeValueLayer6K1@0BL 2KG8A;5=85 7=0G5=8OChoose value calculationTimeValueLayer"!>548=Q==K5 B>G:8Connected PointsTimeValueLayer @820OCurveTimeValueLayer.#40;8BL 2K1@0==K5 B>G:8Delete Selected PointsTimeValueLayer 5@5B0I8BL B>G:C Drag PointTimeValueLayer(5@5B0I8BL 2K45;5=85Drag SelectionTimeValueLayer 0@8A>20BL B>G:C Draw PointTimeValueLayer7<5=8BL B>G:C Edit PointTimeValueLayer!B5@5BL B>G:C Erase PointTimeValueLayer ?@>F5AA5 In progressTimeValueLayer8=59=K9LinearTimeValueLayer 8=88LinesTimeValueLayer>30@8D<8G5A:89LogTimeValueLayer>20O B>G:0 New PointTimeValueLayer&5B ;>:0;L=KE B>G5:No local pointsTimeValueLayerAB028BLPasteTimeValueLayer"8? 3@0D8:0 Plot TypeTimeValueLayer ">G:8PointsTimeValueLayerJ0=>2> 2K@>2=OBL 2AB02;5==K5 >1J5:BK?Re-align pasted items?TimeValueLayer"5@5<5AB8BL B>G:CRelocate PointTimeValueLayer27<5=8BL @07<5@ 2K45;5=8OResize SelectionTimeValueLayer0AHB01ScaleTimeValueLayer48=8FK H:0;K Scale UnitsTimeValueLayer!53<5=B0F8O SegmentationTimeValueLayer# =5:>B>@KE 2AB02;O5<KE >1J5:B>2 =5B 7=0G5=89.0:85 7=0G5=8O 2K E>B8B5 4;O =8E 8A?>;L7>20BL?eSome of the items you are pasting do not have values. What values do you want to use for these items?TimeValueLayer >6:8StemsTimeValueLayer# 2AB02;O5<KE >1J5:B>2 =5B 7=0G5=89. 0:85 7=0G5=8O 2K E>B8B5 4;O =8E 8A?>;L7>20BL?]The items you are pasting do not have values. What values do you want to use for these items?TimeValueLayerD@5<O: %1 =0G5=85: %2%3 5B:0: %4Time: %1 Value: %2%3 Label: %4TimeValueLayerD@5<O: %1 =0G5=85: %2%3 57 <5B:8Time: %1 Value: %2%3 No labelTimeValueLayer5@B. <0AHB01Vertical ScaleTimeValueLayer,>;L 4;O 2A5E >1J5:B>2Zero for all itemsTimeValueLayer<< @54K4CI89 << Previous TipDialog0:@KBLClose TipDialog!;54CNI89 >>Next >> TipDialog:>:07K20BL A>25BK ?@8 70?CA:5Show tip on startup TipDialog!>25B 4=OTip of the Day TipDialog [\(<].*$ [\(<].*$TransformFactory^%1 8A?>;L7CO 2K2>4 "%2" @0AH8@5=8O "%3" (87 %4)-%1 using "%2" output of "%3" plugin (from %4)TransformFactoryH%1 8A?>;L7CO @0AH8@5=85 "%2" (87 %3)%1 using "%2" plugin (from %3)TransformFactory %1: %2%1: %2TransformFactory%1: KE>4 %2 %1: Output %2TransformFactory6<=58725AB=K9 ?@>872>48B5;L>TransformFactory =0;87AnalysisTransformFactory0B53>@8OCategoryTransformFactory?8A0=85 DescriptionTransformFactory-DD5:BKEffectsTransformFactory0==K5 MDD5:B>2 Effects DataTransformFactory|72;5GL "%1" 40==K5 2K2>40 87 @0AH8@5=8O MDD5:B>2 "%2" (87 %3):Extract "%1" data output from "%2" effect plugin (from %3)TransformFactoryx72;5GL 40==K5 2K2>40 %1 87 @0AH8@5=8O MDD5:B>2 "%2" (87 %3)8Extract data output %1 from "%2" effect plugin (from %3)TransformFactory72;5GL 40==K5 ?@8 ?><>I8 "%1" 2K2>40 87 @0AH8@5=8O "%2" (87 %3);Extract features using "%1" output of "%2" plugin (from %3)TransformFactoryL72;5GL 40==K5 ?@8 ?><>I8 "%1" (87 %2),Extract features using "%1" plugin (from %2)TransformFactoryt!>740BL 72C:>2>9 A83=0; ?@8 ?><>I8 @0AH8@5=8O "%1" (87 %2)1Generate audio signal using "%1" plugin (from %2)TransformFactory5=5@0B>@ GeneratorTransformFactory!>740B5;LMakerTransformFactory0720=85NameTransformFactory @>G55OtherTransformFactory"8? @0AH8@5=8O Plugin typeTransformFactory.!8AB5<=K9 845=B8D8:0B>@System IdentifierTransformFactory"@0=AD>@<8@>20BL 72C:>2>9 A83=0; @0AH8@5=85< MDD5:B>2 "%1" (87 %2)8Transform audio signal with "%1" effect plugin (from %2)TransformFactory"48=8F0 87<5@5=8OUnitsTransformFactory%1%2<br><small>%1%2
TransformFinder</small>TransformFinder<b>%1</b>%2<br>%1%2
TransformFinderR<b>8 >4=> @0AH8@5=85 =5 CAB0=>2;5=>!</b>*No plugins are currently installed!TransformFindert<b>5 C40;>AL ?>;CG8BL >?C1;8:>20==K5 2 A5B8 >?8A0=8O!</b>>Unable to retrieve published descriptions from network!TransformFinderz<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; 0B53>@8O: %1<
      — Category: %1TransformFinder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; >4@>1=0O 8=D>@<0F8O: <a href="%1">%1</a>U
      — More information: %1TransformFinder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; "8? @0AH8@5=8O: %1?
      — Plugin type: %1TransformFinder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; !8AB5<=K9 845=B8D8:0B>@: %1E
      — System identifier: %1TransformFinderB<br>&nbsp;&nbsp;8G53> =5 =0945=>
  No results foundTransformFinder0<i> (=5 CAB0=>2;5=>)</i> (not installed)TransformFinder<p>%1<br>%2<br>5@>OB=>, =5 @01>B05B A5B52>5 A>548=5=85, ;81> A;C61K >B7K20NBAO A;8H:>< <54;5==>.<br> 57C;LB0BK ?>8A:0 1C4CB =54>ABC?=K.

%1
%2
Perhaps the network connection is down, or services are responding too slowly.
No search results will be available.TransformFinder<p>%1<br>K45B 2K?>;=5= ?>8A: B>;L:> ?> >?8A0=8O< @0AH8@5=89 Vamp, ?@54=07=0G5==KE 4;O 872;5G5=8O 0=0;878@C5<KE 40==KE.]

%1
Only the published descriptions of Vamp feature extraction plugins will be searched.TransformFinder<p>%1<br>5@>OB=>, =5 @01>B05B A5B52>5 A>548=5=85, ;81> A;C61K >B7K20NBAO A;8H:>< <54;5==>, ;81> ?@>87>H;0 =5?>;04:0 ?@8 >1@01>B:5.<br>C45B 2K?>;=5= ?>8A: B>;L:> ?> >?8A0=8O< C65 CAB0=>2;5==KE @0AH8@5=89.

%1
Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.
Only the descriptions of installed plugins will be searched.TransformFinder<p>2548B5 B5:AB 4;O ?>8A:0 ?> >?8A0=8O< A@548:<ul><li>2A5E CAB0=>2;5==KE @0AH8@5=89 <a href="http://www.vamp-plugins.org/">Vamp</a> 4;O 872;5G5=8O 0=0;878@C5<KE 40==KE;</li><li>2A5E CAB0=>2;5==KE MDD5:B>2<a href="http://www.ladspa.org/">LADSPA</a>;</li><li>5I5 =5 CAB0=>2;5==KE @0AH8@5=89 Vamp, GLQ >?8A0=85 >?C1;8:>20=> 2 A5<0=B8G5A:>9 A5B8.</li></ul>

Type some text into the search box to search the descriptions of:

  • All currently installed Vamp audio feature extraction plugins
  • All currently installed LADSPA audio effects plugins
  • Vamp plugins that are not currently installed but that have descriptions published via the semantic web
TransformFinder<small>TransformFinder"<small>%1</small>%1TransformFinder=87DownTransformFinderD>8A: @0AH8@5=89 4;O B@0=AD>@<0F88Find a TransformTransformFinderA:0BL:Find:TransformFinderR0945=> %n >?8A0=85, A>45@60I55 <b>%1</b>R0945=> %n >?8A0=8O, A>45@60I8E <b>%1</b>R0945=> %n >?8A0=89, A>45@60I8E <b>%1</b>,Found %n description(s) containing %1TransformFinderz0945=> %n >?8A0=85, A>45@60I55 <b>%1</b>, ?>:070=K ?5@2K5 %2z0945=> %n >?8A0=8O, A>45@60I8E <b>%1</b>, ?>:070=K ?5@2K5 %2z0945=> %n >?8A0=89, A>45@60I8E <b>%1</b>, ?>:070=K ?5@2K5 %2GFound %n description(s) containing %1, showing the first %2 onlyTransformFinder 25@EUpTransformFinder<=58725AB=>> ViewK@02=820=85 AlignmentViewB<5=8BLCancelView:!;54>20BL 70 2>A?@>872545=85<Follow PlaybackView(;>10;L=0O ?@>:@CB:0 Global ScrollView$;>10;L=K9 <0AHB01 Global ZoomViewK:;NG8BLOffView>AB@0=8G=>PageView:B@8A>2K205BAO 87>1@065=85...Rendering image...View@>:@CG820BLScrollView86840=85 3>B>2=>AB8 A;>Q2...!Waiting for layers to be ready...View!=OBL 2K45;5=85Clear Selection ViewManager6K45;8BL =5A:>;L:> >1;0AB59Select Multiple Regions ViewManager K45;8BL >1;0ABL Select Region ViewManager2C:>2>9 D09; Wave File WaveFileModel( %1 %2 (?8: 2 %3 1) %1 %2 (%3 dB peak) WaveformLayer2 %1 %2 - %3 (?8: 2 %4 1) %1 %2 - %3 (%4 dB peak) WaveformLayer-Inf-Inf WaveformLayer0 10dB WaveformLayerV->1@07=> Butterfly WaveformLayer0=0; %1 Channel %1 WaveformLayer 0=0;KChannels WaveformLayer#A8;5=85Gain WaveformLayer 52K9:Left: WaveformLayer#@>25=L:Level: WaveformLayer8=59=K9Linear WaveformLayer#A@54=Q==>Mean WaveformLayer!G5BG8:Meter WaveformLayer:>@<0;87>20BL 2848<CN >1;0ABLNormalize Visible Area WaveformLayer@02K9:Right: WaveformLayer0AHB01 ?> YScale WaveformLayerB45;L=>Separate WaveformLayer@5<O: %1Time: %1 WaveformLayer@5<O: %1 - %2 Time: %1 - %2 WaveformLayer1dB WaveformLayerV / 2@5<OV / timeWindowShapePreview1 / G0AB>B0 dB / freqWindowShapePreview40?8AK205<K9 72C:>2>9 D09;Writable Wave FileWritableWaveFileModel ) , sonic-visualiser-2.3~repack1.orig/i18n/sonic-visualiser_en_GB.qm0000644000175000017500000000256612252354725023412 0ustar miramira%1</b>TFound %n descriptions containing <b>%1</b>,Found %n description(s) containing %1TransformFinderFound %n description containing <b>%1</b>, showing the first %2 onlyFound %n descriptions containing <b>%1</b>, showing the first %2 onlyGFound %n description(s) containing %1, showing the first %2 onlyTransformFinder,Normalise Visible AreaNormalize Visible Area WaveformLayersonic-visualiser-2.3~repack1.orig/i18n/sonic-visualiser_ru.ts0000644000175000017500000134207012252354725023075 0ustar miramira ActivityLog Activity Log Журнал изменений <p>Activity Log lists your interactions and other events within %1.</p> <p>Список всех предпринятых вами действий с %1.</p> %1: %2 %1: %2 AddLayerCommand Add %1 Layer Добавить слой %1 AggregateWaveModel Aggregate Wave AlignmentModel Alignment Выравнивание AudioCallbackPlaySource Play from %1 Воспроизведение от %1 Stop at %1 Остановка в позиции %1 Change time-stretch factor to %1 Смена коэффициента растяжения во времени на %1 AudioDial Enter new value Введите новое значение %1: %2%3 %1: %2%3 %2%3 %2%3 New value for %1, from %2 to %3 %4: Новое значение для «%1», от %2 до %3 %4: New value for %1, from %2 to %3: Новое значение для «%1», от %2 до %3: Enter a new value from %1 to %2 %3: Введите новое значение от %1 до %2 %3: Enter a new value from %1 to %2: Введите новое значение от %1 до %2: AudioTargetFactory (auto) (авто) JACK Audio Connection Kit Ограничить воспроизведение выделением PulseAudio Server Сервер PulseAudio Core Audio Device Устройство Core Audio Default Soundcard Device Звуковая карта по умолчанию BZipFileDevice File is already open Этот файл уже открыт Append mode not supported Режим добавления в конец не поддерживается File access mode not specified Способ доступа к файлам не указан Read and write modes both specified Режимы чтения и записи определены Failed to open file for writing Не удалось открыть файл для записи Failed to open bzip2 stream for writing Не удалось открыть поток bzip2 для записи Failed to open file for reading Не удалось открыть файл для чтения Failed to open bzip2 stream for reading Не удалось открыть поток bzip2 для чтения Internal error (open for neither read nor write) Внутренняя ошибка (не открывается ни на чтение, ни на запись) File not open Файл не открыт bzip2 stream write close error Ошибка закрытия записи в поток bzip2 bzip2 stream read close error Ошибка закрытия чтения потока bzip2 Internal error (close for neither read nor write) Внутренняя ошибка (не закрывается ни чтение, ни запись) bzip2 stream read error Ошибка чтения потока bzip2 BundleCommand %1 (%n change(s)) %1 (%n изменение) %1 (%n изменения) %1 (%n изменений) CSVFileWriter Failed to open file %1 for writing Не удалось открыть файл %1 для записи CSVFormatDialog Select Data Format Выберите формат данных Each row specifies: Каждая строка определяет: A point in time Точку во времени A value at a time Значение во точке времени A set of values Серию значений The first column contains: Первый столбец содержит: Time, in seconds Время, в секундах Time, in audio sample frames Время, в выборках звуковых сэмплов Data (rows are consecutive in time) Данные (строки последовательны во времени) Please select the correct data format for this file. <ignore> Values (%1 more) Time Время End time Duration Длительность Value Значение Label Метка Timing is specified: Explicitly, in seconds Explicitly, in audio sample frames Implicitly: rows are equally spaced in time Audio sample rate (Hz): Частота сэмплирования звука (Гц): Frame increment between rows: Data will be displayed in a %1 layer. Example data from file: Пример данных из файла: <b>Select Data Format</b><p>Please select the correct data format for this file. <b>Выберите формат данных</b><p>Выберите правильный формат данных для этого файла. Colour3DPlotLayer Time: %1 - %2 Bin: %3 Value: %4 Время: %1 - %2 Bin: %3 Значение: %4 Linear Линейный <unknown> <неизвестно> Colour Цвет Scale Масштаб Normalize Columns Нормализовать столбцы Normalize Visible Area Нормализовать видимую область Log Логарифмический +/-1 ±1 Invert Vertical Scale Инвертировать масштаб по вертикали Always Opaque Всегда непрозрачно Absolute Абсолютный Gain Усиление Smooth Bin Scale Bins Бины dB Дб ColourMapper <unknown> <неизвестно> Default По умолчанию White on Black Белое на чёрном Black on White Чёрное на белом Red on Blue Красное на синем Yellow on Black Жёлтое на чёрном Blue on Black Синее на чёрном Sunset Закат Fruit Salad Фруктовый салат Banded В полоску Highlight Подсветка Printer Принтер High Gain CommandHistory &Undo &Отменить Ctrl+Z Ctrl+Z Re&do Ве&рнуть Ctrl+Shift+Z Ctrl+Shift+Z Nothing to undo Нет отменяемых действий Nothing to redo Нет повторяемых действий &Undo %1 &Отменить действие «%1» Re&do %1 Повто&рить действие «%1» Undo the last editing operation Отменить последнее действие правки Redo the last operation that was undone Повторить последнее действие правки Undo %1 Отмена действия «%1» Redo %1 Повтор действия «%1» CoreAudioFileReader Decoding %1... Декодируется %1... Dense3DModelPeakCache Dense 3-D Peak Cache DenseThreeDimensionalModel Dense 3-D Time Время Frame Выборка DenseTimeValueModel Dense Time-Value Document Set main model to %1 Сделать %1 основной моделью Clear main model Очистить основную модель EditableDenseThreeDimensionalModel Editable Dense 3-D FFTModel %1 Hz %1 Гц FFT FFT Fader Level: Off Уровень: выкл Level: %1%2.%3%4 dB Уровень: %1%2.%3%4 Дб Enter new fader level Ввведите новый уровень фейдера New fader level, from %1 to %2 dBFS: Новый уровень фейдера, от %1 до %2 dBFS: FeatureExtractionModelTransformer No factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?) Input model for feature extraction plugin "%1" is of wrong type (internal error?) Failed to instantiate plugin "%1" Cannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4) Failed to initialise feature extraction plugin "%1" Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3 Plugin "%1" has no outputs У расширения "%1" нет выходов Plugin "%1" has no output named "%2" У расширения "%1" нет выхода с названием "%2" FileSource Unsupported scheme in URL Неподдерживаемая схема URL Downloading %1... Скачивается %1... Failed to connect to FTP server Не удалось соединиться с FTP-сервером Login failed Не удалось авторизоваться Failed to change to correct directory Не удалось поменять на корректный каталог FTP download aborted Скачивание с FTP-сервера прервано Download cancelled Скачивание отменено Failed to create local file %1 Не удалось создать локальный файл %1 File contains no data! Файл не содержит данных! I Edit Data Изменить данные ImageDialog Image Изображение Label: Метка: File or URL: Файл или URL: Browse... Просмотр... Preview Предпросмотр Unsupported scheme in URL Неподдерживаемая схема URL The URL scheme "%1" is not supported Схема URL "%1" не поддерживается Opening image URL... Открывается изображение по URL... File download failed Не удалось скачать файл Failed to download URL "%1": %2 Не удалось скачать URL "%1": %2 ImageLayer In progress В процессе Select image Выбрать изображение Move Image Переместить изображение Drag Selection Перетащить выделение Resize Selection Изменить размер выделения Delete Selection Удалите выделение Re-align pasted items? Заново выровнять вставленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Вставить New Point Новая точка Opening image URL... Открывается изображение по URL... ImageModel Image Изображение Edit Image Изменить изображение Time Время Frame Выборка Label Метка Unknown Неизвестно Edit Data Изменить данные InteractiveFileFinder Select file Выберите файл All files (*.*) Все файлы (*.*) Select a session file Выберите файл сеанса Sonic Visualiser session files (*.sv) RDF files (%1) All files (*.*) Файлы сеансов Sonic Visualiser (*.sv) Файлы RDF (%1) Все файлы (*.*) Audio files (%1) All files (*.*) Звуковые файлы (%1) Все файлы (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) Все поддерживаемые типы файлов (%1 %2) XML-файлы слоёв Sonic Visualiser (*.svl) Разделённые запятой файлы данных (*.csv) Разделённые пробелом файлы .lab (*.lab) Файлы RDF (%2) Файлы MIDI (*.mid) Текстовые файлы (*.txt) Все файлы (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) Все поддерживаемые типы файлов (%1 %2) XML-файлы слоёв Sonic Visualiser (*.svl) Разделённые запятой файлы данных (*.csv) Разделённые пробелом файлы .lab (*.lab) Файлы RDF (%2) Текстовые файлы (*.txt) Все файлы (*.*) All supported files (*.sv %1 %2) Sonic Visualiser session files (*.sv) Audio files (%2) RDF files (%1) All files (*.*) Все поддерживаемые типы файлов (*.sv %1 %2) Файлы сеансов Sonic Visualiser (*.sv) Звуковые файлы (%2) Файлы RDF (%1) Все файлы (*.*) Image files (%1) All files (*.*) Файлы изображений (%1) Все файлы (*.*) All supported files (*.sv %1 %2 %3) Sonic Visualiser session files (*.sv) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) Все поддерживаемые типы файлов (*.sv %1 %2 %3) Файлы сеансов Sonic Visualiser (*.sv) Звуковые файлы (%1) Файлы слоев (%2) Файлы RDF (%3) Все файлы (*.*) File does not exist Файл не существует <b>File not found</b><p>File "%1" does not exist <b>Файл не найден</b><p>Файл "%1" не существует File is not readable Файл нечитаем <b>File is not readable</b><p>File "%1" can not be read <b>Файл нечитаем</b><p>Файл "%1" не может быть прочитан Directory selected Выбран каталог <b>Directory selected</b><p>File "%1" is a directory <b>Выбран каталог</b><p>Файл "%1" является каталогом Non-file selected Выбран не файл <b>Not a file</b><p>Path "%1" is not a file <b>Это не файл</b><p>Путь "%1" не является файлом File is empty Файл пуст <b>File is empty</b><p>File "%1" is empty <b>Пустой файл</b><p>Файл "%1" пуст Sonic Visualiser session files (*.sv) All files (*.*) Файлы сеансов Sonic Visualiser (*.sv) Все файлы (*.*) Select a file to export to Выберите файл, в который экспортировать WAV audio files (*.wav) All files (*.*) Звуковые файлы WAV (*.wav) Все файлы (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) XML-файлы слоёв Sonic Visualiser (*.svl) Разделённые запятой данные (*.csv) Файлы RDF/Turtle (%1) Файлы MIDI (*.mid) Текстовые файлы (*.txt) Все файлы (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) XML-файлы слоёв Sonic Visualiser (*.svl) Разделённые запятой данные (*.csv) Файлы RDF/Turtle (%1) Текстовые файлы (*.txt) Все файлы (*.*) Portable Network Graphics files (*.png) All files (*.*) Файлы Portable Network Graphics (*.png) Все файлы (*.*) File exists Такой файл уже существует <b>File exists</b><p>The file "%1" already exists. Do you want to overwrite it? <b>Файл существует</b>Файл "%1" уже существует. Вы хотите перезаписать его? <b>File not found</b><p>Audio file "%1" could not be opened. Do you want to locate it? <b>Файл не найден</b><p>Не удалось открыть звуковой файл "%1". Вы хотите указать его программе? <b>File not found</b><p>File "%1" could not be opened. Do you want to locate it? <b>Файл не найден</b><p>Не удалось открыть файл "%1". Вы хотите указать его программе? Failed to open file Не удалось открыть файл Locate file... Указать файл... Use URL... Использовать URL... Cancel Отменить Use URL Использовать URL Please enter the URL to use for this file: Укажите URL, который будет использоваться для этого файла: Failed to open location Не удалось открыть местоположение <b>Failed to open location</b><p>URL "%1" could not be opened <b>Не удалось открыть местоположение</b><p>Не удалось открыть URL "%1". ItemEditDialog Timing Тайминг Time: Время: frames выборок sec с usec мс Duration: Длительность: Properties Свойства Value: Значение: Text: Текст: OK ОК Reset Сбросить Cancel Отменить KeyReference & & <i>or</i>&nbsp;<b>%1</b> <i>или</i>&nbsp;<b>%1</b> </b>&nbsp;(%1)<b> </b>&nbsp;(%1)<b> Sonic Visualiser: Key and Mouse Reference Справка по использованию клавиатуры и мыши LabFileWriter Failed to open file %1 for writing Не удалось открыть файл %1 для записи LabelCounterInputDialog Set Counters Установка счётчиков Fine counter (beats): Точный счётчик (доли): Coarse counter (bars): Грубый счётчик (такты): Labeller No numbering Без нумерации Simple counter Простой счетчик Cyclical counter Циклический счетчик Cyclical two-level counter (bar/beat) Циклический двухуровневый счетчик (такт/доля) Audio sample frame number Номер выборки звукового сэмпла Time in seconds Время в секундах Duration to the following item Длительность до следующей отметки Tempo (bpm) based on duration to following item Темп (bpm) на основе длительности до следующей отметки Duration since the previous item Длительность после предыдущей отметки Tempo (bpm) based on duration since previous item Темп (bpm) на основе длительности после предыдущей отметки Same as the nearest previous item Как и ближайший предыдущий объект Value extracted from the item's label (where possible) Значение, извлечённое из метки объекта (если возможно) %1.%2 %1.%2 %1 %1 Label Points Layer Waveform Волновая форма Spectrogram Спектрограмма Ruler Линейка Time Instants Отметки времени Time Values Значения времени Notes Ноты Text Текст Colour 3D Plot Цветной 3D-график Layer Слой Spectrum Спектр Time Slice Images Изображения Regions Области Make Measurement Создать замер Delete Measurement Удалить замер Layer::AddMeasurementRectCommand Make Measurement Создать замер Layer::DeleteMeasurementRectCommand Delete Measurement Удалить замер LayerTreeDialog Layer Summary Сводка по слою Audio Data Sources Источники звуковых данных Panes and Layers Окна и слои LayerTreeModel Layer Слой Model Модель Shown Отображение Played Воспризведение MIDIFileImportDialog Merge all tracks Объединить все дорожки Merge all non-percussion tracks Объединить все неперкуссионные дорожки Select track or tracks to import Выберите одну или несколько дорожек для импорта <b>Select track to import</b><p>You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.<p>Please select the track or merged tracks you wish to import: <b>Выберите импортируемую дорожку</b><p>Вы можете импортировать этот файл лишь как одиночный слой аннотации, но в файле либо больше одной дорожки, либо ноты в более чем одном канале.<p>Выберите одну дорожку или несколько объединяемых дорожек для импорта: Error in MIDI file import Ошибка при импорте файла MIDI MIDIFileReader Wrong length for long data in MIDI stream (%1, should be %2) Неправильная длительность больших данных в потоке MIDI (%1, должно быть %2) Wrong length for int data in MIDI stream (%1, should be %2) Неправильная длительность int-данных в потоке MIDI (%1, должно быть %2) getMIDIByte called but no MIDI file open Функция getMIDIByte вызвана, но ни один файл MIDI не открыт End of MIDI file encountered while reading При чтении обнаружен конец файла MIDI Attempt to get more bytes than expected on Track Попытка получить из дорожки больше байтов, чем ожидалось Attempt to read past MIDI file end Попытка прочитать файл MIDI после его окончания getMIDIBytes called but no MIDI file open Функция getMIDIBytes вызвана, но ни один файл MIDI не открыт Attempt to get more bytes than available on Track (%1, only have %2) Попытка получить из дорожки больше байтов, чем ожидалось (%1, а есть лишь %2) getNumberFromMIDIBytes called but no MIDI file open Функция getNumberFromMIDIBytes вызвана, но ни один файл MIDI не открыт skipToNextTrack called but no MIDI file open Функция skipToNextTrack вызвана, но ни один файл MIDI не открыт Invalid event code %1 found Обнаружен некорректный код события %1 Running status used for first event in track MIDI file "%1" has no notes in any track Ни в одной дорожке файла MIDI "%1" нет нот - uses GM percussion channel — использует канал перкуссии GM Track %1 (%2)%3 Дорожка %1 (%2)%3 Track %1 (untitled)%3 Дорожка %1 (без имени)%3 %1 - vel %2 %1 - vel %2 MIDIInput Input Вход MP3FileReader Decoding %1... Декодируется %1... MainWindow Sonic Visualiser Sonic Visualiser &Layer С&лой &File &Файл File Toolbar Панель файлов &New Session &Создать сеанс Ctrl+N Ctrl+N &Open Session... &Открыть сеанс... Ctrl+O Ctrl+O Open a previously saved Sonic Visualiser session file Открыть файл сохранённого ранее сеанса Sonic Visualiser &Open... О&ткрыть... Open a session file, audio file, or layer Открыть файл сеанса, звуковой файл или слой &Save Session Сохр&анить сеанс Ctrl+S Ctrl+S Save the current session into a Sonic Visualiser session file Сохранить в файл текущий сеанс Sonic Visualiser Save Session &As... Сохранить сеанс &как... Save the current session into a new Sonic Visualiser session file Сохранить текущий сеанс Sonic Visualiser в файл с другим именем &Import Audio File... &Импортировать звуковой файл... Ctrl+I Ctrl+I Import an existing audio file Импортировать существующий звуковой файл Import Secondary Audio File... Импортировать второй звуковой файл... Ctrl+Shift+I Ctrl+Shift+I Import an extra audio file as a separate layer Импортировать ещё один звуковой файл в отдельный слой &Export Audio File... Э&кспортировать звуковой файл... Export selection as an audio file Экспортировать выделенное в звуковой файл Import Annotation &Layer... И&мпортировать слой аннотаций... Ctrl+L Ctrl+L Import layer data from an existing file Импортировать данные слоя из существующего файла Export Annotation Layer... Экспортировать слой аннотаций... Export layer data to a file Экспортировать данные слоя в файл &Quit В&ыход Ctrl+Q Ctrl+Q &Edit &Правка Cu&t &Вырезать Ctrl+X Ctrl+X &Copy С&копировать Ctrl+C Ctrl+C &Paste Вст&авить Ctrl+V Ctrl+V &Delete Selected Items &Удалить выбранное Del Del Select &All В&ыделить всё Ctrl+A Ctrl+A Select &Visible Range Вы&делить всё видимое Ctrl+Shift+A Ctrl+Shift+A Select to &Start Выделить до &начала Shift+Left Shift+Left Select to &End Выделить до &конца Shift+Right Shift+Right C&lear Selection Сн&ять выделение Esc Esc &Insert Instant at Playback Position Вставить &отметку в точку воспроизведения Enter Enter &View &Вид 0 0 9 9 8 8 Scroll &Left Прокрутить в&лево Abandon the current %1 session and start a new one Replace &Main Audio... Replace the main audio file of the session with a different file Save the current session into a %1 session file Save the current session into a new %1 session file Exit %1 Reset Numbering Counters Reset to 1 all the counters used for counter-based labelling Left Влево Scroll the current pane to the left Прокрутить активное окно влево Scroll &Right Прокрутить в&право Right Вправо Scroll the current pane to the right Прокрутить активное окно вправо Ctrl+Left Ctrl+Влево Scroll the current pane a big step to the left Сделать большой шаг прокрутки влево Ctrl+Right Ctrl+Вправо Scroll the current pane a big step to the right Сделать большой шаг прокрутки вправо Zoom &In При&близить Up Вверх Increase the zoom level Увеличить масштаб отображения Zoom &Out &Отдалить Down Вниз Decrease the zoom level Уменьшить масштаб отображения Restore &Default Zoom &Восстановить обычный масштаб Zoom to &Fit &Уместить в окне Zoom to show the whole file Увидеть весь файл Show &Centre Line ' Show or hide the centre line Toggle All Time Rulers Hide times, layer names, and scale Show times and basic scale Show times, layer names, and scale Go Full-Screen F11 F11 Expand the pane area to the whole screen &Pane &Окно Add &New Pane Добавить &новое окно Add a new pane containing only a time ruler Добавить новое окно, содержащее только линейку времени Add New %1 Layer Добавить новый слой «%1» Add a new empty layer of type %1 Добавить новый пустой слой типа «%1» Add &Waveform Добавить &волновую форму Add a new pane showing a waveform view Добавить новое окно с видом волновой формы Add a new layer showing a waveform view Добавить новый слой с видом волновой формы Add &Melodic Range Spectrogram Добавить спектограмму &мелодического диапазона Add a new pane showing a spectrogram set up for tracking frequencies Добавить новое окно, отображающее спектрограмму для отслеживания частот Add a new layer showing a spectrogram set up for tracking frequencies Добавить новый слой, отображающий спектрограмму для отслеживания частот &All Channels Mixed Все &каналы сведены &All Channels &Все каналы Channel &%1 Канал &%1 &Delete Pane У&далить окно Add &Time Ruler Добавить линейку &времени Add a new layer showing a time ruler Добавить новый слой с линейкой Add &Existing Layer Добавить &существующий слой &Rename Layer... &Переименовать слой... Rename the currently active layer Переименовать активный слой &Delete Layer &Удалить слой Delete the currently active layer Удалить активный слой &Help &Справка &Help Reference &Руководство пользователя Open the Sonic Visualiser reference manual Открыть справку по Sonic Visualiser Sonic Visualiser on the &Web &Веб-сайт Sonic Visualiser Open the Sonic Visualiser website Открыть веб-сайт Sonic Visualiser &About Sonic Visualiser &О Sonic Visualiser Show information about Sonic Visualiser Показать информацию о Sonic Visualiser Rewind to Start Перемотать в начало Home Домой Rewind to the start Перемотать в начало Rewind Перемотать назад Rewind to the previous time instant in the current layer Перемотать до предыдущей отметки времени в текущем слое Play / Pause Воспроизвести / Приостановить Space Пробел Start or stop playback from the current position Запустить или остановить воспроизведение с текущей позиции Fast Forward Перемотать вперёд Fast forward to the next time instant in the current layer Перемотать до следующей отметки времени в текущем слое Fast Forward to End Перемотать до конца Open a window showing the keystrokes you can use in %1 %1 on the &Web Open the %1 website &About %1 Show information about %1 End Конец Fast-forward to the end Перемотать до конца Play Mode Toolbar Панель режима воспроизведения Constrain Playback to Selection Ограничить воспроизведение выделением s с Loop Playback Воспроизведение в цикле l l Loop playback Воспроизведение в цикле Edit Toolbar Панель правки Tools Toolbar Панель инструментов Navigate Перемещение 1 1 Select Выделение 2 2 Edit Правка 3 3 Draw Рисование 4 4 No audio file loaded. Ни один звуковой файл не загружен. %1Hz (resampling to %2Hz) %1 Гц (ресэмплирование до %2 Гц) Failed to open file Не удалось открыть файл Export the selected region only Экспортировать только выделенную область Export the whole audio file Экспортировать весь звуковой файл Select region to export Выделите область для экспорта Which region from the original audio file do you want to export? Какую область исходного звукового файла вы хотите экспортировать? Export the selected regions into a single audio file Экспортировать выделенные области в один звуковой файл Export the selected regions into separate files Экспортировать выделенные области в разные звуковые файлы Multiple regions of the original audio file are selected. What do you want to export? Выбрано несколько областей исходного звукового файла. Какую из них вы хотите экспортировать? Fragment file %1 already exists, aborting Файл фрагмента %1 уже существует, прерывание Failed to write file Не удалось записать файл Failed to open file %1 for writing Не удалось открыть файл %1 для записи Sonic Visualiser: %1 Sonic Visualiser: %1 Session modified Сеанс изменен Failed to save file Не удалось сохранить файл Rename Layer Переименовать слой New name for this layer: Новое имя этого слоя: Sample rate mismatch Несоответствие частоты дискретизации Failed to regenerate layer Не удалось повторно создать слой http://www.sonicvisualiser.org/ http://www.sonicvisualiser.org/ Release %1 : Revision %2 Версия %1 : Редакция %2 Release %1 Версия %1 Unreleased : Revision %1 Не выпущено : редакция %1 <h3>About Sonic Visualiser</h3> <h3>О программе Sonic Visualiser</h3> Debug Отладка Release Версия <br>With Ogg file decoder (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>С декодером Ogg (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>With LADSPA plugin support (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>С поддержкой расширений LADSPA (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>With DSSI plugin support (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton <br>С поддержкой расширений DSSI (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton About Sonic Visualiser О программе Sonic Visualiser Failed to generate layer Не удалось создать слой Adjust the application preferences Изменить параметры работы приложения &Recent Files Н&едавние файлы &Preferences... &Параметры... ; ; Show &Zoom Wheels Показывать &колёса масштабирования Z Z Show thumbwheels for zooming horizontally and vertically Показывать колёса для масштабирования по горизонтали и вертикали %1 by Category %1 по категории Unclassified Неклассифицированные %1 by Maker %1 по имени создателя Unknown Неизвестен %1 by Plugin Name %1 по названию расширения %1... %1... Add Spectr&um Добавить &график спектральной функции Add a new pane showing a frequency spectrum Добавить новое окно с частотой спектра Add a new layer showing a frequency spectrum Добавить новый слой с частотой спектра Playback Speedup Ускорение воспроизведения &Transform Пр&еобразования %1: %2 %1: %2 &Recent Transforms &Недавние преобразования [\(<].*$ [\(<].*$ Audio processing overload Перегрузка в обработке звука Show Property Bo&xes Показывать панели с&войств X X Show the layer property boxes at the side of the main window Показывать панели свойств слоёв сбоку от основного окна Add %1 Pane Добавить окно %1 Abandon the current Sonic Visualiser session and start a new one Отказаться от текущего сеанса Sonic Visualiser и начать новый Open Lo&cation... Открыть &местоположение... Ctrl+Shift+O Ctrl+Shift+O Open or import a file from a remote URL Открыть или импортировать файл с удалённого узла Exit Sonic Visualiser Завершить работу с Sonic Visualiser Cut the selection from the current layer to the clipboard Вырезать выделение из активного слоя в буфер обмена Copy the selection from the current layer to the clipboard Скопировать выделение из активного слоя в буфер обмена Paste from the clipboard to the current layer Вставить содержимое буфера обмена в активный слой Select the whole duration of the current session Выбрать данные по всей длительности активнонр сеанса Select the time range corresponding to the current window width Сделать временной диапазон равным активной ширине окна Select from the start of the session to the current playback position Выделить от начала сеанса до текущей точки воспроизведения Select from the current playback position to the end of the session Выделить от текущей точки воспроизведения до конца сеанса Clear the selection Очистить выделение Insert a new time instant at the current playback position, in a new layer if necessary Вставить новую отметку времени в точку воспроизведения, при необходимости — в новый слой Insert Instants at Selection &Boundaries Вставить отметки времени по &краям выделения Shift+Enter Shift+Enter &Jump Left Перескочить в&лево J&ump Right П&ерескочить вправо Restore the zoom level to the default Восстановить обычный масштаб отображения Show &No Overlays Не по&казывать перекрытия совсем Hide centre indicator, frame times, layer names and scale Спрятать индикацию центра, времён выделения, имена слоёв и масштаб Show &Minimal Overlays Показывать &минимум перекрытий Show centre indicator only Показывать только индикатор центра Show &Standard Overlays Показывать о&бычные перекрытия Show centre indicator, frame times and scale Показывать индикатор центра, времена выделений, имена слоёв и масштаб Show &All Overlays Показывать в&се перекрытия 7 7 Show all texts and scale Показывать весь текст и масштаб Show Status &Bar Показывать статусную &строку Show context help information in the status bar at the bottom of the window Показывать контекстную справку в статусной строке, находящейся внизу окна программы Add a new pane showing a spectrogram Добавить новое окно с отображением спектрограммы Add a new layer showing a spectrogram Добавить новый слой с отображением спектрограммы Add a new pane showing a spectrogram set up for an overview of note pitches Добавить новое окно, отображающее спектрограмму для обзора высоты тона нот Add a new layer showing a spectrogram set up for an overview of note pitches Добавить новый слой, отображающий спектрограмму для обзора высоты тона нот Delete the currently active pane Удалить активное окно Add S&lice of Layer Добавить &фрагмент слоя Select ranges Выбрать диапазон Edit items in layer Изменить объекты слоя Draw new items in layer Нарисовать новые объекты в слое Open Location Открыть местоположение Please enter the URL of the location to open: Введите URL открываемого местоположения: Failed to open location Не удалось открыть местоположение Visible: %1 to %2 (duration %3) Видимая область: от %1 до %2 (длительность %3) Adjust the master playback level Изменить общую громкость воспроизведения Adjust the master playback speed Изменить общую скорость воспроизведения <br>With Ogg file decoder &copy; CSIRO Australia <br>С декодером Ogg &copy; CSIRO Australia <br>With MAD mp3 decoder &copy; Underbit Technologies Inc <br>С декодером MAD mp3 &copy; Underbit Technologies Inc <br>With libsamplerate &copy; Erik de Castro Lopo <br>С libsamplerate &copy; Erik de Castro Lopo <br>With libsndfile &copy; Erik de Castro Lopo <br>С libsndfile &copy; Erik de Castro Lopo <br>With FFTW3 &copy; Matteo Frigo and MIT <br>С FFTW3 &copy; Matteo Frigo и MIT <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam <br>С поддержкой расширений Vamp (API v%1, host SDK v%2) &copy; Chris Cannam <br>With Serd and Sord RDF parser and store &copy; David Robillard <br>With Dataquay Qt/RDF library &copy; Chris Cannam <br>With liblo Lite OSC library &copy; Steve Harris <br>С liblo Lite OSC library &copy; Steve Harris Export Image File... Экспортировать в файл изображения... Export a single pane to an image file Экспортировать всё окно в файл изображения Export the whole pane (%1x%2 pixels) Экспортировать всё окно (%1x%2 пикселов) Export the visible area only (%1x%2 pixels) Экспортировать только видимую часть (%1x%2 пикселов) Export the selection extent (%1x%2 pixels) Экспортировать выделение (%1x%2 пикселов) Export the selection extent Экспортировать выделение Which region of the current pane do you want to export as an image? Какую область текущего окна вы хотите экспортировать как изображение? Note: the whole pane is too wide to be exported as a single image. Примечание: всё окно слишком широко, чтобы сохранить его как изображение. Failed to save image file Не удалось сохранить файл изображения Failed to save image file %1 Не удалось сохранить файл изображения %1 Selection: %1 to %2 (duration %3) Выделение: %1 до %2 (длительность %3) Black Чёрный Red Красный Blue Синий Green Зелёный Purple Пурпурный Orange Оранжевый White Белый Bright Red Ярко-красный Bright Blue Ярко-синий Bright Green Ярко-зелёный Bright Purple Ярко-пурпурный Bright Orange Ярко-оранжевый File and Session Management Файлы и управление сеансами &Import More Audio... Import an extra audio file into a new pane Open &Recent &Export Audio Data... Export audio from selection into a data file Apply Session Template Export Session as Template... Manage Exported Templates Editing Редактирование Paste at Playback Position Ctrl+Shift+V Paste from the clipboard to the current layer, placing the first item at the playback position Delete items in current selection from the current layer Удалить объекты в активном выделении текущего слоя Selection Выделение Tapping Time Instants Insert new time instants at the start and end of the current selected regions, in a new layer if necessary Number New Instants with Способ нумерации новых отметок Cycle size Размер цикла Set Numbering Counters... Установить счетчики нумерации... Set the counters used for counter-based labelling Устанолвить счетчики для меток на основе подсчета Renumber Selected Instants Перенумеровать выбранные отметки Renumber the selected instants using the current labelling scheme Panning and Navigation Прокрутка и перемещение Zoom Масштаб просмотра F F Display Features Отображение элементов # Show or hide all time rulers Show La&yer Summary &Показать сводку по слою Y Y Open a window displaying the hierarchy of panes and layers in this session Открыть окно, в котором отобразится иерархия окон и слоев активного сеанса Managing Panes and Layers Управление окнами и слоями N N T T W W Shift+W Add Spectro&gram Добавить &спектограмму G G Shift+G M M Shift+M Add Pea&k Frequency Spectrogram Добавить спектограмму &пиковой частоты K K Shift+K U U Shift+U Switch to Previous Pane Перейти к предыдущему окну [ [ Make the next pane up in the pane stack current Switch to Next Pane Перейти к следующему окну ] ] Make the next pane down in the pane stack current Ctrl+Shift+D Ctrl+Shift+D R R Edit Layer Data Изменить данные слоя E E Edit the currently active layer as a data grid Изменить активный слой как сетку данных Ctrl+D Ctrl+D Help Справка F1 F1 Open the %1 reference manual &Key and Mouse Reference &Использование клавиатуры и мыши F2 F2 Open a window showing the keystrokes you can use in Sonic Visualiser Открыть окно, в котором перечисляются клавиатурные комбинации Sonic Visualiser Ctrl+R Ctrl+R Re-open Повторно открыть Re-open the current or most recently opened file Повторно открыть активный или недавно открывавшийся файл Standard Waveform Choose Default Template... Ctrl+T Ctrl+T Repeat Transform Повторить преобразование Re-select the most recently run transform Повторно запустить самое последнее выполнявшееся преобразование Playback and Transport Controls Управление воспроизведением и перемоткой Play&back Воспро&изведение Playback Воспроизведение Playback Toolbar Панель воспроизведения PgUp PgUp Rewind to the previous time instant or time ruler notch PgDown PgDown Fast-forward to the next time instant or time ruler notch Constrain playback to the selected regions Solo Current Pane Соло активного окна o o Solo the current pane during playback При воспроизведении звучит лишь активное окно Align File Timelines Выровнять линейки времени Treat multiple audio files as versions of the same work, and align their timelines Speed Up Ускорить Ctrl+PgUp Ctrl+PgUp Time-stretch playback to speed it up without changing pitch Сжать время воспроизведения, не меняя высоту тона Slow Down Замедлить Ctrl+PgDown Ctrl+PgDown Time-stretch playback to slow it down without changing pitch Расширить время воспроизведения, не меняя высоту тона Restore Normal Speed Восстановить обычную скорость Ctrl+Home Ctrl+Home Restore non-time-stretched playback Восстановить естественную скорость воспроизведения Tool Selection Выбор инструмента Erase Стерка 5 5 Erase items from layer Стирать объекты слоя Measure Измеритель 6 6 Make measurements in layer Выполнять измерения в слое &Delete Current Measurement &Удалить активный замер Delete the measurement currently under the mouse pointer Удалить замер, находящийся под курсором мыши Fast Forward to Next Instant Rewind to Previous Instant Fast Forward to Next Point Fast forward to the next point in the current layer Rewind to Previous Point Rewind to the previous point in the current layer Fast forward Быстрый вперед <b>File open failed</b><p>Audio file "%1" could not be opened <b>Не удалось открыть файл</b><p>Не удалось открыть звуковой файл "%1" Export the selected regions into a single file Export the whole file <b>File open failed</b><p>Layer file %1 could not be opened. <b>Не удалось открыть файл</b><p>Не удалось открыть файл слоя "%1" Can't export non-note layers to MIDI Невозможно экспортировать ненотные слои в MIDI Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) <b>File open failed</b><p>Session file "%1" could not be opened <b>Не удалось открыть файл</b><p>Не удалось открыть файл сеанса "%1" <b>File open failed</b><p>File "%1" could not be opened <b>Не удалось открыть файл</b><p>Не удалось открыть файл "%1" <b>Open failed</b><p>URL "%1" could not be opened <b>Не удалось открыть ссылку</b><p>Не удалось открыть URL "%1" <b>Open failed</b><p>File or URL "%1" could not be opened <b>Не удалось открыть ссылку</b><p>Не удалось открыть файл или URL "%1" Enter template name Please enter a name for the saved template: Set as default template for future audio files Template file exists <b>Template file exists</b><p>The template "%1" already exists.<br>Overwrite it? Failed to open dropped URL Не удалось открыть URL, перемещенный мышью в окно программы <b>Open failed</b><p>Dropped URL "%1" could not be opened <b>Не удалось открыть ссылку</b><p>Не удалось открыть файл URL "%1", перетащенный в окно программы мышью <b>Session modified</b><p>The current session has been modified.<br>Do you want to save it? <b>Сеанс изменился</b><p>Активный сеанс изменился<br>Вы хотите сохранить его? <b>Save failed</b><p>Session file "%1" could not be saved. <b>Не удалось сохранить файл</b><p>Не удалось сохранить файл сеанса "%1" %1: %1 %1: %1 {1:?} Playback speed: Normal Скорость воспроизведения: обычная Playback speed: %1%2% Скорость воспроизведения: %1%2% <b>Wrong sample rate</b><p>The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).<p>The file will play at the wrong speed and pitch.<p>Change the <i>Resample mismatching files on import</i> option under <i>File</i> -> <i>Preferences</i> if you want to alter this behaviour. <b>Overloaded</b><p>Audio effects plugin auditioning has been disabled due to a processing overload. Reset Counters Обнуление счетчиков <b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform "%1" failed:<p>%2 <b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform "%1" failed.<p>No error information is available. Warning Предупреждение <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed:<p>%3 <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed.<p>No error information is available. <b>Warning when regenerating layer</b><p>When regenerating the derived layer "%1" using new data model as input:<p>%2 Failed to calculate alignment Не удалось рассчитать выравнивание <b>Alignment calculation failed</b><p>Failed to calculate an audio alignment using transform "%1":<p>%2 <br>With JACK audio output library &copy; Paul Davis and Jack O'Quin <br>С библиотекой JACK &copy; Paul Davis и Jack O'Quin <br>With PortAudio audio output library &copy; Ross Bencina and Phil Burk <br>С библиотекой PortAudio &copy; Ross Bencina и Phil Burk <br>With PulseAudio audio output library &copy; Lennart Poettering and Pierre Ossman <br>С библиотекой PulseAudio &copy; Lennart Poettering и Pierre Ossman <b>Overloaded</b><p>Audio playback speed processing has been reduced to a single channel, due to a processing overload. <br>With Rubber Band &copy; Chris Cannam <br>С Rubber Band &copy; Chris Cannam Find a Transform... Найти эффект трансформации... Search for a transform from the installed plugins, by name or description Найти эффект трансформации среди установленных расширений по названию или описанию Ctrl+M Ctrl+M <p>Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> <p>Sonic Visualiser — программа для просмотра и исследования звукозаписей с целью семантического анализа и аннотации музыки.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> <p><small>%1 : %2 configuration</small></p> <p><small>%1 : конфигурация %2</small></p> With Qt v%1 &copy; Nokia Corporation С использованием Qt v%1 &copy; Nokia Corporation <br>With JACK audio output library v%1 &copy; Paul Davis and Jack O'Quin <br>С библиотекой JACK v%1 &copy; Paul Davis и Jack O'Quin <br>With PulseAudio audio output library v%1 &copy; Lennart Poettering and Pierre Ossman <br>С библиотекой PulseAudio v%1 &copy; Lennart Poettering и Pierre Ossman <br>With MAD mp3 decoder v%1 &copy; Underbit Technologies Inc <br>С декодером mp3 MAD v%1 &copy; Underbit Technologies Inc <br>With libsamplerate v%1 &copy; Erik de Castro Lopo <br>С libsamplerate v%1 &copy; Erik de Castro Lopo <br>With libsndfile v%1 &copy; Erik de Castro Lopo <br>С libsndfile v%1 &copy; Erik de Castro Lopo <br>With FFTW3 v%1 &copy; Matteo Frigo and MIT <br>С FFTW3 v%1 &copy; Matteo Frigo и MIT <br>With Rubber Band v%1 &copy; Chris Cannam <br>С Rubber Band v%1 &copy; Chris Cannam <br>With Raptor RDF parser v%1 &copy; Dave Beckett and the University of Bristol <br>С парсером RDF Raptor v%1 &copy; Dave Beckett и Бристольский университет <br>With Raptor RDF parser &copy; Dave Beckett and the University of Bristol <br>С парсером RDF Raptor &copy; Dave Beckett и Бристольский университет <br>With Rasqal RDF query engine v%1 &copy; Dave Beckett and the University of Bristol <br>С движком запросов RDF Rasqal v%1 &copy; Dave Beckett и Бристольский университет <br>With Rasqal RDF query engine &copy; Dave Beckett and the University of Bristol <br>С движком запросов RDF Rasqal &copy; Dave Beckett и Бристольский университет <br>With Redland RDF datastore v%1 &copy; Dave Beckett and the University of Bristol <br>C хранилищем данных RDF Redland v%1 &copy; Dave Beckett и Бристольский университет <br>With Redland RDF datastore &copy; Dave Beckett and the University of Bristol <br>C хранилищем данных RDF Redland &copy; Dave Beckett и Бристольский университет <br>With liblo Lite OSC library v%1 &copy; Steve Harris <br>С библиотекой OSC liblo v%1 &copy; Steve Harris </small><p><small>The OSC URL for this instance is: "%1" </small><p><small>Адрес OSC для этого сеанса: "%1" With С Using Используя Peek Left Глянуть влево Alt+Left Alt+влево Scroll the current pane to the left without moving the playback cursor or other panes Peek Right Глянуть вправо Alt+Right Alt+вправо Scroll the current pane to the right without moving the playback cursor or other panes Show Acti&vity Log Показать &журнал действий Open a window listing interactions and other events Открыть окно со списком всех действий в сеансе Export multiple audio files Экспортировать несколько звуковых файлов Export audio to "%1" Экспорт звука в "%1" <b>Audio required</b><p>Unable to load layer data from "%1" without an audio file.<br>Please load at least one audio file before importing annotations. Export layer to "%1" Экспорт слоя в "%1" Export image to "%1" Экспорт изображения в "%1" Close the current session and create a new one Add this data to the current session Добавить эти данные в активный сеанс Select target for import Выбрать цель для импорта <b>Select a target for import</b><p>This RDF document refers to one or more audio files.<br>You already have an audio waveform loaded.<br>What would you like to do with the new data? <b>Выберите цель импорта</b><p>Этот документ RDF ссылается на один или более звуковых файлов.<br>У вас уже есть один загруженный звуковой файл.<br>Что вы хотите сделать с новыми данными? Save session as "%1" Сохранение сеанса как "%1" Add Point Добавить точку http://www.sonicvisualiser.org/doc/reference/%1/en/ http://www.sonicvisualiser.org/doc/reference/%1/en/ <br>With RtMidi &copy; Gary P. Scavone <br>С RtMidi &copy; Gary P. Scavone Ctrl+Shift+S Ctrl+Shift+S Insert Item at Selection Вставить объект в выделение Ctrl+Shift+Enter Ctrl+Shift+Enter Insert a new note or region item corresponding to the current selection Rewind to Similar Point Назад к первой схожей точке Shift+PgUp Shift+PgUp Rewind to the previous similarly valued time instant Fast Forward to Similar Point Вперед к первой схожей точке Shift+PgDown Shift+PgDown Fast-forward to the next similarly valued time instant 1. %2 1. %2 %1. %2 %1. %2 Select audio file to export Укажите экспортируемый звуковой файл Which audio file do you want to export from? Какой звуковой файл вы хотите экспортировать? Newer version available Доступна более новая версия <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %3 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> <h3>Доступна более новая версия</h3><p>Вы используетее Sonic Visualiser версии %1, но уже доступна версия %3.</p><p>Загляните на <a href="http://sonicvisualiser.org/">сайт Sonic Visualiser</a> за подробностями.</p> MainWindowBase %1 (modified) %1 (изменен) (modified) (изменен) Cut Вырезать Paste Вставить Add Point Добавить точку Add Point at %1 s Добавить точку по отметке %1 с Opening file or URL... Открывается файл или URL... Replace the existing main waveform Заменить существующую основную волновую форму Load this file into a new waveform pane Загрузить этот файл в новое окно волновой формы Select target for import Выбрать цель для импорта <b>Select a target for import</b><p>You already have an audio file loaded.<br>What would you like to do with the new audio file? %1: %2 %1: %2 %1: %2 [%3] %1: %2 [%3] Import "%1" Импортировать "%1" Opening playlist... Открывается список воспроизведения... Opening session... Открывается сеанс... SV XML file read error: %1 Ошибка чтения XML-файла SV: %1 Open session template "%1" <b>Failed to import RDF</b><p>No suitable data models found for import from RDF document at "%1"</p> Couldn't open audio device Не удалось открыть звуковое устройство Failed to write file Не удалось записать файл <b>Save failed</b><p>Failed to write to file "%1": %2 <b>Не удалось сохранить</b><p>Не удалось записать файл "%1": %2 Add Pane Добавить окно Remove Pane Удалить окно Delete Pane Удалить окно Playing: %1 of %2 (%3 remaining) Воспроизводится: %1 из %2 (осталось %3) <b>No audio available</b><p>Could not open an audio device for playback.<p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <b>Беззвучный режим</b><p>Не удалось открыть звуковое устройство для воспроизведения.<p>Не удалось автоматически определить звуковое устройство. На этот раз придется обойтись без воспроизведения звука.</p> Close the current session and start a new one Replace the main audio file in this session Add the audio file to this session <b>No audio available</b><p>Failed to open your preferred audio device ("%1").<p>Audio playback will not be available during this session.</p> <b>Беззвучный режим</b><p>Не удалось открыть предпочитаемое звуковое устройство («%1»).<p>На этот раз придется обойтись без воспроизведения звука.</p> Importing from RDF... Выполняется импорт из RDF... <b>Select a target for import</b><p>You already have an audio waveform loaded.<br>What would you like to do with the new audio file? <b>Выберите цель импорта</b><p>У вас уже есть один загруженный звуковой файл.<br>Что вы хотите сделать с новыми звуковыми данными? Import audio file "%1" Импорт звукового файла "%1" Import layer XML file "%1" Импорт XML-файла слоя "%1" Import MIDI file "%1" Импорт файла MIDI "%1" Import session file "%1" Импорт файла сеанса "%1" Failed to import RDF Не удалось импортировать RDF <b>Failed to import RDF</b><p>Importing data from RDF document at "%1" failed: %2</p> <b>Не удалось импортировать RDF</b><p>Не удалось импортировать данные из документа RDF "%1": %2</p> Import RDF document "%1" Импорт документа RDF "%1" Add Item at %1 s Добавить объект в позицию %1с MainWindowBase::AddPaneCommand Add Pane Добавить окно MainWindowBase::RemovePaneCommand Remove Pane Удалить окно ModelDataTableDialog Data Editor Редактор данных Playback Toolbar Панель воспроизведения Play Mode Toolbar Панель режима воспроизведения Track Playback Переключить воспроизведение Toggle tracking of playback position Переключить отслеживание позиции воспроизведения Edit Toolbar Панель правки Insert New Item Вставить новый объект Insert Вставить Insert a new item Вставить новый объект Delete Selected Items Удалить выбранные объекты Delete Удалить Delete the selected item or items Удалить выбранные объекты Data in Layer Данные в слое Find: Искать: ModelMetadataModel Type Тип Name Название Maker Создатель Source Источник ModelTransformerFactory %1 <%2> %1 <%2> %1: %2 %1: %2 NoteLayer New Point Новая точка Vertical Scale Верт. масштаб Auto-Align Автовыравнивание In progress В процессе No local points Нет локальных точек Time: %1 Pitch: %2 Duration: %3 No label Время: %1 Высота тона: %2 Длительность: %3 Без метки Time: %1 Pitch: %2 Duration: %3 Label: %4 Время: %1 Высота тона: %2 Длительность: %3 Метка: %4 Draw Point Нарисовать точку Drag Point Перетащить точку Edit Point Изменить точку Relocate Point Переместить точку Change Point Value Изменить значение точки Drag Selection Перетащить выделение Resize Selection Изменить размер выделения Delete Selected Points Удалить выбранные точки Paste Вставить Scale Units Единицы шкалы Scale Масштаб Linear Линейный Log Логарифмический MIDI Notes Ноты MIDI %1 %2 %1 %2 Erase Point Стереть точку Re-align pasted items? Заново выровнять вставленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Record Note %1 (%2, %3 Hz) %1 (%2, %3 Гц) %1 Hz (%2, %3) %1Гц (%2, %3) NoteModel Note Нота Time Время Frame Выборка Pitch Высота тона Duration Длительность Level Уровень Label Метка Unknown Неизвестно Edit Data Изменить данные OggVorbisFileReader Decoding %1... Декодируется %1... Overview Overview Обзор Click and drag to navigate; double-click to jump Щёлкните и потащите для перемещения по окну; щёлкните дважды для скачка Pane Some lengthy prefix: Некий длинный префикс: (R) (R) (X) (X) %1 / %2Hz%3 %1 / %2 Гц%3 Drag Selection Перетащить выделение Resize Selection Изменить выделение Horizontal Zoom Горизонтальное масштабирование Vertical Zoom Вертикальное масштабирование Enter new range Введите новый диапазон New vertical display range, from %1 to %2 %4: Новый диапазон отображения по вертикали, от %1 до %2 %4: Click and drag to navigate Щёлкните и потащите для перемещения по окну Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate Щёлкните и потащите для выделения области; + Shift — для отключения прилипания к объектам; + Ctrl — для выделения нескольких объектов, + средняя клавиша мыши — для перемещения по окну Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate Щёлкните и потащите для выделения области; + Shift — для отключения прилипания к объектам; + Cmd — для выделения нескольких объектов, + средняя клавиша мыши — для перемещения по окну Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate Щёлкните и потащите для выделения диапазона; + Ctrl — для выделения нескольких объектов, + средняя клавиша мыши — для перемещения по окну Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate Щёлкните и потащите для выделения диапазона; + Cmd — для выделения нескольких объектов, + средняя клавиша мыши — для перемещения по окну Click and drag to move the selection boundary Щёлкните и потащите для перемещения границ выделения Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate Щёлкните и потащите для выделения области; + Shift — для отключения прилипания к объектам; + средняя клавиша мыши — для перемещения по окну Click and drag to select a range; middle-click and drag to navigate Щёлкните и потащите для выделения области; + средняя клавиша мыши — для перемещения по окну Click to add a new item in the active layer Щёлкните для добавления нового объекта на активный слой Click and drag to move all items in the selected range Щёлкните и потащите все объекты в выделенной области Click and drag to adjust the visible range of the vertical scale Щёлкните и потащите для смены видимого диапазона масштабирования по вертикали Click and drag to adjust the vertical zoom level Щёлкните и потащите для смены уровня масштабирования по вертикали Click and drag to adjust the horizontal zoom level Щёлкните и потащите для смены уровня масштабирования по горизонтали Reset horizontal and vertical zoom levels to their defaults Сбросить уровни масштабирования по горизонтали и вертикали до исходных значений Reference Unaligned Aligning: %1% Aligned %1 - %2 %1 - %2 +%1 Zoom Масштабирование отображения Zoom In Приблизить Wheel Up Колесом вверх Zoom Out Отдалить Wheel Down Колесом вниз General Pane Mouse Actions Использование мыши в окнах Wheel Колесо Zoom in or out in time axis Приближение и отдаление по временной шкале Ctrl+Wheel Ctrl+прокрутка Scroll Прокручивать окно сеанса Scroll rapidly left or right in time axis Быстро перемещаться вправо и влево по временной шкале Zoom Vertically Вертикальный масштаб Shift+Wheel Shift+прокрутка Zoom in or out in the vertical axis Масштабировать отображение по вертикальной оси Scroll Vertically Прокрутка по вертикали Alt+Wheel Alt+Колесо Scroll up or down in the vertical axis Прокручивать отображение по вертикальной оси Navigate Перемещение Middle Click middle button and drag to navigate with any tool Relocate Перемещение скачком Double-Click Middle Двойной щелчок средней клавишей Double-click middle button to relocate with any tool Перескочить вправо или влево в зависимости от положения курсора Menu Меню Right Правая клавиша Show pane context menu Показать контекстное меню окна Navigate Tool Mouse Actions Использование мыши с инструментом навигации Left Левая клавиша Click left button and drag to move around Zoom to Area Масштабировать в выделение Shift+Left Shift+Left Shift-click left button and drag to zoom to a rectangular area Double-Click Left Двойной щелчок левой клавишей Double-click left button to jump to clicked location Edit Изменить Double-click left button on an item to edit it Select Tool Mouse Actions Использование мыши с инструментом выделения Select Выделить Click left button and drag to select region; drag region edge to resize Multi Select Множественное выделение Ctrl+Left Ctrl+Влево Cmd-click left button and drag to select an additional region Ctrl-click left button and drag to select an additional region Fine Select Выделить точно Shift-click left button and drag to select without snapping to items or grid Edit Tool Mouse Actions Использование мыши с инструментом редактирования Move Переместить Click left button on an item or selected region and drag to move Draw Tool Mouse Actions Использование мыши с инструментом рисования Draw Рисовать Click left button and drag to create new item Щелкните левой клавишей мыши и перетащите курсор для создания нового объекта Measure Tool Mouse Actions Использование мыши с инструментом измерения Measure Area Измерить область Click left button and drag to measure a rectangular area Measure Item Измерить объект Click left button and drag to measure extents of an item or shape Click to erase an item from the active layer Reset zoom to default Click and drag an item in the active layer to move it; hold Shift to override initial resistance PlayParameterRepository Adjust Playback Parameters Коррекция параметров воспроизведения Change Playback Mute State Смена состояния приглушенности воспроизведения Change Playback Gain Смена громкости воспроизведения Change Playback Pan Смена панорамы при воспроизведении Change Playback Plugin Смена расширения воспроизведения Configure Playback Plugin Смена параметров расширения воспроизведения PlayParameterRepository::EditCommand Adjust Playback Parameters Коррекция параметров воспроизведения Change Playback Mute State Смена состояния приглушенности воспроизведения Change Playback Gain Смена громкости воспроизведения Change Playback Pan Смена панорамы при воспроизведении Change Playback Plugin Смена расширения воспроизведения Configure Playback Plugin Смена параметров расширения воспроизведения PluginParameterBox This plugin has no adjustable parameters. У этого расширения нет изменяемых параметров. Program Программа PluginParameterDialog Name: Название: Maker: Автор: Copyright: Авторские права: Version: Версия: Plugin Parameters Параметры расширения Channel mismatch Несовпадение каналов This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly. Этому расширению нужно хотя бы %1 вхдных каналовs, но лишь %2 %3 доступны. Вероятно, расширение не сработает как должно. are являются is является Channels Каналы This plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. Это расширение принимает не более %1 каналов на входе, но доступно целых %2. Только первые %3 будут использованы. This plugin only has a single channel input, but the source has %1 channels. Это расширение может обрабатывать только один канал, но у источника %1 каналов. Use mean of source channels Использовать среднее значение каналов источника Use channel %1 only Использовать только канал %1 Output: Выход: Processing Обработка Window size: Размер оконной функции: Audio frames per block: Выборок звука на блок: Window increment: Шаг: Window shape: Форма: Advanced >> Больше >> Advanced << Меньше << Input Material Restrict to selection extents Только выделение Preferences Frequency of concert A Частота условной ноты Ля (A) Property box layout Внешний вид панели свойств Spectral analysis window shape Форма оконной функции при спектральном анализе Show boxes for all panes Показывать панели для всех окон Show box for current pane only Показывать панель только для активного окна Rectangular Прямоугольная Triangular Треугольная Hamming Хамминга Blackman Блэкмена Gaussian Гауссова Parzen Парзена Nuttall Нутталла Blackman-Harris Блэкмена-Харриса Preferences Параметры Playback resampler type Тип ресэмплирования при воспроизведении Fastest Самый быстрый Standard Обычный Highest quality Наивысшего качества Spectrogram y-axis interpolation: Интерполяция оси Y спектрограммы: Omit temporaries from Recent Files menu Пропускать временные файлы в меню недавно открывавшихся Resample mismatching files on import Ресэмплировать файлы при импорте Location for cache file directory Расположение каталога с кэшем Background colour preference Предпочитаемый цвет фона Font size for text overlays Кегль шрифта для текстовых перекрытий Show splash screen on startup Показывать заставку при старте программы Hann Хэнна Follow desktop theme Использовать параметры окружения Dark background Темный фон Light background Светлый фон Spectrogram x-axis interpolation: Интерполяция спектрограммы по оси X: None Нет Linear interpolation Линейная интерполяция 4 x Oversampling 4 × пересэмплированная 4 x Oversampling with interpolation 4 × пересэмплированная с интерполяцией Time display format Формат отображения времени Standard (to millisecond) Обычный (до мс) High resolution (to microsecond) Высокое разрешение (до мкс) 24 FPS 24 кадра/с 25 FPS 25 кадров/с 30 FPS 30 кадров/с 50 FPS 50 кадров/с 60 FPS 60 кадров/с PreferencesDialog Apply Применить %1: %1: OK ОК Cancel Отменить Sonic Visualiser: Application Preferences Параметры работы Sonic Visualiser <home directory> <домашний каталог> Follow system locale Russian British English American English Czech User interface language &General О&бщие Default session template for audio files: Standard Waveform Session &Template Select a directory to create cache subdirectory in Выберите каталог для хранения кэша Preferences Параметры <b>Restart required</b><p>One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.</p><p>Please exit and restart the application now if you want these changes to take effect immediately.</p> <b>Требуется перезапуск программы</b><p>Некоторые изменившиеся параметры не могут быть учтены без перезапуска Sonic Visualiser.</p><p>Завершите работу с программой и повторно запустите ее, чтобы внесенные изменения возымели эффект.</p> Preferences Changed Параметры изменены Some preferences have been changed but not applied. Apply them before closing? Некоторые параметры работы программы были изменены, но не применены. Применить их перед закрытием? Playback audio device: Устройство воспроизведения: &Appearance Об&лик Anal&ysis &Анализ ProgressDialog Cancel Отменить PropertyBox Show Показать Play Воспроизвести Playback Pan / Balance Панорама/баланс при воспроизведении Playback Gain Усиление воспроизведения dB Дб (current value: %1%2) (текущее значение: %1%2) (current value: %1) (текущее значение: %1) Toggle Visibility of %1 Переключить видимость %1 Toggle Playback of %1 Переключить воспроизведение %1 Toggle %1 property of %2 Переключить %1 свойство %2 Adjust %1 property of %2%3 Скорректировать %1 свойство %2%3 Add New Colour... Добавить новый цвет... Name New Colour Дайте цвету название Enter a name for the new colour: Введите название нового цвета: Prefer black background for this colour Предпочитать черный фон для этого цвета PropertyContainer yes да on вкл true правда no нет off выкл false ложь Set %1 Property Установить свойство %1 PropertyContainer::SetPropertyCommand Set %1 Property Установить свойство %1 PropertyStack Click to change the current active layer Щёлкните для смены активного слоя Change Layer Visibility Переключить видимость слоя QApplication Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control <file>: One or more Sonic Visualiser (.sv) and audio files may be provided. Sonic Visualiser — программа для просмотра и исследования звуковых данных с целью семантического анализа и аннотации музыки. Использование: %1 [--no-audio] [--no-osc] [<файл> ...] --no-audio: не пытаться открыть устройство звукового вывода --no-osc: не предоставлять порт Open Sound Control для удалённого управления <файл>: можно указать один и более файлов Sonic Visualiser (.sv) и звуковых файлов. Sonic Visualiser Sonic Visualiser QFile File "%1" does not exist Файл "%1" не существует Failed to open file "%1" Не удалось открыть файл "%1" File or URL "%1" could not be retrieved Файл или URL "%1" не мог быть получен QMessageBox Failed to open file Не удалось открыть файл File or URL "%1" could not be opened Файл или URL "%1" не мог быть открыт <b>Audio required</b><p>Please load at least one audio file before importing annotation data <b>Нужны звуковые данные</b><p>Загрузите хотя бы один звуковой файл перед импортом аннотаций QuickTimeFileReader Decoding %1... Декодируется %1... RDFImporter Importing audio referenced in RDF... Importing dense signal data from RDF... Importing event data from RDF... RangeInputDialog to до RangeSummarisableTimeValueModel Range-Summarisable Time-Value RegionLayer Vertical Scale Верт. масштаб Scale Units Единицы шкалы Plot Type Тип графика Scale Масштаб Bars Такты Segmentation Сегментация Auto-Align Автовыравнивание Equal Spaced Равные промежутки Linear Линейный Log Логарифмический In progress В процессе No local points Нет локальных точек %1 %2 %1 %2 Time: %1 Value: %2 Duration: %3 No label Время: %1 Значение: %2 Длительность: %3 Без метки Time: %1 Value: %2 Duration: %3 Label: %4 Время: %1 Значение: %2 Длительность: %3 Метка: %4 Change Point Value Изменить значение точки Drag Selection Перетащить выделение Resize Selection Изменить размер выделения Delete Selected Points Удалить выбранные точки Re-align pasted items? Заново выровнять вставленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Вставить New Region Draw Region Erase Region Drag Region Edit Region Relocate Region RegionModel Region Область Time Время Frame Выборка Value Значение Duration Длительность Label Метка Unknown Неизвестно Edit Data Изменить данные RemoveLayerCommand Delete %1 Layer Удалить слой %1 ResamplingWavFileReader Resampling %1... Ресэмплирование %1... SVFileReader (derived model in SV-XML) (модель извлечена в SV-XML) Opening file or URL... Открывается файл или URL... SingleColourLayer Colour Цвет <unknown> <неизвестно> SliceLayer %1 - %2 %1 - %2 First Mean Усреднённо Peak Пик 0dB 0 Дб -Inf -Inf x10 x10 Plot Type Тип графика Scale Масштаб Normalize Нормализовать Gain Усиление Sampling Mode Режим сэмплирования Linear Линейный Meter Счетчик dB Дб Any Любые Lines Линии Steps Шаги Blocks Блоки Colours Цвета Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 Время: %1 - %2 Диапазон: %3 сэмплов (%4) Бин: %5 %6 значение: %7 Time: %1 - %2 Range: %3 samples (%4) Время: %1 - %2 Диапазон: %3 сэмплов (%4) Threshold Порог Bin Scale Bins Бины Log Absolute Абсолютный Rev Log SparseModel Add Point Добавить точку Delete Point Удалить точку Re-Label Point Переразметить точку Sparse Edit Data Изменить данные Insert Data Point Delete Data Point SparseModel::AddPointCommand Add Point Добавить точку SparseModel::DeletePointCommand Delete Point Удалить точку SparseModel::RelabelCommand Re-Label Point Переразметить точку SparseOneDimensionalModel Sparse 1-D Time Время Frame Выборка Label Метка Unknown Неизвестно Edit Data Изменить данные SparseTimeValueModel Sparse Time-Value Time Время Frame Выборка Value Значение Label Метка Unknown Неизвестно Edit Data Изменить данные SparseValueModel Sparse Value SpectrogramLayer Colour Цвет Colour Scale Window Size Размер окна Normalize Columns Нормализовать столбцы Bin Display Threshold Порог Gain Усиление Colour Rotation Вращение цвета Min Frequency Мин. частота Max Frequency Макс. частота Frequency Scale Window Окно Scale Масштаб Linear Линейный Meter Счетчик dB Дб Phase Фаза No min Без минимума 10 Hz 10 Гц 20 Hz 20 Гц 40 Hz 40 Гц 100 Hz 100 Гц 250 Hz 250 Гц 500 Hz 500 Гц 1 KHz 1 КГц 4 KHz 4 КГц 10 KHz 10 КГц 1.5 KHz 1,5 КГц 2 KHz 2 КГц 6 KHz 6 КГц 8 KHz 8 КГц 12 KHz 12 КГц 16 KHz 16 КГц No max Без максимума Log Логарифм. All Bins Все бины Peak Bins Пиковые бины Frequencies Частоты <unknown> <неизвестно> Peak Frequency: %1 - %2 Hz Пиковая частота: %1 - %2 Гц Peak Frequency: %1 Hz Пиковая частота: %1 Гц Peak Pitch: %3 - %4 Пиковая высота тона: %3 - %4 Peak Pitch: %2 Пиковая высота тона: %2 Time: %1 - %2 Время: %1 - %2 Time: %1 Время: %1 %1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 %1Частота бинов: %2 - %3 Гц %4Высота тона бинов: %5 - %6 %1Bin Frequency: %2 Hz %3Bin Pitch: %4 %1Частота бинов: %2 Гц %3Высота тона бинов: %4 -Inf -Inf dB: %1 - %2 Дб: %1 - %2 dB: %1 Дб: %1 Phase: %1 - %2 Фаза: %1 - %2 Phase: %1 Фаза: %1 Window Overlap Перекрытие окон Smoothing None Нет 25 % 25 % 50 % 50 % 75 % 75 % 87.5 % 87,5 % 93.75 % 93,75 % Normalize Visible Area Нормализовать видимую область Bins Бины FFT cache failed Не удалось кэшировать FFT Failed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue. Не удалось создать FFT-модель этой спектрограммы. Вероятно, не хватает памяти или дискового порстранства для продолжения. dBV^2 ДбВ^2 dBV ДбВ 43Hz 43 Гц %1Hz %1 Гц SpectrumLayer Window Size Размер окна Window Overlap Перекрытие окон Window Окно Mean Усреднённо None Ничего Bins Бины 25 % 25 % 50 % 50 % 75 % 75 % 87.5 % 87,5 % 93.75 % 93,75 % %1 - %2 %1 - %2 %1 - %2 Hz %1 - %2 Гц %1 Hz %1 Гц -Inf -Inf %1 %1 %1 Bin: %2 (%3) %4 value: %5 dB: %6 %1 Бин: %2 (%3) %4 значение: %5 Дб: %6 First Peak Пик %1 Bin: %2 (%3) Value: %4 dB: %5 %1 Бин: %2 (%3) Значение: %4 Дб: %5 Show Peak Frequencies Показывать пиковые частоты Plot Type Тип графика SubdividingMenu %1 - %2 %1 - %2 Surveyer Yes! Take me to the survey Да, я хочу заполнить отчёт No, thanks Спасибо, нет TextLayer Empty Label Очистить метку <no text> <без текста> In progress В процессе Time: %1 Height: %2 Label: %3 Время: %1 Высота: %2 Метка: %3 Enter label Введите метку Please enter a new label: Введите текст новой метки: Drag Label Перетащите метку Move Label Переместите метку Move Label Horizontally Переместите по горизонтали Move Label Vertically Переместите по вертикали Drag Selection Перетащите выделение Resize Selection Смените размер выделения Delete Selection Удалите выделение Paste Вставить New Point Новая точка Erase Point Удалить точку Re-align pasted items? Заново выровнять вставленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? TextModel Text Текст Time Время Frame Выборка Height Высота Label Метка Unknown Неизвестно Edit Data Изменить данные Thumbwheel %1: %2%3 %1: %2%3 %2%3 %2%3 New value for %1, from %2 to %3 %4: Новое значение для %1, от %2 до %3 %4: New value for %1, from %2 to %3: Новое значение для %1, от %2 до %3: Enter a new value from %1 to %2 %3: Введите новое значение от %1 до %2 %3: Enter a new value from %1 to %2: Введите новое значение от %1 до %2: Enter new value Введите новое значение TimeInstantLayer New Point Новая точка Plot Type Тип графика Instants Segmentation Сегментация In progress В процессе No local points Нет локальных точек Time: %1 No label Время: %1 Без метки Time: %1 Label: %2 Время: %1 Метка: %2 Draw Point Нарисовать точку Add Point at %1 s Добавить точку в %1 с Drag Point Перетащить точку Move Point to %1 s Перетащить точку к %1 с Edit Point Изменить точку Drag Selection Перетащить выделение Resize Selection Изменить размер выделения Delete Selection Удалить выделение Paste Вставить Erase Point Удалить точку Re-align pasted instants? Заново выровнять вставленные объекты? The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? TimeValueLayer New Point Новая точка Plot Type Тип графика Vertical Scale Верт. масштаб Scale Units Единицы шкалы Show Derivative Points Точки Stems Ножки Connected Points Соединённые точки Lines Линии Curve Кривая Segmentation Сегментация Auto-Align Автовыравнивание In progress В процессе No local points Нет локальных точек Time: %1 Value: %2%3 No label Время: %1 Значение: %2%3 Без метки Time: %1 Value: %2%3 Label: %4 Время: %1 Значение: %2%3 Метка: %4 Draw Point Нарисовать точку Drag Point Перетащить точку Edit Point Изменить точку Relocate Point Переместить точку Change Point Value Изменить значение точки Drag Selection Перетащить выделение Resize Selection Изменить размер выделения Delete Selected Points Удалить выбранные точки Paste Вставить The items you are pasting do not have values. What values do you want to use for these items? У вставляемых объектов нет значений. Какие значения вы хотите для них использовать? Some of the items you are pasting do not have values. What values do you want to use for these items? У некоторых вставляемых объектов нет значений.Какие значения вы хотите для них использовать? Zero for all items Ноль для всех объектов Choose value calculation Выбрать вычисление значения Scale Масштаб Linear Линейный Log Логарифмический +/-1 +/-1 Erase Point Стереть точку Re-align pasted items? Заново выровнять вставленные объекты? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Select cycle size Cycle size: Draw Segment Division Lines TipDialog Tip of the Day Совет дня Show tip on startup Показывать советы при запуске << Previous << Предыдущий Next >> Следующий >> Close Закрыть TransformFactory %1: %2 %1: %2 %1: Output %2 %1: Выход %2 Analysis Анализ Effects Data Данные эффектов Effects Эффекты [\(<].*$ [\(<].*$ <unknown maker> <неизвестный производитель> Extract features using "%1" plugin (from %2) Извлечь данные при помощи "%1" (из %2) Extract features using "%1" output of "%2" plugin (from %3) Извлечь данные при помощи "%1" вывода из расширения "%2" (из %3) %1 using "%2" plugin (from %3) %1 используя расширение "%2" (из %3) %1 using "%2" output of "%3" plugin (from %4) %1 используя вывод "%2" расширения "%3" (из %4) Extract "%1" data output from "%2" effect plugin (from %3) Извлечь "%1" данные вывода из расширения эффектов "%2" (из %3) Extract data output %1 from "%2" effect plugin (from %3) Извлечь данные вывода %1 из расширения эффектов "%2" (из %3) Transform audio signal with "%1" effect plugin (from %2) Трансформировать звуковой сигнал расширением эффектов "%1" (из %2) Generate audio signal using "%1" plugin (from %2) Создать звуковой сигнал при помощи расширения "%1" (из %2) Plugin type Тип расширения Category Категория System Identifier Системный идентификатор Name Название Description Описание Maker Создатель Units Единица измерения Generator Генератор Other Прочее TransformFinder Find a Transform Поиск расширений для трансформации Find: Искать: <br>&nbsp;&nbsp;No results found <br>&nbsp;&nbsp;Ничего не найдено Up Вверх Down Вниз Found %n description(s) containing <b>%1</b>, showing the first %2 only Найдено %n описание, содержащее <b>%1</b>, показаны первые %2 Найдено %n описания, содержащих <b>%1</b>, показаны первые %2 Найдено %n описаний, содержащих <b>%1</b>, показаны первые %2 Found %n description(s) containing <b>%1</b> Найдено %n описание, содержащее <b>%1</b> Найдено %n описания, содержащих <b>%1</b> Найдено %n описаний, содержащих <b>%1</b> <i> (not installed)</i> <i> (не установлено)</i> %1%2<br><small> %1%2<br><small> </small> </small> <b>%1</b>%2<br> <b>%1</b>%2<br> <small>%1</small> <small>%1</small> <small> <small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Plugin type: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Тип расширения: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Category: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Категория: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; System identifier: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Системный идентификатор: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; More information: <a href="%1">%1</a> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Подробная информация: <a href="%1">%1</a> <p>Type some text into the search box to search the descriptions of:<ul><li>All currently installed <a href="http://www.vamp-plugins.org/">Vamp</a> audio feature extraction plugins</li><li>All currently installed <a href="http://www.ladspa.org/">LADSPA</a> audio effects plugins</li><li>Vamp plugins that are not currently installed but that have descriptions published via the semantic web</li></ul> <p>Введите текст для поиска по описаниям среди:<ul><li>всех установленных расширений <a href="http://www.vamp-plugins.org/">Vamp</a> для извлечения анализируемых данных;</li><li>всех установленных эффектов<a href="http://www.ladspa.org/">LADSPA</a>;</li><li>еще не установленных расширений Vamp, чьё описание опубликовано в семантической сети.</li></ul> <b>Unable to retrieve published descriptions from network!</b> <b>Не удалось получить опубликованные в сети описания!</b> <b>No plugins are currently installed!</b> <b>Ни одно расширение не установлено!</b> <p>%1<br>Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.<br>Only the descriptions of installed plugins will be searched. <p>%1<br>Вероятно, не работает сетевое соединение, либо службы отзываются слишком медленно, либо произошла неполадка при обработке.<br>Будет выполнен поиск только по описаниям уже установленных расширений. <p>%1<br>Only the published descriptions of Vamp feature extraction plugins will be searched. <p>%1<br>Выдет выполнен поиск только по описаниям расширений Vamp, предназначенных для извлечения анализируемых данных. <p>%1<br>%2<br>Perhaps the network connection is down, or services are responding too slowly.<br>No search results will be available. <p>%1<br>%2<br>Вероятно, не работает сетевое соединение, либо службы отзываются слишком медленно.<br>Результаты поиска будут недоступны. View Global Scroll Глобальная прокрутка Global Zoom Глобальный масштаб Follow Playback Следовать за воспроизведением Scroll Прокручивать Page Постранично Off Выключить <unknown> <неизвестно> Layer rendering error Waiting for layers to be ready... Ожидание готовности слоёв... Cancel Отменить Rendering image... Отрисовывается изображение... Alignment Выравнивание ViewManager Clear Selection Снять выделение Select Multiple Regions Выделить несколько областей Select Region Выделить область Enter Navigate mode Enter Select mode Enter Edit mode Enter Draw mode Enter Erase mode Enter Measure mode Switch on Loop mode Switch off Loop mode Switch on Play Selection mode Switch off Play Selection mode Switch on Play Solo mode Switch off Play Solo mode Switch on Alignment mode Switch off Alignment mode Scroll to %1 Zoom to %n sample(s) per pixel Change overlay level ViewManager::SetSelectionCommand Clear Selection Снять выделение Select Multiple Regions Выделить несколько областей Select Region Выделить область WaveFileModel Wave File Звуковой файл WaveformLayer Scale Масштаб по Y Gain Усиление Normalize Visible Area Нормализовать видимую область Channels Каналы Linear Линейный Meter Счетчик dB Дб Separate Отдельно Mean Усреднённо Butterfly V-образно Time: %1 - %2 Время: %1 - %2 Time: %1 Время: %1 Level: Уровень: Left: Левый: Right: Правый: Channel %1 Канал %1 %1 %2 - %3 (%4 dB peak) %1 %2 - %3 (пик в %4 Дб) %1 %2 (%3 dB peak) %1 %2 (пик в %3 Дб) 0dB 0 Дб -Inf -Inf WindowShapePreview V / time V / время dB / freq Дб / частота WritableWaveFileModel Writable Wave File Записываемый звуковой файл sonic-visualiser-2.3~repack1.orig/i18n/sonic-visualiser_en_US.qm0000644000175000017500000000450412252354725023443 0ustar miramiraEnter a name for the new color: Enter a name for the new colour: PropertyBoxName New ColorName New Colour PropertyBoxLPrefer black background for this color'Prefer black background for this colour PropertyBox ColorColourSingleColourLayer ColorsColours SliceLayer ColorColourSpectrogramLayerColor RotationColour RotationSpectrogramLayerColor Scale Colour ScaleSpectrogramLayerRFound %n description containing <b>%1</b>TFound %n descriptions containing <b>%1</b>,Found %n description(s) containing %1TransformFinderFound %n description containing <b>%1</b>, showing the first %2 onlyFound %n descriptions containing <b>%1</b>, showing the first %2 onlyGFound %n description(s) containing %1, showing the first %2 onlyTransformFindersonic-visualiser-2.3~repack1.orig/i18n/sonic-visualiser_cs_CZ.qm0000644000175000017500000053500512252354725023440 0ustar miramirald[H F F F1 FW%!NW%2w!%"%2-%"%2SSS~S$S2lv ^6'N05++;~;~3);~I'J6X[JJJ.LACLZL5MzMzwDM M 2M5$M5AlM5M5M5.M5M5<NNlP79P7APWpPb1PRKjQRxRxARx Rx3RxmRxRx=RSkMRp{RsRz7R̼<SSMZSSaS'S(S TZt-TTפ%UjpU4+V=vVVVlV8rVDVNJVaV,W X|!XdX<X/Y%Y%1Y%Y%Y%,Y%PY%Yq@Y%_Y%<YtZg\ZyNZCRZsZze[eE\Pc\\\]Ã]h;^ hg_Xܐ`GCb`GC`GCC`GCM`#ccB!d7d@dd d ddqd 9S $Ey ޞW  Z5[#1zQ7eT7e7e/CW.IdWSoTAEeTl~nTnDodrkR uz.5?r9{BZMaX (%,7 SɩU$_6VarեЉ_{N6n@k)ݞCRF痿 p縿!8I*00BF?b|m!C6nnJnH+Q\t#3<$Cu$^h)*3+4u^8 "S9k:n>]MvBjDb0E^eRY.^SBu~SpU<fcV:sV=Wg](hm,pzA&qNBs5tSsPv"9vSz'6{n‚‚‚m5‚‚ZCX#'DSk)91*5ayiϓzL 8L+| ll 5lWfElՎ+vN%05R##0#)I;_D`mm %:=P o9>w4-&IJ*w;._eL04b[,1xb3*Z5v6CQu93hM:<~(BO NC$ yDO HO VKS-WKSՇX$!wX/B0Xu>Z>-bKSg>rgNkV*p/T0tBv+y#=5yCX;;KS$"Hk d- "KSh::v4q[%[%?9{~>{~{~{~{~9{~E {~O%"%2y\EcMmD"6,#u>tTt !hW  s١3[xO$(%x|&D$?'p,q,q*Z,q;-X2IdB3"5 7a$%9=]>"|6rX/f`evogjgn{n{$Z[.1JeZ#ITjIcIuII{f7\z6666$Ia._ :p?p ;,U(U[Tw'x~†~†=ƾjǴ) Ȣa\ת,ZdNX^֔ҠZ|>ʋINa#Jb<%>.R~)e0}pMwp1 RT}B]W"Z%/%/)%/%/#G%/z'9(?+z,h0K0K0Kv0Ki0K'0KM0K583W7H8Z̍?%IZ$7K0O|Qs)?Qs)QV\¬Zu[\3\9ۙ]^?lau.uh$h5k(<rt_vN|Ku|%-O~fzl3 Afr#8^dD7z5f55I!$,W,}k+E+8rwǨIz=:~b@fBdqȕp$%$[B!!|IY@Geua5,78,;7XYp>\ġ$~8 g;e;#d˨|K WNw{/َtoKg.4Kg4$୎9୎<<arNT)pWXCT0פikP?7qB %b +ntgg"':ő79U79N2FJ3nLA%SSTSTBSTL\WWwW\Eg\eEQ;_,i_PĆa1peUeUeUDMeUN~j-/j`pkOnlsu#dovtCCxž}u VO/)0.g04Tct$hARG Y?D+Zj) d[O%q``\wR9a|*˥.˥4֣d $PA2oF؃cSܐ`kSR*1RJ7Eea߽d 0PJ1u , cuv^$6BaL 2#ϵD$ SR)u@-u/[5 Jb9 Kb=>GHBoKq<|KOȆL+Q$PTlW>|7)]rCi¾ysom.v z;nwϗ:n=Z/-Fa546!A|)g)`7D .;ƽN&n!)u"3*՟'aڎ'WhrzQ\ٱ9YBCN Gf$7ё|VЙMD< v&|'^}j"|Z'//E/A1%2s2L21E243~73n9"^> RE(ExI5PI-:JgH y ~ ?dػ C$ Mg\@ NI S$ S$A= S$K S SA SK V5 W < W + W 8; W C W M X ; \þ bg ca cz dg2/ i64 lH tP z^X {гs }}q #I #& iu c #% Ä8  s| 0J' w5f ~ ~ {f ^4j 8 8 nS1 O= O O O9 ON  @  4. _ V M Ͷ ` Dx * 9B[ ֧OX ֫O ֭P UQ WQA b ' 9 ~r Y_ t= [>G H 58. !nO8 %[ *$ +" -xl_ 1P 54 5k 5> 9: 9:>, 9ͳ3 ;fF >t ?[ ?zC C\ Or X^2 Zx] _Y cl c4J ed5w fM % $d }eQ . E  M<  n2 b ^ _d w t1 IY N; NT N N N5 NA NKP Ȩk (Cx n Jgg ֳ~% t ع ݅ 9l $  W{  YC y jq A   D? =j ? 6- )$,f ,x -? 3ME 8s ;. Cr# F)JF N>Q PvJ RwC V `B}j c$7 dt dtOh e o&} rJ y {WR ~WM   ^Ƚ %-  s s& sJ / flHC " s  6 { O ? pK ̺\z oCR4 Ҙd }d' ޼p ᄡ- nï [ ߯ qo dP N} y( ] -/k 1  d C'! *, l%W U 4 ! 'ɂ ' x -% 5%C D @B Ifn K1 K" O Q RVB' RVd RV RV RV. RV RV= RSK S  [y^ `ɥz a# a2 b.e b f b  h5 t)* t } s m c   + ' &b~+ P L4 Z<a ih 4E Ӑ [v  ̣ 7 z."  ? y[ ߣ % ʧ@ y IR   귓 b 5W J @J  P tj W6 )_>mG ) O - 4U݀ A gj DY DY DYv DZ DZ DZ  D:# Oq P}" [ ]D' ^B f$ iI7 k$O k$ lFsw# o$G p4 u0P z4 z=} { ˗| Pe T ST& i   ( Ʋ txM H ʼD 4 F:  ƨ ǂ L5 әN !m2Y &_  @ 5 _\  D B,y  TC EH B+?bHr|v \Z)%[;[5][@"Rn%j*^G>.IWg>FHK>iP%UHNFh8hYk 4nM8RnM?o:,rb:t*tWN~WNRA@ڴP˟PjVr4UҏR%(աYn->kܭۼ; tWhYW \t@@rN}/ y(c/SC" @< i4 VtG ĵT8"Ƥ%sػ*1|-e1 Y_6pCV0?@??CS D8JdyLLķN zO2}Z[m4c]%f^9'i}jb| m|uTp{Y[{sCx{sC@RJC cojjZsefH>4@LeTL /E2dXHR٣5V݉e@bl!tt tt{2c\֍c^m..i %1: %2%1: %2 ActivityLog<p>Zpis  innost uvd vaai spoluprci a dala udlosti uvnitY %1.</p>G

Activity Log lists your interactions and other events within %1.

 ActivityLogZpis  innosti Activity Log ActivityLog PYidat %1 vrstvu Add %1 LayerAddLayerCommandhrnn vlnaAggregate WaveAggregateWaveModelZarovnn AlignmentAlignmentModelFZmnit nsobek rozta~en  asu na %1 Change time-stretch factor to %1AudioCallbackPlaySourcePYehrt od %1 Play from %1AudioCallbackPlaySourceZastavit na %1 Stop at %1AudioCallbackPlaySource%1: %2%3%1: %2%3 AudioDial%2%3%2%3 AudioDialLZadejte novou hodnotu od %1, do %2 %3:#Enter a new value from %1 to %2 %3: AudioDialDZadejte novou hodnotu od %1 do %2: Enter a new value from %1 to %2: AudioDial&Zadat novou hodnotuEnter new value AudioDialHNov hodnota pro %1, od %2 do %3 %4:#New value for %1, from %2 to %3 %4: AudioDialBNov hodnota pro %1, od %2 do %3: New value for %1, from %2 to %3: AudioDial (auto)(auto)AudioTargetFactory0Jadern zvukov zaYzenCore Audio DeviceAudioTargetFactory<Vchoz zaYzen zvukov kartyDefault Soundcard DeviceAudioTargetFactory8Spojovac sada pro zvuk JACKJACK Audio Connection KitAudioTargetFactory"Server PulseAudioPulseAudio ServerAudioTargetFactory>Re~im pYipojen nen podporovnAppend mode not supportedBZipFileDeviceXOtevYen proudu bzip2 pro  ten se nezdaYilo'Failed to open bzip2 stream for readingBZipFileDeviceXOtevYen proudu bzip2 pro zpis se nezdaYilo'Failed to open bzip2 stream for writingBZipFileDeviceNOtevYen souboru pro  ten se nezdaYiloFailed to open file for readingBZipFileDeviceNOtevYen souboru pro zpis se nezdaYiloFailed to open file for writingBZipFileDeviceHRe~im pYstupu k souborom nen zadnFile access mode not specifiedBZipFileDevice*Soubor je ji~ otevYenFile is already openBZipFileDevice Soubor neotevYen File not openBZipFileDevicedVnitYn chyba (zvr ani pro  ten, ani pro zpis)1Internal error (close for neither read nor write)BZipFileDevicejVnitYn chyba (otevYen ani pro  ten, ani pro zpis)0Internal error (open for neither read nor write)BZipFileDeviceHRe~imy pro  ten a zpis jsou zadny#Read and write modes both specifiedBZipFileDevice>Chyba zvru  ten proudu bzip2bzip2 stream read close errorBZipFileDevice0Chyba  ten proudu bzip2bzip2 stream read errorBZipFileDevice@Chyba zvru zpisu proudu bzip2bzip2 stream write close errorBZipFileDevice %1 (jedna zmna)%1 (%n zmny)%1 (%n zmn)%1 (%n change(s)) BundleCommandTOtevYen souboru %1 pro zpis se nezdaYilo"Failed to open file %1 for writing CSVFileWriter%1 (vce) (%1 more)CSVFormatDialog<nevamat si>CSVFormatDialog>Vzorkovac kmito et zvuku (Hz):Audio sample rate (Hz):CSVFormatDialogDData budou zobrazena ve vrstv %1.%Data will be displayed in a %1 layer.CSVFormatDialogDoba trvnDurationCSVFormatDialogKoncov  asEnd timeCSVFormatDialogXOtevYen, ve zvukovch vzorkovacch snmcch"Explicitly, in audio sample framesCSVFormatDialog*OtevYen, v sekundchExplicitly, in secondsCSVFormatDialog2Nrost snmko mezi Ydky:Frame increment between rows:CSVFormatDialog\Skryt: Ydky jsou pravideln rozlo~eny v  ase+Implicitly: rows are equally spaced in timeCSVFormatDialog `ttekLabelCSVFormatDialogpVyberte, prosm, sprvn datov formt pro tento soubor.4Please select the correct data format for this file.CSVFormatDialog(Vybrat datov formtSelect Data FormatCSVFormatDialog asTimeCSVFormatDialog as je zadn:Timing is specified:CSVFormatDialogHodnotaValueCSVFormatDialogHodnotyValuesCSVFormatDialog+/-1+/-1Colour3DPlotLayer<neznm> Colour3DPlotLayerNaprostAbsoluteColour3DPlotLayer V~d neprohledn Always OpaqueColour3DPlotLayerStupnice koae Bin ScaleColour3DPlotLayerKoaeBinsColour3DPlotLayer BarvaColourColour3DPlotLayer Zeslen signluGainColour3DPlotLayer0Obrtit svislou stupniciInvert Vertical ScaleColour3DPlotLayer  rovLinearColour3DPlotLayer ZpisLogColour3DPlotLayer(Normalizovat sloupceNormalize ColumnsColour3DPlotLayer<Normalizovat viditelnou oblastNormalize Visible AreaColour3DPlotLayerStupniceScaleColour3DPlotLayer JemnSmoothColour3DPlotLayer@ as: %1 - %2 Koa: %3 Hodnota: %4Time: %1 - %2 Bin: %3 Value: %4Colour3DPlotLayerdBdBColour3DPlotLayer<neznm>  ColourMapperPruhovanBanded ColourMapper ern na blBlack on White ColourMapperModr na  ern Blue on Black ColourMapperVchozDefault ColourMapperOvocn salt Fruit Salad ColourMapperZeslen vaek High Gain ColourMapperZvraznn Highlight ColourMapperTiskrnaPrinter ColourMapper  erven na modr Red on Blue ColourMapperZpad slunceSunset ColourMapperBl na  ernWhite on Black ColourMapper}lut na  ernYellow on Black ColourMapper &Zpt&UndoCommandHistory&Zpt %1&Undo %1CommandHistoryCtrl+Shift+Z Ctrl+Shift+ZCommandHistory Ctrl+ZCtrl+ZCommandHistorybNeexistuje nic, u  eho by alo zruait vrcen zptNothing to redoCommandHistoryRNeexistuje nic, co by se dalo vrtit zptNothing to undoCommandHistory &ZnovuRe&doCommandHistory&Znovu %1Re&do %1CommandHistoryZnovu %1Redo %1CommandHistoryfOpakovat posledn krok prav, kter byl vrcen zpt'Redo the last operation that was undoneCommandHistoryZpt %1Undo %1CommandHistory>Posledn krok prav vrtit zptUndo the last editing operationCommandHistory"Dekduje se %1...Decoding %1...CoreAudioFileReader`Vyrovnvac pame hustho trojrozmrnho vrcholuDense 3-D Peak CacheDense3DModelPeakCache$Hust trojrozmrn Dense 3-DDenseThreeDimensionalModel SnmekFrameDenseThreeDimensionalModel asTimeDenseThreeDimensionalModel$Hust hodnota  asuDense Time-ValueDenseTimeValueModel&Smazat hlavn modelClear main modelDocument6Nastavit hlavn model na %1Set main model to %1Document@Upravovateln hust trojrozmrnEditable Dense 3-D"EditableDenseThreeDimensionalModel %1 Hz%1 HzFFTModelFFTFFTFFTModel8Zadat novou roveH prolna eEnter new fader levelFader(roveH: %1%2.%3%4 dBLevel: %1%2.%3%4 dBFaderroveH: Vypnuto Level: OffFaderPNov roveH prolna e, od %1 do %2 dBFS:$New fader level, from %1 to %2 dBFS:FaderFNelze poskytnout dostatek kanlo pro pYdavn modul vyta~en funkce "%1" (minimum pro pYdavn modul je %2, maximum pro pYdavn modul je %3; vstupn model has %4)oCannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4)!FeatureExtractionModelTransformerrPYdavn modul vyta~en funkce se nepodaYilo spustit "%1"3Failed to initialise feature extraction plugin "%1"!FeatureExtractionModelTransformerfPYdavn modul "%1" se nepodaYilo dolo~it pYkladem!Failed to instantiate plugin "%1"!FeatureExtractionModelTransformerPYdavn modul vyta~en funkce "%1" odmtl dan krok a velikosti bloko (%2 a %3); pou~vaj se vchoz nastaven pYdavnho modulu (%4 a %5)}Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead!FeatureExtractionModelTransformerVstupn model pro pYdavn modul vyta~en funkce "%1" je chybnho typu (vnitYn chyba?)QInput model for feature extraction plugin "%1" is of wrong type (internal error?)!FeatureExtractionModelTransformerNen dostupn ~dn zvod pro ID pYdavnho modulu vyta~en funkce "%1" (neznm typ pYdavnho modulu, nebo vnitYn chyba?)dNo factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?)!FeatureExtractionModelTransformervPYdavn modul "%1" nem ~dn vstup pojmenovan jako "%2"$Plugin "%1" has no output named "%2"!FeatureExtractionModelTransformerLPYdavn modul "%1" nem ~dn vstupyPlugin "%1" has no outputs!FeatureExtractionModelTransformerPromna byla nastavena pro verzi %1 pYdavnho modulu "%2", ale pou~van pYdavn modul je ve verzi %3_Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3!FeatureExtractionModelTransformer"Stahovn zruaenoDownload cancelled FileSource Stahuje se %1...Downloading %1... FileSource*FTP stahovn zruaenoFTP download aborted FileSourceLZmna na sprvn adresY se nepodaYila%Failed to change to correct directory FileSourceHPYipojen k FTP serveru se nezdaYiloFailed to connect to FTP server FileSourceTVytvoYen mstnho souboru %1 se nezdaYiloFailed to create local file %1 FileSource<Soubor neobsahuje ~dn daje!File contains no data! FileSource.PYihlaen se nezdaYilo Login failed FileSourceFNepodporovan schma v adrese (URL)Unsupported scheme in URL FileSourceUpravit data Edit DataIProchzet... Browse... ImageDialogXNepodaYilo se sthnout adresu (URL) "%1": %2Failed to download URL "%1": %2 ImageDialog8Sta~en souboru se nezdaYiloFile download failed ImageDialog2Soubor nebo adresa (URL): File or URL: ImageDialogObrzekImage ImageDialog`ttek:Label: ImageDialogDOtevr se adresa obrzku (URL)...Opening image URL... ImageDialog NhledPreview ImageDialogRSchma adresy (URL) "%1" nen podporovna$The URL scheme "%1" is not supported ImageDialogFNepodporovan schma v adrese (URL)Unsupported scheme in URL ImageDialogSmazat vbrDelete Selection ImageLayerThnout vbrDrag Selection ImageLayerProbh In progress ImageLayer"PYesunout obrzek Move Image ImageLayerNov bod New Point ImageLayerDOtevr se adresa obrzku (URL)...Opening image URL... ImageLayer Vlo~itPaste ImageLayer>Zarovnat vlo~en polo~ky znovu?Re-align pasted items? ImageLayer,Zmnit velikost vbruResize Selection ImageLayerVybrat obrzek Select image ImageLayer^Polo~ky, kter vkldte, pYialy z vrstvy s odlianm zdrojovm materilem, ne~ m tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovmu materilu pro tuto vrstvu?The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? ImageLayerUpravit data Edit Data ImageModelUpravit obrzek Edit Image ImageModel SnmekFrame ImageModelObrzekImage ImageModel `ttekLabel ImageModel asTime ImageModelNeznmUnknown ImageModelZ<b>Soubor vybrn</b><p>Soubor "%1" je adresY4Directory selected

File "%1" is a directoryInteractiveFileFinder<b>Umstn se nepodaYilo otevYt</b><p>Adresu (URL) "%1" se nepodaYilo otevYt=Failed to open location

URL "%1" could not be openedInteractiveFileFinder<b>Soubor existuje</b><p>Soubor "%1" ji~ existuje. Chcete jej pYepsat?OFile exists

The file "%1" already exists. Do you want to overwrite it?InteractiveFileFinderb<b>Soubor je przdn</b><p>Soubor "%1" je przdn)File is empty

File "%1" is emptyInteractiveFileFinderl<b>Soubor nen  iteln</b><p>Soubor "%1" nelze pYe st7File is not readable

File "%1" can not be readInteractiveFileFinder<b>Soubor nenalezen</b><p>Zvukov soubor "%1" se nepodaYilo otevYt. Chcete jej najt?VFile not found

Audio file "%1" could not be opened. Do you want to locate it?InteractiveFileFinder<b>Soubor nenalezen</b><p>Soubor "%1" se nepodaYilo otevYt. Chcete jej najt?PFile not found

File "%1" could not be opened. Do you want to locate it?InteractiveFileFinder`<b>Soubor nenalezen</b><p>Soubor "%1" neexistuje0File not found

File "%1" does not existInteractiveFileFinderV<b>Nen soubor</b><p>Cesta "%1" nen soubor+Not a file

You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.

Please select the track or merged tracks you wish to import:MIDIFileImportDialog>Chyba pYi zavdn souboru MIDIError in MIDI file importMIDIFileImportDialogTSlou it vaechny stopy, kter nejsou bicchMerge all non-percussion tracksMIDIFileImportDialog*Slou it vaechny stopyMerge all tracksMIDIFileImportDialogHVybrat stopu nebo stopy pro zaveden Select track or tracks to importMIDIFileImportDialog4 - pou~v kanl bicch GM - uses GM percussion channelMIDIFileReader%1 - vel %2 %1 - vel %2MIDIFileReaderPokus o zskn vce byto, ne~ je na stop dostupnch (%1, m pouze %2)DAttempt to get more bytes than available on Track (%1, only have %2)MIDIFileReaderlPokus o zskn vce byto ze stopy, ne~ bylo o ekvno0Attempt to get more bytes than expected on TrackMIDIFileReaderFPokus o  ten po konci souboru MIDI"Attempt to read past MIDI file endMIDIFileReaderPPYi  ten byl dosa~en konec souboru MIDI*End of MIDI file encountered while readingMIDIFileReader@Nalezen neplatn kd udlosti %1Invalid event code %1 foundMIDIFileReaderPSoubor MIDI "%1" nem noty v ~dn stop(MIDI file "%1" has no notes in any trackMIDIFileReader~Pro prvn udlost ve stop byl pou~it provozn stav ('Running'),Running status used for first event in trackMIDIFileReaderStopa %1 (%2)%3Track %1 (%2)%3MIDIFileReader,Stopa %1 (bez nzvu)%3Track %1 (untitled)%3MIDIFileReaderChybn dlka pro vnitYn data v proudu MIDI (%1, mlo by bt %2);Wrong length for int data in MIDI stream (%1, should be %2)MIDIFileReader~Chybn dlka pro dlouh data v proudu MIDI (%1, mlo by bt %2)<p><small>Adresa (URL) OSC pro tuto instanci je: "%1"8

The OSC URL for this instance is: "%1" MainWindow<b>Spo tn zarovnn se nezdaYilo</b><p>Zarovnn zvuku se spo tat s pomoc "%1" nepodaYilo:<p>%2gAlignment calculation failed

Failed to calculate an audio alignment using transform "%1":

%2 MainWindow8<b>Vy~adovn zvuk</b><p>Data s vrstvou nelze z "%1" nahrt bez zvukovho souboru.<br>PYed zavedenm poznmek nahrajte, prosm, alespoH jeden zvukov soubor.Audio required

Unable to load layer data from "%1" without an audio file.
Please load at least one audio file before importing annotations. MainWindow<b>Soubor se nepodaYilo otevYt</b><p>Zvukov soubor "%1" se nepodaYilo otevYt=File open failed

Audio file "%1" could not be opened MainWindow<b>Soubor se nepodaYilo otevYt</b><p>Soubor "%1" se nepodaYilo otevYt7File open failed

File "%1" could not be opened MainWindow<b>Soubor se nepodaYilo otevYt</b><p>Soubor s vrstvou "%1" se nepodaYilo otevYt.<File open failed

Layer file %1 could not be opened. MainWindow<b>Soubor se nepodaYilo otevYt</b><p>Soubor se sezenm "%1" se nepodaYilo otevYt?File open failed

Session file "%1" could not be opened MainWindow<<b>VytvoYen vrstvy se nezdaYilo</b><p>NepodaYilo se vytvoYit odvozenou vrstvu.<p>Promna vrstvy "%1" se nezdaYila.<p>Nejsou dostupn ~dn informace o chyb.Layer generation failed

Failed to generate a derived layer.

The layer transform "%1" failed.

No error information is available. MainWindow<b>VytvoYen vrstvy se nezdaYilo</b><p>NepodaYilo se vytvoYit odvozenou vrstvu.<p>Promna vrstvy "%1" se nezdaYila:<p>%2jLayer generation failed

Failed to generate derived layer.

The layer transform "%1" failed:

%2 MainWindow<b>VytvoYen vrstvy se nezdaYilo</b><p>NepodaYilo se znovu vytvoYit odvozenou vrstvu "%1" za pou~it novho datovho modelu jako vstupu.<p>Promna vrstvy "%2" se nezdaYila.<p>Nejsou dostupn ~dn informace o chyb.Layer generation failed

Failed to regenerate derived layer "%1" using new data model as input.

The layer transform "%2" failed.

No error information is available. MainWindowb<b>VytvoYen vrstvy se nezdaYilo</b><p>NepodaYilo se znovu vytvoYit odvozenou vrstvu "%1" za pou~it novho datovho modelu jako vstupu.<p>Promna vrstvy "%2" se nezdaYila:<p>%3Layer generation failed

Failed to regenerate derived layer "%1" using new data model as input.

The layer transform "%2" failed:

%3 MainWindow<b>OtevYen se nezdaYilo</b><p>Upuatnou adresu (URL) "%1" se nepodaYilo otevYt9Open failed

Dropped URL "%1" could not be opened MainWindow<b>OtevYen se nezdaYilo</b><p>Soubor nebo adresu (URL) "%1" se nepodaYilo otevYt9Open failed

File or URL "%1" could not be opened MainWindow<b>OtevYen se nezdaYilo</b><p>Adresu (URL) "%1" se nepodaYilo otevYt1Open failed

URL "%1" could not be opened MainWindow<b>PYet~eno</b><p>Poslech pYdavnch modulo zvukovch efekto byl zakzn kvoli pYet~en pYi zpracovn.dOverloaded

Audio effects plugin auditioning has been disabled due to a processing overload. MainWindow<b>PYet~eno</b><p>Zpracovn rychlosti pYehrvn zvuku bylo omezeno na jeden kanl kvoli pYet~en pYi zpracovn.wOverloaded

Audio playback speed processing has been reduced to a single channel, due to a processing overload. MainWindow<b>Ulo~en se nezdaYilo</b><p>Soubor se sezenm "%1" se nepodaYilo ulo~it.:Save failed

Session file "%1" could not be saved. MainWindowt<b>Vybrat cl pro zaveden</b><p> Tento dokument RDF odkazuje na jeden nebo vce zvukovch souboro.<p>Ji~ jste nahrl jeden zvukov  asov probh vlny.<br>Co chcete udlat s novmi daty?Select a target for import

This RDF document refers to one or more audio files.
You already have an audio waveform loaded.
What would you like to do with the new data? MainWindow<b>Sezen bylo upraveno</b><p>Nynja sezen bylo upraveno.<br>Chcete je ulo~it?[Session modified

The current session has been modified.
Do you want to save it? MainWindow<b>Soubor s pYedlohou existuje</b><p>PYedloha "%1" existuje.<br>PYepsat ji?PTemplate file exists

The template "%1" already exists.
Overwrite it? MainWindow<b>Varovn pYi znovuvytvYen vrstvy</b><p>PYi znovuvytvYen odvozen vrstvy "%1" za pou~it novho datovho modelu jako vstupu:<p>%2uWarning when regenerating layer

When regenerating the derived layer "%1" using new data model as input:

%2 MainWindow<b>`patn vzorkovac kmito et</b><p>Vzorkovac kmito et tohoto zvukovho souboru (%1 Hz) neodpovd nynja rychlosti pYehrvn (%2 Hz).<p>Soubor bude pYehrvn se apatnou rychlost a vakou.<p>ZmHte volbu <i>PYevzorkovat neodpovdajc soubory pYi zaveden</i>, kter je v nabdce <i>Soubor</i> -> <i>Nastaven</i>, pokud toto chovn chcete zmnit.7Wrong sample rate

The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).

The file will play at the wrong speed and pitch.

Change the Resample mismatching files on import option under File -> Preferences if you want to alter this behaviour. MainWindow<br>Podpora pro pYdavn moduly DSSI (API v%1) &copy; Chris Cannam, Steve Harris, Sean BoltonU
With DSSI plugin support (API v%1) © Chris Cannam, Steve Harris, Sean Bolton MainWindow`<br>Knihovna Dataquay Qt/RDF &copy; Chris Cannam4
With Dataquay Qt/RDF library © Chris Cannam MainWindowJ<br>FFTW3 &copy; Matteo Frigo and MIT*
With FFTW3 © Matteo Frigo and MIT MainWindowR<br>FFTW3 v%1 &copy; Matteo Frigo and MIT.
With FFTW3 v%1 © Matteo Frigo and MIT MainWindow<br>Zvukov vstupn knihovna JACK &copy; Paul Davis a Jack O'QuinD
With JACK audio output library © Paul Davis and Jack O'Quin MainWindow<br>Zvukov vstupn knihovna JACK v%1 &copy; Paul Davis a Jack O'QuinH
With JACK audio output library v%1 © Paul Davis and Jack O'Quin MainWindow<br>Podpora pro pYdavn moduly LADSPA (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld\
With LADSPA plugin support (API v%1) © Richard Furse, Paul Davis, Stefan Westerfeld MainWindowx<br>Dekodr souboro mp3 MAD &copy; Underbit Technologies Inc9
With MAD mp3 decoder © Underbit Technologies Inc MainWindow<br>Dekodr souboro mp3 MAD v%1 &copy; Underbit Technologies Inc=
With MAD mp3 decoder v%1 © Underbit Technologies Inc MainWindow\<br>Dekodr souboro Ogg &copy; CSIRO Australia0
With Ogg file decoder © CSIRO Australia MainWindow<br>Dekodr souboro Ogg (oggz v%1, fishsound v%2) &copy; CSIRO AustraliaJ
With Ogg file decoder (oggz v%1, fishsound v%2) © CSIRO Australia MainWindow<br>Zvukov vstupn knihovna PortAudio &copy; Ross Bencina a Phil BurkI
With PortAudio audio output library © Ross Bencina and Phil Burk MainWindow<br>Zvukov vstupn knihovna PulseAudio &copy; Lennart Poettering a Pierre OssmanT
With PulseAudio audio output library © Lennart Poettering and Pierre Ossman MainWindow<br>Zvukov vstupn knihovna PulseAudio v%1 &copy; Lennart Poettering a Pierre OssmanX
With PulseAudio audio output library v%1 © Lennart Poettering and Pierre Ossman MainWindow<br>Datov skladiat RDF Redland &copy; Dave Beckett a the University of BristolP
With Redland RDF datastore © Dave Beckett and the University of Bristol MainWindow<br>Datov skladiat RDF Redland v%1 &copy; Dave Beckett a the University of BristolT
With Redland RDF datastore v%1 © Dave Beckett and the University of Bristol MainWindowB<br>RtMidi &copy; Gary P. Scavone&
With RtMidi © Gary P. Scavone MainWindowZ<br>Gumi ka (Rubber Band) &copy; Chris Cannam(
With Rubber Band © Chris Cannam MainWindowb<br>Gumi ka (Rubber Band) v%1 &copy; Chris Cannam,
With Rubber Band v%1 © Chris Cannam MainWindow<br>Syntaktick analyztor Serd a Sord RDF a ukldn &copy; David RobillardB
With Serd and Sord RDF parser and store © David Robillard MainWindow<br>Podpora pro pYdavn moduly Vamp (API v%1, host SDK v%2) &copy; Chris CannamH
With Vamp plugin support (API v%1, host SDK v%2) © Chris Cannam MainWindow^<br>Knihovna liblo Lite OSC &copy; Steve Harris3
With liblo Lite OSC library © Steve Harris MainWindowf<br>Knihovna liblo Lite OSC v%1 &copy; Steve Harris7
With liblo Lite OSC library v%1 © Steve Harris MainWindowX<br>libsamplerate &copy; Erik de Castro Lopo1
With libsamplerate © Erik de Castro Lopo MainWindow`<br>libsamplerate v%1 &copy; Erik de Castro Lopo5
With libsamplerate v%1 © Erik de Castro Lopo MainWindowR<br>libsndfile &copy; Erik de Castro Lopo.
With libsndfile © Erik de Castro Lopo MainWindowZ<br>libsndfile v%1 &copy; Erik de Castro Lopo2
With libsndfile v%1 © Erik de Castro Lopo MainWindowH<h3>O programu Sonic Visualiser</h3>

About Sonic Visualiser

 MainWindow<h3>Je dostupn novja verze</h3><p>Pou~vte verzi %1 programu Sonic Visualiser, ale nyn je dostupn verze %3.</p><p>Podvejte se, prosm, na strnky <a href="http://sonicvisualiser.org/">projektu Sonic Visualiser</a>, abyste zskal vce informac.</p>

Newer version available

You are using version %1 of Sonic Visualiser, but version %3 is now available.

Please see the Sonic Visualiser website for more information.

 MainWindowN<p><small>%1 : %2 nastaven</small></p>+

%1 : %2 configuration

 MainWindow<p>Sonic Visualiser je programem ur enm pro prohl~en a zkoumn zvukovch dat, pro vznamov hudebn rozbor a pYipojovn poznmek.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p>

Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.
http://www.sonicvisualiser.org/

 MainWindowLOpustit nynja sezen %1 a za t nov2Abandon the current %1 session and start a new one MainWindow6O programu Sonic VisualiserAbout Sonic Visualiser MainWindow"PYidat %1 tabulku Add %1 Pane MainWindow0PYidat &stvajc vrstvuAdd &Existing Layer MainWindowNPYidat spektrogram &melodickho rozsahuAdd &Melodic Range Spectrogram MainWindow*PYidat &novou tabulku Add &New Pane MainWindow.PYidat  a&sov pravtkoAdd &Time Ruler MainWindow4PYidat & asov probh vlny Add &Waveform MainWindow,PYidat novou vrstvu %1Add New %1 Layer MainWindowNPYidat spektrogram nejvyaaho &kmito tuAdd Pea&k Frequency Spectrogram MainWindowPYidat bod Add Point MainWindow$PYidat k&us vrstvyAdd S&lice of Layer MainWindow PYidat spektr&um Add Spectr&um MainWindow&PYidat spektro&gramAdd Spectro&gram MainWindowHPYidat novou przdnou vrstvu typu %1 Add a new empty layer of type %1 MainWindowbPYidat novou vrstvu ukazujc kmito tov spektrum,Add a new layer showing a frequency spectrum MainWindowRPYidat novou vrstvu ukazujc spektrogram%Add a new layer showing a spectrogram MainWindowPYidat novou vrstvu ukazujc spektrogram nastaven na pYehled vaek notLAdd a new layer showing a spectrogram set up for an overview of note pitches MainWindowPYidat novou vrstvu ukazujc spektrogram nastaven na sledovn kmito toEAdd a new layer showing a spectrogram set up for tracking frequencies MainWindowZPYidat novou vrstvu ukazujc  asov pravtko$Add a new layer showing a time ruler MainWindowtPYidat novou vrstvu ukazujc pohled na  asov probh vlny'Add a new layer showing a waveform view MainWindowjPYidat novou tabulku obsahujc pouze  asov pravtko+Add a new pane containing only a time ruler MainWindowdPYidat novou tabulku ukazujc kmito tov spektrum+Add a new pane showing a frequency spectrum MainWindowTPYidat novou tabulku ukazujc spektrogram$Add a new pane showing a spectrogram MainWindowPYidat novou tabulku ukazujc spektrogram nastaven na pYehled vaek notKAdd a new pane showing a spectrogram set up for an overview of note pitches MainWindowPYidat novou tabulku ukazujc spektrogram nastaven na sledovn kmito toDAdd a new pane showing a spectrogram set up for tracking frequencies MainWindowvPYidat novou tabulku ukazujc pohled na  asov probh vlny&Add a new pane showing a waveform view MainWindowHPYidat tato data do nynjaho sezen$Add this data to the current session MainWindow4Upravit nastaven programu"Adjust the application preferences MainWindowHPYizposobit hlavn roveH pYehrvn Adjust the master playback level MainWindowLPYizposobit hlavn rychlost pYehrvn Adjust the master playback speed MainWindow<Zarovnat  asov pYmky souboroAlign File Timelines MainWindowAlt+aipka vlevoAlt+Left MainWindow Alt+aipka vpravo Alt+Right MainWindow,Pou~t pYedlohu sezenApply Session Template MainWindow4PYet~en zpracovn zvukuAudio processing overload MainWindow  ernBlack MainWindow ModrBlue MainWindowSvtlemodr Bright Blue MainWindowSvtlezelen Bright Green MainWindowSvtleoran~ov Bright Orange MainWindowSvtlepurpurov Bright Purple MainWindowSvtle erven Bright Red MainWindow"Vyprzd&nit vbrC&lear Selection MainWindowJNe-notov vrstvy nelze do MIDI vyvst$Can't export non-note layers to MIDI MainWindowKanl &%1 Channel &%1 MainWindow4Vybrat vchoz pYedlohu...Choose Default Template... MainWindow Vyprzdnit vbrClear the selection MainWindowJZavYt nynja sezen a vytvoYit nov.Close the current session and create a new one MainWindow4Omezit pYehrvn na vbrConstrain Playback to Selection MainWindowHOmezit pYehrvn na vybran oblasti*Constrain playback to the selected regions MainWindowXKoprovat vbr z nynja vrstvy do schrnky:Copy the selection from the current layer to the clipboard MainWindow Ctrl+ACtrl+A MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindowCtrl+Home Ctrl+Home MainWindow Ctrl+ICtrl+I MainWindow Ctrl+LCtrl+L MainWindow Ctrl+aipka vlevo Ctrl+Left MainWindow Ctrl+MCtrl+M MainWindow Ctrl+NCtrl+N MainWindow Ctrl+OCtrl+O MainWindowCtrl+PgDown Ctrl+PgDown MainWindowCtrl+PgUp Ctrl+PgUp MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+RCtrl+R MainWindow Ctrl+Right MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+A Ctrl+Shift+A MainWindowCtrl+Shift+D Ctrl+Shift+D MainWindow Ctrl+Shift+EnterCtrl+Shift+Enter MainWindowCtrl+Shift+O Ctrl+Shift+O MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindowCtrl+Shift+V Ctrl+Shift+V MainWindow Ctrl+TCtrl+T MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindowVyj&moutCu&t MainWindowTVyjmout vbr z nynja vrstvy do schrnky9Cut the selection from the current layer to the clipboard MainWindowVelikost cyklu Cycle size MainWindow LaditDebug MainWindow,Sn~it roveH zvtaenDecrease the zoom level MainWindowSmazat (Delete)Del MainWindowbSmazat polo~ky v nynjam vbru z nynja vrstvy8Delete items in current selection from the current layer MainWindow2Smazat nyn  innou vrstvu!Delete the currently active layer MainWindow4Smazat nyn  innou tabulku Delete the currently active pane MainWindowbSmazat mYen, kter je nyn pod ukazovtkem myai8Delete the measurement currently under the mouse pointer MainWindow Funkce zobrazenDisplay Features MainWindow Sn~itDown MainWindowNakreslitDraw MainWindow6Nakreslit polo~ky ve vrstvDraw new items in layer MainWindowEE MainWindowUpravitEdit MainWindow&Upravit data vrstvyEdit Layer Data MainWindow4Nstrojov pruh pro pravy Edit Toolbar MainWindow2Upravit polo~ky ve vrstvEdit items in layer MainWindow\Upravit nyn  innou vrstvu jako datovou mY~ku.Edit the currently active layer as a data grid MainWindow pravyEditing MainWindow KonecEnd MainWindow EnterEnter MainWindow(Zadat nzev pYedlohyEnter template name MainWindowVymazatErase MainWindow0Vymazat polo~ky z vrstvyErase items from layer MainWindowEscEsc MainWindowUkon it %1Exit %1 MainWindowTRozaYit oblast tabulky na celou obrazovku(Expand the pane area to the whole screen MainWindow8Vyvst poznmkovou vrstvu...Export Annotation Layer... MainWindow4Vyvst obrzkov soubor...Export Image File... MainWindow<Vyvst pYedlohu jako sezen...Export Session as Template... MainWindowdVyvst ka~dou jednu tabulku do obrzkovho souboru%Export a single pane to an image file MainWindow&Vyvst zvuk do "%1"Export audio to "%1" MainWindow,Vyvst obrzek do "%1"Export image to "%1" MainWindow:Vyvst data vrstvy do souboruExport layer data to a file MainWindow*Vyvst vrstvu do "%1"Export layer to "%1" MainWindow:Vyvst vce zvukovch souboroExport multiple audio files MainWindow@Vyvst vbr jako zvukov soubor!Export selection as an audio file MainWindow8Vyvst pouze vybranou oblastExport the selected region only MainWindowXVyvst vybran oblasti do oddlench souboro/Export the selected regions into separate files MainWindow(Vyvst plochu vbruExport the selection extent MainWindowFVyvst plochu vbru (%1x%2 pixelo)*Export the selection extent (%1x%2 pixels) MainWindowZVyvst pouze viditelnou oblast (%1x%2 pixelo)+Export the visible area only (%1x%2 pixels) MainWindow4Vyvst cel zvukov souborExport the whole audio file MainWindowFVyvst celou tabulku (%1x%2 pixelo)$Export the whole pane (%1x%2 pixels) MainWindowPF MainWindowF1F1 MainWindowF11F11 MainWindowF2F2 MainWindow@Zarovnn se spo tat nepodaYiloFailed to calculate alignment MainWindow:Vrstvu se nepodaYilo vytvoYitFailed to generate layer MainWindowXUpuatnou adresu (URL) se nepodaYilo otevYtFailed to open dropped URL MainWindow8Soubor se nepodaYilo otevYtFailed to open file MainWindowTOtevYen souboru %1 pro zpis se nezdaYilo"Failed to open file %1 for writing MainWindow<Umstn se nepodaYilo otevYtFailed to open location MainWindowFVrstvu se nepodaYilo vytvoYit znovuFailed to regenerate layer MainWindow6Soubor se nepodaYilo ulo~itFailed to save file MainWindowLSoubor s obrzkem se nepodaYilo ulo~itFailed to save image file MainWindowRSoubor s obrzkem %1 se nepodaYilo ulo~itFailed to save image file %1 MainWindow6Soubor se nepodaYilo zapsatFailed to write file MainWindowRychle vpYed Fast Forward MainWindow0PYet et rychle na konecFast Forward to End MainWindow>Rychle vpYed k dalamu okam~ikuFast Forward to Next Instant MainWindow6Rychle vpYed k dalamu boduFast Forward to Next Point MainWindow:Rychle vpYed k podobnmu boduFast Forward to Similar Point MainWindowRychle vpYed Fast forward MainWindowXRychle vpYed k dalamu bodu v nynja vrstv3Fast forward to the next point in the current layer MainWindownRychle vpYed k dalamu okam~iku v  ase v nynja vrstv:Fast forward to the next time instant in the current layer MainWindow0PYet et rychle na konecFast-forward to the end MainWindowvRychle vpYed k dalamu podobn ohodnocenmu okam~iku v  ase6Fast-forward to the next similarly valued time instant MainWindowRychle vpYed k dalamu okam~iku v  ase nebo mstu  asovho pravtka9Fast-forward to the next time instant or time ruler notch MainWindow4Nstrojov pruh pro soubor File Toolbar MainWindow.Sprva souboro a sezenFile and Session Management MainWindow Najt promnu...Find a Transform... MainWindowZZlomkov soubor %1 ji~ existuje. PYeruauje se)Fragment file %1 already exists, aborting MainWindowGG MainWindow,Jt na celou obrazovkuGo Full-Screen MainWindow ZelenGreen MainWindowNpovdaHelp MainWindowHSkrt  asy, nzvy vrstev, a stupnici"Hide times, layer names, and scale MainWindowHomeHome MainWindow:Zavst poznmkovou &vrstvu...Import Annotation &Layer... MainWindowVZavst dala zvukov soubor do nov tabulky*Import an extra audio file into a new pane MainWindowRZavst data vrstvy ze stvajcho souboru'Import layer data from an existing file MainWindow,Zvait roveH zvtaenIncrease the zoom level MainWindowHVlo~it okam~iky na &hranicch vbru(Insert Instants at Selection &Boundaries MainWindow.Vlo~it polo~ku u vbruInsert Item at Selection MainWindowVlo~it novou polo~ku noty nebo oblasti odpovdajc nynjamu vbruGInsert a new note or region item corresponding to the current selection MainWindowVlo~it nov  asov okam~ik v nynja poloze pYehrvn, v nov vrstv, pokud je tYebaWInsert a new time instant at the current playback position, in a new layer if necessary MainWindowVlo~it nov  asov okam~iky na za tku a na konci nyn vybranch oblast, v nov vrstv, pokud je tYebajInsert new time instants at the start and end of the current selected regions, in a new layer if necessary MainWindowS&ko it vpravo J&ump Right MainWindowKK MainWindow VlevoLeft MainWindow4Udlat z pYehrvn smy ku Loop Playback MainWindow8Udlat z pYehrvanho smy ku Loop playback MainWindowMM MainWindow.Udlat mYen ve vrstvMake measurements in layer MainWindow|Udlat dala tabulku smrem dolo v zsobnku tabulek sou asnou1Make the next pane down in the pane stack current MainWindowUdlat dala tabulku smrem nahoru v zsobnku tabulek sou asnou/Make the next pane up in the pane stack current MainWindow6Spravovat vyveden pYedlohyManage Exported Templates MainWindow.Sprva tabulek a vrstevManaging Panes and Layers MainWindow ZmYitMeasure MainWindowJe vybrno vce oblast povodnho zvukovho souboru. Co chcete vyvst?UMultiple regions of the original audio file are selected. What do you want to export? MainWindowNN MainWindowNavdtNavigate MainWindow6Nov nzev pro tuto vrstvu:New name for this layer: MainWindow2Je dostupn novja verzeNewer version available MainWindowDNebyl nahrn ~dn zvukov soubor.No audio file loaded. MainWindowPoznmka: cel tabulka je pYlia airok na to, aby mohla bt vyvedena jako jeden obrzek.BNote: the whole pane is too wide to be exported as a single image. MainWindow0 slovat nov okam~iky sNumber New Instants with MainWindowDOtevYt &naposledy otevYen soubor Open &Recent MainWindow(OtevYt &umstn...Open Lo&cation... MainWindow OtevYt umstn Open Location MainWindowlOtevYt soubor se sezenm, zvukov soubor, nebo vrstvu)Open a session file, audio file, or layer MainWindow~OtevYt okno zobrazujc poYad tabulek a vrstev v tomto sezenJOpen a window displaying the hierarchy of panes and layers in this session MainWindowpOtevYt okno uvdjc vmnu informac a dala udlosti3Open a window listing interactions and other events MainWindowOtevYt okno ukazujc klvesov zkratky, kter lze pou~t v programu %16Open a window showing the keystrokes you can use in %1 MainWindowfOtevYt nebo zavst soubor ze vzdlen adresy (URL)'Open or import a file from a remote URL MainWindow<OtevYt odbornou pYru ku k %1Open the %1 reference manual MainWindowNOtevYt internetov strnky programu %1Open the %1 website MainWindowOran~ovOrange MainWindow(Naj~dn a navdnPanning and Navigation MainWindow4Vlo~it v poloze pYehrvnPaste at Playback Position MainWindowHVlo~it ze schrnky do nynja vrstvy-Paste from the clipboard to the current layer MainWindowVlo~it ze schrnky do nynja vrstvy, prvn polo~ka se umst v poloze pYehrvn^Paste from the clipboard to the current layer, placing the first item at the playback position MainWindow.Letmo prohldnout vlevo Peek Left MainWindow0Letmo prohldnout vpravo Peek Right MainWindow PgDownPgDown MainWindowPgUpPgUp MainWindow$PYehrt/Pozastavit Play / Pause MainWindow:Nstrojov pruh pro re~im hryPlay Mode Toolbar MainWindow&PYehrvn Play&back MainWindowPYehrvnPlayback MainWindow8Zvaen rychlosti pYehrvnPlayback Speedup MainWindow<Nstrojov pruh pro pYehrvnPlayback Toolbar MainWindow:Ovldn pYehrvn a pYesunuPlayback and Transport Controls MainWindow4Rychlost pYehrvn: %1%2%Playback speed: %1%2% MainWindow8Rychlost pYehrvn: ObvyklPlayback speed: Normal MainWindowZZadejte, prosm, nzev pro ulo~enou pYedlohu:+Please enter a name for the saved template: MainWindowvZadejte, prosm adresu (URL) umstn, kter se m otevYt:-Please enter the URL of the location to open: MainWindowPurpurovPurple MainWindowRR MainWindowOtevYt znovuRe-open MainWindowhOtevYt znovu nynja nebo naposledy otevYen soubor0Re-open the current or most recently opened file MainWindowRVybrat znovu naposledy provedenou promnu)Re-select the most recently run transform MainWindow ervenRed MainWindow VydnRelease MainWindowVydn %1 Release %1 MainWindow(Vydn %1: Revize %2Release %1 : Revision %2 MainWindow$PYejmenovat vrstvu Rename Layer MainWindow<PYejmenovat nyn  innou vrstvu!Rename the currently active layer MainWindow8PYe slovat vybran okam~ikyRenumber Selected Instants MainWindowPYe slovat vybran okam~iky za pou~it nynjaho attkovacho plnuARenumber the selected instants using the current labelling scheme MainWindow Opakovat promnuRepeat Transform MainWindow0Nahradit &hlavn zvuk...Replace &Main Audio... MainWindow|Nahradit soubor s hlavnm zvukem v tomto sezen jinm souborem@Replace the main audio file of the session with a different file MainWindow0Nastavit znovu po tadlaReset Counters MainWindowDNastavit  slovac po tadla znovuReset Numbering Counters MainWindowNastavit na 1 vaechna po tadla pou~van pro attkovn zalo~en na po tadlechPYeto it k pYedchozmu okam~ikuRewind to Previous Instant MainWindow6PYeto it k pYedchozmu boduRewind to Previous Point MainWindow2PYeto it k podobnmu boduRewind to Similar Point MainWindow&PYeto it na za tekRewind to Start MainWindowXPYeto it k pYedchozmu bodu v nynja vrstv1Rewind to the previous point in the current layer MainWindowvPYeto it k pYedchozmu podobn ohodnocenmu okam~iku v  ase4Rewind to the previous similarly valued time instant MainWindownPYeto it k pYedchozmu okam~iku v  ase v nynja vrstv8Rewind to the previous time instant in the current layer MainWindowPYeto it k pYedchozmu okam~iku v  ase nebo mstu  asovho pravtka7Rewind to the previous time instant or time ruler notch MainWindow&PYeto it na za tekRewind to the start MainWindow VpravoRight MainWindow@Nesoulad ve vzorkovacm kmito tuSample rate mismatch MainWindow,Ulo~it sezen &jako...Save Session &As... MainWindow.Ulo~it sezen jako "%1"Save session as "%1" MainWindow\Ulo~it nynja sezen do %1 souboru se sezenm/Save the current session into a %1 session file MainWindowjUlo~it nynja sezen do novho %1 souboru se sezenm3Save the current session into a new %1 session file MainWindow"Proj~dt &doleva Scroll &Left MainWindow$Proj~dt do&prava Scroll &Right MainWindow\Proj~dt nynja tabulkou velkm skokem vlevo.Scroll the current pane a big step to the left MainWindow^Proj~dt nynja tabulkou velkm skokem vpravo/Scroll the current pane a big step to the right MainWindow@Proj~dt nynja tabulkou vlevo#Scroll the current pane to the left MainWindowProj~dt nynja tabulkou vlevo bez pohybu ukazatelem pYehrvn nebo jinmi tabulkamiUScroll the current pane to the left without moving the playback cursor or other panes MainWindowBProj~dt nynja tabulkou vpravo$Scroll the current pane to the right MainWindowProj~dt nynja tabulkou vpravo bez pohybu ukazatelem pYehrvn nebo jinmi tabulkamiVScroll the current pane to the right without moving the playback cursor or other panes MainWindowHledat promnu z nainstalovanch pYdavnch modulo, podle nzvu nebo popisuISearch for a transform from the installed plugins, by name or description MainWindow VybratSelect MainWindowVybrat &vae Select &All MainWindow0Vybrat &viditeln rozsahSelect &Visible Range MainWindowDVybrat zvukov soubor pro vyvedenSelect audio file to export MainWindowfVybrat od nynja polohy pYehrvn po konec sezenCSelect from the current playback position to the end of the session MainWindowjVybrat od za tku sezen po nynja polohu pYehrvnESelect from the start of the session to the current playback position MainWindowVybrat rozsah Select ranges MainWindowBVybrat oblast, kter se m vyvstSelect region to export MainWindow.Vybrat cl pro zavedenSelect target for import MainWindowlVybrat  asov rozsah odpovdajc aYce nynjaho okna?Select the time range corresponding to the current window width MainWindowRVybrat celou dobu trvn nynjaho sezen0Select the whole duration of the current session MainWindow Vybrat do &konceSelect to &End MainWindow$Vybrat po &za tekSelect to &Start MainWindow Vbr Selection MainWindow@Vbr: %1 a~ %2 (doba trvn %3)!Selection: %1 to %2 (duration %3) MainWindow(Sezen bylo upravenoSession modified MainWindow>Nastavit  slovac po tadla...Set Numbering Counters... MainWindowtNastavit jako vchoz pYedlohu pro budouc zvukov soubory.Set as default template for future audio files MainWindowNastavit po tadla pou~van pro attkovn zalo~en na po tadlech1Set the counters used for counter-based labelling MainWindowShift+Enter Shift+Enter MainWindowShift+GShift+G MainWindowShift+KShift+K MainWindow"Shift+aipka vlevo Shift+Left MainWindowShift+MShift+M MainWindowShift+PgDown Shift+PgDown MainWindowShift+PgUp Shift+PgUp MainWindow$Shift+aipka vpravo Shift+Right MainWindowShift+UShift+U MainWindowShift+WShift+W MainWindow0Ukzat &vaechna pYekrytShow &All Overlays MainWindow.Ukzat &stYedovou linkuShow &Centre Line MainWindow2Ukzat nej&mena pYekrytShow &Minimal Overlays MainWindow4&Neukazovat ~dn pYekrytShow &No Overlays MainWindow<Ukzat kole ka pro &zvtaovnShow &Zoom Wheels MainWindow,Ukzat zpis  in&nostiShow Acti&vity Log MainWindow,Ukzat pYehled &vrstevShow La&yer Summary MainWindow2Ukzat &oknka vlastnostShow Property Bo&xes MainWindow*Ukzat st&avov YdekShow Status &Bar MainWindownUkzat souvisejc npovdu ve stavovm Ydku okna doleKShow context help information in the status bar at the bottom of the window MainWindow<Ukzat informace o programu %1Show information about %1 MainWindowRUkzat nebo skrt vaechna  asov pravtkaShow or hide all time rulers MainWindowBUkzat nebo skrt stYedovou linkuShow or hide the centre line MainWindownUkzat oknka vlastnost vrstev po stran hlavnho oknaUkzat  asy a zkladn stupniciShow times and basic scale MainWindowJUkzat  asy, nzvy vrstev, a stupnici"Show times, layer names, and scale MainWindowZpomalit Slow Down MainWindow4Nynja tabulka samostatnSolo Current Pane MainWindowVNynja tabulka samostatn bhem pYehrvn%Solo the current pane during playback MainWindowPromiHte, ale typ tto vrstvu nelze vyvst do RDF (podporovanmi typy jsou: oblast, poznmka, text, okam~iky  asu. hodnoty  asu)qSorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) MainWindowMezernkSpace MainWindowZrychlitSpeed Up MainWindow"Obvykl tvar vlnyStandard Waveform MainWindowdSpustit nebo zastavit pYehrvn od nynja polohy0Start or stop playback from the current position MainWindow2PYepnout na dala tabulkuSwitch to Next Pane MainWindow:PYepnout na pYedchoz tabulkuSwitch to Previous Pane MainWindowTT MainWindow.Zaklepn okam~iko  asuTapping Time Instants MainWindow6Soubor s pYedlohou existujeTemplate file exists MainWindow|PYehrvn rozta~en  asu kvoli jeho zpomalen bez zmny vakyhttp://www.sonicvisualiser.org/http://www.sonicvisualiser.org/ MainWindowfhttp://www.sonicvisualiser.org/doc/reference/%1/en/3http://www.sonicvisualiser.org/doc/reference/%1/en/ MainWindowll MainWindowoo MainWindowss MainWindow (upraveno) (modified)MainWindowBase%1 (upraveno) %1 (modified)MainWindowBase %1: %2%1: %2MainWindowBase%1: %2 [%3] %1: %2 [%3]MainWindowBase<b>NepodaYilo se zavst RDF</b><p>Zaveden dat z dokumentu RDF na "%1" se nepodaYilo: %2</p>UFailed to import RDF

Importing data from RDF document at "%1" failed: %2

MainWindowBase<b>NepodaYilo se zavst RDF</b><p>Nebyly nalezeny ~dn vhodn datov modely pro zaveden dat z dokumentu RDF na "%1"</p>dFailed to import RDF

No suitable data models found for import from RDF document at "%1"

MainWindowBase<b>}dn zvuk nen dostupn</b><p> Zvukov zaYzen se nepodaYilo otevYt pro pYehrvn.<p>Automatick ur en zvukovho zaYzen se nezdaYilo. PYehrvn zvuku bhem tohoto sezen nebude dostupn.</p>No audio available

Could not open an audio device for playback.

Automatic audio device detection failed. Audio playback will not be available during this session.

MainWindowBaseD<b>}dn zvuk nen dostupn</b><p> Vmi upYednostHovan zvukov zaYzen se nepodaYilo otevYt ("%1").<p>PYehrvn zvuku bhem tohoto sezen nebude dostupn.</p>No audio available

Failed to open your preferred audio device ("%1").

Audio playback will not be available during this session.

MainWindowBase<b>Ulo~en se nezdaYilo</b><p>NepodaYilo se zapsat do souboru "%1": %25Save failed

Failed to write to file "%1": %2MainWindowBase<b>Vybrat cl pro zaveden</b><p>Ji~ mte nahrn jeden zvukov soubor.<br>Co chcete udlat s novm zvukovm souborem?Select a target for import

You already have an audio file loaded.
What would you like to do with the new audio file?MainWindowBase*PYidat polo~ku v %1 sAdd Item at %1 sMainWindowBasePYidat tabulkuAdd PaneMainWindowBasePYidat bod Add PointMainWindowBase"PYidat bod v %1 sAdd Point at %1 sMainWindowBasePPYidat soubor se zvukem do tohoto sezen"Add the audio file to this sessionMainWindowBaseDZavYt nynja sezen a za t nov-Close the current session and start a new oneMainWindowBaseLNepodaYilo se otevYt zvukov zaYzenCouldn't open audio deviceMainWindowBaseVyjmoutCutMainWindowBaseSmazat tabulku Delete PaneMainWindowBase0NepodaYilo se zavst RDFFailed to import RDFMainWindowBase6Soubor se nepodaYilo zapsatFailed to write fileMainWindowBaseZavst "%1" Import "%1"MainWindowBase.Zavst soubor MIDI "%1"Import MIDI file "%1"MainWindowBase0Zavst dokument RDF "%1"Import RDF document "%1"MainWindowBase4Zavst zvukov soubor "%1"Import audio file "%1"MainWindowBase:Zavst soubor XML vrstvy "%1"Import layer XML file "%1"MainWindowBase:Zavst soubor se sezenm "%1"Import session file "%1"MainWindowBase$Zavd se z RDF...Importing from RDF...MainWindowBase8OtevYt pYedlohu sezen "%1"Open session template "%1"MainWindowBaseLOtevr se soubor nebo adresa (URL)...Opening file or URL...MainWindowBase8Otevr se seznam skladeb...Opening playlist...MainWindowBase(Otevr se sezen...Opening session...MainWindowBase Vlo~itPasteMainWindowBaseBPYehrv se: %1 z %2 (%3 zostv) Playing: %1 of %2 (%3 remaining)MainWindowBase"Odstranit tabulku Remove PaneMainWindowBase^Nahradit soubor s hlavnm zvukem v tomto sezen+Replace the main audio file in this sessionMainWindowBaseDChyba pYi  ten souboru XML SV: %1SV XML file read error: %1MainWindowBase.Vybrat cl pro zavedenSelect target for importMainWindowBase  ModelDataTableDialogEditor dat Data EditorModelDataTableDialogData ve vrstv Data in LayerModelDataTableDialog SmazatDeleteModelDataTableDialog,Smazat vybran polo~kyDelete Selected ItemsModelDataTableDialogHSmazat vybranou polo~ku nebo polo~ky!Delete the selected item or itemsModelDataTableDialog4Nstrojov pruh pro pravy Edit ToolbarModelDataTableDialogHledat:Find:ModelDataTableDialog Vlo~itInsertModelDataTableDialog(Vlo~it novou polo~kuInsert New ItemModelDataTableDialog(Vlo~it novou polo~kuInsert a new itemModelDataTableDialog:Nstrojov pruh pro re~im hryPlay Mode ToolbarModelDataTableDialog<Nstrojov pruh pro pYehrvnPlayback ToolbarModelDataTableDialogHPYepnout sledovn polohy pYehrvn$Toggle tracking of playback positionModelDataTableDialog PYehrvn stopyTrack PlaybackModelDataTableDialog TvorceMakerModelMetadataModel NzevNameModelMetadataModel ZdrojSourceModelMetadataModelTypTypeModelMetadataModel%1 <%2>%1 <%2>ModelTransformerFactory %1: %2%1: %2ModelTransformerFactory %1 %2%1 %2 NoteLayer%1 (%2, %3 Hz)%1 (%2, %3 Hz) NoteLayer%1 Hz (%2, %3)%1 Hz (%2, %3) NoteLayer*Automatick zarovnn Auto-Align NoteLayer&Zmnit hodnotu boduChange Point Value NoteLayer&Smazat vybran bodyDelete Selected Points NoteLayerThnout bod Drag Point NoteLayerThnout vbrDrag Selection NoteLayerNakreslit bod Draw Point NoteLayerUpravit bod Edit Point NoteLayerVymazat bod Erase Point NoteLayerProbh In progress NoteLayerPYmo arLinear NoteLayer ZpisLog NoteLayerNoty MIDI MIDI Notes NoteLayerNov bod New Point NoteLayer"}dn mstn bodyNo local points NoteLayer Vlo~itPaste NoteLayer>Zarovnat vlo~en polo~ky znovu?Re-align pasted items? NoteLayerNahrt notu Record Note NoteLayerPYemstit bodRelocate Point NoteLayer,Zmnit velikost vbruResize Selection NoteLayerStupniceScale NoteLayer"Jednotky stupnice Scale Units NoteLayer^Polo~ky, kter vkldte, pYialy z vrstvy s odlianm zdrojovm materilem, ne~ m tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovmu materilu pro tuto vrstvu?The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? NoteLayerX as: %1 Vaka: %2 Doba trvn: %3 `ttek: %4)Time: %1 Pitch: %2 Duration: %3 Label: %4 NoteLayer\ as: %1 Vaka: %2 Doba trvn: %3 }dn attek(Time: %1 Pitch: %2 Duration: %3 No label NoteLayerSvisl stupniceVertical Scale NoteLayerDoba trvnDuration NoteModelUpravit data Edit Data NoteModel SnmekFrame NoteModel `ttekLabel NoteModel roveHLevel NoteModelNotaNote NoteModelVaka tnuPitch NoteModel asTime NoteModelNeznmUnknown NoteModel"Dekduje se %1...Decoding %1...OggVorbisFileReadertKlepnte a thnte pro navdn; dvakrt klepnte pro skok0Click and drag to navigate; double-click to jumpOverviewPYehledOverviewOverview%1 - %2%1 - %2Pane%1 / %2Hz%3 %1 / %2Hz%3Pane(R)(R)Pane(X)(X)Pane+%1+%1PaneZarovnnoAlignedPaneZarovnn: %1% Aligning: %1%PaneAlt+kole ko Alt+WheelPaneKlepnte a thnte polo~ku v  inn vrstv pro jej pYesun; dr~te klvesu Shift pro potla en po te nho odporu`Click and drag an item in the active layer to move it; hold Shift to override initial resistancePane~Klepnte a thnte pro pYizposoben rovn vodorovnho zvtaen2Click and drag to adjust the horizontal zoom levelPanexKlepnte a thnte pro pYizposoben rovn svislho zvtaen0Click and drag to adjust the vertical zoom levelPaneKlepnte a thnte pro pYizposoben viditelnho rozsahu svisl stupnice@Click and drag to adjust the visible range of the vertical scalePane~Klepnte a thnte pro pYesun vaech polo~ek ve vybranm rozsahu6Click and drag to move all items in the selected rangePanexKlepnte levm tla tkem a thnte pro pYesun hranice vbru-Click and drag to move the selection boundaryPane>Klepnte a thnte pro navdnClick and drag to navigatePane$Klepnte a thnte pro vbr rozsahu; dr~te klvesu Ctrl pro proveden vcensobnho vbru; klepnte prostYednm tla tkem a thnte pro navdn^Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigatePane$Klepnte a thnte pro vbr rozsahu; dr~te klvesu Ctrl pro proveden vcensobnho vbru; klepnte prostYednm tla tkem a thnte pro navdn_Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigatePaneKlepnte a thnte pro vbr rozsahu; dr~te klvesu Shift, abyste se vyhnul zapadvn k polo~km; dr~te klvesu Ctrl pro proveden vcensobnho vbru; klepnte prostYednm tla tkem a thnte pro navdnClick and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigatePaneKlepnte a thnte pro vbr rozsahu; dr~te klvesu Shift, abyste se vyhnul zapadvn k polo~km; dr~te klvesu Ctrl pro proveden vcensobnho vbru; klepnte prostYednm tla tkem a thnte pro navdnClick and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigatePane0Klepnte a thnte pro vbr rozsahu; dr~te klvesu Shift, abyste se vyhnul zapadvn k polo~km; klepnte prostYednm tla tkem a thnte pro navdnaClick and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigatePaneKlepnte a thnte pro vbr rozsahu; klepnte prostYednm tla tkem a thnte pro navdnCClick and drag to select a range; middle-click and drag to navigatePanezKlepnte levm tla tkem a thnte pro vytvoYen nov polo~ky-Click left button and drag to create new itemPaneKlepnte levm tla tkem a thnte pro zmYen obdlnkov oblasti8Click left button and drag to measure a rectangular areaPaneKlepnte levm tla tkem a thnte pro zmYen rozsahu polo~ky nebo tvaruAClick left button and drag to measure extents of an item or shapePanehKlepnte levm tla tkem a thnte pro pYesouvn se)Click left button and drag to move aroundPaneKlepnte levm tla tkem a thnte pro vbr oblasti; thnte za okraj oblasti pro zmnu jej velikostiGClick left button and drag to select region; drag region edge to resizePaneKlepnte levm tla tkem na polo~ku nebo vybranou oblast a thnte pro jej pYesun@Click left button on an item or selected region and drag to movePaneKlepnte prostYednm tla tkem a thnte pro veden s jakmkoli nstrojem6Click middle button and drag to navigate with any toolPanebKlepnte pro pYidn nov polo~ky do  inn vrstvy+Click to add a new item in the active layerPaneXKlepnte pro vymazn polo~ky z  inn vrstvy,Click to erase an item from the active layerPane~Ctrl-klepnte levm tla tkem a thnte pro vbr dala oblasti=Cmd-click left button and drag to select an additional regionPane Ctrl+aipka vlevo Ctrl+LeftPaneCtrl+kole ko Ctrl+WheelPane~Ctrl-klepnte levm tla tkem a thnte pro vbr dala oblasti>Ctrl-click left button and drag to select an additional regionPane,Dvakrt klepnte levmDouble-Click LeftPane8Dvakrt klepnte prostYednmDouble-Click MiddlePanezDvakrt klepnte levm tla tkem na polo~ce pro jej upraven.Double-click left button on an item to edit itPanevDvakrt klepnte levm tla tkem pro skok na klepnut msto4Double-click left button to jump to clicked locationPaneDvakrt klepnte prostYednm pro pYemstn s jakmkoli nstrojem4Double-click middle button to relocate with any toolPaneThnout vbrDrag SelectionPaneNakreslitDrawPaneR innosti nstroje kreslen provdn myaDraw Tool Mouse ActionsPaneUpravitEditPaneL innosti nstroje prav provdn myaEdit Tool Mouse ActionsPane&Zadejte nov rozsahEnter new rangePaneCitliv vbr Fine SelectPaneP innosti provdn mya obecn v tabulceGeneral Pane Mouse ActionsPane$Vodorovn zvtaenHorizontal ZoomPaneLevLeftPaneOblast mYen Measure AreaPanePolo~ka mYen Measure ItemPaneN innosti nstroje mYen provdn myaMeasure Tool Mouse ActionsPaneNabdkaMenuPaneProstYednMiddlePanePosunoutMovePane"Vcensobn vbr Multi SelectPaneNavdtNavigatePaneZ innosti nstroje pro navdn provdn myaNavigate Tool Mouse ActionsPane^Nov rozsah svislho zobrazen, od %1 do %2 %4:-New vertical display range, from %1 to %2 %4:Pane Odkaz ReferencePanePYemstitRelocatePaneNastavit znovu rovn vodorovnho a svislho zvtaen na jejich vchoz hodnoty;Reset horizontal and vertical zoom levels to their defaultsPaneDNastavit zvtaen znovu na vchozReset zoom to defaultPane,Zmnit velikost vbruResize SelectionPane PravRightPaneProj~dtScrollPane Proj~dt svisleScroll VerticallyPane`Proj~dt rychle vlevo nebo vpravo na  asov ose)Scroll rapidly left or right in time axisPanePProj~dt nahoru nebo dolo na svisl ose&Scroll up or down in the vertical axisPane VybratSelectPaneN innosti nstroje vbru provdn myaSelect Tool Mouse ActionsPane"Shift+aipka vlevo Shift+LeftPaneShift+kole ko Shift+WheelPaneShift-klepnte levm tla tkem a thnte pro vbr bez zapadvn k polo~km nebo mY~ceLShift-click left button and drag to select without snapping to items or gridPaneShift-klepnte levm tla tkem a thnte pro pYibl~en obdlnkov oblasti>Shift-click left button and drag to zoom to a rectangular areaPaneJUkzat nabdku souvisejc s tabulkouShow pane context menuPane.PYlia dlouh pYedpona:Some lengthy prefix:PaneNezarovnno UnalignedPaneSvisl zvtaen Vertical ZoomPaneKole koWheelPaneKole ko dolo Wheel DownPaneKole ko nahoruWheel UpPaneZvtaenZoomPanePYibl~itZoom InPaneOddlitZoom OutPane0PYibl~it/Oddlit svisleZoom VerticallyPaneHPYibl~it nebo oddlit na svisl ose#Zoom in or out in the vertical axisPaneHPYibl~it nebo oddlit na  asov oseZoom in or out in time axisPane PYibl~it oblast Zoom to AreaPane8Upravit parametry pYehrvnAdjust Playback ParametersPlayParameterRepository4Zmnit zeslen pYehrvnChange Playback GainPlayParameterRepository>Zmnit stav ztlumen pYehrvnChange Playback Mute StatePlayParameterRepository4Zmnit vyv~en pYehrvnChange Playback PanPlayParameterRepository@Zmnit pYdavn modul pYehrvnChange Playback PluginPlayParameterRepositoryDNastavit pYdavn modul pYehrvnConfigure Playback PluginPlayParameterRepositoryProgramProgramPluginParameterBoxlTento pYdavn modul nem ~dn upraviteln parametry.)This plugin has no adjustable parameters.PluginParameterBoxPokro il << Advanced <<PluginParameterDialogPokro il >> Advanced >>PluginParameterDialog*Snmko zvuku na blok:Audio frames per block:PluginParameterDialog"Nesoulad v kanluChannel mismatchPluginParameterDialog KanlyChannelsPluginParameterDialog"Autorsk prvo:  Copyright: PluginParameterDialog Vstupn materilInput MaterialPluginParameterDialogTvorce:Maker:PluginParameterDialog Nzev:Name:PluginParameterDialogVstup:Output:PluginParameterDialog6Parametry pYdavnho moduluPlugin ParametersPluginParameterDialogZpracovn ProcessingPluginParameterDialog.Omezit na rozsah vbruRestrict to selection extentsPluginParameterDialogTento pYdavn modul nepYijm vce ne~ %1 vstupn kanly, ale dostupn jsou %2. Pou~ije se pouze prvn %3. kThis plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. PluginParameterDialogTento pYdavn modul m jednokanlov vstup, ale zdroj m %1 kanly. LThis plugin only has a single channel input, but the source has %1 channels.PluginParameterDialogTento pYdavn modul vy~aduje alespoH %1 vstupnch kanlo, ale dostupn jsou pouze %2 %3. PYdavn modul pravdpodobn nebude pracovat sprvn.xThis plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly.PluginParameterDialog*Pou~t pouze kanl %1Use channel %1 onlyPluginParameterDialogDPou~t promr ze zdrojovch kanloUse mean of source channelsPluginParameterDialog Verze:Version:PluginParameterDialogPYrostek okna:Window increment:PluginParameterDialogPodoba okna: Window shape:PluginParameterDialogVelikost okna: Window size:PluginParameterDialogjsouarePluginParameterDialogjeisPluginParameterDialog424 snmko za sekundu (FPS)24 FPS Preferences425 snmko za sekundu (FPS)25 FPS Preferences430 snmko za sekundu (FPS)30 FPS Preferences"4 x pYevzorkovn4 x Oversampling Preferences>4 x pYevzorkovn s interpolac#4 x Oversampling with interpolation Preferences450 snmko za sekundu (FPS)50 FPS Preferences460 snmko za sekundu (FPS)60 FPS Preferences8UpYednostHovan barva pozadBackground colour preference PreferencesBlackmanBlackman PreferencesBlackman-HarrisBlackman-Harris PreferencesTmav pozadDark background PreferencesNejrychlejaFastest Preferences,Dr~et se nmtu plochyFollow desktop theme PreferencesDVelikost psma pro pYekryt textemFont size for text overlays Preferences,Kmito et koncertnho AFrequency of concert A Preferences GaussGaussian PreferencesHammingHamming PreferencesHannHann PreferencesDVysok rozliaen (na mikrosekundy) High resolution (to microsecond) Preferences Nejvyaa kvalitaHighest quality PreferencesSvtl pozadLight background Preferences*PYmo ar interpolaceLinear interpolation PreferencesLUmstn adresYe s vyrovnvac pamt!Location for cache file directory Preferences }dnNone PreferencesNuttallNuttall PreferencesnVynechat do asn z nabdky naposledy otevYench souboro'Omit temporaries from Recent Files menu Preferences ParzenParzen Preferences8Typ pYevzorkovn pYehrvnPlayback resampler type PreferencesNastaven Preferences Preferences6Rozvr~en oknka vlastnostProperty box layout PreferencesObdlnkov Rectangular Preferences`PYevzorkovat neodpovdajc soubory pYi zaveden$Resample mismatching files on import PreferencesNUkzat oknko pouze pro nynja tabulkuShow box for current pane only PreferencesBUkzat oknka pro vaechny tabulkyShow boxes for all panes PreferencesHUkzat vodn obrazovku pYi spuatnShow splash screen on startup Preferences<Podoba okna pro rozbor spektraSpectral analysis window shape Preferences>Interpolace osy x spektrogramu:!Spectrogram x-axis interpolation: Preferences>Interpolace osy y spektrogramu:!Spectrogram y-axis interpolation: PreferencesObvyklStandard Preferences0Obvykl (na milisekundy)Standard (to millisecond) Preferences*Formt zobrazen  asuTime display format PreferencesTrojhelnkov Triangular Preferences%1:%1:PreferencesDialogVz&hled &AppearancePreferencesDialog&Obecn&GeneralPreferencesDialog2<b>Znovuspuatn vy~adovno</b><p>Jedno nebo vce nastaven programu, kter jste zmnil, se nebude moci pln projevit do doby, ne~ bude Sonic Visualiser spuatn znovu.</p><p>Ukon ete, prosm, program nyn a spusete jej znovu, pokud chcete, aby se tyto zmny projevily okam~it.</p>Restart required

One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.

Please exit and restart the application now if you want these changes to take effect immediately.

PreferencesDialog$<domovsk adresY>PreferencesDialog&Rozbor Anal&ysisPreferencesDialog Pou~tApplyPreferencesDialog ZruaitCancelPreferencesDialogXVchoz pYedloha sezen pro zvukov soubory:)Default session template for audio files:PreferencesDialogOKOKPreferencesDialog@Zvukov zaYzen pro pYehrvn:Playback audio device:PreferencesDialogNastaven PreferencesPreferencesDialog"Nastaven zmnnaPreferences ChangedPreferencesDialogVyberte adresY pro vytvoYen podadresYe s vyrovnvac pamt v nm2Select a directory to create cache subdirectory inPreferencesDialog &PYedloha sezenSession &TemplatePreferencesDialogNkter nastaven byla zmnna, ale nebyla pou~ita. Pou~t je pYed zavYenm?NSome preferences have been changed but not applied. Apply them before closing?PreferencesDialogHSonic Visualiser: Nastaven programu)Sonic Visualiser: Application PreferencesPreferencesDialog"Obvykl tvar vlnyStandard WaveformPreferencesDialog ZruaitCancelProgressDialog0 (nynja hodnota: %1%2) (current value: %1%2) PropertyBox, (nynja hodnota: %1) (current value: %1) PropertyBox*PYidat novou barvu...Add New Colour... PropertyBox2Upravit %1 vlastnost %2%3Adjust %1 property of %2%3 PropertyBox<Zadejte nzev pro novou barvu: Enter a name for the new colour: PropertyBox,Pojmenovat novou barvuName New Colour PropertyBoxPYehrtPlay PropertyBox&Zeslen pYehrvn Playback Gain PropertyBox:Vyv~en pYehrvn/rovnovhaPlayback Pan / Balance PropertyBoxTUpYednostHovat  ern pozad pro tuto barvu'Prefer black background for this colour PropertyBox UkzatShow PropertyBox0PYepnout %1 vlastnost %2Toggle %1 property of %2 PropertyBox,PYepnout pYehrvn %1Toggle Playback of %1 PropertyBox.PYepnout viditelnost %1Toggle Visibility of %1 PropertyBoxdBdB PropertyBox*Nastavit %1 vlastnostSet %1 PropertyPropertyContainerNepravdivfalsePropertyContainerNenoPropertyContainerVypnutooffPropertyContainerZapnutoonPropertyContainerPravdivtruePropertyContainerAnoyesPropertyContainer2Zmnit viditelnost vrstvyChange Layer Visibility PropertyStackNKlepnte pro zmnu nynja  inn vrstvy(Click to change the current active layer PropertyStackB Sonic Visualiser je programem ur enm pro prohl~en a zkoumn zvukovch dat, pro vznamov hudebn rozbor a pYipojovn poznmek. Pou~it: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Nepokouaet se otevYt zaYzen pro vstup zvuku --no-osc: Neposkytovat pYpojku Open Sound Control pro dlkov ovldn <file>: Lze poskytnout jeden nebo vce souboro Sonic Visualiser (.sv) a zvukovch souboro. w Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [ ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control : One or more Sonic Visualiser (.sv) and audio files may be provided.  QApplicationHSonic Visualiser - ZnzorHova zvukuSonic Visualiser QApplicationBSoubor "%1" se nepodaYilo otevYtFailed to open file "%1"QFile,Soubor "%1" neexistujeFile "%1" does not existQFiledSoubor nebo adresu (URL) "%1" se nepodaYilo zskat'File or URL "%1" could not be retrievedQFile<b>Vy~adovn zvuk</b><p>PYed zavedenm dat s poznmkami nahrajte, prosm, alespoH jeden zvukov soubor\Audio required

Please load at least one audio file before importing annotation data QMessageBox8Soubor se nepodaYilo otevYtFailed to open file QMessageBoxfSoubor nebo adresu (URL) "%1" se nepodaYilo otevYt$File or URL "%1" could not be opened QMessageBox"Dekduje se %1...Decoding %1...QuickTimeFileReaderDZavd se zvuk odkazovan v RDF...$Importing audio referenced in RDF... RDFImporterhZavd se signlov data s vysokou hustotou z RDF...'Importing dense signal data from RDF... RDFImporter@Zavd se data udlost z RDF... Importing event data from RDF... RDFImporter do  to RangeInputDialogFRozsahov shrnuteln  asov hodnotaRange-Summarisable Time-ValueRangeSummarisableTimeValueModel %1 %2%1 %2 RegionLayer*Automatick zarovnn Auto-Align RegionLayer se kyBars RegionLayer&Zmnit hodnotu boduChange Point Value RegionLayer&Smazat vybran bodyDelete Selected Points RegionLayerThnout oblast Drag Region RegionLayerThnout vbrDrag Selection RegionLayer Nakreslit oblast Draw Region RegionLayerUpravit oblast Edit Region RegionLayer&Vyrovnan rozlo~en Equal Spaced RegionLayerVymazat oblast Erase Region RegionLayerProbh In progress RegionLayerPYmo arLinear RegionLayer ZpisLog RegionLayerNov oblast New Region RegionLayer"}dn mstn bodyNo local points RegionLayer Vlo~itPaste RegionLayerTyp nkresu Plot Type RegionLayer>Zarovnat vlo~en polo~ky znovu?Re-align pasted items? RegionLayer PYemstit oblastRelocate Region RegionLayer,Zmnit velikost vbruResize Selection RegionLayerStupniceScale RegionLayer"Jednotky stupnice Scale Units RegionLayerRoz lenn Segmentation RegionLayer^Polo~ky, kter vkldte, pYialy z vrstvy s odlianm zdrojovm materilem, ne~ m tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovmu materilu pro tuto vrstvu?The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? RegionLayer\ as: %1 Hodnota: %2 Doba trvn: %3 `ttek: %4)Time: %1 Value: %2 Duration: %3 Label: %4 RegionLayer` as: %1 Hodnota: %2 Doba trvn: %3 }dn attek(Time: %1 Value: %2 Duration: %3 No label RegionLayerSvisl stupniceVertical Scale RegionLayerDoba trvnDuration RegionModelUpravit data Edit Data RegionModelRme ekFrame RegionModel `ttekLabel RegionModel OblastRegion RegionModel asTime RegionModelNeznmUnknown RegionModelHodnotaValue RegionModel Smazat %1 vrstvuDelete %1 LayerRemoveLayerCommand,PYevzorkovv se %1...Resampling %1...ResamplingWavFileReader2(odvozen model v SV-XML)(derived model in SV-XML) SVFileReaderLOtevr se soubor nebo adresa (URL)...Opening file or URL... SVFileReader<neznm> SingleColourLayer BarvaColourSingleColourLayer%1 - %2%1 - %2 SliceLayer-Inf-Inf SliceLayer0dB0dB SliceLayerNaprostAbsolute SliceLayerJakkoliAny SliceLayerStupnice koae Bin Scale SliceLayerKoaeBins SliceLayer BlokyBlocks SliceLayer BarvyColours SliceLayer PrvnFirst SliceLayerZeslenGain SliceLayerPYmo arLinear SliceLayer ryLines SliceLayer ZpisLog SliceLayer PromrMean SliceLayer MYi Meter SliceLayerNormalizovat Normalize SliceLayer VrcholPeak SliceLayerTyp nkresu Plot Type SliceLayerRev LogRev Log SliceLayer Re~im vzorkovn Sampling Mode SliceLayerStupniceScale SliceLayer KrokySteps SliceLayerPrh Threshold SliceLayerF as: %1 - %2 Rozsah: %3 vzorky (%4)$Time: %1 - %2 Range: %3 samples (%4) SliceLayert as: %1 - %2 Rozsah: %3 vzorky (%4) Koa: %5 %6 hodnota: %79Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 SliceLayerdBdB SliceLayerx10x10 SliceLayer"Smazat datov bodDelete Data Point SparseModelUpravit data Edit Data SparseModel"Vlo~it datov bodInsert Data Point SparseModel XdkSparse SparseModelPYidat bod Add PointSparseModel::AddPointCommandSmazat bod Delete PointSparseModel::DeletePointCommand2OpatYit bod znovu attkemRe-Label PointSparseModel::RelabelCommandUpravit data Edit DataSparseOneDimensionalModel SnmekFrameSparseOneDimensionalModel `ttekLabelSparseOneDimensionalModelXdk 1-D Sparse 1-DSparseOneDimensionalModel asTimeSparseOneDimensionalModelNeznmUnknownSparseOneDimensionalModelUpravit data Edit DataSparseTimeValueModel SnmekFrameSparseTimeValueModel `ttekLabelSparseTimeValueModel$Xdk hodnota  asuSparse Time-ValueSparseTimeValueModel asTimeSparseTimeValueModelNeznmUnknownSparseTimeValueModelHodnotaValueSparseTimeValueModelXdk hodnota Sparse ValueSparseValueModel Fze: %1 Phase: %1SpectrogramLayer Fze: %1 - %2 Phase: %1 - %2SpectrogramLayerd%1Kmito et koae: %2 - %3 Hz %4Vaka koae: %5 - %6 1%1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 SpectrogramLayerP%1Kmito et koae: %2 Hz %3Vaka koae: %4 '%1Bin Frequency: %2 Hz %3Bin Pitch: %4 SpectrogramLayer%1Hz%1HzSpectrogramLayer-Inf-InfSpectrogramLayer1 KHzSpectrogramLayer1.5 KHzSpectrogramLayer10 HzSpectrogramLayer10 KHzSpectrogramLayer100 HzSpectrogramLayer12 KHzSpectrogramLayer16 KHzSpectrogramLayer2 KHzSpectrogramLayer20 HzSpectrogramLayer25 %SpectrogramLayer250 HzSpectrogramLayer4 KHzSpectrogramLayer40 HzSpectrogramLayer43HzSpectrogramLayer50 %SpectrogramLayer500 HzSpectrogramLayer6 KHzSpectrogramLayer75 %SpectrogramLayer8 KHzSpectrogramLayer87.5 %SpectrogramLayer93.75 %SpectrogramLayer<neznm> SpectrogramLayerVaechny koaeAll BinsSpectrogramLayerZobrazen koae Bin DisplaySpectrogramLayerKoaeBinsSpectrogramLayer BarvaColourSpectrogramLayerOt en barevColour RotationSpectrogramLayerStupnice barev Colour ScaleSpectrogramLayer:FFT vyrovnvac pame selhalaFFT cache failedSpectrogramLayerNepodaYilo se vytvoYit model FFT pro tento spektrogram. Dovodem pro to mo~e bt nedostatek pamti, nebo nedostatek msta na disku.pFailed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue.SpectrogramLayerKmito ty FrequenciesSpectrogramLayer&Kmito tov stupniceFrequency ScaleSpectrogramLayerZeslenGainSpectrogramLayerPYmo arLinearSpectrogramLayer ZpisLogSpectrogramLayer"Nejvta kmito et Max FrequencySpectrogramLayer MYi MeterSpectrogramLayer"Nejmena kmito et Min FrequencySpectrogramLayer}dn maximumNo maxSpectrogramLayer}dn minimumNo minSpectrogramLayer }dnNoneSpectrogramLayer(Normalizovat sloupceNormalize ColumnsSpectrogramLayer<Normalizovat viditelnou oblastNormalize Visible AreaSpectrogramLayerKoae vrcholo Peak BinsSpectrogramLayer<Nejvyaa kmito et: %1 - %2 Hz Peak Frequency: %1 - %2 Hz SpectrogramLayer2Nejvyaa kmito et: %1 Hz Peak Frequency: %1 Hz SpectrogramLayer&Nejvyaa vaka: %2 Peak Pitch: %2 SpectrogramLayer0Nejvyaa vaka: %3 - %4 Peak Pitch: %3 - %4 SpectrogramLayerFzePhaseSpectrogramLayerStupniceScaleSpectrogramLayerVyhlazovn SmoothingSpectrogramLayerPrh ThresholdSpectrogramLayer as: %1  Time: %1 SpectrogramLayer as: %1 - %2 Time: %1 - %2 SpectrogramLayerOknoWindowSpectrogramLayerPYekryt oknaWindow OverlapSpectrogramLayerVelikost okna Window SizeSpectrogramLayerdBdBSpectrogramLayer dB: %1dB: %1SpectrogramLayerdB: %1 - %2 dB: %1 - %2SpectrogramLayerdBVdBVSpectrogramLayer dBV^2dBV^2SpectrogramLayer%1%1 SpectrumLayerJ%1 Koa: %2 (%3) %4 hodnota: %5 dB: %6#%1 Bin: %2 (%3) %4 value: %5 dB: %6 SpectrumLayerD%1 Koa: %2 (%3) Hodnota: %4 dB: %5 %1 Bin: %2 (%3) Value: %4 dB: %5 SpectrumLayer%1 - %2%1 - %2 SpectrumLayer %1 - %2 Hz SpectrumLayer %1 Hz%1 Hz SpectrumLayer-Inf-Inf SpectrumLayer25 % SpectrumLayer50 % SpectrumLayer75 % SpectrumLayer87.5 % SpectrumLayer93.75 % SpectrumLayerKoaeBins SpectrumLayer PrvnFirst SpectrumLayer PromrMean SpectrumLayer }dnNone SpectrumLayer VrcholPeak SpectrumLayer0Ukzat nejvyaa kmito tyShow Peak Frequencies SpectrumLayerOknoWindow SpectrumLayerPYekryt oknaWindow Overlap SpectrumLayerVelikost okna Window Size SpectrumLayer%1 - %2%1 - %2SubdividingMenu<~dn text>  TextLayerSmazat vbrDelete Selection TextLayerThnout attek Drag Label TextLayerThnout vbrDrag Selection TextLayerPrzdn attek Empty Label TextLayerZadat attek Enter label TextLayerVymazat bod Erase Point TextLayerProbh In progress TextLayer PYesunout attek Move Label TextLayer4PYesunout attek vodorovnMove Label Horizontally TextLayer.PYesunout attek svisleMove Label Vertically TextLayerNov bod New Point TextLayer Vlo~itPaste TextLayer:Zadejte, prosm, nov attek:Please enter a new label: TextLayer>Zarovnat vlo~en polo~ky znovu?Re-align pasted items? TextLayer,Zmnit velikost vbruResize Selection TextLayer^Polo~ky, kter vkldte, pYialy z vrstvy s odlianm zdrojovm materilem, ne~ m tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovmu materilu pro tuto vrstvu?The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? TextLayer8 as: %1 Vaka: %2 `ttek: %3Time: %1 Height: %2 Label: %3 TextLayerUpravit data Edit Data TextModel SnmekFrame TextModel VakaHeight TextModel `ttekLabel TextModelTextText TextModel asTime TextModelNeznmUnknown TextModel%1: %2%3%1: %2%3 Thumbwheel%2%3%2%3 ThumbwheelHZadejte novou hodnotu od %1do %2 %3:#Enter a new value from %1 to %2 %3: ThumbwheelDZadejte novou hodnotu od %1 do %2: Enter a new value from %1 to %2: Thumbwheel&Zadat novou hodnotuEnter new value ThumbwheelHNov hodnota pro %1, od %2 do %3 %4:#New value for %1, from %2 to %3 %4: ThumbwheelBNov hodnota pro %1, od %2 do %3: New value for %1, from %2 to %3: Thumbwheel"PYidat bod v %1 sAdd Point at %1 sTimeInstantLayerSmazat vbrDelete SelectionTimeInstantLayerNakreslit bod Drag PointTimeInstantLayerThnout vbrDrag SelectionTimeInstantLayerNakreslit bod Draw PointTimeInstantLayerUpravit bod Edit PointTimeInstantLayerVymazat bod Erase PointTimeInstantLayerProbh In progressTimeInstantLayerOkam~ikyInstantsTimeInstantLayer*PYesunout bod na %1 sMove Point to %1 sTimeInstantLayerNov bod New PointTimeInstantLayer"}dn mstn bodyNo local pointsTimeInstantLayer Vlo~itPasteTimeInstantLayerTyp nkresu Plot TypeTimeInstantLayer>Zarovnat vlo~en polo~ky znovu?Re-align pasted instants?TimeInstantLayer,Zmnit velikost vbruResize SelectionTimeInstantLayerRoz lenn SegmentationTimeInstantLayer`Okam~iky, kter vkldte, pYialy z vrstvy s odlianm zdrojovm materilem, ne~ m tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovmu materilu pro tuto vrstvu?The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?TimeInstantLayer$ as: %1 `ttek: %2Time: %1 Label: %2TimeInstantLayer( as: %1 }dn attekTime: %1 No labelTimeInstantLayerv+/-1TimeValueLayer*Automatick zarovnn Auto-AlignTimeValueLayer&Zmnit hodnotu boduChange Point ValueTimeValueLayer,Vybrat vpo et hodnotyChoose value calculationTimeValueLayerSpojen bodyConnected PointsTimeValueLayer KYivkaCurveTimeValueLayerVelikost cyklu: Cycle size:TimeValueLayer&Smazat vybran bodyDelete Selected PointsTimeValueLayerThnout bod Drag PointTimeValueLayerThnout vbrDrag SelectionTimeValueLayerNakreslit bod Draw PointTimeValueLayer<Kreslit  ry rozdlujc  stiDraw Segment Division LinesTimeValueLayerUpravit bod Edit PointTimeValueLayerVymazat bod Erase PointTimeValueLayerProbh In progressTimeValueLayerPYmo arLinearTimeValueLayer ryLinesTimeValueLayer ZpisLogTimeValueLayerNov bod New PointTimeValueLayer"}dn mstn bodyNo local pointsTimeValueLayer Vlo~itPasteTimeValueLayerTyp nkresu Plot TypeTimeValueLayerBodyPointsTimeValueLayer>Zarovnat vlo~en polo~ky znovu?Re-align pasted items?TimeValueLayerPYemstit bodRelocate PointTimeValueLayer,Zmnit velikost vbruResize SelectionTimeValueLayerStupniceScaleTimeValueLayer"Jednotky stupnice Scale UnitsTimeValueLayerRoz lenn SegmentationTimeValueLayer*Vybrat velikost cykluSelect cycle sizeTimeValueLayer"Ukzat odvozeninuShow DerivativeTimeValueLayerNkter z polo~ek, kter vkldte, nemaj hodnoty. Jak hodnoty chcete pro tyto polo~ky pou~t?eSome of the items you are pasting do not have values. What values do you want to use for these items?TimeValueLayer StopkyStemsTimeValueLayer^Polo~ky, kter vkldte, pYialy z vrstvy s odlianm zdrojovm materilem, ne~ m tento. Chcete je zarovnat znovu v  ase, aby se hodily ke zdrojovmu materilu pro tuto vrstvu?The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?TimeValueLayerPolo~ky, kter vkldte, nemaj hodnoty. Jak hodnoty chcete pro tyto polo~ky pou~t?]The items you are pasting do not have values. What values do you want to use for these items?TimeValueLayer@ as: %1 Hodnota: %2%3 `ttek: %4Time: %1 Value: %2%3 Label: %4TimeValueLayerD as: %1 Hodnota: %2%3 }dn attekTime: %1 Value: %2%3 No labelTimeValueLayerSvisl stupniceVertical ScaleTimeValueLayer0Nula pro vaechny polo~kyZero for all itemsTimeValueLayer<< PYedchoz << Previous TipDialog ZavYtClose TipDialogDala >>Next >> TipDialog0Ukzat radu pYi spuatnShow tip on startup TipDialog"Rada na tento denTip of the Day TipDialog [\(<].*$ [\(<].*$TransformFactoryh%1 pou~v "%2" vstup "%3" pYdavnho modulu (z %4)-%1 using "%2" output of "%3" plugin (from %4)TransformFactoryJ%1 pou~v "%2" pYdavn modul (z %3)%1 using "%2" plugin (from %3)TransformFactory %1: %2%1: %2TransformFactory%1: Vstup %2 %1: Output %2TransformFactory <neznm tvorce>TransformFactory RozborAnalysisTransformFactorySkupinaCategoryTransformFactory Popis DescriptionTransformFactory EfektyEffectsTransformFactoryEfektov data Effects DataTransformFactoryVythnout "%1" datov vstup z "%2" efektovho pYdavnho modulu (z %3):Extract "%1" data output from "%2" effect plugin (from %3)TransformFactoryVythnout datov vstup %1 z "%2" efektovho pYdavnho modulu (z %3)8Extract data output %1 from "%2" effect plugin (from %3)TransformFactoryVythnout funkce pomoc "%1" vstupu "%2" pYdavnho modulu (z %3);Extract features using "%1" output of "%2" plugin (from %3)TransformFactoryjVythnout funkce pomoc "%1" pYdavnho modulu (z %2),Extract features using "%1" plugin (from %2)TransformFactoryVytvoYit zvukov signl za pou~it "%1" efektovho pYdavnho modulu (z %2)1Generate audio signal using "%1" plugin (from %2)TransformFactory Tvorce GeneratorTransformFactory TvorceMakerTransformFactory NzevNameTransformFactoryJinOtherTransformFactory,Druh pYdavnho modulu Plugin typeTransformFactory.Systmov identifiktorSystem IdentifierTransformFactoryPromnit zvukov signl s "%1" efektovm pYdavnm modulem (z %2)8Transform audio signal with "%1" effect plugin (from %2)TransformFactoryjednotkyUnitsTransformFactory%1%2<br><small>%1%2
TransformFinder</small>TransformFinder<b>%1</b>%2<br>%1%2
TransformFindern<b>Nyn nejsou nainstalovny ~dn pYdavn moduly!</b>*No plugins are currently installed!TransformFinderl<b>ZveYejnn popisy se ze st zskat nepodaYilo!</b>>Unable to retrieve published descriptions from network!TransformFinderv<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Skupina: %1<
      — Category: %1TransformFinder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Vce informac naleznete na strnkch: <a href="%1">%1</a>U
      — More information: %1TransformFinder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Typ pYdavnho modulu: %1?
      — Plugin type: %1TransformFinder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Systmov identifiktor: %1E
      — System identifier: %1TransformFinder\<br>&nbsp;&nbsp;Nebyly nalezeny ~dn vsledky
  No results foundTransformFinder0<i> (nenainstalovn)</i> (not installed)TransformFinder <p>%1<br>%2<br>Je mo~n, ~e seov spojen vypadlo, nebo slu~by odpovdaj pYlia pomalu.<br>Nebudou dostupn ~dn vsledky hledn.

%1
%2
Perhaps the network connection is down, or services are responding too slowly.
No search results will be available.TransformFinder<p>%1<br>Budou se prohledvat pouze zveYejnn popisy funk nch vytahovacch pYdavnch modulo Vamp.]

%1
Only the published descriptions of Vamp feature extraction plugins will be searched.TransformFinder|<p>%1<br>Je mo~n, ~e seov spojen vypadlo, slu~by odpovdaj pYlia pomalu, nebo se vyskytly pot~e se zpracovnm.<br>Budou se prohledvat pouze popisy nainstalovanch pYdavnch modulo.

%1
Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.
Only the descriptions of installed plugins will be searched.TransformFinder<p>Napiate do oknka pro hledn njak text pro hledn popiso:<ul><li>Vaech nyn nainstalovanch <a href="http://www.vamp-plugins.org/">Vamp</a> zvukovch funk nch vytahovacch pYdavnch modulo</li><li>Vaech nyn nainstalovanch <a href="http://www.ladspa.org/">LADSPA</a> zvukovch efektovch pYdavnch modulo</li><li>Vamp pYdavnch modulo, kter nyn nainstalovny nejsou, ale maj svoj popis zvYejnn prostYednictvm vznamovho internetu</li></ul>

Type some text into the search box to search the descriptions of:

  • All currently installed Vamp audio feature extraction plugins
  • All currently installed LADSPA audio effects plugins
  • Vamp plugins that are not currently installed but that have descriptions published via the semantic web
TransformFinder</small>TransformFinder"<small>%1</small>%1TransformFinderDoloDownTransformFinderNajt promnuFind a TransformTransformFinderHledat:Find:TransformFinderPNalezen jeden popis obsahujc <b>%1</b>NNalezeny %n popisy obsahujc <b>%1</b>RNalezeno %n popiso obsahujcch <b>%1</b>,Found %n description(s) containing %1TransformFinderNalezen jeden popis obsahujc <b>%1</b>, ukazuj se pouze prvn %2Nalezeny %n popisy obsahujc <b>%1</b>, ukazuj se pouze prvn %2Nalezeno %n popiso obsahujcch <b>%1</b>, ukazuj se pouze prvn %2GFound %n description(s) containing %1, showing the first %2 onlyTransformFinder NahoruUpTransformFinder<neznm> ViewZarovnn AlignmentView ZruaitCancelView&Sledovat pYehrvnFollow PlaybackView$Celkov proj~dn Global ScrollView Celkov zvtaen Global ZoomView.Chyba pYi dln vrstvyLayer rendering errorViewVypnutoOffView StranaPageView$Dl se obrzek...Rendering image...ViewProj~dtScrollViewR ek se na vrstvy, a~ budou pYipraveny...!Waiting for layers to be ready...View,Zmnit roveH pYekrytChange overlay level ViewManager Vyprzdnit vbrClear Selection ViewManager6Vstoupit do re~imu kreslenEnter Draw mode ViewManager0Vstoupit do re~imu pravEnter Edit mode ViewManager2Vstoupit do re~imu maznEnter Erase mode ViewManager2Vstoupit do re~imu mYenEnter Measure mode ViewManager6Vstoupit do re~imu navdnEnter Navigate mode ViewManager2Vstoupit do re~imu vbruEnter Select mode ViewManagerProj~dt k %1 Scroll to %1 ViewManager&Vybrat vce oblastSelect Multiple Regions ViewManagerVybrat oblast Select Region ViewManager2Vypnout re~im zarovnvnSwitch off Alignment mode ViewManager(Vypnout re~im smy kySwitch off Loop mode ViewManagerPVypnout re~im pYehrvn vybran oblastiSwitch off Play Selection mode ViewManagerJVypnout re~im samostatnho pYehrvnSwitch off Play Solo mode ViewManager2Zapnout re~im zarovnvnSwitch on Alignment mode ViewManager(Zapnout re~im smy kySwitch on Loop mode ViewManagerPZapnout re~im pYehrvn vybran oblastiSwitch on Play Selection mode ViewManagerJZapnout re~im samostatnho pYehrvnSwitch on Play Solo mode ViewManagerBZvtaen na jeden vzorek na pixel<Zvtaen na %n vzorky na pixel<Zvtaen na %n vzorko na pixelZoom to %n sample(s) per pixel ViewManagerSoubor Wave Wave File WaveFileModel. %1 %2 (%3 dB nejvyaa) %1 %2 (%3 dB peak) WaveformLayer8 %1 %2 - %3 (%4 dB nejvyaa) %1 %2 - %3 (%4 dB peak) WaveformLayer-Inf-Inf WaveformLayer0dB0dB WaveformLayer.RozYznout a rozthnout Butterfly WaveformLayerKanl %1 Channel %1 WaveformLayer KanlyChannels WaveformLayerZeslenGain WaveformLayer Lev:Left: WaveformLayerroveH:Level: WaveformLayerPYmo arLinear WaveformLayer PromrMean WaveformLayer MYi Meter WaveformLayer<Normalizovat viditelnou oblastNormalize Visible Area WaveformLayer Prav:Right: WaveformLayerStupniceScale WaveformLayerRozdlitSeparate WaveformLayer as: %1Time: %1 WaveformLayer as: %1 - %2 Time: %1 - %2 WaveformLayerdBdB WaveformLayer V/ asV / timeWindowShapePreviewdB/kmito et dB / freqWindowShapePreview2Zapisovateln soubor WaveWritable Wave FileWritableWaveFileModelsonic-visualiser-2.3~repack1.orig/i18n/tips_en.xml0000644000175000017500000000434512252354725020702 0ustar miramira

Welcome to Sonic Visualiser!

Sonic Visualiser is a complex application, but it's easy enough to get started with.

Try importing an audio file and using the Pane menu to add some different views of it.

Check out the links on the Help menu for tutorials and other documentation!

Sonic Visualiser's window is organised into "panes" and "layers". To begin with, you have one pane. Import an audio file to see it displayed in a waveform layer on that pane.

Each pane can contain any number of layers, which appear stacked from "front" to "back" on the same timeline. A layer can contain a view of audio, or of points (time instants) or data plots (time-values).

There's a "layer property box" to the right of each pane, with one tab for each of the layers on that pane. Click on a layer's tab to bring that layer to the front. You can then adjust its colour and other display properties in the property box. The first tab is always for the pane itself, which has a few adjustable properties of its own.

If you have more than one pane, only one of them will be "current", marked with a black bar at the left side. Just click on another pane to make it current. Most editing operations affect the layer that's at the front of the current pane.

You can use different zoom levels for different panes by un-checking the Global Zoom control for one of them. By default, all panes will zoom and scroll together.

You can speed up and slow down playback using the Playback Speedup control in the bottom-right of the window.

The Transforms menu lists things you can do to extract features from or process your audio. The available outputs of any Vamp feature-extraction plugins or LADSPA audio effects plugins you have will show up here.

sonic-visualiser-2.3~repack1.orig/i18n/sonic-visualiser_cs_CZ.ts0000644000175000017500000070465412252354725023461 0ustar miramira ActivityLog %1: %2 %1: %2 Activity Log Zápis činnosti <p>Activity Log lists your interactions and other events within %1.</p> <p>Zápis činností uvádí vaši spolupráci a další události uvnitř %1.</p> AddLayerCommand Add %1 Layer Přidat %1 vrstvu AggregateWaveModel Aggregate Wave Úhrnná vlna AlignmentModel Alignment Zarovnání AudioCallbackPlaySource Stop at %1 Zastavit na %1 Play from %1 Přehrát od %1 Change time-stretch factor to %1 Změnit násobek roztažení času na %1 AudioDial %2%3 %2%3 Enter new value Zadat novou hodnotu %1: %2%3 %1: %2%3 New value for %1, from %2 to %3: Nová hodnota pro %1, od %2 do %3: Enter a new value from %1 to %2: Zadejte novou hodnotu od %1 do %2: Enter a new value from %1 to %2 %3: Zadejte novou hodnotu od %1, do %2 %3: New value for %1, from %2 to %3 %4: Nová hodnota pro %1, od %2 do %3 %4: AudioTargetFactory Core Audio Device Jaderné zvukové zařízení (auto) (auto) Default Soundcard Device Výchozí zařízení zvukové karty PulseAudio Server Server PulseAudio JACK Audio Connection Kit Spojovací sada pro zvuk JACK BZipFileDevice Failed to open bzip2 stream for writing Otevření proudu bzip2 pro zápis se nezdařilo bzip2 stream read close error Chyba závěru čtení proudu bzip2 bzip2 stream read error Chyba čtení proudu bzip2 Internal error (open for neither read nor write) Vnitřní chyba (otevření ani pro čtení, ani pro zápis) Failed to open bzip2 stream for reading Otevření proudu bzip2 pro čtení se nezdařilo Read and write modes both specified Režimy pro čtení a zápis jsou zadány File access mode not specified Režim přístupu k souborům není zadán Failed to open file for writing Otevření souboru pro zápis se nezdařilo Append mode not supported Režim připojení není podporován File not open Soubor neotevřen Internal error (close for neither read nor write) Vnitřní chyba (závěr ani pro čtení, ani pro zápis) File is already open Soubor je již otevřen bzip2 stream write close error Chyba závěru zápisu proudu bzip2 Failed to open file for reading Otevření souboru pro čtení se nezdařilo BundleCommand %1 (%n change(s)) %1 (jedna změna) %1 (%n změny) %1 (%n změn) CSVFileWriter Failed to open file %1 for writing Otevření souboru %1 pro zápis se nezdařilo CSVFormatDialog Time Čas Label Štítek Value Hodnota Explicitly, in seconds Otevřeně, v sekundách (%1 more) %1 (více) End time Koncový čas Audio sample rate (Hz): Vzorkovací kmitočet zvuku (Hz): Frame increment between rows: Nárůst snímků mezi řádky: Values Hodnoty Select Data Format Vybrat datový formát Timing is specified: Čas je zadán: Duration Doba trvání Explicitly, in audio sample frames Otevřeně, ve zvukových vzorkovacích snímcích Please select the correct data format for this file. Vyberte, prosím, správný datový formát pro tento soubor. Implicitly: rows are equally spaced in time Skrytě: řádky jsou pravidelně rozloženy v čase Data will be displayed in a %1 layer. Data budou zobrazena ve vrstvě %1. <ignore> <nevšímat si> Colour3DPlotLayer dB dB Log Zápis +/-1 +/-1 Bins Koše Gain Zesílení signálu Scale Stupnice Bin Scale Stupnice koše Normalize Columns Normalizovat sloupce Normalize Visible Area Normalizovat viditelnou oblast Colour Barva <unknown> <neznámý> Linear Čárový Smooth Jemná Absolute Naprostý Time: %1 - %2 Bin: %3 Value: %4 Čas: %1 - %2 Koš: %3 Hodnota: %4 Always Opaque Vždý neprůhledná Invert Vertical Scale Obrátit svislou stupnici ColourMapper Black on White Černá na bílé Yellow on Black Žlutá na černé Banded Pruhovaný <unknown> <neznámý> Sunset Západ slunce Fruit Salad Ovocný salát Red on Blue Červená na modré Printer Tiskárna Blue on Black Modrá na černé Default Výchozí High Gain Zesílení výšek Highlight Zvýraznění White on Black Bílá na černé CommandHistory &Undo &Zpět Re&do &Znovu Undo the last editing operation Poslední krok úprav vrátit zpět Nothing to redo Neexistuje nic, u čeho by šlo zrušit vrácení zpět Nothing to undo Neexistuje nic, co by se dalo vrátit zpět Ctrl+Z Ctrl+Z Re&do %1 &Znovu %1 Redo the last operation that was undone Opakovat poslední krok úprav, který byl vrácen zpět Redo %1 Znovu %1 &Undo %1 &Zpět %1 Undo %1 Zpět %1 Ctrl+Shift+Z Ctrl+Shift+Z CoreAudioFileReader Decoding %1... Dekóduje se %1... Dense3DModelPeakCache Dense 3-D Peak Cache Vyrovnávací paměť hustého trojrozměrného vrcholu DenseThreeDimensionalModel Time Čas Frame Snímek Dense 3-D Hustý trojrozměrný DenseTimeValueModel Dense Time-Value Hustá hodnota času Document Set main model to %1 Nastavit hlavní model na %1 Clear main model Smazat hlavní model EditableDenseThreeDimensionalModel Editable Dense 3-D Upravovatelný hustý trojrozměrný FFTModel FFT FFT %1 Hz %1 Hz Fader New fader level, from %1 to %2 dBFS: Nová úroveň prolínače, od %1 do %2 dBFS: Enter new fader level Zadat novou úroveň prolínače Level: %1%2.%3%4 dB Úroveň: %1%2.%3%4 dB Level: Off Úroveň: Vypnuto FeatureExtractionModelTransformer Failed to instantiate plugin "%1" Přídavný modul "%1" se nepodařilo doložit příkladem No factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?) Není dostupný žádný závod pro ID přídavného modulu vytažení funkce "%1" (neznámý typ přídavného modulu, nebo vnitřní chyba?) Input model for feature extraction plugin "%1" is of wrong type (internal error?) Vstupní model pro přídavný modul vytažení funkce "%1" je chybného typu (vnitřní chyba?) Plugin "%1" has no output named "%2" Přídavný modul "%1" nemá žádný výstup pojmenovaný jako "%2" Failed to initialise feature extraction plugin "%1" Přídavný modul vytažení funkce se nepodařilo spustit "%1" Plugin "%1" has no outputs Přídavný modul "%1" nemá žádné výstupy Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead Přídavný modul vytažení funkce "%1" odmítl daný krok a velikosti bloků (%2 a %3); používají se výchozí nastavení přídavného modulu (%4 a %5) Cannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4) Nelze poskytnout dostatek kanálů pro přídavný modul vytažení funkce "%1" (minimum pro přídavný modul je %2, maximum pro přídavný modul je %3; vstupní model has %4) Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3 Proměna byla nastavena pro verzi %1 přídavného modulu "%2", ale používaný přídavný modul je ve verzi %3 FileSource File contains no data! Soubor neobsahuje žádné údaje! Login failed Přihlášení se nezdařilo Download cancelled Stahování zrušeno Failed to create local file %1 Vytvoření místního souboru %1 se nezdařilo Unsupported scheme in URL Nepodporované schéma v adrese (URL) FTP download aborted FTP stahování zrušeno Downloading %1... Stahuje se %1... Failed to connect to FTP server Připojení k FTP serveru se nezdařilo Failed to change to correct directory Změna na správný adresář se nepodařila I Edit Data Upravit data ImageDialog Image Obrázek File or URL: Soubor nebo adresa (URL): Label: Štítek: Unsupported scheme in URL Nepodporované schéma v adrese (URL) Opening image URL... Otevírá se adresa obrázku (URL)... Browse... Procházet... Preview Náhled The URL scheme "%1" is not supported Schéma adresy (URL) "%1" není podporována File download failed Stažení souboru se nezdařilo Failed to download URL "%1": %2 Nepodařilo se stáhnout adresu (URL) "%1": %2 ImageLayer Paste Vložit The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, přišly z vrstvy s odlišným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v čase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? Resize Selection Změnit velikost výběru Select image Vybrat obrázek Opening image URL... Otevírá se adresa obrázku (URL)... Move Image Přesunout obrázek In progress Probíhá New Point Nový bod Re-align pasted items? Zarovnat vložené položky znovu? Drag Selection Táhnout výběr Delete Selection Smazat výběr ImageModel Time Čas Frame Snímek Image Obrázek Label Štítek Edit Data Upravit data Edit Image Upravit obrázek Unknown Neznámý InteractiveFileFinder <b>File is not readable</b><p>File "%1" can not be read <b>Soubor není čitelný</b><p>Soubor "%1" nelze přečíst Select a session file Vybrat soubor se sezením Failed to open file Soubor se nepodařilo otevřít <b>File exists</b><p>The file "%1" already exists. Do you want to overwrite it? <b>Soubor existuje</b><p>Soubor "%1" již existuje. Chcete jej přepsat? All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) Všechny podporované soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl) Čárkou oddělené datové soubory (*.csv) Mezerou oddělené soubory .lab (*.lab) Soubory RDF (%2) Soubory MIDI (*.mid) Textové soubory (*.txt) Všechny soubory (*.*) Cancel Zrušit <b>Not a file</b><p>Path "%1" is not a file <b>Není soubor</b><p>Cesta "%1" není soubor Use URL... Použít adresu (URL)... Directory selected Adresář vybrán File exists Soubor již existuje <b>File not found</b><p>Audio file "%1" could not be opened. Do you want to locate it? <b>Soubor nenalezen</b><p>Zvukový soubor "%1" se nepodařilo otevřít. Chcete jej najít? Audio files (%1) All files (*.*) Zvukové soubory (%1) Všechny soubory (*.*) Sonic Visualiser session files (*.sv) RDF files (%1) All files (*.*) Soubory se sezením programu Sonic Visualiser (*.sv) Soubory RDF (%1) Všechny soubory (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) Všechny podporované soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl) Čárkou oddělené datové soubory (*.csv) Mezerou oddělené soubory .lab (*.lab) Soubory RDF (%2) Textové soubory (*.txt) Všechny soubory (*.*) File is empty Soubor je prázdný Non-file selected Vybrán ne-soubor All supported files (*.sv %1 %2 %3) Sonic Visualiser session files (*.sv) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) Všechny podporované soubory (*.sv %1 %2 %3) Soubory XML Sonic Visualiser Layer (*.svl) Zvukové soubory (%1) Soubory Layer (%2) Soubory RDF (%3) Všechny soubory (*.*) Failed to open location Umístění se nepodařilo otevřít Please enter the URL to use for this file: Zadejte, prosím, adresu (URL), která se má použít pro tento soubor: Locate file... Najít soubor... <b>Directory selected</b><p>File "%1" is a directory <b>Soubor vybrán</b><p>Soubor "%1" je adresář <b>File not found</b><p>File "%1" does not exist <b>Soubor nenalezen</b><p>Soubor "%1" neexistuje Select file Vybrat soubor <b>File is empty</b><p>File "%1" is empty <b>Soubor je prázdný</b><p>Soubor "%1" je prázdný All files (*.*) Všechny soubory (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Soubory XML Sonic Visualiser Layer (*.svl) Čárkou oddělené datové soubory (*.csv) Soubory RDF/Turtle (%1) Textové soubory (*.txt) Všechny soubory (*.*) File is not readable Soubor není čitelný Use URL Použít adresu (URL) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Soubory XML Sonic Visualiser Layer (*.svl) Čárkou oddělené datové soubory (*.csv) Soubory RDF/Turtle (%1) Soubory MIDI (*.mid) Textové soubory (*.txt) Všechny soubory (*.*) All supported files (*.sv %1 %2) Sonic Visualiser session files (*.sv) Audio files (%2) RDF files (%1) All files (*.*) Všechny podporované soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl) Zvukové soubory (%2) Soubory RDF (%1) Všechny soubory (*.*) <b>File not found</b><p>File "%1" could not be opened. Do you want to locate it? <b>Soubor nenalezen</b><p>Soubor "%1" se nepodařilo otevřít. Chcete jej najít? <b>Failed to open location</b><p>URL "%1" could not be opened <b>Umístění se nepodařilo otevřít</b><p>Adresu (URL) "%1" se nepodařilo otevřít Image files (%1) All files (*.*) Obrázkové soubory (%1) Všechny soubory (*.*) Portable Network Graphics files (*.png) All files (*.*) Soubory PNG (Portable Network Graphics) (*.png) Všechny soubory (*.*) File does not exist Soubor neexistuje Sonic Visualiser session files (*.sv) All files (*.*) Soubory se sezením programu Sonic Visualiser (*.sv) Všechny soubory (*.*) Select a file to export to Vybrat soubor, do kterého se má provést vyvedení WAV audio files (*.wav) All files (*.*) Zvukové soubory WAV (*.wav) Všechny soubory (*.*) ItemEditDialog OK OK sec sek usec usek Reset Nastavit znovu Text: Text: Time: Čas: Cancel Zrušit Timing Načasování Value: Hodnota: Properties Vlastnosti frames snímky Duration: Doba trvání: KeyReference & & <i>or</i>&nbsp;<b>%1</b> <i>nebo</i>&nbsp;<b>%1</b> </b>&nbsp;(%1)<b> </b>&nbsp;(%1)<b> Sonic Visualiser: Key and Mouse Reference Sonic Visualiser: Odkaz na klávesy a myš LabelCounterInputDialog Set Counters Nastavit počítadla Fine counter (beats): Citlivé počítadlo (doby): Coarse counter (bars): Hrubé počítadlo (doby): Labeller %1 %1 %1.%2 %1 %2 Tempo (bpm) based on duration since previous item Tempo (počet úderů za minutu; úzm: bpm) založené na době trvání od předchozí položky Duration since the previous item Doba trvání od předchozí položky Label Points Body štítků Audio sample frame number Číslo snímku zvukového vzorku Cyclical two-level counter (bar/beat) Cyklické dvouúrovňové počítadlo (takt/doba) Tempo (bpm) based on duration to following item Tempo (počet úderů za minutu; úzm: bpm) založené na době trvání po následující položku Value extracted from the item's label (where possible) Hodnota vytažená ze štítku u položky (kde je to možné) No numbering Žádné číslování Simple counter Jednoduché počítadlo Same as the nearest previous item Stejné jako nejbližší předchozí položka Time in seconds Čas v sekundách Duration to the following item Doba trvání po následující položku Cyclical counter Cyklické počítadlo Layer Text Text Layer Vrstva Notes Noty Ruler Pravítko Colour 3D Plot Barevný trojrozměrný nákres Images Obrázky Time Values Hodnoty času Spectrum Spektrum Time Slice Kus času Regions Oblasti Waveform Časový průběh vlny Make Measurement Udělat měření Spectrogram Spektrogram Time Instants Okamžiky času Delete Measurement Smazat měření LayerTreeDialog Layer Summary Přehled vrstev Panes and Layers Tabulky a vrstvy Audio Data Sources Zdroje zvukových dat LayerTreeModel Layer Vrstva Model Model Shown Ukázaná Played Přehrávaná MIDIFileImportDialog <b>Select track to import</b><p>You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.<p>Please select the track or merged tracks you wish to import: <b>Vybrat stopu pro zavedení</b><p> Tento soubor můžete zavést jen jako jednu poznámkovou vrstvu, ale soubor obsahuje více než jednu stopu, nebo noty na více než jednom kanálu.<p>Vyberte, prosím, stopu nebo sloučené stopy, jež si přejete zavést: Error in MIDI file import Chyba při zavádění souboru MIDI Merge all tracks Sloučit všechny stopy Merge all non-percussion tracks Sloučit všechny stopy, které nejsou bicích Select track or tracks to import Vybrat stopu nebo stopy pro zavedení MIDIFileReader Track %1 (untitled)%3 Stopa %1 (bez názvu)%3 getMIDIByte called but no MIDI file open Voláno getMIDIByte (získat byt MIDI), ale neotevřen žádný soubor MIDI Attempt to get more bytes than expected on Track Pokus o získání více bytů ze stopy, než bylo očekáváno Running status used for first event in track Pro první událost ve stopě byl použit provozní stav ('Running') Track %1 (%2)%3 Stopa %1 (%2)%3 Wrong length for long data in MIDI stream (%1, should be %2) Chybná délka pro dlouhá data v proudu MIDI (%1, mělo by být %2) getNumberFromMIDIBytes called but no MIDI file open Voláno getNumberFromMIDIBytes (získat z bytů MIDI číslo), ale neotevřen žádný soubor MIDI Attempt to read past MIDI file end Pokus o čtení po konci souboru MIDI Attempt to get more bytes than available on Track (%1, only have %2) Pokus o získání více bytů, než je na stopě dostupných (%1, má pouze %2) %1 - vel %2 %1 - vel %2 Invalid event code %1 found Nalezen neplatný kód události %1 getMIDIBytes called but no MIDI file open Voláno getMIDIBytes (získat byty MIDI), ale neotevřen žádný soubor MIDI skipToNextTrack called but no MIDI file open Voláno skipToNextTrack (skočit na další skladbuI), ale neotevřen žádný soubor MIDI End of MIDI file encountered while reading Při čtení byl dosažen konec souboru MIDI Wrong length for int data in MIDI stream (%1, should be %2) Chybná délka pro vnitřní data v proudu MIDI (%1, mělo by být %2) - uses GM percussion channel - používá kanál bicích GM MIDI file "%1" has no notes in any track Soubor MIDI "%1" nemá noty v žádné stopě MIDIInput Input Vstup MP3FileReader Decoding %1... Dekóduje se %1... MainWindow # # 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 ; ; E E F P G G K K M M N N R R T T U U W W X X Y Y Z Z [ [ ] ] l l o o s s F1 F1 F2 F2 Up Zvýšit Del Smazat (Delete) End Konec Esc Esc Red Červená Blue Modrá Cu&t Vyj&mout Down Snížit Draw Nakreslit Edit Upravit Help Nápověda Home Home Left Vlevo PgUp PgUp Zoom Zvětšení <br>With Rasqal RDF query engine &copy; Dave Beckett and the University of Bristol <br>Se strojem na dotazy RDF Rasqal &copy; Dave Beckett a the University of Bristol Zoom to show the whole file Ukázat celý soubor Ctrl+PgDown Ctrl+PgDown Paste at Playback Position Vložit v poloze přehrávání Fast forward to the next time instant in the current layer Rychle vpřed k dalšímu okamžiku v čase v nynější vrstvě %1... %1... &Copy &Kopírovat &Edit &Úpravy &File &Soubor &Help &Nápověda &Pane &Tabulka &Quit &Ukončit &View &Pohled Play Mode Toolbar Nástrojový pruh pro režim hry Black Černá Debug Ladit Enter Enter Erase Vymazat Green Zelená &All Channels Mixed &Všechny kanály smíchány Right Vpravo Space Mezerník Add a new layer showing a waveform view Přidat novou vrstvu ukazující pohled na časový průběh vlny White Bílá With S Scroll the current pane to the left without moving the playback cursor or other panes Projíždět nynější tabulkou vlevo bez pohybu ukazatelem přehrávání nebo jinými tabulkami Sample rate mismatch Nesoulad ve vzorkovacím kmitočtu Managing Panes and Layers Správa tabulek a vrstev Scroll the current pane to the right without moving the playback cursor or other panes Projíždět nynější tabulkou vpravo bez pohybu ukazatelem přehrávání nebo jinými tabulkami <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed:<p>%3 <b>Vytvoření vrstvy se nezdařilo</b><p>Nepodařilo se znovu vytvořit odvozenou vrstvu "%1" za použití nového datového modelu jako vstupu.<p>Proměna vrstvy "%2" se nezdařila:<p>%3 Open a window listing interactions and other events Otevřít okno uvádějící výměnu informací a další události Show La&yer Summary Ukázat přehled &vrstev Select region to export Vybrat oblast, která se má vyvést Start or stop playback from the current position Spustit nebo zastavit přehrávání od nynější polohy &Help Reference Odkaz na &nápovědu Export layer data to a file Vyvést data vrstvy do souboru Choose Default Template... Vybrat výchozí předlohu... Fast-forward to the end Přetáčet rychle na konec Abandon the current Sonic Visualiser session and start a new one Opustit nynější sezení programu Sonic Visualiser a spustit nové Failed to open file Soubor se nepodařilo otevřít Fast Forward to Similar Point Rychle vpřed k podobnému bodu Export selection as an audio file Vyvést výběr jako zvukový soubor Search for a transform from the installed plugins, by name or description Hledat proměnu z nainstalovaných přídavných modulů, podle názvu nebo popisu Cut the selection from the current layer to the clipboard Vyjmout výběr z nynější vrstvy do schránky Add &Time Ruler Přidat ča&sové pravítko Insert a new time instant at the current playback position, in a new layer if necessary Vložit nový časový okamžik v nynější poloze přehrávání, v nové vrstvě, pokud je třeba Rewind to the previous point in the current layer Přetočit k předchozímu bodu v nynější vrstvě Edit items in layer Upravit položky ve vrstvě Solo Current Pane Nynější tabulka samostatně <br>With Ogg file decoder (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>Dekodér souborů Ogg (oggz v%1, fishsound v%2) &copy; CSIRO Australia Fast-forward to the next time instant or time ruler notch Rychle vpřed k dalšímu okamžiku v čase nebo místu časového pravítka Paste from the clipboard to the current layer Vložit ze schránky do nynější vrstvy <b>Open failed</b><p>Dropped URL "%1" could not be opened <b>Otevření se nezdařilo</b><p>Upuštěnou adresu (URL) "%1" se nepodařilo otevřít Constrain Playback to Selection Omezit přehrávání na výběr Export a single pane to an image file Vyvést každou jednu tabulku do obrázkového souboru Loop playback Udělat z přehrávaného smyčku Loop Playback Udělat z přehrávání smyčku Select audio file to export Vybrat zvukový soubor pro vyvedení J&ump Right S&kočit vpravo Apply Session Template Použít předlohu sezení Standard Waveform Obvyklý tvar vlny Switch to Previous Pane Přepnout na předchozí tabulku New name for this layer: Nový název pro tuto vrstvu: <br>With PortAudio audio output library &copy; Ross Bencina and Phil Burk <br>Zvuková výstupní knihovna PortAudio &copy; Ross Bencina a Phil Burk Switch to Next Pane Přepnout na další tabulku &Recent Transforms &Poslední proměny Tools Toolbar Nástrojový pruh s nástroji Visible: %1 to %2 (duration %3) Viditelný: %1 až %2 (doba trvání %3) &Save Session &Uložit sezení <br>With Rubber Band &copy; Chris Cannam <br>Gumička (Rubber Band) &copy; Chris Cannam Erase items from layer Vymazat položky z vrstvy Set the counters used for counter-based labelling Nastavit počítadla používaná pro štítkování založené na počítadlech <b>Open failed</b><p>URL "%1" could not be opened <b>Otevření se nezdařilo</b><p>Adresu (URL) "%1" se nepodařilo otevřít Cycle size Velikost cyklu Export the selection extent (%1x%2 pixels) Vyvést plochu výběru (%1x%2 pixelů) Clear the selection Vyprázdnit výběr Open a session file, audio file, or layer Otevřít soubor se sezením, zvukový soubor, nebo vrstvu %1: %2 %1: %2 <b>Alignment calculation failed</b><p>Failed to calculate an audio alignment using transform "%1":<p>%2 <b>Spočítání zarovnání se nezdařilo</b><p>Zarovnání zvuku se spočítat s pomocí "%1" nepodařilo:<p>%2 Show Acti&vity Log Ukázat zápis čin&nosti Playback Přehrávání Add a new layer showing a spectrogram Přidat novou vrstvu ukazující spektrogram &Layer &Vrstva &Paste V&ložit Selection Výběr Playback speed: Normal Rychlost přehrávání: Obvyklá Fast-forward to the next similarly valued time instant Rychle vpřed k dalšímu podobně ohodnocenému okamžiku v čase Open the Sonic Visualiser website Otevřít internetové stránky programu Sonic Visualiser Please enter a name for the saved template: Zadejte, prosím, název pro uloženou předlohu: Bright Green Světlezelená Rename Layer Přejmenovat vrstvu Export the selected region only Vyvést pouze vybranou oblast No audio file loaded. Nebyl nahrán žádný zvukový soubor. Show &All Overlays Ukázat &všechna překrytí Rename the currently active layer Přejmenovat nyní činnou vrstvu %1Hz (resampling to %2Hz) %1Hz (převzorkování na %2Hz) <b>File open failed</b><p>Layer file %1 could not be opened. <b>Soubor se nepodařilo otevřít</b><p>Soubor s vrstvou "%1" se nepodařilo otevřít. Insert a new note or region item corresponding to the current selection Vložit novou položku noty nebo oblasti odpovídající nynějšímu výběru <br>With libsamplerate &copy; Erik de Castro Lopo <br>libsamplerate &copy; Erik de Castro Lopo Alt+Left Alt+šipka vlevo Playback speed: %1%2% Rychlost přehrávání: %1%2% Restore &Default Zoom Obnovit &výchozí zvětšení http://www.sonicvisualiser.org/doc/reference/%1/en/ http://www.sonicvisualiser.org/doc/reference/%1/en/ Delete the measurement currently under the mouse pointer Smazat měření, které je nyní pod ukazovátkem myši </small><p><small>The OSC URL for this instance is: "%1" </small><p><small>Adresa (URL) OSC pro tuto instanci je: "%1" Rewind to the previous time instant in the current layer Přetočit k předchozímu okamžiku v čase v nynější vrstvě &Import More Audio... &Zavést více zvukových souborů... Measure Změřit Open Location Otevřít umístění Add &Existing Layer Přidat &stávající vrstvu <br>With Ogg file decoder &copy; CSIRO Australia <br>Dekodér souborů Ogg &copy; CSIRO Australia Fragment file %1 already exists, aborting Zlomkový soubor %1 již existuje. Přerušuje se Play / Pause Přehrát/Pozastavit Number New Instants with Číslovat nové okamžiky s Save the current session into a new Sonic Visualiser session file Uložit nynější sezení do nového souboru se sezením programu Sonic Visualiser &Jump Left &Skočit vlevo Show thumbwheels for zooming horizontally and vertically Ukázat ovládací kolečko pro vodorovné a svislé zvětšování Sonic Visualiser Sonic Visualiser - Znázorňovač zvuku File and Session Management Správa souborů a sezení Make the next pane down in the pane stack current Udělat další tabulku směrem dolů v zásobníku tabulek současnou Exit Sonic Visualiser Ukončit Sonic Visualiser <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed.<p>No error information is available. <b>Vytvoření vrstvy se nezdařilo</b><p>Nepodařilo se znovu vytvořit odvozenou vrstvu "%1" za použití nového datového modelu jako vstupu.<p>Proměna vrstvy "%2" se nezdařila.<p>Nejsou dostupné žádné informace o chybě. Export the selection extent Vyvést plochu výběru Import Annotation &Layer... Zavést poznámkovou &vrstvu... Adjust the master playback speed Přizpůsobit hlavní rychlost přehrávání Show &Standard Overlays Ukázat ob&vyklá překrytí Show All Time Rulers Ukázat všechna časová pravítka Ctrl+A Ctrl+A Ctrl+C Ctrl+C Ctrl+D Ctrl+D Ctrl+I Ctrl+I Ctrl+L Ctrl+L Ctrl+M Ctrl+M Ctrl+N Ctrl+N Ctrl+O Ctrl+O Ctrl+Q Ctrl+Q Ctrl+R Ctrl+R Ctrl+S Ctrl+S Ctrl+T Ctrl+T Ctrl+V Ctrl+V Ctrl+X Ctrl+X <br>With PulseAudio audio output library v%1 &copy; Lennart Poettering and Pierre Ossman <br>Zvuková výstupní knihovna PulseAudio v%1 &copy; Lennart Poettering a Pierre Ossman Can't export non-note layers to MIDI Ne-notové vrstvy nelze do MIDI vyvést Adjust the master playback level Přizpůsobit hlavní úroveň přehrávání <p>Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> <p>Sonic Visualiser je programem určeným pro prohlížení a zkoumání zvukových dat, pro významový hudební rozbor a připojování poznámek.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> Tool Selection Výběr nástroje Failed to open file %1 for writing Otevření souboru %1 pro zápis se nezdařilo Channel &%1 Kanál &%1 <b>Audio required</b><p>Unable to load layer data from "%1" without an audio file.<br>Please load at least one audio file before importing annotations. <b>Vyžadován zvuk</b><p>Data s vrstvou nelze z "%1" nahrát bez zvukového souboru.<br>Před zavedením poznámek nahrajte, prosím, alespoň jeden zvukový soubor. &All Channels &Všechny kanály Show Status &Bar Ukázat st&avový řádek Delete the currently active layer Smazat nyní činnou vrstvu <b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform "%1" failed:<p>%2 <b>Vytvoření vrstvy se nezdařilo</b><p>Nepodařilo se vytvořit odvozenou vrstvu.<p>Proměna vrstvy "%1" se nezdařila:<p>%2 <br>With MAD mp3 decoder &copy; Underbit Technologies Inc <br>Dekodér souborů mp3 MAD &copy; Underbit Technologies Inc Failed to calculate alignment Zarovnání se spočítat nepodařilo Rewind to Previous Instant Přetočit k předchozímu okamžiku Add a new pane containing only a time ruler Přidat novou tabulku obsahující pouze časové pravítko Orange Oranžová PgDown PgDown %1 by Plugin Name %1 podle názvu přídavného modulu Purple Purpurová Export the whole audio file Vyvést celý zvukový soubor Open or import a file from a remote URL Otevřít nebo zavést soubor ze vzdálené adresy (URL) Rewind Přetočit zpět Select Vybrat Select the time range corresponding to the current window width Vybrat časový rozsah odpovídající šířce nynějšího okna <b>File open failed</b><p>Session file "%1" could not be opened <b>Soubor se nepodařilo otevřít</b><p>Soubor se sezením "%1" se nepodařilo otevřít <br>With Rubber Band v%1 &copy; Chris Cannam <br>Gumička (Rubber Band) v%1 &copy; Chris Cannam Show centre indicator, frame times and scale Ukázat středový ukazatel, časy snímků a stupnici Failed to open dropped URL Upuštěnou adresu (URL) se nepodařilo otevřít Using Find a Transform... Najít proměnu... Fast Forward to Next Instant Rychle vpřed k dalšímu okamžiku Playback Speedup Zvýšení rychlosti přehrávání Zoom &Out &Oddálit Shift+PgDown Shift+PgDown Add a new pane showing a spectrogram set up for tracking frequencies Přidat novou tabulku ukazující spektrogram nastavený na sledování kmitočtů Add New %1 Layer Přidat novou vrstvu %1 Add Point Přidat bod Zoom &In &Přiblížit <h3>About Sonic Visualiser</h3> <h3>O programu Sonic Visualiser</h3> &Open... &Otevřít... Make the next pane up in the pane stack current Udělat další tabulku směrem nahoru v zásobníku tabulek současnou Scroll the current pane to the right Projíždět nynější tabulkou vpravo <br>With liblo Lite OSC library &copy; Steve Harris <br>Knihovna liblo Lite OSC &copy; Steve Harris Insert Instants at Selection &Boundaries Vložit okamžiky na &hranicích výběru Slow Down Zpomalit Solo the current pane during playback Nynější tabulka samostatně během přehrávání Shift+Enter Shift+Enter &Key and Mouse Reference &Klávesové zkratky a myš Speed Up Zrychlit Open a window displaying the hierarchy of panes and layers in this session Otevřít okno zobrazující pořadí tabulek a vrstev v tomto sezení <br>With FFTW3 v%1 &copy; Matteo Frigo and MIT <br>FFTW3 v%1 &copy; Matteo Frigo and MIT Time-stretch playback to speed it up without changing pitch Přehrávání roztažení času kvůli jeho zrychlení bez změny výšky Playback Toolbar Nástrojový pruh pro přehrávání Renumber Selected Instants Přečíslovat vybrané okamžiky Alt+Right Alt+šipka vpravo Show &Zoom Wheels Ukázat kolečka pro &zvětšování Select to &End Vybrat do &konce Export Session as Template... Vyvést předlohu jako sezení... Failed to save file Soubor se nepodařilo uložit <br>With libsndfile &copy; Erik de Castro Lopo <br>libsndfile &copy; Erik de Castro Lopo Shift+Right Shift+šipka vpravo Insert Item at Selection Vložit položku u výběru Re-select the most recently run transform Vybrat znovu naposledy provedenou proměnu Save Session &As... Uložit sezení &jako... Restore Normal Speed Obnovit obyčejnou rychlost Rewind to the previous time instant or time ruler notch Přetočit k předchozímu okamžiku v čase nebo místu časového pravítka Paste from the clipboard to the current layer, placing the first item at the playback position Vložit ze schránky do nynější vrstvy, první položka se umístí v poloze přehrávání With Qt v%1 &copy; Nokia Corporation S Qt v%1 &copy; Nokia Corporation Add a new layer showing a time ruler Přidat novou vrstvu ukazující časové pravítko Restore the zoom level to the default Obnovit úroveň zvětšení na výchozí Insert new time instants at the start and end of the current selected regions, in a new layer if necessary Vložit nové časové okamžiky na začátku a na konci nyní vybraných oblastí, v nové vrstvě, pokud je třeba Failed to save image file %1 Soubor s obrázkem %1 se nepodařilo uložit Rewind to the start Přetočit na začátek <br>With liblo Lite OSC library v%1 &copy; Steve Harris <br>Knihovna liblo Lite OSC v%1 &copy; Steve Harris Tapping Time Instants Zaklepání okamžiků času Show centre indicator only Ukázat pouze středový ukazatel Open the Sonic Visualiser reference manual Otevřít odbornou příručku k programu Sonic Visualiser <b>File open failed</b><p>File "%1" could not be opened <b>Soubor se nepodařilo otevřít</b><p>Soubor "%1" se nepodařilo otevřít Add Pea&k Frequency Spectrogram Přidat spektrogram nejvyššího &kmitočtu Delete the currently active pane Smazat nyní činnou tabulku About Sonic Visualiser O programu Sonic Visualiser Restore non-time-stretched playback Obnovit nečasově roztažené přehrávání &Transform &Proměna Scroll the current pane to the left Projíždět nynější tabulkou vlevo Show the layer property boxes at the side of the main window Ukázat okénka vlastností vrstev po straně hlavního okna Add %1 Pane Přidat %1 tabulku &About Sonic Visualiser &O programu Sonic Visualiser Re-open Otevřít znovu <b>Overloaded</b><p>Audio playback speed processing has been reduced to a single channel, due to a processing overload. <b>Přetíženo</b><p>Zpracování rychlosti přehrávání zvuku bylo omezeno na jeden kanál kvůli přetížení při zpracování. <b>Save failed</b><p>Session file "%1" could not be saved. <b>Uložení se nezdařilo</b><p>Soubor se sezením "%1" se nepodařilo uložit. Export the visible area only (%1x%2 pixels) Vyvést pouze viditelnou oblast (%1x%2 pixelů) Export the whole pane (%1x%2 pixels) Vyvést celou tabulku (%1x%2 pixelů) Adjust the application preferences Upravit nastavení programu Play&back &Přehrávání Release Vydání <b>Overloaded</b><p>Audio effects plugin auditioning has been disabled due to a processing overload. <b>Přetíženo</b><p>Poslech přídavných modulů zvukových efektů byl zakázán kvůli přetížení při zpracování. Navigate Navádět Import an extra audio file into a new pane Zavést další zvukový soubor do nové tabulky Failed to open location Umístění se nepodařilo otevřít Save the current session into a Sonic Visualiser session file Uložit nynější sezení do souboru se sezením programu Sonic Visualiser &Delete Pane &Smazat tabulku Export layer to "%1" Vyvést vrstvu do "%1" Select &Visible Range Vybrat &viditelný rozsah Ctrl+Home Ctrl+Home Ctrl+PgUp Ctrl+PgUp Ctrl+Left Ctrl+šipka vlevo Treat multiple audio files as versions of the same work, and align their timelines S více zvukovými soubory zacházet jako s verzemi téže práce a zarovnat jejich časové přímky <br>With JACK audio output library v%1 &copy; Paul Davis and Jack O'Quin <br>Zvuková výstupní knihovna JACK v%1 &copy; Paul Davis a Jack O'Quin &Insert Instant at Playback Position &Vložit okamžik v poloze přehrávání Renumber the selected instants using the current labelling scheme Přečíslovat vybrané okamžiky za použití nynějšího štítkovacího plánu Select to &Start Vybrat po &začátek <br>With Redland RDF datastore &copy; Dave Beckett and the University of Bristol <br>Datové skladiště RDF Redland &copy; Dave Beckett a the University of Bristol Edit the currently active layer as a data grid Upravit nyní činnou vrstvu jako datovou mřížku <b>Warning when regenerating layer</b><p>When regenerating the derived layer "%1" using new data model as input:<p>%2 <b>Varování při znovuvytváření vrstvy</b><p>Při znovuvytváření odvozené vrstvy "%1" za použití nového datového modelu jako vstupu:<p>%2 C&lear Selection Vyprázd&nit výběr Failed to write file Soubor se nepodařilo zapsat Release %1 : Revision %2 Vydání %1: Revize %2 <br>With Raptor RDF parser v%1 &copy; Dave Beckett and the University of Bristol <br>Se syntaktickým analyzátorem RDF Raptor v%1 &copy; Dave Beckett a the University of Bristol Export the selected regions into a single audio file Vyvést vybrané oblasti do jednoho zvukového souboru <b>Wrong sample rate</b><p>The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).<p>The file will play at the wrong speed and pitch.<p>Change the <i>Resample mismatching files on import</i> option under <i>File</i> -> <i>Preferences</i> if you want to alter this behaviour. <b>Špatný vzorkovací kmitočet</b><p>Vzorkovací kmitočet tohoto zvukového souboru (%1 Hz) neodpovídá nynější rychlosti přehrávání (%2 Hz).<p>Soubor bude přehráván se špatnou rychlostí a výškou.<p>Změňte volbu <i>Převzorkovat neodpovídající soubory při zavedení</i>, která je v nabídce <i>Soubor</i> -> <i>Nastavení</i>, pokud toto chování chcete změnit. Select target for import Vybrat cíl pro zavedení Rewind to Similar Point Přetočit k podobnému bodu Fast Forward Rychle vpřed Fast forward Rychle vpřed Which region from the original audio file do you want to export? Kterou oblast z původního zvukového souboru chcete vyvést? Manage Exported Templates Spravovat vyvedené předlohy Multiple regions of the original audio file are selected. What do you want to export? Je vybráno více oblastí původního zvukového souboru. Co chcete vyvést? Set Numbering Counters... Nastavit číslovací počítadla... Add a new pane showing a spectrogram set up for an overview of note pitches Přidat novou tabulku ukazující spektrogram nastavený na přehled výšek not Shift+G Shift+G Shift+K Shift+K Shift+M Shift+M Shift+U Shift+U Shift+W Shift+W Ctrl+Shift+Enter Ctrl+Shift+Enter Audio processing overload Přetížení zpracování zvuku Save session as "%1" Uložit sezení jako "%1" <b>Session modified</b><p>The current session has been modified.<br>Do you want to save it? <b>Sezení bylo upraveno</b><p>Nynější sezení bylo upraveno.<br>Chcete je uložit? <br>With FFTW3 &copy; Matteo Frigo and MIT <br>FFTW3 &copy; Matteo Frigo and MIT Failed to save image file Soubor s obrázkem se nepodařilo uložit Reset Counters Nastavit znovu počítadla Select &All Vybrat &vše Fast Forward to Next Point Rychle vpřed k dalšímu bodu <br>With Redland RDF datastore v%1 &copy; Dave Beckett and the University of Bristol <br>Datové skladiště RDF Redland v%1 &copy; Dave Beckett a the University of Bristol Show all texts and scale Ukázat všechny texty a stupnici <br>With libsndfile v%1 &copy; Erik de Castro Lopo <br>libsndfile v%1 &copy; Erik de Castro Lopo Import layer data from an existing file Zavést data vrstvy ze stávajícího souboru <br>With DSSI plugin support (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton <br>Podpora pro přídavné moduly DSSI (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton Add a new pane showing a waveform view Přidat novou tabulku ukazující pohled na časový průběh vlny Hide centre indicator, frame times, layer names and scale Skrýt středový ukazatel, časy snímků, názvy vrstev a stupnici Which region of the current pane do you want to export as an image? Kterou oblast nynější tabulky chcete vyvést jako obrázek? Increase the zoom level Zvýšit úroveň zvětšení Decrease the zoom level Snížit úroveň zvětšení Add a new empty layer of type %1 Přidat novou prázdnou vrstvu typu %1 Scroll &Right Projíždět do&prava Add &New Pane Přidat &novou tabulku Export Annotation Layer... Vyvést poznámkovou vrstvu... &Export Audio File... &Vyvést zvukový soubor... Export multiple audio files Vyvést více zvukových souborů Close the current session and create a new one Zavřít nynější sezení a vytvořit nové Add a new pane showing a spectrogram Přidat novou tabulku ukazující spektrogram Select the whole duration of the current session Vybrat celou dobu trvání nynějšího sezení %1 by Maker %1 podle tvůrce &New Session &Nové sezení Fast forward to the next point in the current layer Rychle vpřed k dalšímu bodu v nynější vrstvě Re-open the current or most recently opened file Otevřít znovu nynější nebo naposledy otevřený soubor Newer version available Je dostupná novější verze Release %1 Vydání %1 <br>With Raptor RDF parser &copy; Dave Beckett and the University of Bristol <br>Se syntaktickým analyzátorem RDF Raptor &copy; Dave Beckett a the University of Bristol <b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform "%1" failed.<p>No error information is available. <b>Vytvoření vrstvy se nezdařilo</b><p>Nepodařilo se vytvořit odvozenou vrstvu.<p>Proměna vrstvy "%1" se nezdařila.<p>Nejsou dostupné žádné informace o chybě. Editing Úpravy Scroll &Left Projíždět &doleva %1 by Category %1 podle skupiny Show &Minimal Overlays Ukázat nej&menší překrytí Peek Left Letmo prohlédnout vlevo Add this data to the current session Přidat tato data do nynějšího sezení Unreleased : Revision %1 Nevydáno: Revize %1 http://www.sonicvisualiser.org/ http://www.sonicvisualiser.org/ Please enter the URL of the location to open: Zadejte, prosím adresu (URL) umístění, které se má otevřít: Add Spectr&um Přidat spektr&um &Preferences... &Nastavení... Edit Layer Data Upravit data vrstvy Open a window showing the keystrokes you can use in Sonic Visualiser Otevřít okno ukazující klávesové zkratky, které lze použít v programu Sonic Visualiser &Delete Current Measurement &Smazat nynější měření Unknown Neznámý Export image to "%1" Vyvést obrázek do "%1" <br>With Rasqal RDF query engine v%1 &copy; Dave Beckett and the University of Bristol <br>Se strojem na dotazy RDF Rasqal v%1 &copy; Dave Beckett a the University of Bristol Which audio file do you want to export from? Ze kterého zvukového souboru chcete provést vyvedení? Playback and Transport Controls Ovládání přehrávání a přesunu &Rename Layer... &Přejmenovat vrstvu... Enter template name Zadat název předlohy Make measurements in layer Udělat měření ve vrstvě Selection: %1 to %2 (duration %3) Výběr: %1 až %2 (doba trvání %3) Display Features Funkce zobrazení <br>With JACK audio output library &copy; Paul Davis and Jack O'Quin <br>Zvuková výstupní knihovna JACK &copy; Paul Davis a Jack O'Quin &Delete Selected Items &Smazat vybrané položky <br>With PulseAudio audio output library &copy; Lennart Poettering and Pierre Ossman <br>Zvuková výstupní knihovna PulseAudio &copy; Lennart Poettering a Pierre Ossman Bright Purple Světlepurpurová Scroll the current pane a big step to the left Projíždět nynější tabulkou velkým skokem vlevo Zoom to &Fit &Přizpůsobit oknu Add S&lice of Layer Přidat k&us vrstvy Ctrl+Shift+A Ctrl+Shift+A Ctrl+Shift+D Ctrl+Shift+D Ctrl+Shift+O Ctrl+Shift+O Ctrl+Shift+S Ctrl+Shift+S Ctrl+Shift+V Ctrl+Shift+V Rewind to the previous similarly valued time instant Přetočit k předchozímu podobně ohodnocenému okamžiku v čase Peek Right Letmo prohlédnout vpravo Export the selected regions into separate files Vyvést vybrané oblasti do oddělených souborů Shift+Left Shift+šipka vlevo Shift+PgUp Shift+PgUp <br>With LADSPA plugin support (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>Podpora pro přídavné moduly LADSPA (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld Add a new layer showing a frequency spectrum Přidat novou vrstvu ukazující kmitočtové spektrum Align File Timelines Zarovnat časové přímky souborů Warning Varování Show context help information in the status bar at the bottom of the window Ukázat související nápovědu ve stavovém řádku okna dole Show Property Bo&xes Ukázat &okénka vlastností Note: the whole pane is too wide to be exported as a single image. Poznámka: celá tabulka je příliš široká na to, aby mohla být vyvedena jako jeden obrázek. Failed to generate layer Vrstvu se nepodařilo vytvořit Draw new items in layer Nakreslit položky ve vrstvě Export Image File... Vyvést obrázkový soubor... Fast Forward to End Přetáčet rychle na konec Delete items in current selection from the current layer Smazat položky v nynějším výběru z nynější vrstvy Repeat Transform Opakovat proměnu Time-stretch playback to slow it down without changing pitch Přehrávání roztažení času kvůli jeho zpomalení bez změny výšky Template file exists Soubor s předlohou existuje Bright Red Světlečervená &Delete Layer &Smazat vrstvu Sonic Visualiser on the &Web Sonic Visualiser na &internetu <br>With libsamplerate v%1 &copy; Erik de Castro Lopo <br>libsamplerate v%1 &copy; Erik de Castro Lopo Select from the current playback position to the end of the session Vybrat od nynější polohy přehrávání po konec sezení Select ranges Vybrat rozsah Failed to regenerate layer Vrstvu se nepodařilo vytvořit znovu Constrain playback to the selected regions Omezit přehrávání na vybrané oblasti <br>With RtMidi &copy; Gary P. Scavone <br>RtMidi &copy; Gary P. Scavone Copy the selection from the current layer to the clipboard Kopírovat výběr z nynější vrstvy do schránky Rewind to Previous Point Přetočit k předchozímu bodu Add &Melodic Range Spectrogram Přidat spektrogram &melodického rozsahu Show information about Sonic Visualiser Ukázat informace o programu Sonic Visualiser <p><small>%1 : %2 configuration</small></p> <p><small>%1 : %2 nastavení</small></p> <b>Template file exists</b><p>The template "%1" already exists.<br>Overwrite it? <b>Soubor s předlohou existuje</b><p>Předloha "%1" existuje.<br>Přepsat ji? Panning and Navigation Najíždění a navádění Add Spectro&gram Přidat spektro&gram [\(<].*$ [\(<].*$ Add a new pane showing a frequency spectrum Přidat novou tabulku ukazující kmitočtové spektrum Export audio to "%1" Vyvést zvuk do "%1" <b>Open failed</b><p>File or URL "%1" could not be opened <b>Otevření se nezdařilo</b><p>Soubor nebo adresu (URL) "%1" se nepodařilo otevřít Bright Orange Světleoranžová Open &Recent Otevřít &naposledy otevřený soubor Ctrl+Right Sonic Visualiser: %1 Sonic Visualiser: %1 <b>File open failed</b><p>Audio file "%1" could not be opened <b>Soubor se nepodařilo otevřít</b><p>Zvukový soubor "%1" se nepodařilo otevřít Add a new layer showing a spectrogram set up for tracking frequencies Přidat novou vrstvu ukazující spektrogram nastavený na sledování kmitočtů Bright Blue Světlemodrá Show or hide all time rulers Ukázat nebo skrýt všechna časová pravítka <br>With MAD mp3 decoder v%1 &copy; Underbit Technologies Inc <br>Dekodér souborů mp3 MAD v%1 &copy; Underbit Technologies Inc <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam <br>Podpora pro přídavné moduly Vamp (API v%1, host SDK v%2) &copy; Chris Cannam Unclassified Bez zařazení Rewind to Start Přetočit na začátek Add &Waveform Přidat &časový průběh vlny Open Lo&cation... Otevřít &umístění... File Toolbar Nástrojový pruh pro soubor <b>Select a target for import</b><p>This RDF document refers to one or more audio files.<br>You already have an audio waveform loaded.<br>What would you like to do with the new data? <b>Vybrat cíl pro zavedení</b><p> Tento dokument RDF odkazuje na jeden nebo více zvukových souborů.<p>Již jste nahrál jeden zvukový časový průběh vlny.<br>Co chcete udělat s novými daty? Scroll the current pane a big step to the right Projíždět nynější tabulkou velkým skokem vpravo Session modified Sezení bylo upraveno Select from the start of the session to the current playback position Vybrat od začátku sezení po nynější polohu přehrávání Show &No Overlays &Neukazovat žádná překrytí Add a new layer showing a spectrogram set up for an overview of note pitches Přidat novou vrstvu ukazující spektrogram nastavený na přehled výšek not <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %3 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> <h3>Je dostupná novější verze</h3><p>Používáte verzi %1 programu Sonic Visualiser, ale nyní je dostupná verze %3.</p><p>Podívejte se, prosím, na stránky <a href="http://sonicvisualiser.org/">projektu Sonic Visualiser</a>, abyste získal více informací.</p> Edit Toolbar Nástrojový pruh pro úpravy Abandon the current %1 session and start a new one Opustit nynější sezení %1 a začít nové Replace &Main Audio... Nahradit &hlavní zvuk... Replace the main audio file of the session with a different file Nahradit soubor s hlavním zvukem v tomto sezení jiným souborem Save the current session into a %1 session file Uložit nynější sezení do %1 souboru se sezením Save the current session into a new %1 session file Uložit nynější sezení do nového %1 souboru se sezením Exit %1 Ukončit %1 Reset Numbering Counters Nastavit číslovací počítadla znovu Reset to 1 all the counters used for counter-based labelling Nastavit na 1 všechna počítadla používaná pro štítkování založené na počítadlech Show &Centre Line Ukázat &středovou linku ' ' Show or hide the centre line Ukázat nebo skrýt středovou linku Toggle All Time Rulers Přepnout všechna časová pravítka Hide times, layer names, and scale Skrýt časy, názvy vrstev, a stupnici Show times and basic scale Ukázat časy a základní stupnici Show times, layer names, and scale Ukázat časy, názvy vrstev, a stupnici Go Full-Screen Jít na celou obrazovku F11 F11 Expand the pane area to the whole screen Rozšířit oblast tabulky na celou obrazovku Open the %1 reference manual Otevřít odbornou příručku k %1 Open a window showing the keystrokes you can use in %1 Otevřít okno ukazující klávesové zkratky, které lze použít v programu %1 %1 on the &Web %1 na &internetu Open the %1 website Otevřít internetové stránky programu %1 &About %1 &O programu %1 Show information about %1 Ukázat informace o programu %1 Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) Promiňte, ale typ této vrstvu nelze vyvést do RDF (podporovanými typy jsou: oblast, poznámka, text, okamžiky času. hodnoty času) Set as default template for future audio files Nastavit jako výchozí předlohu pro budoucí zvukové soubory %1: %1 %1: %1 <br>With Serd and Sord RDF parser and store &copy; David Robillard <br>Syntaktický analyzátor Serd a Sord RDF a ukládání &copy; David Robillard <br>With Dataquay Qt/RDF library &copy; Chris Cannam <br>Knihovna Dataquay Qt/RDF &copy; Chris Cannam &Export Audio Data... Export audio from selection into a data file Export the selected regions into a single file Export the whole file MainWindowBase Cut Vyjmout Paste Vložit Couldn't open audio device Nepodařilo se otevřít zvukové zařízení %1: %2 %1: %2 %1 (modified) %1 (upraveno) Failed to import RDF Nepodařilo se zavést RDF <b>No audio available</b><p>Could not open an audio device for playback.<p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <b>Žádný zvuk není dostupný</b><p> Zvukové zařízení se nepodařilo otevřít pro přehrávání.<p>Automatické určení zvukového zařízení se nezdařilo. Přehrávání zvuku během tohoto sezení nebude dostupné.</p> Add Point Přidat bod <b>Select a target for import</b><p>You already have an audio file loaded.<br>What would you like to do with the new audio file? <b>Vybrat cíl pro zavedení</b><p>Již máte nahrán jeden zvukový soubor.<br>Co chcete udělat s novým zvukovým souborem? Replace the main audio file in this session Nahradit soubor s hlavním zvukem v tomto sezení <b>Failed to import RDF</b><p>No suitable data models found for import from RDF document at "%1"</p> <b>Nepodařilo se zavést RDF</b><p>Nebyly nalezeny žádné vhodné datové modely pro zavedení dat z dokumentu RDF na "%1"</p> Opening session... Otevírá se sezení... %1: %2 [%3] %1: %2 [%3] Import MIDI file "%1" Zavést soubor MIDI "%1" SV XML file read error: %1 Chyba při čtení souboru XML SV: %1 Import "%1" Zavést "%1" Playing: %1 of %2 (%3 remaining) Přehrává se: %1 z %2 (%3 zůstává) Failed to write file Soubor se nepodařilo zapsat Select target for import Vybrat cíl pro zavedení Import layer XML file "%1" Zavést soubor XML vrstvy "%1" <b>No audio available</b><p>Failed to open your preferred audio device ("%1").<p>Audio playback will not be available during this session.</p> <b>Žádný zvuk není dostupný</b><p> Vámi upřednostňované zvukové zařízení se nepodařilo otevřít ("%1").<p>Přehrávání zvuku během tohoto sezení nebude dostupné.</p> Delete Pane Smazat tabulku Add the audio file to this session Přidat soubor se zvukem do tohoto sezení Add Pane Přidat tabulku <b>Save failed</b><p>Failed to write to file "%1": %2 <b>Uložení se nezdařilo</b><p>Nepodařilo se zapsat do souboru "%1": %2 (modified) (upraveno) Close the current session and start a new one Zavřít nynější sezení a začít nové Importing from RDF... Zavádí se z RDF... Remove Pane Odstranit tabulku Open session template "%1" Otevřít předlohu sezení "%1" Add Item at %1 s Přidat položku v %1 s Import audio file "%1" Zavést zvukový soubor "%1" Opening playlist... Otevírá se seznam skladeb... Opening file or URL... Otevírá se soubor nebo adresa (URL)... Import session file "%1" Zavést soubor se sezením "%1" Import RDF document "%1" Zavést dokument RDF "%1" Add Point at %1 s Přidat bod v %1 s <b>Failed to import RDF</b><p>Importing data from RDF document at "%1" failed: %2</p> <b>Nepodařilo se zavést RDF</b><p>Zavedení dat z dokumentu RDF na "%1" se nepodařilo: %2</p> ModelDataTableDialog Play Mode Toolbar Nástrojový pruh pro režim hry Find: Hledat: Delete the selected item or items Smazat vybranou položku nebo položky Delete Smazat Data Editor Editor dat Insert Vložit Insert New Item Vložit novou položku Insert a new item Vložit novou položku Toggle tracking of playback position Přepnout sledování polohy přehrávání Playback Toolbar Nástrojový pruh pro přehrávání Data in Layer Data ve vrstvě Track Playback Přehrávání stopy Delete Selected Items Smazat vybrané položky Edit Toolbar Nástrojový pruh pro úpravy ModelMetadataModel Name Název Type Typ Maker Tvůrce Source Zdroj ModelTransformerFactory %1: %2 %1: %2 %1 <%2> %1 <%2> NoteLayer Log Zápis %1 %2 %1 %2 Paste Vložit Scale Stupnice No local points Žádné místní body The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, přišly z vrstvy s odlišným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v čase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? %1 (%2, %3 Hz) %1 (%2, %3 Hz) Auto-Align Automatické zarovnání Vertical Scale Svislá stupnice Resize Selection Změnit velikost výběru Linear Přímočaré Change Point Value Změnit hodnotu bodu Edit Point Upravit bod Scale Units Jednotky stupnice Erase Point Vymazat bod Time: %1 Pitch: %2 Duration: %3 No label Čas: %1 Výška: %2 Doba trvání: %3 Žádný štítek Record Note Nahrát notu In progress Probíhá Drag Point Táhnout bod Draw Point Nakreslit bod New Point Nový bod Re-align pasted items? Zarovnat vložené položky znovu? Time: %1 Pitch: %2 Duration: %3 Label: %4 Čas: %1 Výška: %2 Doba trvání: %3 Štítek: %4 Drag Selection Táhnout výběr %1 Hz (%2, %3) %1 Hz (%2, %3) MIDI Notes Noty MIDI Relocate Point Přemístit bod Delete Selected Points Smazat vybrané body NoteModel Note Nota Time Čas Frame Snímek Label Štítek Level Úroveň Pitch Výška tónu Edit Data Upravit data Unknown Neznámý Duration Doba trvání OggVorbisFileReader Decoding %1... Dekóduje se %1... Overview Click and drag to navigate; double-click to jump Klepněte a táhněte pro navádění; dvakrát klepněte pro skok Overview Přehled Pane (R) (R) +%1 +%1 (X) (X) Draw Nakreslit Edit Upravit Left Levé Menu Nabídka Move Posunout Zoom Zvětšení Click left button and drag to measure a rectangular area Klepněte levým tlačítkem a táhněte pro změření obdélníkové oblasti Double-Click Middle Dvakrát klepněte prostředním Edit Tool Mouse Actions Činnosti nástroje úprav prováděné myší Draw Tool Mouse Actions Činnosti nástroje kreslení prováděné myší Right Pravé Wheel Kolečko Show pane context menu Ukázat nabídku související s tabulkou Multi Select Vícenásobný výběr Zoom In Přiblížit Double-click middle button to relocate with any tool Dvakrát klepněte prostředním pro přemístění s jakýmkoli nástrojem Shift-click left button and drag to zoom to a rectangular area Shift-klepněte levým tlačítkem a táhněte pro přiblížení obdélníkové oblasti %1 / %2Hz%3 %1 / %2Hz%3 Click and drag an item in the active layer to move it; hold Shift to override initial resistance Klepněte a táhněte položku v činné vrstvě pro její přesun; držte klávesu Shift pro potlačení počátečního odporu Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate Klepněte a táhněte pro výběr rozsahu; držte klávesu Ctrl pro provedení vícenásobného výběru; klepněte prostředním tlačítkem a táhněte pro navádění Reset horizontal and vertical zoom levels to their defaults Nastavit znovu úrovně vodorovného a svislého zvětšení na jejich výchozí hodnoty Resize Selection Změnit velikost výběru Enter new range Zadejte nový rozsah Double-click left button on an item to edit it Dvakrát klepněte levým tlačítkem na položce pro její upravení Scroll rapidly left or right in time axis Projíždět rychle vlevo nebo vpravo na časové ose Middle Prostřední Some lengthy prefix: Příliš dlouhá předpona: Scroll Projíždět Select Vybrat Fine Select Citlivý výběr Zoom in or out in time axis Přiblížit nebo oddálit na časové ose Click left button and drag to measure extents of an item or shape Klepněte levým tlačítkem a táhněte pro změření rozsahu položky nebo tvaru Zoom Out Oddálit Click and drag to select a range; middle-click and drag to navigate Klepněte a táhněte pro výběr rozsahu; klepněte prostředním tlačítkem a táhněte pro navádění Scroll up or down in the vertical axis Projíždět nahoru nebo dolů na svislé ose Reset zoom to default Nastavit zvětšení znovu na výchozí Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate Klepněte a táhněte pro výběr rozsahu; držte klávesu Shift, abyste se vyhnul zapadávání k položkám; klepněte prostředním tlačítkem a táhněte pro navádění Alt+Wheel Alt+kolečko Click left button on an item or selected region and drag to move Klepněte levým tlačítkem na položku nebo vybranou oblast a táhněte pro její přesun Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate Klepněte a táhněte pro výběr rozsahu; držte klávesu Shift, abyste se vyhnul zapadávání k položkám; držte klávesu Ctrl pro provedení vícenásobného výběru; klepněte prostředním tlačítkem a táhněte pro navádění Click and drag to adjust the visible range of the vertical scale Klepněte a táhněte pro přizpůsobení viditelného rozsahu svislé stupnice Click and drag to navigate Klepněte a táhněte pro navádění Shift+Wheel Shift+kolečko Click left button and drag to move around Klepněte levým tlačítkem a táhněte pro přesouvání se Select Tool Mouse Actions Činnosti nástroje výběru prováděné myší Unaligned Nezarovnáno Click and drag to move all items in the selected range Klepněte a táhněte pro přesun všech položek ve vybraném rozsahu Aligned Zarovnáno %1 - %2 %1 - %2 Scroll Vertically Projíždět svisle Navigate Navádět Ctrl+Left Ctrl+šipka vlevo Click and drag to move the selection boundary Klepněte levým tlačítkem a táhněte pro přesun hranice výběru Measure Tool Mouse Actions Činnosti nástroje měření prováděné myší Ctrl-click left button and drag to select an additional region Ctrl-klepněte levým tlačítkem a táhněte pro výběr další oblasti Zoom in or out in the vertical axis Přiblížit nebo oddálit na svislé ose Click to erase an item from the active layer Klepněte pro vymazání položky z činné vrstvy Drag Selection Táhnout výběr Vertical Zoom Svislé zvětšení Click middle button and drag to navigate with any tool Klepněte prostředním tlačítkem a táhněte pro vedení s jakýmkoli nástrojem Double-Click Left Dvakrát klepněte levým Wheel Down Kolečko dolů Shift-click left button and drag to select without snapping to items or grid Shift-klepněte levým tlačítkem a táhněte pro výběr bez zapadávání k položkám nebo mřížce Relocate Přemístit Aligning: %1% Zarovnání: %1% Navigate Tool Mouse Actions Činnosti nástroje pro navádění prováděné myší Reference Odkaz General Pane Mouse Actions Činnosti prováděné myší obecně v tabulce Zoom to Area Přiblížit oblast Measure Area Oblast měření Measure Item Položka měření Shift+Left Shift+šipka vlevo Click and drag to adjust the horizontal zoom level Klepněte a táhněte pro přizpůsobení úrovně vodorovného zvětšení Click left button and drag to select region; drag region edge to resize Klepněte levým tlačítkem a táhněte pro výběr oblasti; táhněte za okraj oblasti pro změnu její velikosti Wheel Up Kolečko nahoru Click and drag to adjust the vertical zoom level Klepněte a táhněte pro přizpůsobení úrovně svislého zvětšení Horizontal Zoom Vodorovné zvětšení Ctrl+Wheel Ctrl+kolečko Zoom Vertically Přiblížit/Oddálit svisle Click to add a new item in the active layer Klepněte pro přidání nové položky do činné vrstvy Double-click left button to jump to clicked location Dvakrát klepněte levým tlačítkem pro skok na klepnuté místo Click left button and drag to create new item Klepněte levým tlačítkem a táhněte pro vytvoření nové položky New vertical display range, from %1 to %2 %4: Nový rozsah svislého zobrazení, od %1 do %2 %4: Cmd-click left button and drag to select an additional region Ctrl-klepněte levým tlačítkem a táhněte pro výběr další oblasti Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate Klepněte a táhněte pro výběr rozsahu; držte klávesu Shift, abyste se vyhnul zapadávání k položkám; držte klávesu Ctrl pro provedení vícenásobného výběru; klepněte prostředním tlačítkem a táhněte pro navádění Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate Klepněte a táhněte pro výběr rozsahu; držte klávesu Ctrl pro provedení vícenásobného výběru; klepněte prostředním tlačítkem a táhněte pro navádění PlayParameterRepository Change Playback Gain Změnit zesílení přehrávání Adjust Playback Parameters Upravit parametry přehrávání Change Playback Mute State Změnit stav ztlumení přehrávání Change Playback Plugin Změnit přídavný modul přehrávání Change Playback Pan Změnit vyvážení přehrávání Configure Playback Plugin Nastavit přídavný modul přehrávání PluginParameterBox Program Program This plugin has no adjustable parameters. Tento přídavný modul nemá žádné upravitelné parametry. PluginParameterDialog is je are jsou Name: Název: Use mean of source channels Použít průměr ze zdrojových kanálů This plugin only has a single channel input, but the source has %1 channels. Tento přídavný modul má jednokanálový vstup, ale zdroj má %1 kanály. This plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. Tento přídavný modul nepřijímá více než %1 vstupní kanály, ale dostupné jsou %2. Použije se pouze první %3. Use channel %1 only Použít pouze kanál %1 Advanced << Pokročilé << Advanced >> Pokročilé >> Maker: Tvůrce: Channel mismatch Nesoulad v kanálu Output: Výstup: Plugin Parameters Parametry přídavného modulu Window shape: Podoba okna: Processing Zpracování This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly. Tento přídavný modul vyžaduje alespoň %1 vstupních kanálů, ale dostupné jsou pouze %2 %3. Přídavný modul pravděpodobně nebude pracovat správně. Copyright: Autorské právo: Audio frames per block: Snímků zvuku na blok: Version: Verze: Window size: Velikost okna: Input Material Vstupní materiál Channels Kanály Window increment: Přírůstek okna: Restrict to selection extents Omezit na rozsah výběru Preferences Hann Hann None Žádná Show splash screen on startup Ukázat úvodní obrazovku při spuštění Location for cache file directory Umístění adresáře s vyrovnávací pamětí Blackman Blackman 4 x Oversampling 4 x převzorkování 24 FPS 24 snímků za sekundu (FPS) 25 FPS 25 snímků za sekundu (FPS) 30 FPS 30 snímků za sekundu (FPS) 50 FPS 50 snímků za sekundu (FPS) 60 FPS 60 snímků za sekundu (FPS) Font size for text overlays Velikost písma pro překrytí textem Spectral analysis window shape Podoba okna pro rozbor spektra Highest quality Nejvyšší kvalita Parzen Parzen Nuttall Nuttall Linear interpolation Přímočará interpolace Blackman-Harris Blackman-Harris Show box for current pane only Ukázat okénko pouze pro nynější tabulku Resample mismatching files on import Převzorkovat neodpovídající soubory při zavedení Background colour preference Upřednostňovaná barva pozadí Rectangular Obdélníková Triangular Trojúhelníková Gaussian Gauss Playback resampler type Typ převzorkování přehrávání Dark background Tmavé pozadí Standard Obvyklé Frequency of concert A Kmitočet koncertního A Property box layout Rozvržení okénka vlastností Standard (to millisecond) Obvyklý (na milisekundy) Spectrogram x-axis interpolation: Interpolace osy x spektrogramu: Spectrogram y-axis interpolation: Interpolace osy y spektrogramu: Fastest Nejrychlejší Preferences Nastavení Omit temporaries from Recent Files menu Vynechat dočasné z nabídky naposledy otevřených souborů Time display format Formát zobrazení času Show boxes for all panes Ukázat okénka pro všechny tabulky Follow desktop theme Držet se námětu plochy Hamming Hamming Light background Světlé pozadí High resolution (to microsecond) Vysoké rozlišení (na mikrosekundy) 4 x Oversampling with interpolation 4 x převzorkování s interpolací PreferencesDialog OK OK %1: %1: Apply Použít Some preferences have been changed but not applied. Apply them before closing? Některá nastavení byla změněna, ale nebyla použita. Použít je před zavřením? Standard Waveform Obvyklý tvar vlny <b>Restart required</b><p>One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.</p><p>Please exit and restart the application now if you want these changes to take effect immediately.</p> <b>Znovuspuštění vyžadováno</b><p>Jedno nebo více nastavení programu, které jste změnil, se nebude moci plně projevit do doby, než bude Sonic Visualiser spuštěn znovu.</p><p>Ukončete, prosím, program nyní a spusťte jej znovu, pokud chcete, aby se tyto změny projevily okamžitě.</p> Preferences Changed Nastavení změněna Select a directory to create cache subdirectory in Vyberte adresář pro vytvoření podadresáře s vyrovnávací pamětí v něm Cancel Zrušit Default session template for audio files: Výchozí předloha sezení pro zvukové soubory: Anal&ysis &Rozbor <home directory> <domovský adresář> &Appearance Vz&hled Sonic Visualiser: Application Preferences Sonic Visualiser: Nastavení programu Session &Template &Předloha sezení Preferences Nastavení &General &Obecné Playback audio device: Zvukové zařízení pro přehrávání: Follow system locale Russian British English American English Czech User interface language ProgressDialog Cancel Zrušit PropertyBox dB dB Play Přehrát Show Ukázat (current value: %1) (nynější hodnota: %1) Adjust %1 property of %2%3 Upravit %1 vlastnost %2%3 Toggle %1 property of %2 Přepnout %1 vlastnost %2 Toggle Playback of %1 Přepnout přehrávání %1 Playback Pan / Balance Vyvážení přehrávání/rovnováha Prefer black background for this colour Upřednostňovat černé pozadí pro tuto barvu Toggle Visibility of %1 Přepnout viditelnost %1 (current value: %1%2) (nynější hodnota: %1%2) Add New Colour... Přidat novou barvu... Name New Colour Pojmenovat novou barvu Enter a name for the new colour: Zadejte název pro novou barvu: Playback Gain Zesílení přehrávání PropertyContainer no Ne on Zapnuto off Vypnuto yes Ano true Pravdivý false Nepravdivý Set %1 Property Nastavit %1 vlastnost PropertyStack Click to change the current active layer Klepněte pro změnu nynější činné vrstvy Change Layer Visibility Změnit viditelnost vrstvy QApplication Sonic Visualiser Sonic Visualiser - Znázorňovač zvuku Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control <file>: One or more Sonic Visualiser (.sv) and audio files may be provided. Sonic Visualiser je programem určeným pro prohlížení a zkoumání zvukových dat, pro významový hudební rozbor a připojování poznámek. Použití: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Nepokoušet se otevřít zařízení pro výstup zvuku --no-osc: Neposkytovat přípojku Open Sound Control pro dálkové ovládání <file>: Lze poskytnout jeden nebo více souborů Sonic Visualiser (.sv) a zvukových souborů. QFile File "%1" does not exist Soubor "%1" neexistuje File or URL "%1" could not be retrieved Soubor nebo adresu (URL) "%1" se nepodařilo získat Failed to open file "%1" Soubor "%1" se nepodařilo otevřít QMessageBox Failed to open file Soubor se nepodařilo otevřít <b>Audio required</b><p>Please load at least one audio file before importing annotation data <b>Vyžadován zvuk</b><p>Před zavedením dat s poznámkami nahrajte, prosím, alespoň jeden zvukový soubor File or URL "%1" could not be opened Soubor nebo adresu (URL) "%1" se nepodařilo otevřít QuickTimeFileReader Decoding %1... Dekóduje se %1... RDFImporter Importing event data from RDF... Zavádí se data událostí z RDF... Importing dense signal data from RDF... Zavádí se signálová data s vysokou hustotou z RDF... Importing audio referenced in RDF... Zavádí se zvuk odkazovaný v RDF... RangeInputDialog to do RangeSummarisableTimeValueModel Range-Summarisable Time-Value Rozsahově shrnutelná časová hodnota RegionLayer Log Zápis Bars Úsečky %1 %2 %1 %2 Segmentation Rozčlenění Paste Vložit Scale Stupnice No local points Žádné místní body The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, přišly z vrstvy s odlišným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v čase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? Erase Region Vymazat oblast Equal Spaced Vyrovnaně rozložené Auto-Align Automatické zarovnání Vertical Scale Svislá stupnice Resize Selection Změnit velikost výběru Linear Přímočarý New Region Nová oblast Change Point Value Změnit hodnotu bodu Draw Region Nakreslit oblast Drag Region Táhnout oblast Edit Region Upravit oblast Plot Type Typ nákresu Relocate Region Přemístit oblast Scale Units Jednotky stupnice In progress Probíhá Re-align pasted items? Zarovnat vložené položky znovu? Drag Selection Táhnout výběr Delete Selected Points Smazat vybrané body Time: %1 Value: %2 Duration: %3 No label Čas: %1 Hodnota: %2 Doba trvání: %3 Žádný štítek Time: %1 Value: %2 Duration: %3 Label: %4 Čas: %1 Hodnota: %2 Doba trvání: %3 Štítek: %4 RegionModel Time Čas Frame Rámeček Label Štítek Value Hodnota Edit Data Upravit data Region Oblast Unknown Neznámý Duration Doba trvání RemoveLayerCommand Delete %1 Layer Smazat %1 vrstvu ResamplingWavFileReader Resampling %1... Převzorkovává se %1... SVFileReader (derived model in SV-XML) (odvozený model v SV-XML) Opening file or URL... Otevírá se soubor nebo adresa (URL)... SingleColourLayer Colour Barva <unknown> <neznámý> SliceLayer dB dB 0dB 0dB Any Jakýkoli Log Zápis x10 x10 -Inf -Inf Bins Koše Gain Zesílení Mean Průměr Peak Vrchol First První Time: %1 - %2 Range: %3 samples (%4) Čas: %1 - %2 Rozsah: %3 vzorky (%4) Lines Čáry Meter Měřič Scale Stupnice Bin Scale Stupnice koše Steps Kroky Blocks Bloky Linear Přímočarý Plot Type Typ nákresu %1 - %2 %1 - %2 Rev Log Rev Log Threshold Práh Normalize Normalizovat Absolute Naprostý Colours Barvy Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 Čas: %1 - %2 Rozsah: %3 vzorky (%4) Koš: %5 %6 hodnota: %7 Sampling Mode Režim vzorkování SparseModel Edit Data Upravit data Sparse Řídký Delete Data Point Smazat datový bod Insert Data Point Vložit datový bod SparseModel::AddPointCommand Add Point Přidat bod SparseModel::DeletePointCommand Delete Point Smazat bod SparseModel::RelabelCommand Re-Label Point Opatřit bod znovu štítkem SparseOneDimensionalModel Time Čas Frame Snímek Label Štítek Edit Data Upravit data Sparse 1-D Řídký 1-D Unknown Neznámý SparseTimeValueModel Time Čas Frame Snímek Label Štítek Value Hodnota Edit Data Upravit data Unknown Neznámý Sparse Time-Value Řídká hodnota času SparseValueModel Sparse Value Řídká hodnota SpectrogramLayer dB dB Log Zápis dBV dBV %1Hz %1Hz -Inf -Inf 25 % 43Hz 50 % 75 % Bins Koše Gain Zesílení None Žádná 1 KHz 10 Hz 2 KHz 20 Hz 4 KHz 40 Hz 6 KHz 8 KHz Meter Měřič FFT cache failed FFT vyrovnávací paměť selhala Phase Fáze Scale Stupnice dBV^2 dBV^2 Colour Scale Stupnice barev All Bins Všechny koše Normalize Columns Normalizovat sloupce Time: %1 - %2 Čas: %1 - %2 %1Bin Frequency: %2 Hz %3Bin Pitch: %4 %1Kmitočet koše: %2 Hz %3Výška koše: %4 10 KHz 100 Hz 12 KHz 16 KHz 250 Hz 500 Hz Time: %1 Čas: %1 87.5 % 1.5 KHz Normalize Visible Area Normalizovat viditelnou oblast Colour Barva Peak Pitch: %3 - %4 Nejvyšší výška: %3 - %4 %1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 %1Kmitočet koše: %2 - %3 Hz %4Výška koše: %5 - %6 <unknown> <neznámý> Linear Přímočarý No max Žádné maximum No min Žádné minimum Colour Rotation Otáčení barev Window Okno Smoothing Vyhlazování dB: %1 dB: %1 Window Overlap Překrytí okna Phase: %1 - %2 Fáze: %1 - %2 Window Size Velikost okna Peak Frequency: %1 - %2 Hz Nejvyšší kmitočet: %1 - %2 Hz Peak Bins Koše vrcholů Frequency Scale Kmitočtová stupnice dB: %1 - %2 dB: %1 - %2 Min Frequency Nejmenší kmitočet Phase: %1 Fáze: %1 Threshold Práh Failed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue. Nepodařilo se vytvořit model FFT pro tento spektrogram. Důvodem pro to může být nedostatek paměti, nebo nedostatek místa na disku. Bin Display Zobrazení koše Frequencies Kmitočty 93.75 % Peak Frequency: %1 Hz Nejvyšší kmitočet: %1 Hz Peak Pitch: %2 Nejvyšší výška: %2 Max Frequency Největší kmitočet SpectrumLayer %1 %1 -Inf -Inf 25 % 50 % 75 % Bins Koše Mean Průměr None Žádný Peak Vrchol %1 Hz %1 Hz First První Show Peak Frequencies Ukázat nejvyšší kmitočty %1 Bin: %2 (%3) %4 value: %5 dB: %6 %1 Koš: %2 (%3) %4 hodnota: %5 dB: %6 87.5 % %1 Bin: %2 (%3) Value: %4 dB: %5 %1 Koš: %2 (%3) Hodnota: %4 dB: %5 Window Okno Window Overlap Překrytí okna Window Size Velikost okna %1 - %2 %1 - %2 93.75 % %1 - %2 Hz SubdividingMenu %1 - %2 %1 - %2 Surveyer No, thanks Ne, děkuji Yes! Take me to the survey Ano! Vezmi mě do průzkumu TextLayer Paste Vložit The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, přišly z vrstvy s odlišným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v čase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? <no text> <žádný text> Time: %1 Height: %2 Label: %3 Čas: %1 Výška: %2 Štítek: %3 Please enter a new label: Zadejte, prosím, nový štítek: Resize Selection Změnit velikost výběru Enter label Zadat štítek Move Label Horizontally Přesunout štítek vodorovně Erase Point Vymazat bod Move Label Přesunout štítek In progress Probíhá Drag Label Táhnout štítek New Point Nový bod Re-align pasted items? Zarovnat vložené položky znovu? Drag Selection Táhnout výběr Empty Label Prázdný štítek Move Label Vertically Přesunout štítek svisle Delete Selection Smazat výběr TextModel Text Text Time Čas Frame Snímek Label Štítek Edit Data Upravit data Height Výška Unknown Neznámý Thumbwheel %2%3 %2%3 Enter new value Zadat novou hodnotu %1: %2%3 %1: %2%3 New value for %1, from %2 to %3: Nová hodnota pro %1, od %2 do %3: Enter a new value from %1 to %2: Zadejte novou hodnotu od %1 do %2: Enter a new value from %1 to %2 %3: Zadejte novou hodnotu od %1do %2 %3: New value for %1, from %2 to %3 %4: Nová hodnota pro %1, od %2 do %3 %4: TimeInstantLayer Segmentation Rozčlenění Paste Vložit No local points Žádné místní body Resize Selection Změnit velikost výběru Instants Okamžiky Edit Point Upravit bod Plot Type Typ nákresu Time: %1 Label: %2 Čas: %1 Štítek: %2 Re-align pasted instants? Zarovnat vložené položky znovu? Erase Point Vymazat bod In progress Probíhá Drag Point Nakreslit bod Draw Point Nakreslit bod New Point Nový bod Drag Selection Táhnout výběr Time: %1 No label Čas: %1 Žádný štítek Delete Selection Smazat výběr Move Point to %1 s Přesunout bod na %1 s Add Point at %1 s Přidat bod v %1 s The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Okamžiky, které vkládáte, přišly z vrstvy s odlišným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v čase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? TimeValueLayer Log Zápis +/-1 v Segmentation Rozčlenění Curve Křivka Lines Čáry Paste Vložit Scale Stupnice Stems Stopky No local points Žádné místní body Choose value calculation Vybrat výpočet hodnoty The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Položky, které vkládáte, přišly z vrstvy s odlišným zdrojovým materiálem, než má tento. Chcete je zarovnat znovu v čase, aby se hodily ke zdrojovému materiálu pro tuto vrstvu? Some of the items you are pasting do not have values. What values do you want to use for these items? Některé z položek, které vkládáte, nemají hodnoty. Jaké hodnoty chcete pro tyto položky použít? Time: %1 Value: %2%3 Label: %4 Čas: %1 Hodnota: %2%3 Štítek: %4 Connected Points Spojené body Auto-Align Automatické zarovnání Vertical Scale Svislá stupnice Resize Selection Změnit velikost výběru Zero for all items Nula pro všechny položky Linear Přímočaré Points Body Change Point Value Změnit hodnotu bodu The items you are pasting do not have values. What values do you want to use for these items? Položky, které vkládáte, nemají hodnoty. Jaké hodnoty chcete pro tyto položky použít? Edit Point Upravit bod Show Derivative Ukázat odvozeninu Plot Type Typ nákresu Scale Units Jednotky stupnice Erase Point Vymazat bod Cycle size: Velikost cyklu: Time: %1 Value: %2%3 No label Čas: %1 Hodnota: %2%3 Žádný štítek Select cycle size Vybrat velikost cyklu In progress Probíhá Drag Point Táhnout bod Draw Point Nakreslit bod New Point Nový bod Re-align pasted items? Zarovnat vložené položky znovu? Drag Selection Táhnout výběr Relocate Point Přemístit bod Delete Selected Points Smazat vybrané body Draw Segment Division Lines Kreslit čáry rozdělující části TipDialog Close Zavřít Show tip on startup Ukázat radu při spuštění Next >> Další >> << Previous << Předchozí Tip of the Day Rada na tento den TransformFactory Name Název Plugin type Druh přídavného modulu Maker Tvůrce Other Jiný Units jednotky %1 using "%2" plugin (from %3) %1 používá "%2" přídavný modul (z %3) %1: %2 %1: %2 %1: Output %2 %1: Výstup %2 <unknown maker> <neznámý tvůrce> Extract data output %1 from "%2" effect plugin (from %3) Vytáhnout datový výstup %1 z "%2" efektového přídavného modulu (z %3) Analysis Rozbor Extract "%1" data output from "%2" effect plugin (from %3) Vytáhnout "%1" datový výstup z "%2" efektového přídavného modulu (z %3) Generator Tvůrce Transform audio signal with "%1" effect plugin (from %2) Proměnit zvukový signál s "%1" efektovým přídavným modulem (z %2) Generate audio signal using "%1" plugin (from %2) Vytvořit zvukový signál za použití "%1" efektového přídavného modulu (z %2) %1 using "%2" output of "%3" plugin (from %4) %1 používá "%2" výstup "%3" přídavného modulu (z %4) Category Skupina Description Popis Extract features using "%1" plugin (from %2) Vytáhnout funkce pomocí "%1" přídavného modulu (z %2) Effects Efekty Extract features using "%1" output of "%2" plugin (from %3) Vytáhnout funkce pomocí "%1" výstupu "%2" přídavného modulu (z %3) System Identifier Systémový identifikátor [\(<].*$ [\(<].*$ Effects Data Efektová data TransformFinder Up Nahoru <b>%1</b>%2<br> <b>%1</b>%2<br> Down Dolů Find: Hledat: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; System identifier: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Systémový identifikátor: %1 <p>%1<br>Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.<br>Only the descriptions of installed plugins will be searched. <p>%1<br>Je možné, že síťové spojení vypadlo, služby odpovídají příliš pomalu, nebo se vyskytly potíže se zpracováním.<br>Budou se prohledávat pouze popisy nainstalovaných přídavných modulů. <i> (not installed)</i> <i> (nenainstalován)</i> Find a Transform Najít proměnu <small> </small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Plugin type: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Typ přídavného modulu: %1 <small>%1</small> <small>%1</small> <br>&nbsp;&nbsp;No results found <br>&nbsp;&nbsp;Nebyly nalezeny žádné výsledky <p>Type some text into the search box to search the descriptions of:<ul><li>All currently installed <a href="http://www.vamp-plugins.org/">Vamp</a> audio feature extraction plugins</li><li>All currently installed <a href="http://www.ladspa.org/">LADSPA</a> audio effects plugins</li><li>Vamp plugins that are not currently installed but that have descriptions published via the semantic web</li></ul> <p>Napište do okénka pro hledání nějaký text pro hledání popisů:<ul><li>Všech nyní nainstalovaných <a href="http://www.vamp-plugins.org/">Vamp</a> zvukových funkčních vytahovacích přídavných modulů</li><li>Všech nyní nainstalovaných <a href="http://www.ladspa.org/">LADSPA</a> zvukových efektových přídavných modulů</li><li>Vamp přídavných modulů, které nyní nainstalovány nejsou, ale mají svůj popis zvěřejněný prostřednictvím významového internetu</li></ul> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Category: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Skupina: %1 Found %n description(s) containing <b>%1</b> Nalezen jeden popis obsahující <b>%1</b> Nalezeny %n popisy obsahující <b>%1</b> Nalezeno %n popisů obsahujících <b>%1</b> </small> </small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; More information: <a href="%1">%1</a> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Více informací naleznete na stránkách: <a href="%1">%1</a> <b>No plugins are currently installed!</b> <b>Nyní nejsou nainstalovány žádné přídavné moduly!</b> %1%2<br><small> %1%2<br><small> Found %n description(s) containing <b>%1</b>, showing the first %2 only Nalezen jeden popis obsahující <b>%1</b>, ukazují se pouze první %2 Nalezeny %n popisy obsahující <b>%1</b>, ukazují se pouze první %2 Nalezeno %n popisů obsahujících <b>%1</b>, ukazují se pouze první %2 <p>%1<br>Only the published descriptions of Vamp feature extraction plugins will be searched. <p>%1<br>Budou se prohledávat pouze zveřejněné popisy funkčních vytahovacích přídavných modulů Vamp. <p>%1<br>%2<br>Perhaps the network connection is down, or services are responding too slowly.<br>No search results will be available. <p>%1<br>%2<br>Je možné, že síťové spojení vypadlo, nebo služby odpovídají příliš pomalu.<br>Nebudou dostupné žádné výsledky hledání. <b>Unable to retrieve published descriptions from network!</b> <b>Zveřejněné popisy se ze sítě získat nepodařilo!</b> View Off Vypnuto Page Strana Follow Playback Sledovat přehrávání Layer rendering error Chyba při dělání vrstvy Cancel Zrušit <unknown> <neznámý> Scroll Projíždět Global Zoom Celkové zvětšení Waiting for layers to be ready... Čeká se na vrstvy, až budou připraveny... Global Scroll Celkové projíždění Rendering image... Dělá se obrázek... Alignment Zarovnání ViewManager Switch on Play Solo mode Zapnout režim samostatného přehrávání Enter Draw mode Vstoupit do režimu kreslení Enter Navigate mode Vstoupit do režimu navádění Change overlay level Změnit úroveň překrytí Enter Erase mode Vstoupit do režimu mazání Switch on Alignment mode Zapnout režim zarovnávání Switch off Play Selection mode Vypnout režim přehrávání vybrané oblasti Clear Selection Vyprázdnit výběr Select Multiple Regions Vybrat více oblastí Enter Measure mode Vstoupit do režimu měření Switch off Alignment mode Vypnout režim zarovnávání Enter Edit mode Vstoupit do režimu úprav Switch on Play Selection mode Zapnout režim přehrávání vybrané oblasti Scroll to %1 Projíždět k %1 Switch on Loop mode Zapnout režim smyčky Select Region Vybrat oblast Switch off Loop mode Vypnout režim smyčky Switch off Play Solo mode Vypnout režim samostatného přehrávání Enter Select mode Vstoupit do režimu výběru Zoom to %n sample(s) per pixel Zvětšení na jeden vzorek na pixel Zvětšení na %n vzorky na pixel Zvětšení na %n vzorků na pixel WaveFileModel Wave File Soubor Wave WaveformLayer dB dB 0dB 0dB -Inf -Inf Gain Zesílení Mean Průměr Time: %1 Čas: %1 Left: Levý: Meter Měřič Scale Stupnice %1 %2 - %3 (%4 dB peak) %1 %2 - %3 (%4 dB nejvyšší) Time: %1 - %2 Čas: %1 - %2 Normalize Visible Area Normalizovat viditelnou oblast Level: Úroveň: Linear Přímočarý Channel %1 Kanál %1 Right: Pravý: %1 %2 (%3 dB peak) %1 %2 (%3 dB nejvyšší) Butterfly Rozříznout a roztáhnout Separate Rozdělit Channels Kanály WindowShapePreview dB / freq dB/kmitočet V / time V/čas WritableWaveFileModel Writable Wave File Zapisovatelný soubor Wave sonic-visualiser-2.3~repack1.orig/i18n/sonic-visualiser_en_US.ts0000644000175000017500000117761212252354725023470 0ustar miramira ActivityLog Activity Log <p>Activity Log lists your interactions and other events within %1.</p> %1: %2 AddLayerCommand Add %1 Layer AggregateWaveModel Aggregate Wave AlignmentModel Alignment AudioCallbackPlaySource Play from %1 Stop at %1 Change time-stretch factor to %1 AudioDial %1: %2%3 %2%3 New value for %1, from %2 to %3 %4: New value for %1, from %2 to %3: Enter a new value from %1 to %2 %3: Enter a new value from %1 to %2: Enter new value AudioTargetFactory (auto) JACK Audio Connection Kit PulseAudio Server Core Audio Device Default Soundcard Device BZipFileDevice File is already open Append mode not supported File access mode not specified Read and write modes both specified Failed to open file for writing Failed to open bzip2 stream for writing Failed to open file for reading Failed to open bzip2 stream for reading Internal error (open for neither read nor write) File not open bzip2 stream write close error bzip2 stream read close error Internal error (close for neither read nor write) bzip2 stream read error BundleCommand %1 (%n change(s)) %1 (%n change) %1 (%n changes) CSVFileWriter Failed to open file %1 for writing CSVFormatDialog Select Data Format Please select the correct data format for this file. <ignore> Values (%1 more) Time End time Duration Value Label Timing is specified: Explicitly, in seconds Explicitly, in audio sample frames Implicitly: rows are equally spaced in time Audio sample rate (Hz): Frame increment between rows: Data will be displayed in a %1 layer. Colour3DPlotLayer Colour Color Scale Normalize Columns Normalize Visible Area Invert Vertical Scale Gain Always Opaque Smooth Bin Scale Bins Linear Log +/-1 Absolute <unknown> dB Time: %1 - %2 Bin: %3 Value: %4 ColourMapper <unknown> Default White on Black Black on White Red on Blue Yellow on Black Blue on Black Sunset Fruit Salad Banded Highlight Printer High Gain CommandHistory &Undo Ctrl+Z Undo the last editing operation Re&do Ctrl+Shift+Z Redo the last operation that was undone Undo %1 Redo %1 Nothing to undo Nothing to redo &Undo %1 Re&do %1 CoreAudioFileReader Decoding %1... Dense3DModelPeakCache Dense 3-D Peak Cache DenseThreeDimensionalModel Dense 3-D Time Frame DenseTimeValueModel Dense Time-Value Document Set main model to %1 Clear main model EditableDenseThreeDimensionalModel Editable Dense 3-D FFTModel FFT %1 Hz Fader Enter new fader level New fader level, from %1 to %2 dBFS: Level: Off Level: %1%2.%3%4 dB FeatureExtractionModelTransformer No factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?) Input model for feature extraction plugin "%1" is of wrong type (internal error?) Failed to instantiate plugin "%1" Cannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4) Failed to initialise feature extraction plugin "%1" Failed to initialize feature extraction plugin "%1" Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3 Plugin "%1" has no outputs Plugin "%1" has no output named "%2" FileSource Unsupported scheme in URL Downloading %1... Failed to connect to FTP server Login failed Failed to change to correct directory FTP download aborted Download cancelled Failed to create local file %1 File contains no data! I Edit Data ImageDialog Image Label: File or URL: Browse... Preview Unsupported scheme in URL The URL scheme "%1" is not supported Opening image URL... File download failed Failed to download URL "%1": %2 ImageLayer In progress Select image Move Image Drag Selection Resize Selection Delete Selection Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste New Point Opening image URL... ImageModel Image Edit Image Time Frame Label Unknown Edit Data InteractiveFileFinder Select file All files (*.*) Select a session file Sonic Visualiser session files (*.sv) RDF files (%1) All files (*.*) Audio files (%1) All files (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) All supported files (*.sv %1 %2) Sonic Visualiser session files (*.sv) Audio files (%2) RDF files (%1) All files (*.*) Image files (%1) All files (*.*) All supported files (*.sv %1 %2 %3) Sonic Visualiser session files (*.sv) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) File does not exist <b>File not found</b><p>File "%1" does not exist File is not readable <b>File is not readable</b><p>File "%1" can not be read Directory selected <b>Directory selected</b><p>File "%1" is a directory Non-file selected <b>Not a file</b><p>Path "%1" is not a file File is empty <b>File is empty</b><p>File "%1" is empty Sonic Visualiser session files (*.sv) All files (*.*) Select a file to export to WAV audio files (*.wav) All files (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Portable Network Graphics files (*.png) All files (*.*) File exists <b>File exists</b><p>The file "%1" already exists. Do you want to overwrite it? <b>File not found</b><p>Audio file "%1" could not be opened. Do you want to locate it? <b>File not found</b><p>File "%1" could not be opened. Do you want to locate it? Failed to open file Locate file... Use URL... Cancel Use URL Please enter the URL to use for this file: Failed to open location <b>Failed to open location</b><p>URL "%1" could not be opened ItemEditDialog Timing Time: frames sec usec Duration: Properties Value: Text: OK Reset Cancel KeyReference & <i>or</i>&nbsp;<b>%1</b> </b>&nbsp;(%1)<b> Sonic Visualiser: Key and Mouse Reference LabelCounterInputDialog Set Counters Fine counter (beats): Coarse counter (bars): Coarse counter (measures): Labeller No numbering Simple counter Cyclical counter Cyclical two-level counter (bar/beat) Cyclical two-level counter (measure/beat) Audio sample frame number Time in seconds Duration to the following item Tempo (bpm) based on duration to following item Duration since the previous item Tempo (bpm) based on duration since previous item Same as the nearest previous item Value extracted from the item's label (where possible) %1.%2 %1 Label Points Layer Waveform Spectrogram Ruler Time Instants Time Values Notes Regions Text Images Colour 3D Plot Color 3D Plot Spectrum Time Slice Layer Make Measurement Delete Measurement LayerTreeDialog Layer Summary Audio Data Sources Panes and Layers LayerTreeModel Layer Shown Played Model MIDIFileImportDialog Merge all tracks Merge all non-percussion tracks Select track or tracks to import <b>Select track to import</b><p>You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.<p>Please select the track or merged tracks you wish to import: Error in MIDI file import MIDIFileReader Wrong length for long data in MIDI stream (%1, should be %2) Wrong length for int data in MIDI stream (%1, should be %2) getMIDIByte called but no MIDI file open End of MIDI file encountered while reading Attempt to get more bytes than expected on Track Attempt to read past MIDI file end getMIDIBytes called but no MIDI file open Attempt to get more bytes than available on Track (%1, only have %2) getNumberFromMIDIBytes called but no MIDI file open skipToNextTrack called but no MIDI file open Invalid event code %1 found Running status used for first event in track MIDI file "%1" has no notes in any track - uses GM percussion channel Track %1 (%2)%3 Track %1 (untitled)%3 %1 - vel %2 MIDIInput Input MP3FileReader Decoding %1... MainWindow Black Red Blue Green Purple Orange White Bright Red Bright Blue Bright Green Bright Purple Bright Orange Playback Speedup &Layer &Transform &File File Toolbar File and Session Management &New Session Ctrl+N Ctrl+O &Open... Open a session file, audio file, or layer &Save Session Ctrl+S Save Session &As... Ctrl+Shift+S Ctrl+I &Export Audio File... Export selection as an audio file Import Annotation &Layer... Ctrl+L Import layer data from an existing file Export Annotation Layer... Export layer data to a file Export Image File... Export a single pane to an image file Open Lo&cation... Ctrl+Shift+O Open or import a file from a remote URL &Preferences... Adjust the application preferences &Quit Ctrl+Q &Edit Editing Cu&t Ctrl+X Cut the selection from the current layer to the clipboard &Copy Ctrl+C Copy the selection from the current layer to the clipboard &Paste Ctrl+V Paste from the clipboard to the current layer Paste at Playback Position Ctrl+Shift+V Paste from the clipboard to the current layer, placing the first item at the playback position &Delete Selected Items Del Delete items in current selection from the current layer Selection Select &All Ctrl+A Select the whole duration of the current session Select &Visible Range Ctrl+Shift+A Select the time range corresponding to the current window width Select to &Start Shift+Left Select from the start of the session to the current playback position Select to &End Shift+Right Select from the current playback position to the end of the session C&lear Selection Esc Clear the selection Tapping Time Instants &Insert Instant at Playback Position Enter Insert a new time instant at the current playback position, in a new layer if necessary ; Insert Instants at Selection &Boundaries Shift+Enter Insert new time instants at the start and end of the current selected regions, in a new layer if necessary Insert Item at Selection Ctrl+Shift+Enter Insert a new note or region item corresponding to the current selection Number New Instants with Cycle size Reset Numbering Counters Reset to 1 all the counters used for counter-based labelling Set Numbering Counters... Set the counters used for counter-based labelling Renumber Selected Instants Renumber the selected instants using the current labelling scheme Panning and Navigation &View Scroll &Left Left Scroll the current pane to the left Scroll &Right Right Scroll the current pane to the right &Jump Left Ctrl+Left Scroll the current pane a big step to the left J&ump Right Ctrl+Right Scroll the current pane a big step to the right Peek Left Alt+Left Scroll the current pane to the left without moving the playback cursor or other panes Peek Right Alt+Right Scroll the current pane to the right without moving the playback cursor or other panes Zoom Zoom &In Up Increase the zoom level Zoom &Out Down Decrease the zoom level Restore &Default Zoom Restore the zoom level to the default Zoom to &Fit F Zoom to show the whole file Display Features Show &Centre Line ' Show or hide the centre line Toggle All Time Rulers Show &No Overlays 0 Hide centre indicator, frame times, layer names and scale Hide center indicator, frame times, layer names and scale Show &Minimal Overlays 9 Show centre indicator only Show center indicator only 8 Show centre indicator, frame times and scale Show center indicator, frame times and scale Show &All Overlays # &Export Audio Data... Export audio from selection into a data file Show or hide all time rulers Hide times, layer names, and scale Show times and basic scale Show times, layer names, and scale Show &Zoom Wheels Z Show thumbwheels for zooming horizontally and vertically Show Property Bo&xes X Show the layer property boxes at the side of the main window Show Status &Bar Show context help information in the status bar at the bottom of the window Show La&yer Summary Y Open a window displaying the hierarchy of panes and layers in this session Show Acti&vity Log Open a window listing interactions and other events Go Full-Screen F11 Expand the pane area to the whole screen &Pane Managing Panes and Layers Add &New Pane N Add a new pane containing only a time ruler Add New %1 Layer Add a new empty layer of type %1 T Add &Waveform W Add a new pane showing a waveform view Shift+W Add a new layer showing a waveform view Add Spectro&gram G Add a new pane showing a spectrogram Shift+G Add a new layer showing a spectrogram Add &Melodic Range Spectrogram M Add a new pane showing a spectrogram set up for an overview of note pitches Shift+M Add a new layer showing a spectrogram set up for an overview of note pitches Add Pea&k Frequency Spectrogram K Add a new pane showing a spectrogram set up for tracking frequencies Shift+K Add a new layer showing a spectrogram set up for tracking frequencies Add Spectr&um U Add a new pane showing a frequency spectrum Shift+U Add a new layer showing a frequency spectrum &All Channels Mixed &All Channels Channel &%1 %1: %2 Switch to Previous Pane [ Make the next pane up in the pane stack current Switch to Next Pane ] Make the next pane down in the pane stack current &Delete Pane Ctrl+Shift+D Delete the currently active pane Add &Time Ruler Add a new layer showing a time ruler Add &Existing Layer Add S&lice of Layer &Rename Layer... R Rename the currently active layer Edit Layer Data E Edit the currently active layer as a data grid &Delete Layer Ctrl+D Delete the currently active layer &Recent Transforms %1 by Category Unclassified %1 by Plugin Name %1 by Maker Unknown [\(<].*$ %1... Find a Transform... Search for a transform from the installed plugins, by name or description Ctrl+M &Help Help &Help Reference F1 &Key and Mouse Reference F2 Ctrl+R Re-open Re-open the current or most recently opened file Standard Waveform Choose Default Template... Ctrl+T Repeat Transform Re-select the most recently run transform Playback and Transport Controls Play&back Playback Playback Toolbar Rewind to Start Home Rewind to the start Rewind PgUp Rewind to the previous time instant or time ruler notch Rewind to Similar Point Shift+PgUp Rewind to the previous similarly valued time instant Play / Pause Space Start or stop playback from the current position Fast Forward PgDown Fast-forward to the next time instant or time ruler notch Fast Forward to Similar Point Shift+PgDown Fast-forward to the next similarly valued time instant Fast Forward to End End Fast-forward to the end Play Mode Toolbar Constrain Playback to Selection s Constrain playback to the selected regions Loop Playback l Loop playback Solo Current Pane o Solo the current pane during playback Align File Timelines Treat multiple audio files as versions of the same work, and align their timelines Speed Up Ctrl+PgUp Time-stretch playback to speed it up without changing pitch Slow Down Ctrl+PgDown Time-stretch playback to slow it down without changing pitch Restore Normal Speed Ctrl+Home Restore non-time-stretched playback Edit Toolbar Tool Selection Tools Toolbar Navigate 1 Select 2 Select ranges Edit 3 Edit items in layer Draw 4 Draw new items in layer Erase 5 Erase items from layer Measure 6 Make measurements in layer &Delete Current Measurement Delete the measurement currently under the mouse pointer Fast Forward to Next Instant Fast forward to the next time instant in the current layer Rewind to Previous Instant Rewind to the previous time instant in the current layer Fast Forward to Next Point Fast forward to the next point in the current layer Rewind to Previous Point Rewind to the previous point in the current layer Fast forward No audio file loaded. %1Hz (resampling to %2Hz) Failed to open file <b>File open failed</b><p>Audio file "%1" could not be opened Select audio file to export Which audio file do you want to export from? Export the selected region only Export the whole audio file Select region to export Which region from the original audio file do you want to export? Export the selected regions into separate files Multiple regions of the original audio file are selected. What do you want to export? Fragment file %1 already exists, aborting Export multiple audio files Export audio to "%1" Failed to write file <b>File open failed</b><p>Layer file %1 could not be opened. <b>Audio required</b><p>Unable to load layer data from "%1" without an audio file.<br>Please load at least one audio file before importing annotations. Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) Enter template name Please enter a name for the saved template: Set as default template for future audio files Template file exists <b>Template file exists</b><p>The template "%1" already exists.<br>Overwrite it? %1: %1 http://www.sonicvisualiser.org/doc/reference/%1/en/ <br>With Serd and Sord RDF parser and store &copy; David Robillard <br>With Dataquay Qt/RDF library &copy; Chris Cannam Newer version available <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %3 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> Failed to open file %1 for writing Abandon the current %1 session and start a new one &Import More Audio... Import an extra audio file into a new pane Replace &Main Audio... Replace the main audio file of the session with a different file Open &Recent Save the current session into a %1 session file Save the current session into a new %1 session file Apply Session Template Export Session as Template... Manage Exported Templates Exit %1 Open the %1 reference manual Open a window showing the keystrokes you can use in %1 %1 on the &Web Open the %1 website &About %1 Show information about %1 Export the selected regions into a single file Export the whole file Can't export non-note layers to MIDI Export layer to "%1" Export the whole pane (%1x%2 pixels) Export the visible area only (%1x%2 pixels) Export the selection extent (%1x%2 pixels) Export the selection extent Which region of the current pane do you want to export as an image? Note: the whole pane is too wide to be exported as a single image. Failed to save image file Failed to save image file %1 <b>File open failed</b><p>Session file "%1" could not be opened <b>File open failed</b><p>File "%1" could not be opened Open Location Please enter the URL of the location to open: Failed to open location <b>Open failed</b><p>URL "%1" could not be opened <b>Open failed</b><p>File or URL "%1" could not be opened Failed to open dropped URL <b>Open failed</b><p>Dropped URL "%1" could not be opened Export image to "%1" Session modified <b>Session modified</b><p>The current session has been modified.<br>Do you want to save it? Close the current session and create a new one Add this data to the current session Select target for import <b>Select a target for import</b><p>This RDF document refers to one or more audio files.<br>You already have an audio waveform loaded.<br>What would you like to do with the new data? Failed to save file <b>Save failed</b><p>Session file "%1" could not be saved. Save session as "%1" Rename Layer New name for this layer: Playback speed: Normal Playback speed: %1%2% Selection: %1 to %2 (duration %3) Visible: %1 to %2 (duration %3) Sample rate mismatch <b>Wrong sample rate</b><p>The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).<p>The file will play at the wrong speed and pitch.<p>Change the <i>Resample mismatching files on import</i> option under <i>File</i> -> <i>Preferences</i> if you want to alter this behaviour. Audio processing overload <b>Overloaded</b><p>Audio effects plugin auditioning has been disabled due to a processing overload. <b>Overloaded</b><p>Audio playback speed processing has been reduced to a single channel, due to a processing overload. Add Point Reset Counters Failed to generate layer <b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform "%1" failed:<p>%2 <b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform "%1" failed.<p>No error information is available. Warning Failed to regenerate layer <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed:<p>%3 <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed.<p>No error information is available. <b>Warning when regenerating layer</b><p>When regenerating the derived layer "%1" using new data model as input:<p>%2 Failed to calculate alignment <b>Alignment calculation failed</b><p>Failed to calculate an audio alignment using transform "%1":<p>%2 Adjust the master playback level Adjust the master playback speed http://www.sonicvisualiser.org/ Release %1 : Revision %2 Release %1 Unreleased : Revision %1 <h3>About Sonic Visualiser</h3> <p>Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> <p><small>%1 : %2 configuration</small></p> Debug Release With Qt v%1 &copy; Nokia Corporation <br>With JACK audio output library v%1 &copy; Paul Davis and Jack O'Quin <br>With JACK audio output library &copy; Paul Davis and Jack O'Quin <br>With PortAudio audio output library &copy; Ross Bencina and Phil Burk <br>With PulseAudio audio output library v%1 &copy; Lennart Poettering and Pierre Ossman <br>With PulseAudio audio output library &copy; Lennart Poettering and Pierre Ossman <br>With Ogg file decoder (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>With Ogg file decoder &copy; CSIRO Australia <br>With MAD mp3 decoder v%1 &copy; Underbit Technologies Inc <br>With MAD mp3 decoder &copy; Underbit Technologies Inc <br>With libsamplerate v%1 &copy; Erik de Castro Lopo <br>With libsamplerate &copy; Erik de Castro Lopo <br>With libsndfile v%1 &copy; Erik de Castro Lopo <br>With libsndfile &copy; Erik de Castro Lopo <br>With FFTW3 v%1 &copy; Matteo Frigo and MIT <br>With FFTW3 &copy; Matteo Frigo and MIT <br>With Rubber Band v%1 &copy; Chris Cannam <br>With Rubber Band &copy; Chris Cannam <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam <br>With LADSPA plugin support (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>With DSSI plugin support (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton <br>With Redland RDF datastore v%1 &copy; Dave Beckett and the University of Bristol <br>With Redland RDF datastore &copy; Dave Beckett and the University of Bristol <br>With RtMidi &copy; Gary P. Scavone <br>With liblo Lite OSC library v%1 &copy; Steve Harris <br>With liblo Lite OSC library &copy; Steve Harris </small><p><small>The OSC URL for this instance is: "%1" With Using About Sonic Visualiser Add %1 Pane MainWindowBase %1 (modified) (modified) Cut Paste Add Point Add Point at %1 s Add Item at %1 s Opening file or URL... Select target for import %1: %2 %1: %2 [%3] Import "%1" Opening playlist... Importing from RDF... Opening session... Close the current session and start a new one Replace the main audio file in this session Add the audio file to this session <b>Select a target for import</b><p>You already have an audio file loaded.<br>What would you like to do with the new audio file? Import audio file "%1" Import layer XML file "%1" Import MIDI file "%1" SV XML file read error: %1 Import session file "%1" Open session template "%1" Failed to import RDF <b>Failed to import RDF</b><p>Importing data from RDF document at "%1" failed: %2</p> <b>Failed to import RDF</b><p>No suitable data models found for import from RDF document at "%1"</p> Import RDF document "%1" Couldn't open audio device <b>No audio available</b><p>Could not open an audio device for playback.<p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <b>No audio available</b><p>Failed to open your preferred audio device ("%1").<p>Audio playback will not be available during this session.</p> Failed to write file <b>Save failed</b><p>Failed to write to file "%1": %2 Add Pane Remove Pane Delete Pane Playing: %1 of %2 (%3 remaining) ModelDataTableDialog Data Editor Playback Toolbar Play Mode Toolbar Track Playback Toggle tracking of playback position Edit Toolbar Insert New Item Insert Insert a new item Delete Selected Items Delete Delete the selected item or items Data in Layer Find: ModelMetadataModel Type Name Maker Source ModelTransformerFactory %1 <%2> %1: %2 NoteLayer New Point Vertical Scale Scale Units Scale Auto-Align Linear Log MIDI Notes In progress No local points %1 (%2, %3 Hz) %1 Hz (%2, %3) %1 %2 Time: %1 Pitch: %2 Duration: %3 No label Time: %1 Pitch: %2 Duration: %3 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Record Note NoteModel Note Time Frame Pitch Duration Level Label Unknown Edit Data OggVorbisFileReader Decoding %1... Overview Overview Click and drag to navigate; double-click to jump Pane Horizontal Zoom Vertical Zoom Reset zoom to default Some lengthy prefix: Reference Unaligned Aligning: %1% Aligned %1 - %2 +%1 (R) (X) %1 / %2Hz%3 Zoom Zoom In Wheel Up Zoom Out Wheel Down General Pane Mouse Actions Wheel Zoom in or out in time axis Scroll Ctrl+Wheel Scroll rapidly left or right in time axis Zoom Vertically Shift+Wheel Zoom in or out in the vertical axis Scroll Vertically Alt+Wheel Scroll up or down in the vertical axis Navigate Middle Click middle button and drag to navigate with any tool Relocate Double-Click Middle Double-click middle button to relocate with any tool Menu Right Show pane context menu Navigate Tool Mouse Actions Left Click left button and drag to move around Zoom to Area Shift+Left Shift-click left button and drag to zoom to a rectangular area Double-Click Left Double-click left button to jump to clicked location Edit Double-click left button on an item to edit it Select Tool Mouse Actions Select Click left button and drag to select region; drag region edge to resize Multi Select Ctrl+Left Cmd-click left button and drag to select an additional region Ctrl-click left button and drag to select an additional region Fine Select Shift-click left button and drag to select without snapping to items or grid Edit Tool Mouse Actions Move Click left button on an item or selected region and drag to move Draw Tool Mouse Actions Draw Click left button and drag to create new item Measure Tool Mouse Actions Measure Area Click left button and drag to measure a rectangular area Measure Item Click left button and drag to measure extents of an item or shape Enter new range New vertical display range, from %1 to %2 %4: Drag Selection Resize Selection Click and drag to navigate Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate Click and drag to move the selection boundary Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate Click and drag to select a range; middle-click and drag to navigate Click to add a new item in the active layer Click to erase an item from the active layer Click and drag an item in the active layer to move it; hold Shift to override initial resistance Click and drag to move all items in the selected range Click and drag to adjust the visible range of the vertical scale Click and drag to adjust the vertical zoom level Click and drag to adjust the horizontal zoom level Reset horizontal and vertical zoom levels to their defaults PlayParameterRepository Adjust Playback Parameters Change Playback Mute State Change Playback Gain Change Playback Pan Change Playback Plugin Configure Playback Plugin PluginParameterBox This plugin has no adjustable parameters. Program PluginParameterDialog Plugin Parameters Name: Version: Maker: Copyright: Output: Input Material Restrict to selection extents Channels Processing Advanced >> Channel mismatch This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly. are is This plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. This plugin only has a single channel input, but the source has %1 channels. Use mean of source channels Use channel %1 only Window size: Audio frames per block: Window increment: Window shape: Advanced << Preferences Spectrogram y-axis interpolation: Spectrogram x-axis interpolation: Frequency of concert A Property box layout Spectral analysis window shape Playback resampler type Omit temporaries from Recent Files menu Resample mismatching files on import Location for cache file directory Background colour preference Background color preference Time display format Font size for text overlays Show splash screen on startup Show boxes for all panes Show box for current pane only Rectangular Triangular Hamming Hann Blackman Gaussian Parzen Nuttall Blackman-Harris Fastest Standard Highest quality None Linear interpolation 4 x Oversampling 4 x Oversampling with interpolation Follow desktop theme Dark background Light background Standard (to millisecond) High resolution (to microsecond) 24 FPS 25 FPS 30 FPS 50 FPS 60 FPS Preferences PreferencesDialog Sonic Visualiser: Application Preferences Apply <home directory> Follow system locale Russian British English American English Czech %1: User interface language Playback audio device: &General &Appearance Anal&ysis Default session template for audio files: Standard Waveform Session &Template OK Cancel Select a directory to create cache subdirectory in Preferences <b>Restart required</b><p>One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.</p><p>Please exit and restart the application now if you want these changes to take effect immediately.</p> Preferences Changed Some preferences have been changed but not applied. Apply them before closing? ProgressDialog Cancel PropertyBox Show Play Playback Gain dB Playback Pan / Balance Add New Colour... Add New Color... Name New Colour Name New Color Enter a name for the new colour: Enter a name for the new color: Prefer black background for this colour Prefer black background for this color (current value: %1%2) (current value: %1) Toggle Visibility of %1 Toggle Playback of %1 Toggle %1 property of %2 Adjust %1 property of %2%3 PropertyContainer yes on true no off false Set %1 Property PropertyStack Change Layer Visibility Click to change the current active layer QApplication Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control <file>: One or more Sonic Visualiser (.sv) and audio files may be provided. Sonic Visualiser QFile File "%1" does not exist Failed to open file "%1" File or URL "%1" could not be retrieved QMessageBox Failed to open file File or URL "%1" could not be opened <b>Audio required</b><p>Please load at least one audio file before importing annotation data QuickTimeFileReader Decoding %1... RDFImporter Importing audio referenced in RDF... Importing dense signal data from RDF... Importing event data from RDF... RangeInputDialog to RangeSummarisableTimeValueModel Range-Summarisable Time-Value RegionLayer New Region Vertical Scale Scale Units Plot Type Scale Bars Segmentation Auto-Align Equal Spaced Linear Log In progress No local points %1 %2 Time: %1 Value: %2 Duration: %3 No label Time: %1 Value: %2 Duration: %3 Label: %4 Draw Region Erase Region Drag Region Edit Region Relocate Region Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste RegionModel Region Time Frame Value Duration Label Unknown Edit Data RemoveLayerCommand Delete %1 Layer ResamplingWavFileReader Resampling %1... SVFileReader (derived model in SV-XML) Opening file or URL... SingleColourLayer Colour Color <unknown> SliceLayer %1 - %2 Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 First Mean Peak Time: %1 - %2 Range: %3 samples (%4) 0dB -Inf x10 Plot Type Scale Normalize Threshold Gain Sampling Mode Linear Meter Rev Log dB Any Bin Scale Bins Log Absolute Lines Steps Blocks Colours Colors SparseModel Sparse Edit Data Insert Data Point Delete Data Point SparseModel::AddPointCommand Add Point SparseModel::DeletePointCommand Delete Point SparseModel::RelabelCommand Re-Label Point SparseOneDimensionalModel Sparse 1-D Time Frame Label Unknown Edit Data SparseTimeValueModel Sparse Time-Value Time Frame Value Label Unknown Edit Data SparseValueModel Sparse Value SpectrogramLayer Colour Color Colour Scale Color Scale Window Size Window Overlap Normalize Columns Normalize Visible Area Bin Display Threshold Gain Colour Rotation Color Rotation Min Frequency Max Frequency Frequency Scale Smoothing Bins Window Scale Linear Meter dBV^2 dBV Phase None 25 % 50 % 75 % 87.5 % 93.75 % No min 10 Hz 20 Hz 40 Hz 100 Hz 250 Hz 500 Hz 1 KHz 4 KHz 10 KHz 1.5 KHz 2 KHz 6 KHz 8 KHz 12 KHz 16 KHz No max Log All Bins Peak Bins Frequencies <unknown> dB FFT cache failed Failed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue. Peak Frequency: %1 - %2 Hz Peak Frequency: %1 Hz Peak Pitch: %3 - %4 Peak Pitch: %2 Time: %1 - %2 Time: %1 %1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 %1Bin Frequency: %2 Hz %3Bin Pitch: %4 -Inf dB: %1 - %2 dB: %1 Phase: %1 - %2 Phase: %1 43Hz %1Hz SpectrumLayer Window Size Window Overlap Show Peak Frequencies Window Bins None 25 % 50 % 75 % 87.5 % 93.75 % %1 - %2 %1 - %2 Hz %1 Hz -Inf %1 %1 Bin: %2 (%3) %4 value: %5 dB: %6 First Mean Peak %1 Bin: %2 (%3) Value: %4 dB: %5 SubdividingMenu %1 - %2 TextLayer Empty Label <no text> In progress Time: %1 Height: %2 Label: %3 Enter label Please enter a new label: Erase Point Drag Label Move Label Move Label Horizontally Move Label Vertically Drag Selection Resize Selection Delete Selection Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste New Point TextModel Text Time Frame Height Label Unknown Edit Data Thumbwheel %1: %2%3 %2%3 New value for %1, from %2 to %3 %4: New value for %1, from %2 to %3: Enter a new value from %1 to %2 %3: Enter a new value from %1 to %2: Enter new value TimeInstantLayer New Point Plot Type Instants Segmentation In progress No local points Time: %1 No label Time: %1 Label: %2 Draw Point Add Point at %1 s Erase Point Drag Point Move Point to %1 s Edit Point Drag Selection Resize Selection Delete Selection Re-align pasted instants? The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste TimeValueLayer New Point Plot Type Vertical Scale Scale Units Draw Segment Division Lines Show Derivative Scale Points Stems Connected Points Lines Curve Segmentation Auto-Align Linear Log +/-1 In progress No local points Time: %1 Value: %2%3 No label Time: %1 Value: %2%3 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste The items you are pasting do not have values. What values do you want to use for these items? Some of the items you are pasting do not have values. What values do you want to use for these items? Zero for all items Choose value calculation Select cycle size Cycle size: TipDialog Tip of the Day Show tip on startup << Previous Next >> Close TransformFactory [\(<].*$ <unknown maker> Extract features using "%1" plugin (from %2) Extract features using "%1" output of "%2" plugin (from %3) %1 using "%2" plugin (from %3) %1 using "%2" output of "%3" plugin (from %4) Analysis Generator Other %1: %2 %1: Output %2 Extract "%1" data output from "%2" effect plugin (from %3) Extract data output %1 from "%2" effect plugin (from %3) Effects Data Effects Transform audio signal with "%1" effect plugin (from %2) Generate audio signal using "%1" plugin (from %2) Plugin type Category System Identifier Name Description Maker Units TransformFinder Find a Transform Find: <br>&nbsp;&nbsp;No results found Up Down <p>Type some text into the search box to search the descriptions of:<ul><li>All currently installed <a href="http://www.vamp-plugins.org/">Vamp</a> audio feature extraction plugins</li><li>All currently installed <a href="http://www.ladspa.org/">LADSPA</a> audio effects plugins</li><li>Vamp plugins that are not currently installed but that have descriptions published via the semantic web</li></ul> <b>Unable to retrieve published descriptions from network!</b> <b>No plugins are currently installed!</b> <p>%1<br>Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.<br>Only the descriptions of installed plugins will be searched. <p>%1<br>Only the published descriptions of Vamp feature extraction plugins will be searched. <p>%1<br>%2<br>Perhaps the network connection is down, or services are responding too slowly.<br>No search results will be available. Found %n description(s) containing <b>%1</b>, showing the first %2 only Found %n description containing <b>%1</b>, showing the first %2 only Found %n descriptions containing <b>%1</b>, showing the first %2 only Found %n description(s) containing <b>%1</b> Found %n description containing <b>%1</b> Found %n descriptions containing <b>%1</b> <i> (not installed)</i> %1%2<br><small> </small> <b>%1</b>%2<br> <small>%1</small> <small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Plugin type: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Category: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; System identifier: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; More information: <a href="%1">%1</a> View Global Scroll Global Zoom Follow Playback Scroll Page Off <unknown> Layer rendering error Alignment Waiting for layers to be ready... Cancel Rendering image... ViewManager Clear Selection Select Multiple Regions Select Region Enter Navigate mode Enter Select mode Enter Edit mode Enter Draw mode Enter Erase mode Enter Measure mode Switch on Loop mode Switch off Loop mode Switch on Play Selection mode Switch off Play Selection mode Switch on Play Solo mode Switch off Play Solo mode Switch on Alignment mode Switch off Alignment mode Scroll to %1 Zoom to %n sample(s) per pixel Change overlay level WaveFileModel Wave File WaveformLayer Scale Gain Normalize Visible Area Channels Linear Meter dB Separate Mean Butterfly Time: %1 - %2 Time: %1 Level: Left: Right: Channel %1 %1 %2 - %3 (%4 dB peak) %1 %2 (%3 dB peak) 0dB -Inf WindowShapePreview V / time dB / freq WritableWaveFileModel Writable Wave File sonic-visualiser-2.3~repack1.orig/i18n/sonic-visualiser_en_GB.ts0000644000175000017500000120003012252354725023406 0ustar miramira ActivityLog Activity Log <p>Activity Log lists your interactions and other events within %1.</p> %1: %2 AddLayerCommand Add %1 Layer AggregateWaveModel Aggregate Wave AlignmentModel Alignment AudioCallbackPlaySource Play from %1 Stop at %1 Change time-stretch factor to %1 AudioDial %1: %2%3 %2%3 New value for %1, from %2 to %3 %4: New value for %1, from %2 to %3: Enter a new value from %1 to %2 %3: Enter a new value from %1 to %2: Enter new value AudioTargetFactory (auto) JACK Audio Connection Kit PulseAudio Server Core Audio Device Default Soundcard Device BZipFileDevice File is already open Append mode not supported File access mode not specified Read and write modes both specified Failed to open file for writing Failed to open bzip2 stream for writing Failed to open file for reading Failed to open bzip2 stream for reading Internal error (open for neither read nor write) File not open bzip2 stream write close error bzip2 stream read close error Internal error (close for neither read nor write) bzip2 stream read error BundleCommand %1 (%n change(s)) %1 (%n change) %1 (%n changes) CSVFileWriter Failed to open file %1 for writing CSVFormatDialog Select Data Format Please select the correct data format for this file. <ignore> Values (%1 more) Time End time Duration Value Label Timing is specified: Explicitly, in seconds Explicitly, in audio sample frames Implicitly: rows are equally spaced in time Audio sample rate (Hz): Frame increment between rows: Data will be displayed in a %1 layer. Colour3DPlotLayer Colour Scale Normalize Columns Normalise Columns Normalize Visible Area Normalise Visible Area Invert Vertical Scale Gain Always Opaque Smooth Bin Scale Bins Linear Log +/-1 Absolute <unknown> dB Time: %1 - %2 Bin: %3 Value: %4 ColourMapper <unknown> Default White on Black Black on White Red on Blue Yellow on Black Blue on Black Sunset Fruit Salad Banded Highlight Printer High Gain CommandHistory &Undo Ctrl+Z Undo the last editing operation Re&do Ctrl+Shift+Z Redo the last operation that was undone Undo %1 Redo %1 Nothing to undo Nothing to redo &Undo %1 Re&do %1 CoreAudioFileReader Decoding %1... Dense3DModelPeakCache Dense 3-D Peak Cache DenseThreeDimensionalModel Dense 3-D Time Frame DenseTimeValueModel Dense Time-Value Document Set main model to %1 Clear main model EditableDenseThreeDimensionalModel Editable Dense 3-D FFTModel FFT %1 Hz Fader Enter new fader level New fader level, from %1 to %2 dBFS: Level: Off Level: %1%2.%3%4 dB FeatureExtractionModelTransformer No factory available for feature extraction plugin id "%1" (unknown plugin type, or internal error?) Input model for feature extraction plugin "%1" is of wrong type (internal error?) Failed to instantiate plugin "%1" Cannot provide enough channels to feature extraction plugin "%1" (plugin min is %2, max %3; input model has %4) Failed to initialise feature extraction plugin "%1" Feature extraction plugin "%1" rejected the given step and block sizes (%2 and %3); using plugin defaults (%4 and %5) instead Transform was configured for version %1 of plugin "%2", but the plugin being used is version %3 Plugin "%1" has no outputs Plugin "%1" has no output named "%2" FileSource Unsupported scheme in URL Downloading %1... Failed to connect to FTP server Login failed Failed to change to correct directory FTP download aborted Download cancelled Failed to create local file %1 File contains no data! I Edit Data ImageDialog Image Label: File or URL: Browse... Preview Unsupported scheme in URL The URL scheme "%1" is not supported Opening image URL... File download failed Failed to download URL "%1": %2 ImageLayer In progress Select image Move Image Drag Selection Resize Selection Delete Selection Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste New Point Opening image URL... ImageModel Image Edit Image Time Frame Label Unknown Edit Data InteractiveFileFinder Select file All files (*.*) Select a session file Sonic Visualiser session files (*.sv) RDF files (%1) All files (*.*) Audio files (%1) All files (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*) All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*) All supported files (*.sv %1 %2) Sonic Visualiser session files (*.sv) Audio files (%2) RDF files (%1) All files (*.*) Image files (%1) All files (*.*) All supported files (*.sv %1 %2 %3) Sonic Visualiser session files (*.sv) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*) File does not exist <b>File not found</b><p>File "%1" does not exist File is not readable <b>File is not readable</b><p>File "%1" can not be read Directory selected <b>Directory selected</b><p>File "%1" is a directory Non-file selected <b>Not a file</b><p>Path "%1" is not a file File is empty <b>File is empty</b><p>File "%1" is empty Sonic Visualiser session files (*.sv) All files (*.*) Select a file to export to WAV audio files (*.wav) All files (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*) Portable Network Graphics files (*.png) All files (*.*) File exists <b>File exists</b><p>The file "%1" already exists. Do you want to overwrite it? <b>File not found</b><p>Audio file "%1" could not be opened. Do you want to locate it? <b>File not found</b><p>File "%1" could not be opened. Do you want to locate it? Failed to open file Locate file... Use URL... Cancel Use URL Please enter the URL to use for this file: Failed to open location <b>Failed to open location</b><p>URL "%1" could not be opened ItemEditDialog Timing Time: frames sec usec Duration: Properties Value: Text: OK Reset Cancel KeyReference & <i>or</i>&nbsp;<b>%1</b> </b>&nbsp;(%1)<b> Sonic Visualiser: Key and Mouse Reference LabelCounterInputDialog Set Counters Fine counter (beats): Coarse counter (bars): Labeller No numbering Simple counter Cyclical counter Cyclical two-level counter (bar/beat) Audio sample frame number Time in seconds Duration to the following item Tempo (bpm) based on duration to following item Duration since the previous item Tempo (bpm) based on duration since previous item Same as the nearest previous item Value extracted from the item's label (where possible) %1.%2 %1 Label Points Layer Waveform Spectrogram Ruler Time Instants Time Values Notes Regions Text Images Colour 3D Plot Spectrum Time Slice Layer Make Measurement Delete Measurement LayerTreeDialog Layer Summary Audio Data Sources Panes and Layers LayerTreeModel Layer Shown Played Model MIDIFileImportDialog Merge all tracks Merge all non-percussion tracks Select track or tracks to import <b>Select track to import</b><p>You can only import this file as a single annotation layer, but the file contains more than one track, or notes on more than one channel.<p>Please select the track or merged tracks you wish to import: Error in MIDI file import MIDIFileReader Wrong length for long data in MIDI stream (%1, should be %2) Wrong length for int data in MIDI stream (%1, should be %2) getMIDIByte called but no MIDI file open End of MIDI file encountered while reading Attempt to get more bytes than expected on Track Attempt to read past MIDI file end getMIDIBytes called but no MIDI file open Attempt to get more bytes than available on Track (%1, only have %2) getNumberFromMIDIBytes called but no MIDI file open skipToNextTrack called but no MIDI file open Invalid event code %1 found Running status used for first event in track MIDI file "%1" has no notes in any track - uses GM percussion channel Track %1 (%2)%3 Track %1 (untitled)%3 %1 - vel %2 MIDIInput Input MP3FileReader Decoding %1... MainWindow Black Red Blue Green Purple Orange White Bright Red Bright Blue Bright Green Bright Purple Bright Orange Playback Speedup &Layer &Transform &File File Toolbar File and Session Management &New Session Ctrl+N Ctrl+O &Open... Open a session file, audio file, or layer &Save Session Ctrl+S Save Session &As... Ctrl+Shift+S Ctrl+I &Export Audio File... Export selection as an audio file Import Annotation &Layer... Ctrl+L Import layer data from an existing file Export Annotation Layer... Export layer data to a file Export Image File... Export a single pane to an image file Open Lo&cation... Ctrl+Shift+O Open or import a file from a remote URL &Preferences... Adjust the application preferences &Quit Ctrl+Q &Edit Editing Cu&t Ctrl+X Cut the selection from the current layer to the clipboard &Copy Ctrl+C Copy the selection from the current layer to the clipboard &Paste Ctrl+V Paste from the clipboard to the current layer Paste at Playback Position Ctrl+Shift+V Paste from the clipboard to the current layer, placing the first item at the playback position &Delete Selected Items Del Delete items in current selection from the current layer Selection Select &All Ctrl+A Select the whole duration of the current session Select &Visible Range Ctrl+Shift+A Select the time range corresponding to the current window width Select to &Start Shift+Left Select from the start of the session to the current playback position Select to &End Shift+Right Select from the current playback position to the end of the session C&lear Selection Esc Clear the selection Tapping Time Instants &Insert Instant at Playback Position Enter Insert a new time instant at the current playback position, in a new layer if necessary ; Insert Instants at Selection &Boundaries Shift+Enter Insert new time instants at the start and end of the current selected regions, in a new layer if necessary Insert Item at Selection Ctrl+Shift+Enter Insert a new note or region item corresponding to the current selection Number New Instants with Cycle size Reset Numbering Counters Reset to 1 all the counters used for counter-based labelling Set Numbering Counters... Set the counters used for counter-based labelling Renumber Selected Instants Renumber the selected instants using the current labelling scheme Panning and Navigation &View Scroll &Left Left Scroll the current pane to the left Scroll &Right Right Scroll the current pane to the right &Jump Left Ctrl+Left Scroll the current pane a big step to the left J&ump Right Ctrl+Right Scroll the current pane a big step to the right Peek Left Alt+Left Scroll the current pane to the left without moving the playback cursor or other panes Peek Right Alt+Right Scroll the current pane to the right without moving the playback cursor or other panes Zoom Zoom &In Up Increase the zoom level Zoom &Out Down Decrease the zoom level Restore &Default Zoom Restore the zoom level to the default Zoom to &Fit F Zoom to show the whole file Display Features Show &Centre Line ' Show or hide the centre line Toggle All Time Rulers Show &No Overlays 0 Show &Minimal Overlays 9 8 Show &All Overlays &Export Audio Data... Export audio from selection into a data file # Show or hide all time rulers Hide times, layer names, and scale Show times and basic scale Show times, layer names, and scale Show &Zoom Wheels Z Show thumbwheels for zooming horizontally and vertically Show Property Bo&xes X Show the layer property boxes at the side of the main window Show Status &Bar Show context help information in the status bar at the bottom of the window Show La&yer Summary Y Open a window displaying the hierarchy of panes and layers in this session Show Acti&vity Log Open a window listing interactions and other events Go Full-Screen F11 Expand the pane area to the whole screen &Pane Managing Panes and Layers Add &New Pane N Add a new pane containing only a time ruler Add New %1 Layer Add a new empty layer of type %1 T Add &Waveform W Add a new pane showing a waveform view Shift+W Add a new layer showing a waveform view Add Spectro&gram G Add a new pane showing a spectrogram Shift+G Add a new layer showing a spectrogram Add &Melodic Range Spectrogram M Add a new pane showing a spectrogram set up for an overview of note pitches Shift+M Add a new layer showing a spectrogram set up for an overview of note pitches Add Pea&k Frequency Spectrogram K Add a new pane showing a spectrogram set up for tracking frequencies Shift+K Add a new layer showing a spectrogram set up for tracking frequencies Add Spectr&um U Add a new pane showing a frequency spectrum Shift+U Add a new layer showing a frequency spectrum &All Channels Mixed &All Channels Channel &%1 %1: %2 Switch to Previous Pane [ Make the next pane up in the pane stack current Switch to Next Pane ] Make the next pane down in the pane stack current &Delete Pane Ctrl+Shift+D Delete the currently active pane Add &Time Ruler Add a new layer showing a time ruler Add &Existing Layer Add S&lice of Layer &Rename Layer... R Rename the currently active layer Edit Layer Data E Edit the currently active layer as a data grid &Delete Layer Ctrl+D Delete the currently active layer &Recent Transforms %1 by Category Unclassified %1 by Plugin Name %1 by Maker Unknown [\(<].*$ %1... Find a Transform... Search for a transform from the installed plugins, by name or description Ctrl+M &Help Help &Help Reference F1 &Key and Mouse Reference F2 Ctrl+R Re-open Re-open the current or most recently opened file Standard Waveform Choose Default Template... Ctrl+T Repeat Transform Re-select the most recently run transform Playback and Transport Controls Play&back Playback Playback Toolbar Rewind to Start Home Rewind to the start Rewind PgUp Rewind to the previous time instant or time ruler notch Rewind to Similar Point Shift+PgUp Rewind to the previous similarly valued time instant Play / Pause Space Start or stop playback from the current position Fast Forward PgDown Fast-forward to the next time instant or time ruler notch Fast Forward to Similar Point Shift+PgDown Fast-forward to the next similarly valued time instant Fast Forward to End End Fast-forward to the end Play Mode Toolbar Constrain Playback to Selection s Constrain playback to the selected regions Loop Playback l Loop playback Solo Current Pane o Solo the current pane during playback Align File Timelines Treat multiple audio files as versions of the same work, and align their timelines Speed Up Ctrl+PgUp Time-stretch playback to speed it up without changing pitch Slow Down Ctrl+PgDown Time-stretch playback to slow it down without changing pitch Restore Normal Speed Ctrl+Home Restore non-time-stretched playback Edit Toolbar Tool Selection Tools Toolbar Navigate 1 Select 2 Select ranges Edit 3 Edit items in layer Draw 4 Draw new items in layer Erase 5 Erase items from layer Measure 6 Make measurements in layer &Delete Current Measurement Delete the measurement currently under the mouse pointer Fast Forward to Next Instant Fast forward to the next time instant in the current layer Rewind to Previous Instant Rewind to the previous time instant in the current layer Fast Forward to Next Point Fast forward to the next point in the current layer Rewind to Previous Point Rewind to the previous point in the current layer Fast forward No audio file loaded. %1Hz (resampling to %2Hz) Failed to open file <b>File open failed</b><p>Audio file "%1" could not be opened Select audio file to export Which audio file do you want to export from? Export the selected region only Export the whole audio file Select region to export Which region from the original audio file do you want to export? Export the selected regions into separate files Multiple regions of the original audio file are selected. What do you want to export? Fragment file %1 already exists, aborting Export multiple audio files Export audio to "%1" Failed to write file <b>File open failed</b><p>Layer file %1 could not be opened. <b>Audio required</b><p>Unable to load layer data from "%1" without an audio file.<br>Please load at least one audio file before importing annotations. Sorry, cannot export this layer type to RDF (supported types are: region, note, text, time instants, time values) Enter template name Please enter a name for the saved template: Set as default template for future audio files Template file exists <b>Template file exists</b><p>The template "%1" already exists.<br>Overwrite it? %1: %1 http://www.sonicvisualiser.org/doc/reference/%1/en/ <br>With Serd and Sord RDF parser and store &copy; David Robillard <br>With Dataquay Qt/RDF library &copy; Chris Cannam Newer version available <h3>Newer version available</h3><p>You are using version %1 of Sonic Visualiser, but version %3 is now available.</p><p>Please see the <a href="http://sonicvisualiser.org/">Sonic Visualiser website</a> for more information.</p> Failed to open file %1 for writing Abandon the current %1 session and start a new one &Import More Audio... Import an extra audio file into a new pane Replace &Main Audio... Replace the main audio file of the session with a different file Open &Recent Save the current session into a %1 session file Save the current session into a new %1 session file Apply Session Template Export Session as Template... Manage Exported Templates Exit %1 Open the %1 reference manual Open a window showing the keystrokes you can use in %1 %1 on the &Web Open the %1 website &About %1 Show information about %1 Export the selected regions into a single file Export the whole file Can't export non-note layers to MIDI Export layer to "%1" Export the whole pane (%1x%2 pixels) Export the visible area only (%1x%2 pixels) Export the selection extent (%1x%2 pixels) Export the selection extent Which region of the current pane do you want to export as an image? Note: the whole pane is too wide to be exported as a single image. Failed to save image file Failed to save image file %1 <b>File open failed</b><p>Session file "%1" could not be opened <b>File open failed</b><p>File "%1" could not be opened Open Location Please enter the URL of the location to open: Failed to open location <b>Open failed</b><p>URL "%1" could not be opened <b>Open failed</b><p>File or URL "%1" could not be opened Failed to open dropped URL <b>Open failed</b><p>Dropped URL "%1" could not be opened Export image to "%1" Session modified <b>Session modified</b><p>The current session has been modified.<br>Do you want to save it? Close the current session and create a new one Add this data to the current session Select target for import <b>Select a target for import</b><p>This RDF document refers to one or more audio files.<br>You already have an audio waveform loaded.<br>What would you like to do with the new data? Failed to save file <b>Save failed</b><p>Session file "%1" could not be saved. Save session as "%1" Rename Layer New name for this layer: Playback speed: Normal Playback speed: %1%2% Selection: %1 to %2 (duration %3) Visible: %1 to %2 (duration %3) Sample rate mismatch <b>Wrong sample rate</b><p>The sample rate of this audio file (%1 Hz) does not match the current playback rate (%2 Hz).<p>The file will play at the wrong speed and pitch.<p>Change the <i>Resample mismatching files on import</i> option under <i>File</i> -> <i>Preferences</i> if you want to alter this behaviour. Audio processing overload <b>Overloaded</b><p>Audio effects plugin auditioning has been disabled due to a processing overload. <b>Overloaded</b><p>Audio playback speed processing has been reduced to a single channel, due to a processing overload. Add Point Reset Counters Failed to generate layer <b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform "%1" failed:<p>%2 <b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform "%1" failed.<p>No error information is available. Warning Failed to regenerate layer <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed:<p>%3 <b>Layer generation failed</b><p>Failed to regenerate derived layer "%1" using new data model as input.<p>The layer transform "%2" failed.<p>No error information is available. <b>Warning when regenerating layer</b><p>When regenerating the derived layer "%1" using new data model as input:<p>%2 Failed to calculate alignment <b>Alignment calculation failed</b><p>Failed to calculate an audio alignment using transform "%1":<p>%2 Adjust the master playback level Adjust the master playback speed http://www.sonicvisualiser.org/ Release %1 : Revision %2 Release %1 Unreleased : Revision %1 <h3>About Sonic Visualiser</h3> <p>Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation.<br><a href="http://www.sonicvisualiser.org/">http://www.sonicvisualiser.org/</a></p> <p><small>%1 : %2 configuration</small></p> Debug Release With Qt v%1 &copy; Nokia Corporation <br>With JACK audio output library v%1 &copy; Paul Davis and Jack O'Quin <br>With JACK audio output library &copy; Paul Davis and Jack O'Quin <br>With PortAudio audio output library &copy; Ross Bencina and Phil Burk <br>With PulseAudio audio output library v%1 &copy; Lennart Poettering and Pierre Ossman <br>With PulseAudio audio output library &copy; Lennart Poettering and Pierre Ossman <br>With Ogg file decoder (oggz v%1, fishsound v%2) &copy; CSIRO Australia <br>With Ogg file decoder &copy; CSIRO Australia <br>With MAD mp3 decoder v%1 &copy; Underbit Technologies Inc <br>With MAD mp3 decoder &copy; Underbit Technologies Inc <br>With libsamplerate v%1 &copy; Erik de Castro Lopo <br>With libsamplerate &copy; Erik de Castro Lopo <br>With libsndfile v%1 &copy; Erik de Castro Lopo <br>With libsndfile &copy; Erik de Castro Lopo <br>With FFTW3 v%1 &copy; Matteo Frigo and MIT <br>With FFTW3 &copy; Matteo Frigo and MIT <br>With Rubber Band v%1 &copy; Chris Cannam <br>With Rubber Band &copy; Chris Cannam <br>With Vamp plugin support (API v%1, host SDK v%2) &copy; Chris Cannam <br>With LADSPA plugin support (API v%1) &copy; Richard Furse, Paul Davis, Stefan Westerfeld <br>With DSSI plugin support (API v%1) &copy; Chris Cannam, Steve Harris, Sean Bolton <br>With Redland RDF datastore v%1 &copy; Dave Beckett and the University of Bristol <br>With Redland RDF datastore &copy; Dave Beckett and the University of Bristol <br>With RtMidi &copy; Gary P. Scavone <br>With liblo Lite OSC library v%1 &copy; Steve Harris <br>With liblo Lite OSC library &copy; Steve Harris </small><p><small>The OSC URL for this instance is: "%1" With Using About Sonic Visualiser Add %1 Pane MainWindowBase %1 (modified) (modified) Cut Paste Add Point Add Point at %1 s Add Item at %1 s Opening file or URL... Select target for import %1: %2 %1: %2 [%3] Import "%1" Opening playlist... Importing from RDF... Opening session... Close the current session and start a new one Replace the main audio file in this session Add the audio file to this session <b>Select a target for import</b><p>You already have an audio file loaded.<br>What would you like to do with the new audio file? Import audio file "%1" Import layer XML file "%1" Import MIDI file "%1" SV XML file read error: %1 Import session file "%1" Open session template "%1" Failed to import RDF <b>Failed to import RDF</b><p>Importing data from RDF document at "%1" failed: %2</p> <b>Failed to import RDF</b><p>No suitable data models found for import from RDF document at "%1"</p> Import RDF document "%1" Couldn't open audio device <b>No audio available</b><p>Could not open an audio device for playback.<p>Automatic audio device detection failed. Audio playback will not be available during this session.</p> <b>No audio available</b><p>Failed to open your preferred audio device ("%1").<p>Audio playback will not be available during this session.</p> Failed to write file <b>Save failed</b><p>Failed to write to file "%1": %2 Add Pane Remove Pane Delete Pane Playing: %1 of %2 (%3 remaining) ModelDataTableDialog Data Editor Playback Toolbar Play Mode Toolbar Track Playback Toggle tracking of playback position Edit Toolbar Insert New Item Insert Insert a new item Delete Selected Items Delete Delete the selected item or items Data in Layer Find: ModelMetadataModel Type Name Maker Source ModelTransformerFactory %1 <%2> %1: %2 NoteLayer New Point Vertical Scale Scale Units Scale Auto-Align Linear Log MIDI Notes In progress No local points %1 (%2, %3 Hz) %1 Hz (%2, %3) %1 %2 Time: %1 Pitch: %2 Duration: %3 No label Time: %1 Pitch: %2 Duration: %3 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste Record Note NoteModel Note Time Frame Pitch Duration Level Label Unknown Edit Data OggVorbisFileReader Decoding %1... Overview Overview Click and drag to navigate; double-click to jump Pane Horizontal Zoom Vertical Zoom Reset zoom to default Some lengthy prefix: Reference Unaligned Aligning: %1% Aligned %1 - %2 +%1 (R) (X) %1 / %2Hz%3 Zoom Zoom In Wheel Up Zoom Out Wheel Down General Pane Mouse Actions Wheel Zoom in or out in time axis Scroll Ctrl+Wheel Scroll rapidly left or right in time axis Zoom Vertically Shift+Wheel Zoom in or out in the vertical axis Scroll Vertically Alt+Wheel Scroll up or down in the vertical axis Navigate Middle Click middle button and drag to navigate with any tool Relocate Double-Click Middle Double-click middle button to relocate with any tool Menu Right Show pane context menu Navigate Tool Mouse Actions Left Click left button and drag to move around Zoom to Area Shift+Left Shift-click left button and drag to zoom to a rectangular area Double-Click Left Double-click left button to jump to clicked location Edit Double-click left button on an item to edit it Select Tool Mouse Actions Select Click left button and drag to select region; drag region edge to resize Multi Select Ctrl+Left Cmd-click left button and drag to select an additional region Ctrl-click left button and drag to select an additional region Fine Select Shift-click left button and drag to select without snapping to items or grid Edit Tool Mouse Actions Move Click left button on an item or selected region and drag to move Draw Tool Mouse Actions Draw Click left button and drag to create new item Measure Tool Mouse Actions Measure Area Click left button and drag to measure a rectangular area Measure Item Click left button and drag to measure extents of an item or shape Enter new range New vertical display range, from %1 to %2 %4: Drag Selection Resize Selection Click and drag to navigate Click and drag to select a range; hold Shift to avoid snapping to items; hold Cmd for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Cmd for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Shift to avoid snapping to items; hold Ctrl for multi-select; middle-click and drag to navigate Click and drag to select a range; hold Ctrl for multi-select; middle-click and drag to navigate Click and drag to move the selection boundary Click and drag to select a range; hold Shift to avoid snapping to items; middle-click to navigate Click and drag to select a range; middle-click and drag to navigate Click to add a new item in the active layer Click to erase an item from the active layer Click and drag an item in the active layer to move it; hold Shift to override initial resistance Click and drag to move all items in the selected range Click and drag to adjust the visible range of the vertical scale Click and drag to adjust the vertical zoom level Click and drag to adjust the horizontal zoom level Reset horizontal and vertical zoom levels to their defaults PlayParameterRepository Adjust Playback Parameters Change Playback Mute State Change Playback Gain Change Playback Pan Change Playback Plugin Configure Playback Plugin PluginParameterBox This plugin has no adjustable parameters. Program PluginParameterDialog Plugin Parameters Name: Version: Maker: Copyright: Output: Input Material Restrict to selection extents Channels Processing Advanced >> Channel mismatch This plugin requires at least %1 input channels, but only %2 %3 available. The plugin probably will not work correctly. are is This plugin accepts no more than %1 input channels, but %2 are available. Only the first %3 will be used. This plugin only has a single channel input, but the source has %1 channels. Use mean of source channels Use channel %1 only Window size: Audio frames per block: Window increment: Window shape: Advanced << Preferences Spectrogram y-axis interpolation: Spectrogram x-axis interpolation: Frequency of concert A Property box layout Spectral analysis window shape Playback resampler type Omit temporaries from Recent Files menu Resample mismatching files on import Location for cache file directory Background colour preference Time display format Font size for text overlays Show splash screen on startup Show boxes for all panes Show box for current pane only Rectangular Triangular Hamming Hann Blackman Gaussian Parzen Nuttall Blackman-Harris Fastest Standard Highest quality None Linear interpolation 4 x Oversampling 4 x Oversampling with interpolation Follow desktop theme Dark background Light background Standard (to millisecond) High resolution (to microsecond) 24 FPS 25 FPS 30 FPS 50 FPS 60 FPS Preferences PreferencesDialog Sonic Visualiser: Application Preferences Apply <home directory> Follow system locale Russian British English American English Czech %1: User interface language Playback audio device: &General &Appearance Anal&ysis Default session template for audio files: Standard Waveform Session &Template OK Cancel Select a directory to create cache subdirectory in Preferences <b>Restart required</b><p>One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.</p><p>Please exit and restart the application now if you want these changes to take effect immediately.</p> Preferences Changed Some preferences have been changed but not applied. Apply them before closing? ProgressDialog Cancel PropertyBox Show Play Playback Gain dB Playback Pan / Balance Add New Colour... Name New Colour Enter a name for the new colour: Prefer black background for this colour (current value: %1%2) (current value: %1) Toggle Visibility of %1 Toggle Playback of %1 Toggle %1 property of %2 Adjust %1 property of %2%3 PropertyContainer yes on true no off false Set %1 Property PropertyStack Change Layer Visibility Click to change the current active layer QApplication Sonic Visualiser is a program for viewing and exploring audio data for semantic music analysis and annotation. Usage: %1 [--no-audio] [--no-osc] [<file> ...] --no-audio: Do not attempt to open an audio output device --no-osc: Do not provide an Open Sound Control port for remote control <file>: One or more Sonic Visualiser (.sv) and audio files may be provided. Sonic Visualiser QColorDialog Color Colour &Basic colors &Basic colours &Custom colors &Custom colours &Define Custom Colors >> &Define Custom Colours >> &Add to Custom Colors &Add to Custom Colours Select color Select colour QFile File "%1" does not exist Failed to open file "%1" File or URL "%1" could not be retrieved QMessageBox Failed to open file File or URL "%1" could not be opened <b>Audio required</b><p>Please load at least one audio file before importing annotation data QuickTimeFileReader Decoding %1... RDFImporter Importing audio referenced in RDF... Importing dense signal data from RDF... Importing event data from RDF... RangeInputDialog to RangeSummarisableTimeValueModel Range-Summarisable Time-Value RegionLayer New Region Vertical Scale Scale Units Plot Type Scale Bars Segmentation Auto-Align Equal Spaced Linear Log In progress No local points %1 %2 Time: %1 Value: %2 Duration: %3 No label Time: %1 Value: %2 Duration: %3 Label: %4 Draw Region Erase Region Drag Region Edit Region Relocate Region Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste RegionModel Region Time Frame Value Duration Label Unknown Edit Data RemoveLayerCommand Delete %1 Layer ResamplingWavFileReader Resampling %1... SVFileReader (derived model in SV-XML) Opening file or URL... SingleColourLayer Colour <unknown> SliceLayer %1 - %2 Time: %1 - %2 Range: %3 samples (%4) Bin: %5 %6 value: %7 First Mean Peak Time: %1 - %2 Range: %3 samples (%4) 0dB -Inf x10 Plot Type Scale Normalize Normalise Threshold Gain Sampling Mode Linear Meter Rev Log dB Any Bin Scale Bins Log Absolute Lines Steps Blocks Colours SparseModel Sparse Edit Data Insert Data Point Delete Data Point SparseModel::AddPointCommand Add Point SparseModel::DeletePointCommand Delete Point SparseModel::RelabelCommand Re-Label Point SparseOneDimensionalModel Sparse 1-D Time Frame Label Unknown Edit Data SparseTimeValueModel Sparse Time-Value Time Frame Value Label Unknown Edit Data SparseValueModel Sparse Value SpectrogramLayer Colour Colour Scale Window Size Window Overlap Normalize Columns Normalise Columns Normalize Visible Area Normalise Visible Area Bin Display Threshold Gain Colour Rotation Min Frequency Max Frequency Frequency Scale Smoothing Bins Window Scale Linear Meter dBV^2 dBV Phase None 25 % 50 % 75 % 87.5 % 93.75 % No min 10 Hz 20 Hz 40 Hz 100 Hz 250 Hz 500 Hz 1 KHz 4 KHz 10 KHz 1.5 KHz 2 KHz 6 KHz 8 KHz 12 KHz 16 KHz No max Log All Bins Peak Bins Frequencies <unknown> dB FFT cache failed Failed to create the FFT model for this spectrogram. There may be insufficient memory or disc space to continue. Peak Frequency: %1 - %2 Hz Peak Frequency: %1 Hz Peak Pitch: %3 - %4 Peak Pitch: %2 Time: %1 - %2 Time: %1 %1Bin Frequency: %2 - %3 Hz %4Bin Pitch: %5 - %6 %1Bin Frequency: %2 Hz %3Bin Pitch: %4 -Inf dB: %1 - %2 dB: %1 Phase: %1 - %2 Phase: %1 43Hz %1Hz SpectrumLayer Window Size Window Overlap Show Peak Frequencies Window Bins None 25 % 50 % 75 % 87.5 % 93.75 % %1 - %2 %1 - %2 Hz %1 Hz -Inf %1 %1 Bin: %2 (%3) %4 value: %5 dB: %6 First Mean Peak %1 Bin: %2 (%3) Value: %4 dB: %5 SubdividingMenu %1 - %2 TextLayer Empty Label <no text> In progress Time: %1 Height: %2 Label: %3 Enter label Please enter a new label: Erase Point Drag Label Move Label Move Label Horizontally Move Label Vertically Drag Selection Resize Selection Delete Selection Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste New Point TextModel Text Time Frame Height Label Unknown Edit Data Thumbwheel %1: %2%3 %2%3 New value for %1, from %2 to %3 %4: New value for %1, from %2 to %3: Enter a new value from %1 to %2 %3: Enter a new value from %1 to %2: Enter new value TimeInstantLayer New Point Plot Type Instants Segmentation In progress No local points Time: %1 No label Time: %1 Label: %2 Draw Point Add Point at %1 s Erase Point Drag Point Move Point to %1 s Edit Point Drag Selection Resize Selection Delete Selection Re-align pasted instants? The instants you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste TimeValueLayer New Point Plot Type Vertical Scale Scale Units Draw Segment Division Lines Show Derivative Scale Points Stems Connected Points Lines Curve Segmentation Auto-Align Linear Log +/-1 In progress No local points Time: %1 Value: %2%3 No label Time: %1 Value: %2%3 Label: %4 Draw Point Erase Point Drag Point Edit Point Relocate Point Change Point Value Drag Selection Resize Selection Delete Selected Points Re-align pasted items? The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer? Paste The items you are pasting do not have values. What values do you want to use for these items? Some of the items you are pasting do not have values. What values do you want to use for these items? Zero for all items Choose value calculation Select cycle size Cycle size: TipDialog Tip of the Day Show tip on startup << Previous Next >> Close TransformFactory [\(<].*$ <unknown maker> Extract features using "%1" plugin (from %2) Extract features using "%1" output of "%2" plugin (from %3) %1 using "%2" plugin (from %3) %1 using "%2" output of "%3" plugin (from %4) Analysis Generator Other %1: %2 %1: Output %2 Extract "%1" data output from "%2" effect plugin (from %3) Extract data output %1 from "%2" effect plugin (from %3) Effects Data Effects Transform audio signal with "%1" effect plugin (from %2) Generate audio signal using "%1" plugin (from %2) Plugin type Category System Identifier Name Description Maker Units TransformFinder Find a Transform Find: <br>&nbsp;&nbsp;No results found Up Down <p>Type some text into the search box to search the descriptions of:<ul><li>All currently installed <a href="http://www.vamp-plugins.org/">Vamp</a> audio feature extraction plugins</li><li>All currently installed <a href="http://www.ladspa.org/">LADSPA</a> audio effects plugins</li><li>Vamp plugins that are not currently installed but that have descriptions published via the semantic web</li></ul> <b>Unable to retrieve published descriptions from network!</b> <b>No plugins are currently installed!</b> <p>%1<br>Perhaps the network connection is down, services are responding too slowly, or a processing problem has occurred.<br>Only the descriptions of installed plugins will be searched. <p>%1<br>Only the published descriptions of Vamp feature extraction plugins will be searched. <p>%1<br>%2<br>Perhaps the network connection is down, or services are responding too slowly.<br>No search results will be available. Found %n description(s) containing <b>%1</b>, showing the first %2 only Found %n description containing <b>%1</b>, showing the first %2 only Found %n descriptions containing <b>%1</b>, showing the first %2 only Found %n description(s) containing <b>%1</b> Found %n description containing <b>%1</b> Found %n descriptions containing <b>%1</b> <i> (not installed)</i> %1%2<br><small> </small> <b>%1</b>%2<br> <small>%1</small> <small> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Plugin type: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; Category: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; System identifier: %1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mdash; More information: <a href="%1">%1</a> View Global Scroll Global Zoom Follow Playback Scroll Page Off <unknown> Layer rendering error Alignment Waiting for layers to be ready... Cancel Rendering image... ViewManager Clear Selection Select Multiple Regions Select Region Enter Navigate mode Enter Select mode Enter Edit mode Enter Draw mode Enter Erase mode Enter Measure mode Switch on Loop mode Switch off Loop mode Switch on Play Selection mode Switch off Play Selection mode Switch on Play Solo mode Switch off Play Solo mode Switch on Alignment mode Switch off Alignment mode Scroll to %1 Zoom to %n sample(s) per pixel Change overlay level WaveFileModel Wave File WaveformLayer Scale Gain Normalize Visible Area Normalise Visible Area Channels Linear Meter dB Separate Mean Butterfly Time: %1 - %2 Time: %1 Level: Left: Right: Channel %1 %1 %2 - %3 (%4 dB peak) %1 %2 (%3 dB peak) 0dB -Inf WindowShapePreview V / time dB / freq WritableWaveFileModel Writable Wave File sonic-visualiser-2.3~repack1.orig/acinclude.m40000644000175000017500000000777612252354725020144 0ustar miramira AC_DEFUN([SV_MODULE_REQUIRED], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE"],[AC_MSG_ERROR([Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE])]) if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_ERROR([Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE])]) fi fi ]) AC_DEFUN([SV_MODULE_OPTIONAL], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE])]) if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_NOTICE([Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE])]) fi fi fi ]) # Check for Qt. The only part of Qt we use directly is qmake. AC_DEFUN([SV_CHECK_QT], [ AC_REQUIRE([AC_PROG_CXX]) if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, $QTDIR/bin/qmake-qt5,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, $QTDIR/bin/qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake.exe, $QTDIR/bin/qmake.exe,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, qmake-qt5,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, qmake,,$PATH) fi if test x$QMAKE = x ; then AC_MSG_ERROR([ Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. ]) fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) AC_MSG_WARN([ *** The version of qmake found in "$QMAKE" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. ]) esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac ]) sonic-visualiser-2.3~repack1.orig/misc/0000755000175000017500000000000012264464201016657 5ustar miramirasonic-visualiser-2.3~repack1.orig/misc/ladspa.cat0000644000175000017500000003451112252354725020626 0ustar miramiraladspa:adsr_1653:adsr::Amplitude > Dynamics ladspa:adsr_1680:adsr_g+t::Amplitude > Dynamics ladspa:alias_1407:alias::Amplitude > Distortions ladspa:allpass_1895:allpass_c::Time > Delays ladspa:allpass_1895:allpass_l::Time > Delays ladspa:allpass_1895:allpass_n::Time > Delays ladspa:amp_1181:amp::Amplitude > Amplifiers ladspa:amp_1654:amp_gaia_oa::Amplitude > Amplifiers ladspa:amp_1654:amp_gcia_oa::Amplitude > Amplifiers ladspa:amp:amp_mono::Amplitude > Amplifiers ladspa:amp:amp_stereo::Amplitude > Amplifiers ladspa:am_pitchshift_1433:amPitchshift::Frequency > Pitch shifters ladspa:analogue_osc_1416:analogueOsc::Generators > Oscillators ladspa:bandpass_a_iir_1893:bandpass_a_iir::Frequency > Filters > Bandpass ladspa:bandpass_iir_1892:bandpass_iir::Frequency > Filters > Bandpass ladspa:blvco:Pulse-VCO::Generators > Oscillators ladspa:blvco:Rec-VCO::Generators > Oscillators ladspa:blvco:Saw-VCO::Generators > Oscillators ladspa:bode_shifter_1431:bodeShifter::Spectral ladspa:bode_shifter_cv_1432:bodeShifterCV::Spectral ladspa:branch_1673:branch_ia_oaoa::Utilities ladspa:branch_1673:branch_ic_ococ::Utilities ladspa:butterworth_1902:butthigh_iir::Frequency > Filters > Highpass ladspa:butterworth_1902:buttlow_iir::Frequency > Filters > Lowpass ladspa:butterworth_1902:bwxover_iir::Frequency > Filters > Bandpass ladspa:caps:AmpIII::Amplitude > Distortions ladspa:caps:AmpIV::Amplitude > Distortions ladspa:caps:Cabinet::Amplitude > Distortions ladspa:caps:CEO::Generators > Oscillators ladspa:caps:Chorus::Time > Chorus ladspa:caps:Click::Utilities ladspa:caps:Clip::Amplitude > Distortions ladspa:caps:Compress::Amplitude > Dynamics > Compressors ladspa:caps:Eq::Frequency > EQs ladspa:caps:HRTF::Utilities ladspa:caps:JVRev::Time > Reverbs ladspa:caps:Lorenz::Generators ladspa:caps:Pan::Utilities ladspa:caps:Phaser::Time > Phasers ladspa:caps:Plate2x2::Time > Reverbs ladspa:caps:Plate::Time > Reverbs ladspa:caps:PreampIII::Amplitude > Distortions ladspa:caps:PreampIV::Amplitude > Distortions ladspa:caps:Roessler::Generators ladspa:caps:Sin::Generators ladspa:caps:StereoChorus::Time > Chorus ladspa:caps:SweepVF::Frequency > Filters ladspa:caps:VCOd::Generators > Oscillators ladspa:caps:VCOs::Generators > Oscillators ladspa:caps:White::Generators ladspa:chebstortion_1430:chebstortion::Amplitude > Distortions ladspa:cmt:am::Amplitude > Modulators ladspa:cmt:amp_mono::Amplitude > Amplifiers ladspa:cmt:amp_stereo::Amplitude > Amplifiers ladspa:cmt:analogue::Generators ladspa:cmt:bf2cube::Utilities > Ambisonic ladspa:cmt:bf2quad::Utilities > Ambisonic ladspa:cmt:bf2stereo::Utilities > Ambisonic ladspa:cmt:bf_rotate_z::Utilities > Ambisonic ladspa:cmt:canyon_delay::Time > Delays ladspa:cmt:compress_peak::Amplitude > Dynamics > Compressors ladspa:cmt:compress_rms::Amplitude > Dynamics > Compressors ladspa:cmt:delay_0.01s::Time > Delays ladspa:cmt:delay_0.1s::Time > Delays ladspa:cmt:delay_1s::Time > Delays ladspa:cmt:delay_5s::Time > Delays ladspa:cmt:delay_60s::Time > Delays ladspa:cmt:disintegrator::Amplitude > Distortions ladspa:cmt:encode_bformat::Utilities > Ambisonic ladspa:cmt:encode_fmh::Utilities > Ambisonic ladspa:cmt:expand_peak::Amplitude > Dynamics > Expanders ladspa:cmt:expand_rms::Amplitude > Dynamics > Expanders ladspa:cmt:fbdelay_0.01s::Time > Delays ladspa:cmt:fbdelay_0.1s::Time > Delays ladspa:cmt:fbdelay_1s::Time > Delays ladspa:cmt:fbdelay_5s::Time > Delays ladspa:cmt:fbdelay_60s::Time > Delays ladspa:cmt:fmh2bf::Utilities > Ambisonic ladspa:cmt:fmh2oct::Utilities > Ambisonic ladspa:cmt:fmh_rotate_z::Utilities > Ambisonic ladspa:cmt:freeverb3::Time > Reverbs ladspa:cmt:grain_scatter::Generators ladspa:cmt:hard_gate::Amplitude > Dynamics > Gates ladspa:cmt:hpf::Frequency > Filters > Highpass ladspa:cmt:identity_audio::Utilities ladspa:cmt:identity_control::Utilities ladspa:cmt:limit_peak::Amplitude > Dynamics > Limiters ladspa:cmt:limit_rms::Amplitude > Dynamics > Limiters ladspa:cmt:lofi::Amplitude > Distortions ladspa:cmt:logistic::Utilities ladspa:cmt:lpf::Frequency > Filters > Lowpass ladspa:cmt:mixer::Utilities ladspa:cmt:noise_source_white::Generators ladspa:cmt:null_ai::Utilities ladspa:cmt:null_ao::Utilities ladspa:cmt:null_ci::Utilities ladspa:cmt:null_co::Utilities ladspa:cmt:organ::Generators ladspa:cmt:peak::Utilities ladspa:cmt:phasemod::Generators ladspa:cmt:pink_full_frequency::Generators ladspa:cmt:pink_interpolated_audio::Generators ladspa:cmt:pink_sh::Generators ladspa:cmt:sine_faaa::Generators ladspa:cmt:sine_faac::Generators ladspa:cmt:sine_fcaa::Generators ladspa:cmt:sine_fcac::Generators ladspa:cmt:sledgehammer::Amplitude > Dynamics > Limiters ladspa:cmt:syndrum::Generators ladspa:cmt:track_max_peak::Utilities ladspa:cmt:track_max_rms::Utilities ladspa:cmt:track_peak::Utilities ladspa:cmt:track_rms::Utilities ladspa:cmt:vcf303::Frequency > Filters > Lowpass ladspa:cmt:wshape_sine::Amplitude > Waveshapers ladspa:comb_1190:comb::Frequency > Filters > Combs ladspa:comb_1887:comb_c::Time > Delays ladspa:comb_1887:comb_l::Time > Delays ladspa:comb_1887:comb_n::Time > Delays ladspa:comb_splitter_1411:combSplitter::Frequency > Filters > Combs ladspa:const_1909:const::Utilities ladspa:crossover_dist_1404:crossoverDist::Amplitude > Distortions ladspa:cs_chorus:Chorus1::Time > Chorus ladspa:cs_chorus:Chorus2::Time > Chorus ladspa:cs_phaser:Phaser1+LFO::Time > Phasers ladspa:cs_phaser:Phaser1::Time > Phasers ladspa:dahdsr_2021:dahdsr_cg+t_control::Amplitude > Dynamics ladspa:dahdsr_2021:dahdsr_g+t_audio::Amplitude > Dynamics ladspa:dahdsr_2021:dahdsr_g+t_control::Amplitude > Dynamics ladspa:dc_remove_1207:dcRemove::Frequency > Filters > Highpass ladspa:decay_1886:decay::Utilities ladspa:decimator_1202:decimator::Amplitude > Distortions ladspa:declip_1195:declip::Amplitude > Waveshapers ladspa:delay_1898:delay_c::Time > Delays ladspa:delay_1898:delay_l::Time > Delays ladspa:delay_1898:delay_n::Time > Delays ladspa:delay:delay_5s::Time > Delays ladspa:delayorama_1402:delayorama::Time > Delays ladspa:difference_2030:difference_iama_oa::Utilities ladspa:difference_2030:difference_iamc_oa::Utilities ladspa:difference_2030:difference_icma_oa::Utilities ladspa:difference_2030:difference_icmc_oc::Utilities ladspa:diode_1185:diode::Amplitude > Distortions ladspa:divider_1186:divider::Generators ladspa:dj_eq_1901:dj_eq::Frequency > EQs ladspa:dj_eq_1901:dj_eq_mono::Frequency > EQs ladspa:dj_flanger_1438:djFlanger::Time > Flangers ladspa:dyson_compress_1403:dysonCompress::Amplitude > Dynamics > Compressors ladspa:fad_delay_1192:fadDelay::Time > Delays ladspa:fast_lookahead_limiter_1913:fastLookaheadLimiter::Amplitude > Dynamics > Limiters ladspa:filter:hpf::Frequency > Filters > Highpass ladspa:filter:lpf::Frequency > Filters > Lowpass ladspa:filters:Parametric1::Frequency > Filters ladspa:flanger_1191:flanger::Time > Flangers ladspa:fmod_1656:fmod_fama_oa::Frequency ladspa:fmod_1656:fmod_famc_oa::Frequency ladspa:fmod_1656:fmod_fcma_oa::Frequency ladspa:fmod_1656:fmod_fcmc_oc::Frequency ladspa:fm_osc_1415:fmOsc::Generators > Oscillators ladspa:foldover_1213:foldover::Amplitude > Distortions ladspa:foverdrive_1196:foverdrive::Amplitude > Distortions ladspa:freq_tracker_1418:freqTracker::Frequency > Measurement ladspa:g2reverb:G2reverb::Time > Reverbs ladspa:gate_1410:gate::Amplitude > Dynamics > Gates ladspa:giant_flange_1437:giantFlange::Time > Flangers ladspa:gong_1424:gong::Simulators ladspa:gong_beater_1439:gongBeater::Generators ladspa:gsm_1215:gsm::Amplitude > Distortions ladspa:gverb_1216:gverb::Time > Reverbs ladspa:hard_limiter_1413:hardLimiter::Amplitude > Dynamics > Limiters ladspa:harmonic_gen_1220:harmonicGen::Generators ladspa:hermes_filter_1200:hermesFilter::Frequency > Filters ladspa:highpass_iir_1890:highpass_iir::Frequency > Filters > Highpass ladspa:hilbert_1440:hilbert::Utilities ladspa:imp_1199:imp::Spectral ladspa:impulse_1885:impulse_fc::Utilities ladspa:interpolator_1660:interpolator::Utilities ladspa:inv_1429:inv::Utilities ladspa:jamincont_1912:jaminController::Utilities ladspa:karaoke_1409:karaoke::Utilities ladspa:latency_1914:artificialLatency::Utilities ladspa:lcr_delay_1436:lcrDelay::Time > Delays ladspa:lowpass_iir_1891:lowpass_iir::Frequency > Filters > Lowpass ladspa:lp4pole_1671:lp4pole_faraia_oa::Frequency > Filters > Lowpass ladspa:lp4pole_1671:lp4pole_fcrcia_oa::Frequency > Filters > Lowpass ladspa:ls_filter_1908:lsFilter::Frequency > Filters ladspa:matrix_ms_st_1421:matrixMSSt::Utilities ladspa:matrix_spatialiser_1422:matrixSpatialiser::Utilities ladspa:matrix_st_ms_1420:matrixStMS::Utilities ladspa:mbeq_1197:mbeq::Frequency > EQs > Multiband ladspa:mod_delay_1419:modDelay::Time > Delays ladspa:multivoice_chorus_1201:multivoiceChorus::Time > Chorus ladspa:mvchpf24:Mvchpf-1::Frequency > Filters ladspa:mvclpf24:Mvclpf-1::Frequency > Filters ladspa:mvclpf24:Mvclpf-2::Frequency > Filters ladspa:mvclpf24:Mvclpf-3::Frequency > Filters ladspa:mvclpf24:Mvclpf-4::Frequency > Filters ladspa:noise:noise_white::Generators ladspa:notch_iir_1894:notch_iir::Frequency > Filters > Notch ladspa:phasers_1217:autoPhaser::Time > Phasers ladspa:phasers_1217:fourByFourPole::Frequency > Filters > Allpass ladspa:phasers_1217:lfoPhaser::Time > Phasers ladspa:pitch_scale_1193:pitchScale::Frequency > Pitch shifters ladspa:pitch_scale_1194:pitchScaleHQ::Frequency > Pitch shifters ladspa:plate_1423:plate::Time > Reverbs ladspa:pointer_cast_1910:pointerCastDistortion::Amplitude > Distortions ladspa:product_1668:product_iaia_oa::Utilities ladspa:product_1668:product_iaic_oa::Utilities ladspa:product_1668:product_icic_oc::Utilities ladspa:pulse_1645:pulse_fapa_oa::Generators > Oscillators ladspa:pulse_1645:pulse_fapc_oa::Generators > Oscillators ladspa:pulse_1645:pulse_fcpa_oa::Generators > Oscillators ladspa:pulse_1645:pulse_fcpc_oa::Generators > Oscillators ladspa:pvoc:Accumulate::Spectral ladspa:pvoc:Exaggerate::Spectral ladspa:pvoc:Transpose::Frequency > Pitch shifters ladspa:quantiser100_2029:quantiser100::Utilities ladspa:quantiser20_2027:quantiser20::Utilities ladspa:quantiser50_2028:quantiser50::Utilities ladspa:random_1661:random_fasa_oa::Generators ladspa:random_1661:random_fasc_oa::Generators ladspa:random_1661:random_fcsa_oa::Generators ladspa:random_1661:random_fcsc_oa::Generators ladspa:rate_shifter_1417:rateShifter::Frequency > Pitch shifters ladspa:ratio_2034:ratio_nada_oa::Utilities ladspa:ratio_2034:ratio_nadc_oa::Utilities ladspa:ratio_2034:ratio_ncda_oa::Utilities ladspa:ratio_2034:ratio_ncdc_oc::Utilities ladspa:retro_flange_1208:retroFlange::Time > Flangers ladspa:revdelay_1605:revdelay::Time > Delays ladspa:ringmod_1188:ringmod_1i1o1l::Amplitude > Modulators ladspa:ringmod_1188:ringmod_2i1o::Amplitude > Modulators ladspa:satan_maximiser_1408:satanMaximiser::Amplitude > Dynamics ladspa:sawtooth_1641:sawtooth_fa_oa::Generators > Oscillators ladspa:sawtooth_1641:sawtooth_fc_oa::Generators > Oscillators ladspa:sc1_1425:sc1::Amplitude > Dynamics > Compressors ladspa:sc2_1426:sc2::Amplitude > Dynamics > Compressors ladspa:sc3_1427:sc3::Amplitude > Dynamics > Compressors ladspa:sc4_1882:sc4::Amplitude > Dynamics > Compressors ladspa:sc4m_1916:sc4m::Amplitude > Dynamics > Compressors ladspa:se4_1883:se4::Amplitude > Dynamics > Compressors ladspa:sequencer16_1677:sequencer16::Simulators ladspa:sequencer32_1676:sequencer32::Simulators ladspa:sequencer64_1675:sequencer64::Simulators ladspa:shaper_1187:shaper::Amplitude > Waveshapers ladspa:sifter_1210:sifter::Amplitude > Distortions ladspa:sin_cos_1881:sinCos::Generators > Oscillators ladspa:sine:sine_faaa::Generators > Oscillators ladspa:sine:sine_faac::Generators > Oscillators ladspa:sine:sine_fcaa::Generators > Oscillators ladspa:sine:sine_fcac::Generators > Oscillators ladspa:single_para_1203:singlePara::Frequency > EQs > Parametric ladspa:sinus_wavewrapper_1198:sinusWavewrapper::Amplitude > Waveshapers ladspa:smooth_decimate_1414:smoothDecimate::Amplitude > Distortions ladspa:split_1406:split::Utilities ladspa:square_1643:square_fa_oa::Generators > Oscillators ladspa:square_1643:square_fc_oa::Generators > Oscillators ladspa:step_muxer_1212:stepMuxer::Utilities ladspa:sum_1665:sum_iaia_oa::Utilities ladspa:sum_1665:sum_iaic_oa::Utilities ladspa:sum_1665:sum_icic_oc::Utilities ladspa:surround_encoder_1401:surroundEncoder::Utilities ladspa:svf_1214:svf::Frequency > Filters ladspa:sync_pulse_2023:syncpulse_fapaga_oa::Generators > Oscillators ladspa:sync_pulse_2023:syncpulse_fcpcga_oa::Generators > Oscillators ladspa:sync_square_1678:syncsquare_faga_oa::Generators > Oscillators ladspa:sync_square_1678:syncsquare_fcga_oa::Generators > Oscillators ladspa:tap_autopan:tap_autopan::Amplitude > Modulators ladspa:tap_chorusflanger:tap_chorusflanger::Time > Flangers ladspa:tap_deesser:tap_deesser::Amplitude > Dynamics ladspa:tap_doubler:tap_doubler::Simulators ladspa:tap_dynamics_m:tap_dynamics_m::Amplitude > Dynamics ladspa:tap_dynamics_st:tap_dynamics_st::Amplitude > Dynamics ladspa:tap_echo:tap_stereo_echo::Time > Delays ladspa:tape_delay_1211:tapeDelay::Time > Delays ladspa:tap_eqbw:tap_equalizer_bw::Frequency > EQs ladspa:tap_eq:tap_equalizer::Frequency > EQs ladspa:tap_limiter:tap_limiter::Amplitude > Dynamics > Limiters ladspa:tap_pinknoise:tap_pinknoise::Utilities ladspa:tap_pitch:tap_pitch::Frequency > Pitch shifters ladspa:tap_reflector:tap_reflector::Time ladspa:tap_reverb:tap_reverb::Time > Reverbs ladspa:tap_rotspeak:tap_rotspeak::Simulators ladspa:tap_sigmoid:tap_sigmoid::Amplitude > Distortions ladspa:tap_tremolo:tap_tremolo::Amplitude > Modulators ladspa:tap_tubewarmth:tap_tubewarmth::Simulators ladspa:tap_vibrato:tap_vibrato::Amplitude > Modulators ladspa:tracker_2025:tracker_gaaadaia_oa::Amplitude > Waveshapers ladspa:tracker_2025:tracker_gaacdcia_oa::Amplitude > Waveshapers ladspa:transient_1206:transient::Amplitude > Dynamics ladspa:triangle_1649:triangle_fasa_oa::Generators > Oscillators ladspa:triangle_1649:triangle_fasc_oa::Generators > Oscillators ladspa:triangle_1649:triangle_fcsa_oa::Generators > Oscillators ladspa:triangle_1649:triangle_fcsc_oa::Generators > Oscillators ladspa:triple_para_1204:triplePara::Frequency > EQs > Parametric ladspa:valve_1209:valve::Amplitude > Distortions ladspa:valve_rect_1405:valveRect::Amplitude > Distortions ladspa:vco_sawpulse:Pulse-VCO::Generators > Oscillators ladspa:vco_sawpulse:Rec-VCO::Generators > Oscillators ladspa:vco_sawpulse:Saw-VCO::Generators > Oscillators ladspa:vynil_1905:vynil::Amplitude > Distortions ladspa:wave_terrain_1412:waveTerrain::Generators > Oscillators ladspa:xfade_1915:xfade4::Amplitude > Dynamics > Compressors ladspa:zm1_1428:zm1::Utilities sonic-visualiser-2.3~repack1.orig/misc/debian-dependencies.sh0000644000175000017500000000154212252354725023071 0ustar miramira#!/bin/bash target=$1 if [ ! -f "$target" ]; then echo "Usage: $0 target-executable" exit 1 fi pfile=/tmp/packages_$$ rfile=/tmp/redundant_$$ trap "rm -f $pfile $rfile" 0 echo ldd "$target" | awk '{ print $3; }' | grep '^/' | while read lib; do if test -n "$lib" ; then dpkg-query -S "$lib" fi done | grep ': ' | awk -F: '{ print $1 }' | sort | uniq > $pfile echo "Packages providing required libraries:" cat $pfile echo for p in `cat $pfile`; do echo Looking at $p 1>&2 apt-cache showpkg "$p" | grep '^ ' | grep ',' | awk -F, '{ print $1; }' | \ while read d; do if grep -q '^'$d'$' $pfile; then echo $p fi done done | sort | uniq > $rfile echo "Packages that can be eliminated because other packages depend on them:" cat $rfile echo echo "Remaining required packages:" cat $pfile $rfile | sort | uniq -u sonic-visualiser-2.3~repack1.orig/misc/update-i18n.sh0000644000175000017500000000100312252354725021252 0ustar miramira#!/bin/sh LUPDATE="lupdate" LRELEASE="lrelease" if lupdate-qt4 -version >/dev/null 2>&1; then LUPDATE="lupdate-qt4" LRELEASE="lrelease-qt4" fi LANGUAGES="ru en_GB en_US cs_CZ" for LANG in $LANGUAGES; do $LUPDATE \ ../svcore/*/*.h ../svcore/*/*.cpp \ ../svcore/*/*/*.h ../svcore/*/*/*.cpp \ ../svgui/*/*.h ../svgui/*/*.cpp \ ../svapp/*/*.h ../svapp/*/*.cpp \ */*.h */*.cpp \ -ts i18n/sonic-visualiser_$LANG.ts done for LANG in $LANGUAGES; do $LRELEASE i18n/sonic-visualiser_$LANG.ts done sonic-visualiser-2.3~repack1.orig/Doxyfile0000644000175000017500000014253012252354725017445 0ustar miramira# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Sonic Visualiser # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.9 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = main # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. #USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = Q* *.h # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = HAVE_FFTW3F HAVE_FISHSOUND HAVE_JACK HAVE_LIBLO HAVE_LRDF HAVE_MAD HAVE_OGGZ HAVE_PORTAUDIO HAVE_SAMPLERATE HAVE_SNDFILE HAVE_VAMP # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO sonic-visualiser-2.3~repack1.orig/bootstrap.sh0000644000175000017500000000004412252354725020301 0ustar miramira#!/bin/sh aclocal -I . && autoconf sonic-visualiser-2.3~repack1.orig/svapp/0000755000175000017500000000000012264464201017055 5ustar miramirasonic-visualiser-2.3~repack1.orig/svapp/.hgignore0000644000175000017500000000016712252354725020672 0ustar miramirasyntax: glob Makefile */Makefile o/* */o/* */tmp_obj/* */tmp_moc/* doc/html/ *.o *.so *.so.* *.a *.wav *~ *.orig *.rej sonic-visualiser-2.3~repack1.orig/svapp/INSTALL.txt0000644000175000017500000000412112252354725020730 0ustar miramira To compile from source ---------------------- This file provides various instructions useful when compiling the SV libraries from source, but it doesn't have a complete recipe for any one platform -- there are too many variables. However, you can find a recipe for one platform (Ubuntu Linux) in the file INSTALL.ubuntu. To build, run $ ./configure && make The following additional libraries are required or optional when building the SV core libraries: REQUIRED Qt v4.4 or newer http://qt.nokia.com/ REQUIRED Vamp Plugin SDK v2.x http://www.vamp-plugins.org/ REQUIRED Rubber Band Library http://www.breakfastquay.com/rubberband/ REQUIRED libsndfile http://www.mega-nerd.com/libsndfile/ REQUIRED libsamplerate http://www.mega-nerd.com/SRC/ REQUIRED FFTW3 http://www.fftw.org/ REQUIRED bzip2 library http://www.bzip.org/ REQUIRED Redland RDF libraries http://librdf.org/ Optional MAD mp3 decoder http://www.underbit.com/products/mad/ Optional Oggz and fishsound http://www.annodex.net/software/libraries.html Optional liblo OSC library http://www.plugin.org.uk/liblo/ The Redland RDF libraries include the Raptor RDF parser library, Rasqal RDF query library, and librdf, the Redland RDF datastore (which depends on both of those). The SV libraries require all of these. If you are going to build the rest of the SV libraries, you will also need one or more of: Optional JACK http://www.jackaudio.org/ Optional PortAudio v19 http://www.portaudio.com/ Optional PulseAudio http://www.pulseaudio.org/ Although JACK, PortAudio, and PulseAudio are individually optional, you will need to have one or the other of them in order to get any audio playback. Usually JACK is preferred on Linux, with PulseAudio as a backup, and PortAudio is used elsewhere. On Linux, you will need the ALSA libraries (used for MIDI). If you happen to be using a Debian-based Linux, you probably want to apt-get install the following packages: libqt4-dev libsndfile1-dev libsamplerate0-dev fftw3-dev libbz2-dev libjack-dev libmad0-dev liboggz1-dev libfishsound1-dev libasound2-dev liblo0-dev liblrdf0-dev librdf0-dev . sonic-visualiser-2.3~repack1.orig/svapp/framework/0000755000175000017500000000000012264464201021052 5ustar miramirasonic-visualiser-2.3~repack1.orig/svapp/framework/MainWindowBase.cpp0000644000175000017500000027224212252354725024444 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "MainWindowBase.h" #include "Document.h" #include "view/Pane.h" #include "view/PaneStack.h" #include "data/model/WaveFileModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/NoteModel.h" #include "data/model/Labeller.h" #include "data/model/TabularModel.h" #include "view/ViewManager.h" #include "layer/WaveformLayer.h" #include "layer/TimeRulerLayer.h" #include "layer/TimeInstantLayer.h" #include "layer/TimeValueLayer.h" #include "layer/Colour3DPlotLayer.h" #include "layer/SliceLayer.h" #include "layer/SliceableLayer.h" #include "layer/ImageLayer.h" #include "layer/NoteLayer.h" #include "layer/RegionLayer.h" #include "widgets/ListInputDialog.h" #include "widgets/CommandHistory.h" #include "widgets/ProgressDialog.h" #include "widgets/MIDIFileImportDialog.h" #include "widgets/CSVFormatDialog.h" #include "widgets/ModelDataTableDialog.h" #include "audioio/AudioCallbackPlaySource.h" #include "audioio/AudioCallbackPlayTarget.h" #include "audioio/AudioTargetFactory.h" #include "audioio/PlaySpeedRangeMapper.h" #include "data/fileio/DataFileReaderFactory.h" #include "data/fileio/PlaylistFileReader.h" #include "data/fileio/WavFileWriter.h" #include "data/fileio/CSVFileWriter.h" #include "data/fileio/MIDIFileWriter.h" #include "data/fileio/BZipFileDevice.h" #include "data/fileio/FileSource.h" #include "data/fileio/AudioFileReaderFactory.h" #include "rdf/RDFImporter.h" #include "data/fft/FFTDataServer.h" #include "base/RecentFiles.h" #include "base/PlayParameterRepository.h" #include "base/XmlExportable.h" #include "base/Profiler.h" #include "base/Preferences.h" #include "base/TempWriteFile.h" #include "base/Exceptions.h" #include "base/ResourceFinder.h" #include "data/osc/OSCQueue.h" #include "data/midi/MIDIInput.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::vector; using std::map; using std::set; #ifdef Q_WS_X11 #define Window X11Window #include #include #include #include static int handle_x11_error(Display *dpy, XErrorEvent *err) { char errstr[256]; XGetErrorText(dpy, err->error_code, errstr, 256); if (err->error_code != BadWindow) { cerr << "Sonic Visualiser: X Error: " << errstr << " " << int(err->error_code) << "\nin major opcode: " << int(err->request_code) << endl; } return 0; } #undef Window #endif MainWindowBase::MainWindowBase(bool withAudioOutput, bool withMIDIInput) : m_document(0), m_paneStack(0), m_viewManager(0), m_timeRulerLayer(0), m_audioOutput(withAudioOutput), m_playSource(0), m_playTarget(0), m_oscQueue(0), m_oscQueueStarter(0), m_midiInput(0), m_recentFiles("RecentFiles", 20), m_recentTransforms("RecentTransforms", 20), m_documentModified(false), m_openingAudioFile(false), m_abandoning(false), m_labeller(0), m_lastPlayStatusSec(0) { Profiler profiler("MainWindowBase::MainWindowBase"); #ifdef Q_WS_X11 XSetErrorHandler(handle_x11_error); #endif connect(CommandHistory::getInstance(), SIGNAL(commandExecuted()), this, SLOT(documentModified())); connect(CommandHistory::getInstance(), SIGNAL(documentRestored()), this, SLOT(documentRestored())); m_viewManager = new ViewManager(); connect(m_viewManager, SIGNAL(selectionChanged()), this, SLOT(updateMenuStates())); connect(m_viewManager, SIGNAL(inProgressSelectionChanged()), this, SLOT(inProgressSelectionChanged())); // set a sensible default font size for views -- cannot do this // in Preferences, which is in base and not supposed to use QtGui int viewFontSize = QApplication::font().pointSize() * 0.9; QSettings settings; settings.beginGroup("Preferences"); viewFontSize = settings.value("view-font-size", viewFontSize).toInt(); settings.setValue("view-font-size", viewFontSize); settings.endGroup(); Preferences::BackgroundMode mode = Preferences::getInstance()->getBackgroundMode(); m_initialDarkBackground = m_viewManager->getGlobalDarkBackground(); if (mode != Preferences::BackgroundFromTheme) { m_viewManager->setGlobalDarkBackground (mode == Preferences::DarkBackground); } m_paneStack = new PaneStack(0, m_viewManager); connect(m_paneStack, SIGNAL(currentPaneChanged(Pane *)), this, SLOT(currentPaneChanged(Pane *))); connect(m_paneStack, SIGNAL(currentLayerChanged(Pane *, Layer *)), this, SLOT(currentLayerChanged(Pane *, Layer *))); connect(m_paneStack, SIGNAL(rightButtonMenuRequested(Pane *, QPoint)), this, SLOT(rightButtonMenuRequested(Pane *, QPoint))); connect(m_paneStack, SIGNAL(contextHelpChanged(const QString &)), this, SLOT(contextHelpChanged(const QString &))); connect(m_paneStack, SIGNAL(paneAdded(Pane *)), this, SLOT(paneAdded(Pane *))); connect(m_paneStack, SIGNAL(paneHidden(Pane *)), this, SLOT(paneHidden(Pane *))); connect(m_paneStack, SIGNAL(paneAboutToBeDeleted(Pane *)), this, SLOT(paneAboutToBeDeleted(Pane *))); connect(m_paneStack, SIGNAL(dropAccepted(Pane *, QStringList)), this, SLOT(paneDropAccepted(Pane *, QStringList))); connect(m_paneStack, SIGNAL(dropAccepted(Pane *, QString)), this, SLOT(paneDropAccepted(Pane *, QString))); connect(m_paneStack, SIGNAL(paneDeleteButtonClicked(Pane *)), this, SLOT(paneDeleteButtonClicked(Pane *))); m_playSource = new AudioCallbackPlaySource(m_viewManager, QApplication::applicationName()); connect(m_playSource, SIGNAL(sampleRateMismatch(size_t, size_t, bool)), this, SLOT(sampleRateMismatch(size_t, size_t, bool))); connect(m_playSource, SIGNAL(audioOverloadPluginDisabled()), this, SLOT(audioOverloadPluginDisabled())); connect(m_playSource, SIGNAL(audioTimeStretchMultiChannelDisabled()), this, SLOT(audioTimeStretchMultiChannelDisabled())); connect(m_viewManager, SIGNAL(outputLevelsChanged(float, float)), this, SLOT(outputLevelsChanged(float, float))); connect(m_viewManager, SIGNAL(playbackFrameChanged(unsigned long)), this, SLOT(playbackFrameChanged(unsigned long))); connect(m_viewManager, SIGNAL(globalCentreFrameChanged(unsigned long)), this, SLOT(globalCentreFrameChanged(unsigned long))); connect(m_viewManager, SIGNAL(viewCentreFrameChanged(View *, unsigned long)), this, SLOT(viewCentreFrameChanged(View *, unsigned long))); connect(m_viewManager, SIGNAL(viewZoomLevelChanged(View *, unsigned long, bool)), this, SLOT(viewZoomLevelChanged(View *, unsigned long, bool))); connect(Preferences::getInstance(), SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); Labeller::ValueType labellerType = Labeller::ValueFromTwoLevelCounter; settings.beginGroup("MainWindow"); labellerType = (Labeller::ValueType) settings.value("labellertype", (int)labellerType).toInt(); int cycle = settings.value("labellercycle", 4).toInt(); settings.endGroup(); m_labeller = new Labeller(labellerType); m_labeller->setCounterCycleSize(cycle); if (withMIDIInput) { m_midiInput = new MIDIInput(QApplication::applicationName(), this); } } MainWindowBase::~MainWindowBase() { SVDEBUG << "MainWindowBase::~MainWindowBase" << endl; if (m_playTarget) m_playTarget->shutdown(); // delete m_playTarget; delete m_playSource; delete m_viewManager; delete m_oscQueue; delete m_oscQueueStarter; delete m_midiInput; Profiles::getInstance()->dump(); } void MainWindowBase::resizeConstrained(QSize size) { QDesktopWidget *desktop = QApplication::desktop(); QRect available = desktop->availableGeometry(); QSize actual(std::min(size.width(), available.width()), std::min(size.height(), available.height())); resize(actual); } void MainWindowBase::startOSCQueue() { m_oscQueueStarter = new OSCQueueStarter(this); connect(m_oscQueueStarter, SIGNAL(finished()), this, SLOT(oscReady())); m_oscQueueStarter->start(); } void MainWindowBase::oscReady() { if (m_oscQueue && m_oscQueue->isOK()) { connect(m_oscQueue, SIGNAL(messagesAvailable()), this, SLOT(pollOSC())); QTimer *oscTimer = new QTimer(this); connect(oscTimer, SIGNAL(timeout()), this, SLOT(pollOSC())); oscTimer->start(1000); cerr << "Finished setting up OSC interface" << endl; } } QString MainWindowBase::getOpenFileName(FileFinder::FileType type) { FileFinder *ff = FileFinder::getInstance(); switch (type) { case FileFinder::SessionFile: return ff->getOpenFileName(type, m_sessionFile); case FileFinder::AudioFile: return ff->getOpenFileName(type, m_audioFile); case FileFinder::LayerFile: return ff->getOpenFileName(type, m_sessionFile); case FileFinder::LayerFileNoMidi: return ff->getOpenFileName(type, m_sessionFile); case FileFinder::SessionOrAudioFile: return ff->getOpenFileName(type, m_sessionFile); case FileFinder::ImageFile: return ff->getOpenFileName(type, m_sessionFile); case FileFinder::CSVFile: return ff->getOpenFileName(type, m_sessionFile); case FileFinder::AnyFile: if (getMainModel() != 0 && m_paneStack != 0 && m_paneStack->getCurrentPane() != 0) { // can import a layer return ff->getOpenFileName(FileFinder::AnyFile, m_sessionFile); } else { return ff->getOpenFileName(FileFinder::SessionOrAudioFile, m_sessionFile); } } return ""; } QString MainWindowBase::getSaveFileName(FileFinder::FileType type) { FileFinder *ff = FileFinder::getInstance(); switch (type) { case FileFinder::SessionFile: return ff->getSaveFileName(type, m_sessionFile); case FileFinder::AudioFile: return ff->getSaveFileName(type, m_audioFile); case FileFinder::LayerFile: return ff->getSaveFileName(type, m_sessionFile); case FileFinder::LayerFileNoMidi: return ff->getSaveFileName(type, m_sessionFile); case FileFinder::SessionOrAudioFile: return ff->getSaveFileName(type, m_sessionFile); case FileFinder::ImageFile: return ff->getSaveFileName(type, m_sessionFile); case FileFinder::CSVFile: return ff->getSaveFileName(type, m_sessionFile); case FileFinder::AnyFile: return ff->getSaveFileName(type, m_sessionFile); } return ""; } void MainWindowBase::registerLastOpenedFilePath(FileFinder::FileType type, QString path) { FileFinder *ff = FileFinder::getInstance(); ff->registerLastOpenedFilePath(type, path); } QString MainWindowBase::getDefaultSessionTemplate() const { QSettings settings; settings.beginGroup("MainWindow"); QString templateName = settings.value("sessiontemplate", "").toString(); if (templateName == "") templateName = "default"; return templateName; } void MainWindowBase::setDefaultSessionTemplate(QString n) { QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("sessiontemplate", n); } void MainWindowBase::updateMenuStates() { Pane *currentPane = 0; Layer *currentLayer = 0; if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentLayer = currentPane->getSelectedLayer(); bool havePrevPane = false, haveNextPane = false; bool havePrevLayer = false, haveNextLayer = false; if (currentPane) { for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { if (m_paneStack->getPane(i) == currentPane) { if (i > 0) havePrevPane = true; if (i < m_paneStack->getPaneCount()-1) haveNextPane = true; break; } } if (currentLayer) { for (int i = 0; i < currentPane->getLayerCount(); ++i) { if (currentPane->getLayer(i) == currentLayer) { if (i > 0) havePrevLayer = true; if (i < currentPane->getLayerCount()-1) haveNextLayer = true; break; } } } } bool haveCurrentPane = (currentPane != 0); bool haveCurrentLayer = (haveCurrentPane && (currentLayer != 0)); bool haveMainModel = (getMainModel() != 0); bool havePlayTarget = (m_playTarget != 0); bool haveSelection = (m_viewManager && !m_viewManager->getSelections().empty()); bool haveCurrentEditableLayer = (haveCurrentLayer && currentLayer->isLayerEditable()); bool haveCurrentTimeInstantsLayer = (haveCurrentLayer && dynamic_cast(currentLayer)); bool haveCurrentDurationLayer = (haveCurrentLayer && (dynamic_cast(currentLayer) || dynamic_cast(currentLayer))); bool haveCurrentColour3DPlot = (haveCurrentLayer && dynamic_cast(currentLayer)); bool haveClipboardContents = (m_viewManager && !m_viewManager->getClipboard().empty()); bool haveTabularLayer = (haveCurrentLayer && dynamic_cast(currentLayer->getModel())); emit canAddPane(haveMainModel); emit canDeleteCurrentPane(haveCurrentPane); emit canZoom(haveMainModel && haveCurrentPane); emit canScroll(haveMainModel && haveCurrentPane); emit canAddLayer(haveMainModel && haveCurrentPane); emit canImportMoreAudio(haveMainModel); emit canReplaceMainAudio(haveMainModel); emit canImportLayer(haveMainModel && haveCurrentPane); emit canExportAudio(haveMainModel); emit canChangeSessionTemplate(haveMainModel); emit canExportLayer(haveMainModel && (haveCurrentEditableLayer || haveCurrentColour3DPlot)); emit canExportImage(haveMainModel && haveCurrentPane); emit canDeleteCurrentLayer(haveCurrentLayer); emit canRenameLayer(haveCurrentLayer); emit canEditLayer(haveCurrentEditableLayer); emit canEditLayerTabular(haveCurrentEditableLayer || haveTabularLayer); emit canMeasureLayer(haveCurrentLayer); emit canSelect(haveMainModel && haveCurrentPane); emit canPlay(haveMainModel && havePlayTarget); emit canFfwd(true); emit canRewind(true); emit canPaste(haveClipboardContents); emit canInsertInstant(haveCurrentPane); emit canInsertInstantsAtBoundaries(haveCurrentPane && haveSelection); emit canInsertItemAtSelection(haveCurrentPane && haveSelection && haveCurrentDurationLayer); emit canRenumberInstants(haveCurrentTimeInstantsLayer && haveSelection); emit canPlaySelection(haveMainModel && havePlayTarget && haveSelection); emit canClearSelection(haveSelection); emit canEditSelection(haveSelection && haveCurrentEditableLayer); emit canSave(m_sessionFile != "" && m_documentModified); emit canSelectPreviousPane(havePrevPane); emit canSelectNextPane(haveNextPane); emit canSelectPreviousLayer(havePrevLayer); emit canSelectNextLayer(haveNextLayer); } void MainWindowBase::documentModified() { // SVDEBUG << "MainWindowBase::documentModified" << endl; if (!m_documentModified) { //!!! this in subclass implementation? setWindowTitle(tr("%1 (modified)").arg(windowTitle())); } m_documentModified = true; updateMenuStates(); } void MainWindowBase::documentRestored() { // SVDEBUG << "MainWindowBase::documentRestored" << endl; if (m_documentModified) { //!!! this in subclass implementation? QString wt(windowTitle()); wt.replace(tr(" (modified)"), ""); setWindowTitle(wt); } m_documentModified = false; updateMenuStates(); } void MainWindowBase::playLoopToggled() { QAction *action = dynamic_cast(sender()); if (action) { m_viewManager->setPlayLoopMode(action->isChecked()); } else { m_viewManager->setPlayLoopMode(!m_viewManager->getPlayLoopMode()); } } void MainWindowBase::playSelectionToggled() { QAction *action = dynamic_cast(sender()); if (action) { m_viewManager->setPlaySelectionMode(action->isChecked()); } else { m_viewManager->setPlaySelectionMode(!m_viewManager->getPlaySelectionMode()); } } void MainWindowBase::playSoloToggled() { QAction *action = dynamic_cast(sender()); if (action) { m_viewManager->setPlaySoloMode(action->isChecked()); } else { m_viewManager->setPlaySoloMode(!m_viewManager->getPlaySoloMode()); } if (m_viewManager->getPlaySoloMode()) { currentPaneChanged(m_paneStack->getCurrentPane()); } else { m_viewManager->setPlaybackModel(0); if (m_playSource) { m_playSource->clearSoloModelSet(); } } } void MainWindowBase::currentPaneChanged(Pane *p) { updateMenuStates(); updateVisibleRangeDisplay(p); if (!p) return; if (!(m_viewManager && m_playSource && m_viewManager->getPlaySoloMode())) { if (m_viewManager) m_viewManager->setPlaybackModel(0); return; } Model *prevPlaybackModel = m_viewManager->getPlaybackModel(); // What we want here is not the currently playing frame (unless we // are about to clear out the audio playback buffers -- which may // or may not be possible, depending on the audio driver). What // we want is the frame that was last committed to the soundcard // buffers, as the audio driver will continue playing up to that // frame before switching to whichever one we decide we want to // switch to, regardless of our efforts. int frame = m_playSource->getCurrentBufferedFrame(); // cerr << "currentPaneChanged: current frame (in ref model) = " << frame << endl; View::ModelSet soloModels = p->getModels(); View::ModelSet sources; for (View::ModelSet::iterator mi = soloModels.begin(); mi != soloModels.end(); ++mi) { // If a model in this pane is derived from something else, // then we want to play that model as well -- if the model // that's derived from it is not something that is itself // individually playable (e.g. a waveform) if (*mi && !dynamic_cast(*mi) && (*mi)->getSourceModel()) { sources.insert((*mi)->getSourceModel()); } } for (View::ModelSet::iterator mi = sources.begin(); mi != sources.end(); ++mi) { soloModels.insert(*mi); } //!!! Need an "atomic" way of telling the play source that the //playback model has changed, and changing it on ViewManager -- //the play source should be making the setPlaybackModel call to //ViewManager for (View::ModelSet::iterator mi = soloModels.begin(); mi != soloModels.end(); ++mi) { if (dynamic_cast(*mi)) { m_viewManager->setPlaybackModel(*mi); } } RangeSummarisableTimeValueModel *a = dynamic_cast(prevPlaybackModel); RangeSummarisableTimeValueModel *b = dynamic_cast(m_viewManager-> getPlaybackModel()); m_playSource->setSoloModelSet(soloModels); if (a && b && (a != b)) { if (m_playSource->isPlaying()) m_playSource->play(frame); } } void MainWindowBase::currentLayerChanged(Pane *p, Layer *) { updateMenuStates(); updateVisibleRangeDisplay(p); } void MainWindowBase::selectAll() { if (!getMainModel()) return; m_viewManager->setSelection(Selection(getMainModel()->getStartFrame(), getMainModel()->getEndFrame())); } void MainWindowBase::selectToStart() { if (!getMainModel()) return; m_viewManager->setSelection(Selection(getMainModel()->getStartFrame(), m_viewManager->getGlobalCentreFrame())); } void MainWindowBase::selectToEnd() { if (!getMainModel()) return; m_viewManager->setSelection(Selection(m_viewManager->getGlobalCentreFrame(), getMainModel()->getEndFrame())); } void MainWindowBase::selectVisible() { Model *model = getMainModel(); if (!model) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; size_t startFrame, endFrame; if (currentPane->getStartFrame() < 0) startFrame = 0; else startFrame = currentPane->getStartFrame(); if (currentPane->getEndFrame() > model->getEndFrame()) endFrame = model->getEndFrame(); else endFrame = currentPane->getEndFrame(); m_viewManager->setSelection(Selection(startFrame, endFrame)); } void MainWindowBase::clearSelection() { m_viewManager->clearSelections(); } void MainWindowBase::cut() { Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Layer *layer = currentPane->getSelectedLayer(); if (!layer) return; Clipboard &clipboard = m_viewManager->getClipboard(); clipboard.clear(); MultiSelection::SelectionList selections = m_viewManager->getSelections(); CommandHistory::getInstance()->startCompoundOperation(tr("Cut"), true); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { layer->copy(currentPane, *i, clipboard); layer->deleteSelection(*i); } CommandHistory::getInstance()->endCompoundOperation(); } void MainWindowBase::copy() { Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Layer *layer = currentPane->getSelectedLayer(); if (!layer) return; Clipboard &clipboard = m_viewManager->getClipboard(); clipboard.clear(); MultiSelection::SelectionList selections = m_viewManager->getSelections(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { layer->copy(currentPane, *i, clipboard); } } void MainWindowBase::paste() { pasteRelative(0); } void MainWindowBase::pasteAtPlaybackPosition() { unsigned long pos = getFrame(); Clipboard &clipboard = m_viewManager->getClipboard(); if (!clipboard.empty()) { long firstEventFrame = clipboard.getPoints()[0].getFrame(); long offset = 0; if (firstEventFrame < 0) { offset = (long)pos - firstEventFrame; } else if (firstEventFrame < pos) { offset = pos - (unsigned long)firstEventFrame; } else { offset = -((unsigned long)firstEventFrame - pos); } pasteRelative(offset); } } void MainWindowBase::pasteRelative(int offset) { Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Layer *layer = currentPane->getSelectedLayer(); Clipboard &clipboard = m_viewManager->getClipboard(); bool inCompound = false; if (!layer || !layer->isLayerEditable()) { CommandHistory::getInstance()->startCompoundOperation (tr("Paste"), true); // no suitable current layer: create one of the most // appropriate sort LayerFactory::LayerType type = LayerFactory::getInstance()->getLayerTypeForClipboardContents(clipboard); layer = m_document->createEmptyLayer(type); if (!layer) { CommandHistory::getInstance()->endCompoundOperation(); return; } m_document->addLayerToView(currentPane, layer); m_paneStack->setCurrentLayer(currentPane, layer); inCompound = true; } layer->paste(currentPane, clipboard, offset, true); if (inCompound) CommandHistory::getInstance()->endCompoundOperation(); } void MainWindowBase::deleteSelected() { if (m_paneStack->getCurrentPane() && m_paneStack->getCurrentPane()->getSelectedLayer()) { Layer *layer = m_paneStack->getCurrentPane()->getSelectedLayer(); if (m_viewManager && (m_viewManager->getToolMode() == ViewManager::MeasureMode)) { layer->deleteCurrentMeasureRect(); } else { MultiSelection::SelectionList selections = m_viewManager->getSelections(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { layer->deleteSelection(*i); } } } } // FrameTimer method unsigned long MainWindowBase::getFrame() const { if (m_playSource && m_playSource->isPlaying()) { return m_playSource->getCurrentPlayingFrame(); } else { return m_viewManager->getPlaybackFrame(); } } void MainWindowBase::insertInstant() { insertInstantAt(getFrame()); } void MainWindowBase::insertInstantsAtBoundaries() { MultiSelection::SelectionList selections = m_viewManager->getSelections(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { size_t start = i->getStartFrame(); size_t end = i->getEndFrame(); if (start != end) { insertInstantAt(start); insertInstantAt(end); } } } void MainWindowBase::insertInstantAt(size_t frame) { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { return; } frame = pane->alignFromReference(frame); Layer *layer = dynamic_cast (pane->getSelectedLayer()); if (!layer) { for (int i = pane->getLayerCount(); i > 0; --i) { layer = dynamic_cast(pane->getLayer(i - 1)); if (layer) break; } if (!layer) { CommandHistory::getInstance()->startCompoundOperation (tr("Add Point"), true); layer = m_document->createEmptyLayer(LayerFactory::TimeInstants); if (layer) { m_document->addLayerToView(pane, layer); m_paneStack->setCurrentLayer(pane, layer); } CommandHistory::getInstance()->endCompoundOperation(); } } if (layer) { Model *model = layer->getModel(); SparseOneDimensionalModel *sodm = dynamic_cast (model); if (sodm) { SparseOneDimensionalModel::Point point(frame, ""); SparseOneDimensionalModel::Point prevPoint(0); bool havePrevPoint = false; SparseOneDimensionalModel::EditCommand *command = new SparseOneDimensionalModel::EditCommand(sodm, tr("Add Point")); if (m_labeller->requiresPrevPoint()) { SparseOneDimensionalModel::PointList prevPoints = sodm->getPreviousPoints(frame); if (!prevPoints.empty()) { prevPoint = *prevPoints.begin(); havePrevPoint = true; } } if (m_labeller) { m_labeller->setSampleRate(sodm->getSampleRate()); if (m_labeller->actingOnPrevPoint()) { command->deletePoint(prevPoint); } m_labeller->label (point, havePrevPoint ? &prevPoint : 0); if (m_labeller->actingOnPrevPoint()) { command->addPoint(prevPoint); } } command->addPoint(point); command->setName(tr("Add Point at %1 s") .arg(RealTime::frame2RealTime (frame, sodm->getSampleRate()) .toText(false).c_str())); Command *c = command->finish(); if (c) CommandHistory::getInstance()->addCommand(c, false); } } } void MainWindowBase::insertItemAtSelection() { MultiSelection::SelectionList selections = m_viewManager->getSelections(); for (MultiSelection::SelectionList::iterator i = selections.begin(); i != selections.end(); ++i) { size_t start = i->getStartFrame(); size_t end = i->getEndFrame(); if (start < end) { insertItemAt(start, end - start); } } } void MainWindowBase::insertItemAt(size_t frame, size_t duration) { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { return; } // ugh! size_t alignedStart = pane->alignFromReference(frame); size_t alignedEnd = pane->alignFromReference(frame + duration); if (alignedStart >= alignedEnd) return; size_t alignedDuration = alignedEnd - alignedStart; Command *c = 0; QString name = tr("Add Item at %1 s") .arg(RealTime::frame2RealTime (alignedStart, getMainModel()->getSampleRate()) .toText(false).c_str()); Layer *layer = pane->getSelectedLayer(); if (!layer) return; RegionModel *rm = dynamic_cast(layer->getModel()); if (rm) { RegionModel::Point point(alignedStart, rm->getValueMaximum() + 1, alignedDuration, ""); RegionModel::EditCommand *command = new RegionModel::EditCommand(rm, tr("Add Point")); command->addPoint(point); command->setName(name); c = command->finish(); } if (c) { CommandHistory::getInstance()->addCommand(c, false); return; } NoteModel *nm = dynamic_cast(layer->getModel()); if (nm) { NoteModel::Point point(alignedStart, rm->getValueMinimum(), alignedDuration, 1.f, ""); NoteModel::EditCommand *command = new NoteModel::EditCommand(nm, tr("Add Point")); command->addPoint(point); command->setName(name); c = command->finish(); } if (c) { CommandHistory::getInstance()->addCommand(c, false); return; } } void MainWindowBase::renumberInstants() { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return; Layer *layer = dynamic_cast(pane->getSelectedLayer()); if (!layer) return; MultiSelection ms(m_viewManager->getSelection()); Model *model = layer->getModel(); SparseOneDimensionalModel *sodm = dynamic_cast (model); if (!sodm) return; if (!m_labeller) return; Labeller labeller(*m_labeller); labeller.setSampleRate(sodm->getSampleRate()); // This uses a command labeller.labelAll(*sodm, &ms); } MainWindowBase::FileOpenStatus MainWindowBase::open(QString fileOrUrl, AudioFileOpenMode mode) { ProgressDialog dialog(tr("Opening file or URL..."), true, 2000, this); connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); return open(FileSource(fileOrUrl, &dialog), mode); } MainWindowBase::FileOpenStatus MainWindowBase::open(FileSource source, AudioFileOpenMode mode) { FileOpenStatus status; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); bool canImportLayer = (getMainModel() != 0 && m_paneStack != 0 && m_paneStack->getCurrentPane() != 0); bool rdf = (source.getExtension().toLower() == "rdf" || source.getExtension().toLower() == "n3" || source.getExtension().toLower() == "ttl"); bool audio = AudioFileReaderFactory::getKnownExtensions().contains (source.getExtension().toLower()); bool rdfSession = false; if (rdf) { RDFImporter::RDFDocumentType rdfType = RDFImporter::identifyDocumentType (QUrl::fromLocalFile(source.getLocalFilename()).toString()); // cerr << "RDF type: " << (int)rdfType << endl; if (rdfType == RDFImporter::AudioRefAndAnnotations || rdfType == RDFImporter::AudioRef) { rdfSession = true; } else if (rdfType == RDFImporter::NotRDF) { rdf = false; } } if (rdf) { if (rdfSession) { bool cancel = false; if (!canImportLayer || shouldCreateNewSessionForRDFAudio(&cancel)) { return openSession(source); } else if (cancel) { return FileOpenCancelled; } else { return openLayer(source); } } else { if ((status = openSession(source)) != FileOpenFailed) { return status; } else if (!canImportLayer) { return FileOpenWrongMode; } else if ((status = openLayer(source)) != FileOpenFailed) { return status; } else { return FileOpenFailed; } } } if (audio && (status = openAudio(source, mode)) != FileOpenFailed) { return status; } else if ((status = openSession(source)) != FileOpenFailed) { return status; } else if ((status = openPlaylist(source, mode)) != FileOpenFailed) { return status; } else if (!canImportLayer) { return FileOpenWrongMode; } else if ((status = openImage(source)) != FileOpenFailed) { return status; } else if ((status = openLayer(source)) != FileOpenFailed) { return status; } else { return FileOpenFailed; } } MainWindowBase::FileOpenStatus MainWindowBase::openAudio(FileSource source, AudioFileOpenMode mode, QString templateName) { // SVDEBUG << "MainWindowBase::openAudio(" << source.getLocation() << ")" << endl; if (templateName == "") { templateName = getDefaultSessionTemplate(); } cerr << "template is: \"" << templateName << "\"" << endl; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); m_openingAudioFile = true; size_t rate = 0; if (Preferences::getInstance()->getResampleOnLoad()) { rate = m_playSource->getSourceSampleRate(); } WaveFileModel *newModel = new WaveFileModel(source, rate); if (!newModel->isOK()) { delete newModel; m_openingAudioFile = false; return FileOpenFailed; } // cerr << "mode = " << mode << endl; if (mode == AskUser) { if (getMainModel()) { QSettings settings; settings.beginGroup("MainWindow"); int lastMode = settings.value("lastaudioopenmode", 0).toBool(); settings.endGroup(); int imode = 0; QStringList items; items << tr("Close the current session and start a new one") << tr("Replace the main audio file in this session") << tr("Add the audio file to this session"); bool ok = false; QString item = ListInputDialog::getItem (this, tr("Select target for import"), tr("Select a target for import

You already have an audio file loaded.
What would you like to do with the new audio file?"), items, lastMode, &ok); if (!ok || item.isEmpty()) { delete newModel; m_openingAudioFile = false; return FileOpenCancelled; } for (int i = 0; i < items.size(); ++i) { if (item == items[i]) imode = i; } settings.beginGroup("MainWindow"); settings.setValue("lastaudioopenmode", imode); settings.endGroup(); mode = (AudioFileOpenMode)imode; } else { // no main model: make a new session mode = ReplaceSession; } } if (mode == ReplaceCurrentPane) { Pane *pane = m_paneStack->getCurrentPane(); if (pane) { if (getMainModel()) { View::ModelSet models(pane->getModels()); if (models.find(getMainModel()) != models.end()) { // Current pane contains main model: replace that mode = ReplaceMainModel; } // Otherwise the current pane has a non-default model, // which we will deal with later } else { // We have no main model, so start a new session with // optional template mode = ReplaceSession; } } else { // We seem to have no current pane! Oh well mode = CreateAdditionalModel; } } if (mode == CreateAdditionalModel && !getMainModel()) { mode = ReplaceSession; } bool loadedTemplate = false; if (mode == ReplaceSession) { if (!checkSaveModified()) return FileOpenCancelled; cerr << "SV looking for template " << templateName << endl; if (templateName != "") { FileOpenStatus tplStatus = openSessionTemplate(templateName); if (tplStatus == FileOpenCancelled) { cerr << "Template load cancelled" << endl; return FileOpenCancelled; } if (tplStatus != FileOpenFailed) { cerr << "Template load succeeded" << endl; loadedTemplate = true; } } if (!loadedTemplate) { closeSession(); createDocument(); } mode = ReplaceMainModel; } emit activity(tr("Import audio file \"%1\"").arg(source.getLocation())); if (mode == ReplaceMainModel) { Model *prevMain = getMainModel(); if (prevMain) { m_playSource->removeModel(prevMain); PlayParameterRepository::getInstance()->removePlayable(prevMain); } PlayParameterRepository::getInstance()->addPlayable(newModel); SVDEBUG << "SV about to call setMainModel(" << newModel << "): prevMain is " << prevMain << endl; m_document->setMainModel(newModel); setupMenus(); if (loadedTemplate || (m_sessionFile == "")) { //!!! shouldn't be dealing directly with title from here -- call a method setWindowTitle(tr("%1: %2") .arg(QApplication::applicationName()) .arg(source.getLocation())); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); m_documentModified = false; } else { setWindowTitle(tr("%1: %2 [%3]") .arg(QApplication::applicationName()) .arg(QFileInfo(m_sessionFile).fileName()) .arg(source.getLocation())); if (m_documentModified) { m_documentModified = false; documentModified(); // so as to restore "(modified)" window title } } if (!source.isRemote()) m_audioFile = source.getLocalFilename(); } else if (mode == CreateAdditionalModel) { CommandHistory::getInstance()->startCompoundOperation (tr("Import \"%1\"").arg(source.getBasename()), true); m_document->addImportedModel(newModel); AddPaneCommand *command = new AddPaneCommand(this); CommandHistory::getInstance()->addCommand(command); Pane *pane = command->getPane(); if (m_timeRulerLayer) { m_document->addLayerToView(pane, m_timeRulerLayer); } Layer *newLayer = m_document->createImportedLayer(newModel); if (newLayer) { m_document->addLayerToView(pane, newLayer); } CommandHistory::getInstance()->endCompoundOperation(); } else if (mode == ReplaceCurrentPane) { // We know there is a current pane, otherwise we would have // reset the mode to CreateAdditionalModel above; and we know // the current pane does not contain the main model, otherwise // we would have reset it to ReplaceMainModel. But we don't // know whether the pane contains a waveform model at all. Pane *pane = m_paneStack->getCurrentPane(); Layer *replace = 0; for (int i = 0; i < pane->getLayerCount(); ++i) { Layer *layer = pane->getLayer(i); if (dynamic_cast(layer)) { replace = layer; break; } } CommandHistory::getInstance()->startCompoundOperation (tr("Import \"%1\"").arg(source.getBasename()), true); m_document->addImportedModel(newModel); if (replace) { m_document->removeLayerFromView(pane, replace); } Layer *newLayer = m_document->createImportedLayer(newModel); if (newLayer) { m_document->addLayerToView(pane, newLayer); } CommandHistory::getInstance()->endCompoundOperation(); } updateMenuStates(); m_recentFiles.addFile(source.getLocation()); if (!source.isRemote()) { // for file dialog registerLastOpenedFilePath(FileFinder::AudioFile, source.getLocalFilename()); } m_openingAudioFile = false; currentPaneChanged(m_paneStack->getCurrentPane()); return FileOpenSucceeded; } MainWindowBase::FileOpenStatus MainWindowBase::openPlaylist(FileSource source, AudioFileOpenMode mode) { SVDEBUG << "MainWindowBase::openPlaylist(" << source.getLocation() << ")" << endl; std::set extensions; PlaylistFileReader::getSupportedExtensions(extensions); QString extension = source.getExtension().toLower(); if (extensions.find(extension) == extensions.end()) return FileOpenFailed; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); PlaylistFileReader reader(source.getLocalFilename()); if (!reader.isOK()) return FileOpenFailed; PlaylistFileReader::Playlist playlist = reader.load(); bool someSuccess = false; for (PlaylistFileReader::Playlist::const_iterator i = playlist.begin(); i != playlist.end(); ++i) { ProgressDialog dialog(tr("Opening playlist..."), true, 2000, this); connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); FileOpenStatus status = openAudio(FileSource(*i, &dialog), mode); if (status == FileOpenCancelled) { return FileOpenCancelled; } if (status == FileOpenSucceeded) { someSuccess = true; mode = CreateAdditionalModel; } } if (someSuccess) return FileOpenSucceeded; else return FileOpenFailed; } MainWindowBase::FileOpenStatus MainWindowBase::openLayer(FileSource source) { SVDEBUG << "MainWindowBase::openLayer(" << source.getLocation() << ")" << endl; Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindowBase::openLayer: no current pane" << endl; return FileOpenWrongMode; } if (!getMainModel()) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindowBase::openLayer: No main model -- hence no default sample rate available" << endl; return FileOpenWrongMode; } if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); QString path = source.getLocalFilename(); RDFImporter::RDFDocumentType rdfType = RDFImporter::identifyDocumentType(QUrl::fromLocalFile(path).toString()); // cerr << "RDF type: (in layer) " << (int) rdfType << endl; if (rdfType != RDFImporter::NotRDF) { return openLayersFromRDF(source); } else if (source.getExtension().toLower() == "svl" || (source.getExtension().toLower() == "xml" && (SVFileReader::identifyXmlFile(source.getLocalFilename()) == SVFileReader::SVLayerFile))) { PaneCallback callback(this); QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { cerr << "ERROR: MainWindowBase::openLayer(" << source.getLocation() << "): Failed to open file for reading" << endl; return FileOpenFailed; } SVFileReader reader(m_document, callback, source.getLocation()); connect (&reader, SIGNAL(modelRegenerationFailed(QString, QString, QString)), this, SLOT(modelRegenerationFailed(QString, QString, QString))); connect (&reader, SIGNAL(modelRegenerationWarning(QString, QString, QString)), this, SLOT(modelRegenerationWarning(QString, QString, QString))); reader.setCurrentPane(pane); QXmlInputSource inputSource(&file); reader.parse(inputSource); if (!reader.isOK()) { cerr << "ERROR: MainWindowBase::openLayer(" << source.getLocation() << "): Failed to read XML file: " << reader.getErrorString() << endl; return FileOpenFailed; } emit activity(tr("Import layer XML file \"%1\"").arg(source.getLocation())); m_recentFiles.addFile(source.getLocation()); if (!source.isRemote()) { registerLastOpenedFilePath(FileFinder::LayerFile, path); // for file dialog } return FileOpenSucceeded; } else { try { MIDIFileImportDialog midiDlg(this); Model *model = DataFileReaderFactory::loadNonCSV (path, &midiDlg, getMainModel()->getSampleRate()); if (!model) { CSVFormat format(path); format.setSampleRate(getMainModel()->getSampleRate()); CSVFormatDialog *dialog = new CSVFormatDialog(this, format); if (dialog->exec() == QDialog::Accepted) { model = DataFileReaderFactory::loadCSV (path, dialog->getFormat(), getMainModel()->getSampleRate()); } } if (model) { SVDEBUG << "MainWindowBase::openLayer: Have model" << endl; emit activity(tr("Import MIDI file \"%1\"").arg(source.getLocation())); Layer *newLayer = m_document->createImportedLayer(model); if (newLayer) { m_document->addLayerToView(pane, newLayer); m_paneStack->setCurrentLayer(pane, newLayer); m_recentFiles.addFile(source.getLocation()); if (!source.isRemote()) { registerLastOpenedFilePath (FileFinder::LayerFile, path); // for file dialog } return FileOpenSucceeded; } } } catch (DataFileReaderFactory::Exception e) { if (e == DataFileReaderFactory::ImportCancelled) { return FileOpenCancelled; } } } return FileOpenFailed; } MainWindowBase::FileOpenStatus MainWindowBase::openImage(FileSource source) { SVDEBUG << "MainWindowBase::openImage(" << source.getLocation() << ")" << endl; Pane *pane = m_paneStack->getCurrentPane(); if (!pane) { // shouldn't happen, as the menu action should have been disabled cerr << "WARNING: MainWindowBase::openImage: no current pane" << endl; return FileOpenWrongMode; } if (!m_document->getMainModel()) { return FileOpenWrongMode; } bool newLayer = false; ImageLayer *il = dynamic_cast(pane->getSelectedLayer()); if (!il) { for (int i = pane->getLayerCount()-1; i >= 0; --i) { il = dynamic_cast(pane->getLayer(i)); if (il) break; } } if (!il) { il = dynamic_cast (m_document->createEmptyLayer(LayerFactory::Image)); if (!il) return FileOpenFailed; newLayer = true; } // We don't put the image file in Recent Files cerr << "openImage: trying location \"" << source.getLocation() << "\" in image layer" << endl; if (!il->addImage(m_viewManager->getGlobalCentreFrame(), source.getLocation())) { if (newLayer) { m_document->deleteLayer(il); // also releases its model } return FileOpenFailed; } else { if (newLayer) { m_document->addLayerToView(pane, il); } m_paneStack->setCurrentLayer(pane, il); } return FileOpenSucceeded; } MainWindowBase::FileOpenStatus MainWindowBase::openSessionFile(QString fileOrUrl) { ProgressDialog dialog(tr("Opening session..."), true, 2000, this); connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); return openSession(FileSource(fileOrUrl, &dialog)); } MainWindowBase::FileOpenStatus MainWindowBase::openSession(FileSource source) { SVDEBUG << "MainWindowBase::openSession(" << source.getLocation() << ")" << endl; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); if (source.getExtension().toLower() != "sv") { RDFImporter::RDFDocumentType rdfType = RDFImporter::identifyDocumentType (QUrl::fromLocalFile(source.getLocalFilename()).toString()); // cerr << "RDF type: " << (int)rdfType << endl; if (rdfType == RDFImporter::AudioRefAndAnnotations || rdfType == RDFImporter::AudioRef) { return openSessionFromRDF(source); } else if (rdfType != RDFImporter::NotRDF) { return FileOpenFailed; } if (source.getExtension().toLower() == "xml") { if (SVFileReader::identifyXmlFile(source.getLocalFilename()) == SVFileReader::SVSessionFile) { cerr << "This XML file looks like a session file, attempting to open it as a session" << endl; } else { return FileOpenFailed; } } else { return FileOpenFailed; } } QXmlInputSource *inputSource = 0; BZipFileDevice *bzFile = 0; QFile *rawFile = 0; if (source.getExtension().toLower() == "sv") { bzFile = new BZipFileDevice(source.getLocalFilename()); if (!bzFile->open(QIODevice::ReadOnly)) { delete bzFile; return FileOpenFailed; } inputSource = new QXmlInputSource(bzFile); } else { rawFile = new QFile(source.getLocalFilename()); inputSource = new QXmlInputSource(rawFile); } if (!checkSaveModified()) { if (bzFile) bzFile->close(); delete inputSource; delete bzFile; delete rawFile; return FileOpenCancelled; } QString error; closeSession(); createDocument(); PaneCallback callback(this); m_viewManager->clearSelections(); SVFileReader reader(m_document, callback, source.getLocation()); connect (&reader, SIGNAL(modelRegenerationFailed(QString, QString, QString)), this, SLOT(modelRegenerationFailed(QString, QString, QString))); connect (&reader, SIGNAL(modelRegenerationWarning(QString, QString, QString)), this, SLOT(modelRegenerationWarning(QString, QString, QString))); reader.parse(*inputSource); if (!reader.isOK()) { error = tr("SV XML file read error:\n%1").arg(reader.getErrorString()); } if (bzFile) bzFile->close(); delete inputSource; delete bzFile; delete rawFile; bool ok = (error == ""); if (ok) { emit activity(tr("Import session file \"%1\"").arg(source.getLocation())); setWindowTitle(tr("%1: %2") .arg(QApplication::applicationName()) .arg(source.getLocation())); if (!source.isRemote()) m_sessionFile = source.getLocalFilename(); setupMenus(); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); m_documentModified = false; updateMenuStates(); m_recentFiles.addFile(source.getLocation()); if (!source.isRemote()) { // for file dialog registerLastOpenedFilePath(FileFinder::SessionFile, source.getLocalFilename()); } } else { setWindowTitle(QApplication::applicationName()); } return ok ? FileOpenSucceeded : FileOpenFailed; } MainWindowBase::FileOpenStatus MainWindowBase::openSessionTemplate(QString templateName) { // Template in the user's template directory takes // priority over a bundled one; we don't unbundle, but // open directly from the bundled file (where applicable) ResourceFinder rf; QString tfile = rf.getResourcePath("templates", templateName + ".svt"); if (tfile != "") { cerr << "SV loading template file " << tfile << endl; return openSessionTemplate(FileSource("file:" + tfile)); } else { return FileOpenFailed; } } MainWindowBase::FileOpenStatus MainWindowBase::openSessionTemplate(FileSource source) { cerr << "MainWindowBase::openSessionTemplate(" << source.getLocation() << ")" << endl; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); QXmlInputSource *inputSource = 0; QFile *file = 0; bool isTemplate = false; file = new QFile(source.getLocalFilename()); inputSource = new QXmlInputSource(file); if (!checkSaveModified()) { delete inputSource; delete file; return FileOpenCancelled; } QString error; closeSession(); createDocument(); PaneCallback callback(this); m_viewManager->clearSelections(); SVFileReader reader(m_document, callback, source.getLocation()); connect (&reader, SIGNAL(modelRegenerationFailed(QString, QString, QString)), this, SLOT(modelRegenerationFailed(QString, QString, QString))); connect (&reader, SIGNAL(modelRegenerationWarning(QString, QString, QString)), this, SLOT(modelRegenerationWarning(QString, QString, QString))); reader.parse(*inputSource); if (!reader.isOK()) { error = tr("SV XML file read error:\n%1").arg(reader.getErrorString()); } delete inputSource; delete file; bool ok = (error == ""); setWindowTitle(QApplication::applicationName()); if (ok) { emit activity(tr("Open session template \"%1\"").arg(source.getLocation())); setupMenus(); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); m_documentModified = false; updateMenuStates(); } return ok ? FileOpenSucceeded : FileOpenFailed; } MainWindowBase::FileOpenStatus MainWindowBase::openSessionFromRDF(FileSource source) { SVDEBUG << "MainWindowBase::openSessionFromRDF(" << source.getLocation() << ")" << endl; if (!source.isAvailable()) return FileOpenFailed; source.waitForData(); if (!checkSaveModified()) { return FileOpenCancelled; } closeSession(); createDocument(); FileOpenStatus status = openLayersFromRDF(source); setupMenus(); setWindowTitle(tr("%1: %2") .arg(QApplication::applicationName()) .arg(source.getLocation())); CommandHistory::getInstance()->clear(); CommandHistory::getInstance()->documentSaved(); m_documentModified = false; return status; } MainWindowBase::FileOpenStatus MainWindowBase::openLayersFromRDF(FileSource source) { size_t rate = 0; SVDEBUG << "MainWindowBase::openLayersFromRDF" << endl; ProgressDialog dialog(tr("Importing from RDF..."), true, 2000, this); connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); if (getMainModel()) { rate = getMainModel()->getSampleRate(); } else if (Preferences::getInstance()->getResampleOnLoad()) { rate = m_playSource->getSourceSampleRate(); } RDFImporter importer (QUrl::fromLocalFile(source.getLocalFilename()).toString(), rate); if (!importer.isOK()) { if (importer.getErrorString() != "") { QMessageBox::critical (this, tr("Failed to import RDF"), tr("Failed to import RDF

Importing data from RDF document at \"%1\" failed: %2

") .arg(source.getLocation()).arg(importer.getErrorString())); } return FileOpenFailed; } std::vector models = importer.getDataModels(&dialog); dialog.setMessage(tr("Importing from RDF...")); if (models.empty()) { QMessageBox::critical (this, tr("Failed to import RDF"), tr("Failed to import RDF

No suitable data models found for import from RDF document at \"%1\"

").arg(source.getLocation())); return FileOpenFailed; } emit activity(tr("Import RDF document \"%1\"").arg(source.getLocation())); std::set added; for (int i = 0; i < (int)models.size(); ++i) { Model *m = models[i]; WaveFileModel *w = dynamic_cast(m); if (w) { Pane *pane = addPaneToStack(); Layer *layer = 0; if (m_timeRulerLayer) { m_document->addLayerToView(pane, m_timeRulerLayer); } if (!getMainModel()) { m_document->setMainModel(w); layer = m_document->createMainModelLayer(LayerFactory::Waveform); } else { layer = m_document->createImportedLayer(w); } m_document->addLayerToView(pane, layer); added.insert(w); for (int j = 0; j < (int)models.size(); ++j) { Model *dm = models[j]; if (dm == m) continue; if (dm->getSourceModel() != m) continue; layer = m_document->createImportedLayer(dm); if (layer->isLayerOpaque() || dynamic_cast(layer)) { // these always go in a new pane, with nothing // else going in the same pane Pane *singleLayerPane = addPaneToStack(); if (m_timeRulerLayer) { m_document->addLayerToView(singleLayerPane, m_timeRulerLayer); } m_document->addLayerToView(singleLayerPane, layer); } else if (layer->getLayerColourSignificance() == Layer::ColourHasMeaningfulValue) { // these can go in a pane with something else, but // only if none of the something elses also have // this quality bool needNewPane = false; for (int i = 0; i < pane->getLayerCount(); ++i) { Layer *otherLayer = pane->getLayer(i); if (otherLayer && (otherLayer->getLayerColourSignificance() == Layer::ColourHasMeaningfulValue)) { needNewPane = true; break; } } if (needNewPane) { pane = addPaneToStack(); } m_document->addLayerToView(pane, layer); } else { if (pane->getLayerCount() > 4) { pane = addPaneToStack(); } m_document->addLayerToView(pane, layer); } added.insert(dm); } } } for (int i = 0; i < (int)models.size(); ++i) { Model *m = models[i]; if (added.find(m) == added.end()) { Layer *layer = m_document->createImportedLayer(m); if (!layer) return FileOpenFailed; Pane *singleLayerPane = addPaneToStack(); if (m_timeRulerLayer) { m_document->addLayerToView(singleLayerPane, m_timeRulerLayer); } m_document->addLayerToView(singleLayerPane, layer); } } m_recentFiles.addFile(source.getLocation()); return FileOpenSucceeded; } void MainWindowBase::createPlayTarget() { if (m_playTarget) return; QSettings settings; settings.beginGroup("Preferences"); QString targetName = settings.value("audio-target", "").toString(); settings.endGroup(); AudioTargetFactory *factory = AudioTargetFactory::getInstance(); factory->setDefaultCallbackTarget(targetName); m_playTarget = factory->createCallbackTarget(m_playSource); if (!m_playTarget) { emit hideSplash(); if (factory->isAutoCallbackTarget(targetName)) { QMessageBox::warning (this, tr("Couldn't open audio device"), tr("No audio available

Could not open an audio device for playback.

Automatic audio device detection failed. Audio playback will not be available during this session.

"), QMessageBox::Ok); } else { QMessageBox::warning (this, tr("Couldn't open audio device"), tr("No audio available

Failed to open your preferred audio device (\"%1\").

Audio playback will not be available during this session.

") .arg(factory->getCallbackTargetDescription(targetName)), QMessageBox::Ok); } } } WaveFileModel * MainWindowBase::getMainModel() { if (!m_document) return 0; return m_document->getMainModel(); } const WaveFileModel * MainWindowBase::getMainModel() const { if (!m_document) return 0; return m_document->getMainModel(); } void MainWindowBase::createDocument() { m_document = new Document; connect(m_document, SIGNAL(layerAdded(Layer *)), this, SLOT(layerAdded(Layer *))); connect(m_document, SIGNAL(layerRemoved(Layer *)), this, SLOT(layerRemoved(Layer *))); connect(m_document, SIGNAL(layerAboutToBeDeleted(Layer *)), this, SLOT(layerAboutToBeDeleted(Layer *))); connect(m_document, SIGNAL(layerInAView(Layer *, bool)), this, SLOT(layerInAView(Layer *, bool))); connect(m_document, SIGNAL(modelAdded(Model *)), this, SLOT(modelAdded(Model *))); connect(m_document, SIGNAL(mainModelChanged(WaveFileModel *)), this, SLOT(mainModelChanged(WaveFileModel *))); connect(m_document, SIGNAL(modelAboutToBeDeleted(Model *)), this, SLOT(modelAboutToBeDeleted(Model *))); connect(m_document, SIGNAL(modelGenerationFailed(QString, QString)), this, SLOT(modelGenerationFailed(QString, QString))); connect(m_document, SIGNAL(modelRegenerationWarning(QString, QString, QString)), this, SLOT(modelRegenerationWarning(QString, QString, QString))); connect(m_document, SIGNAL(modelGenerationFailed(QString, QString)), this, SLOT(modelGenerationFailed(QString, QString))); connect(m_document, SIGNAL(modelRegenerationWarning(QString, QString, QString)), this, SLOT(modelRegenerationWarning(QString, QString, QString))); connect(m_document, SIGNAL(alignmentFailed(QString, QString)), this, SLOT(alignmentFailed(QString, QString))); emit replacedDocument(); } bool MainWindowBase::saveSessionFile(QString path) { try { TempWriteFile temp(path); BZipFileDevice bzFile(temp.getTemporaryFilename()); if (!bzFile.open(QIODevice::WriteOnly)) { cerr << "Failed to open session file \"" << temp.getTemporaryFilename() << "\" for writing: " << bzFile.errorString() << endl; return false; } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QTextStream out(&bzFile); toXml(out, false); out.flush(); QApplication::restoreOverrideCursor(); if (!bzFile.isOK()) { QMessageBox::critical(this, tr("Failed to write file"), tr("Save failed

Failed to write to file \"%1\": %2") .arg(path).arg(bzFile.errorString())); bzFile.close(); return false; } bzFile.close(); temp.moveToTarget(); return true; } catch (FileOperationFailed &f) { QMessageBox::critical(this, tr("Failed to write file"), tr("Save failed

Failed to write to file \"%1\": %2") .arg(path).arg(f.what())); return false; } } bool MainWindowBase::saveSessionTemplate(QString path) { try { TempWriteFile temp(path); QFile file(temp.getTemporaryFilename()); if (!file.open(QIODevice::WriteOnly)) { cerr << "Failed to open session template file \"" << temp.getTemporaryFilename() << "\" for writing: " << file.errorString() << endl; return false; } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QTextStream out(&file); toXml(out, true); out.flush(); QApplication::restoreOverrideCursor(); file.close(); temp.moveToTarget(); return true; } catch (FileOperationFailed &f) { QMessageBox::critical(this, tr("Failed to write file"), tr("Save failed

Failed to write to file \"%1\": %2") .arg(path).arg(f.what())); return false; } } void MainWindowBase::toXml(QTextStream &out, bool asTemplate) { QString indent(" "); out << "\n"; out << "\n"; out << "\n"; if (asTemplate) { m_document->toXmlAsTemplate(out, "", ""); } else { m_document->toXml(out, "", ""); } out << "\n"; out << QString(" \n") .arg(width()).arg(height()); for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (pane) { pane->toXml(out, indent); } } out << "\n"; m_viewManager->getSelection().toXml(out); out << "\n"; } Pane * MainWindowBase::addPaneToStack() { AddPaneCommand *command = new AddPaneCommand(this); CommandHistory::getInstance()->addCommand(command); Pane *pane = command->getPane(); return pane; } void MainWindowBase::zoomIn() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->zoom(true); } void MainWindowBase::zoomOut() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->zoom(false); } void MainWindowBase::zoomToFit() { Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Model *model = getMainModel(); if (!model) return; size_t start = model->getStartFrame(); size_t end = model->getEndFrame(); if (m_playSource) end = std::max(end, m_playSource->getPlayEndFrame()); size_t pixels = currentPane->width(); size_t sw = currentPane->getVerticalScaleWidth(); if (pixels > sw * 2) pixels -= sw * 2; else pixels = 1; if (pixels > 4) pixels -= 4; size_t zoomLevel = (end - start) / pixels; if (zoomLevel < 1) zoomLevel = 1; currentPane->setZoomLevel(zoomLevel); currentPane->setCentreFrame((start + end) / 2); } void MainWindowBase::zoomDefault() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->setZoomLevel(1024); } void MainWindowBase::scrollLeft() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(false, false); } void MainWindowBase::jumpLeft() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(false, true); } void MainWindowBase::peekLeft() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(false, false, false); } void MainWindowBase::scrollRight() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(true, false); } void MainWindowBase::jumpRight() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(true, true); } void MainWindowBase::peekRight() { Pane *currentPane = m_paneStack->getCurrentPane(); if (currentPane) currentPane->scroll(true, false, false); } void MainWindowBase::showNoOverlays() { m_viewManager->setOverlayMode(ViewManager::NoOverlays); } void MainWindowBase::showMinimalOverlays() { m_viewManager->setOverlayMode(ViewManager::MinimalOverlays); } void MainWindowBase::showAllOverlays() { m_viewManager->setOverlayMode(ViewManager::AllOverlays); } void MainWindowBase::toggleTimeRulers() { bool haveRulers = false; bool someHidden = false; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!dynamic_cast(layer)) continue; haveRulers = true; if (layer->isLayerDormant(pane)) someHidden = true; } } if (haveRulers) { bool show = someHidden; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *layer = pane->getLayer(j); if (!dynamic_cast(layer)) continue; layer->showLayer(pane, show); } } } } void MainWindowBase::toggleZoomWheels() { if (m_viewManager->getZoomWheelsEnabled()) { m_viewManager->setZoomWheelsEnabled(false); } else { m_viewManager->setZoomWheelsEnabled(true); } } void MainWindowBase::togglePropertyBoxes() { if (m_paneStack->getLayoutStyle() == PaneStack::NoPropertyStacks) { if (Preferences::getInstance()->getPropertyBoxLayout() == Preferences::VerticallyStacked) { m_paneStack->setLayoutStyle(PaneStack::PropertyStackPerPaneLayout); } else { m_paneStack->setLayoutStyle(PaneStack::SinglePropertyStackLayout); } } else { m_paneStack->setLayoutStyle(PaneStack::NoPropertyStacks); } } void MainWindowBase::toggleStatusBar() { QSettings settings; settings.beginGroup("MainWindow"); bool sb = settings.value("showstatusbar", true).toBool(); if (sb) { statusBar()->hide(); } else { statusBar()->show(); } settings.setValue("showstatusbar", !sb); settings.endGroup(); } void MainWindowBase::toggleCentreLine() { if (m_viewManager->shouldShowCentreLine()) { m_viewManager->setShowCentreLine(false); } else { m_viewManager->setShowCentreLine(true); } } void MainWindowBase::preferenceChanged(PropertyContainer::PropertyName name) { if (name == "Property Box Layout") { if (m_paneStack->getLayoutStyle() != PaneStack::NoPropertyStacks) { if (Preferences::getInstance()->getPropertyBoxLayout() == Preferences::VerticallyStacked) { m_paneStack->setLayoutStyle(PaneStack::PropertyStackPerPaneLayout); } else { m_paneStack->setLayoutStyle(PaneStack::SinglePropertyStackLayout); } } } else if (name == "Background Mode" && m_viewManager) { Preferences::BackgroundMode mode = Preferences::getInstance()->getBackgroundMode(); if (mode == Preferences::BackgroundFromTheme) { m_viewManager->setGlobalDarkBackground(m_initialDarkBackground); } else if (mode == Preferences::DarkBackground) { m_viewManager->setGlobalDarkBackground(true); } else { m_viewManager->setGlobalDarkBackground(false); } } } void MainWindowBase::play() { if (m_playSource->isPlaying()) { stop(); } else { playbackFrameChanged(m_viewManager->getPlaybackFrame()); m_playSource->play(m_viewManager->getPlaybackFrame()); } } void MainWindowBase::ffwd() { if (!getMainModel()) return; int frame = m_viewManager->getPlaybackFrame(); ++frame; Pane *pane = m_paneStack->getCurrentPane(); Layer *layer = getSnapLayer(); size_t sr = getMainModel()->getSampleRate(); if (!layer) { frame = RealTime::realTime2Frame (RealTime::frame2RealTime(frame, sr) + RealTime(2, 0), sr); if (frame > int(getMainModel()->getEndFrame())) { frame = getMainModel()->getEndFrame(); } } else { size_t resolution = 0; if (pane) frame = pane->alignFromReference(frame); if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(), frame, resolution, Layer::SnapRight)) { if (pane) frame = pane->alignToReference(frame); } else { frame = getMainModel()->getEndFrame(); } } if (frame < 0) frame = 0; if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(size_t(frame)); } m_viewManager->setPlaybackFrame(frame); if (frame == getMainModel()->getEndFrame() && m_playSource && m_playSource->isPlaying() && !m_viewManager->getPlayLoopMode()) { stop(); } } void MainWindowBase::ffwdEnd() { if (!getMainModel()) return; if (m_playSource && m_playSource->isPlaying() && !m_viewManager->getPlayLoopMode()) { stop(); } size_t frame = getMainModel()->getEndFrame(); if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(frame); } m_viewManager->setPlaybackFrame(frame); } void MainWindowBase::ffwdSimilar() { if (!getMainModel()) return; Layer *layer = getSnapLayer(); if (!layer) { ffwd(); return; } Pane *pane = m_paneStack->getCurrentPane(); size_t sr = getMainModel()->getSampleRate(); int frame = m_viewManager->getPlaybackFrame(); size_t resolution = 0; if (pane) frame = pane->alignFromReference(frame); if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), frame, resolution, Layer::SnapRight)) { if (pane) frame = pane->alignToReference(frame); } else { frame = getMainModel()->getEndFrame(); } if (frame < 0) frame = 0; if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(size_t(frame)); } m_viewManager->setPlaybackFrame(frame); if (frame == getMainModel()->getEndFrame() && m_playSource && m_playSource->isPlaying() && !m_viewManager->getPlayLoopMode()) { stop(); } } void MainWindowBase::rewind() { if (!getMainModel()) return; int frame = m_viewManager->getPlaybackFrame(); if (frame > 0) --frame; Pane *pane = m_paneStack->getCurrentPane(); Layer *layer = getSnapLayer(); size_t sr = getMainModel()->getSampleRate(); // when rewinding during playback, we want to allow a period // following a rewind target point at which the rewind will go to // the prior point instead of the immediately neighbouring one if (m_playSource && m_playSource->isPlaying()) { RealTime ct = RealTime::frame2RealTime(frame, sr); ct = ct - RealTime::fromSeconds(0.25); if (ct < RealTime::zeroTime) ct = RealTime::zeroTime; frame = RealTime::realTime2Frame(ct, sr); } if (!layer) { frame = RealTime::realTime2Frame (RealTime::frame2RealTime(frame, sr) - RealTime(2, 0), sr); if (frame < int(getMainModel()->getStartFrame())) { frame = getMainModel()->getStartFrame(); } } else { size_t resolution = 0; if (pane) frame = pane->alignFromReference(frame); if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(), frame, resolution, Layer::SnapLeft)) { if (pane) frame = pane->alignToReference(frame); } else { frame = getMainModel()->getStartFrame(); } } if (frame < 0) frame = 0; if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(size_t(frame)); } m_viewManager->setPlaybackFrame(frame); } void MainWindowBase::rewindStart() { if (!getMainModel()) return; size_t frame = getMainModel()->getStartFrame(); if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(frame); } m_viewManager->setPlaybackFrame(frame); } void MainWindowBase::rewindSimilar() { if (!getMainModel()) return; Layer *layer = getSnapLayer(); if (!layer) { rewind(); return; } Pane *pane = m_paneStack->getCurrentPane(); size_t sr = getMainModel()->getSampleRate(); int frame = m_viewManager->getPlaybackFrame(); size_t resolution = 0; if (pane) frame = pane->alignFromReference(frame); if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), frame, resolution, Layer::SnapLeft)) { if (pane) frame = pane->alignToReference(frame); } else { frame = getMainModel()->getStartFrame(); } if (frame < 0) frame = 0; if (m_viewManager->getPlaySelectionMode()) { frame = m_viewManager->constrainFrameToSelection(size_t(frame)); } m_viewManager->setPlaybackFrame(frame); } Layer * MainWindowBase::getSnapLayer() const { Pane *pane = m_paneStack->getCurrentPane(); if (!pane) return 0; Layer *layer = pane->getSelectedLayer(); if (!dynamic_cast(layer) && !dynamic_cast(layer) && !dynamic_cast(layer) && !dynamic_cast(layer)) { layer = 0; for (int i = pane->getLayerCount(); i > 0; --i) { Layer *l = pane->getLayer(i-1); if (dynamic_cast(l)) { layer = l; break; } } } return layer; } void MainWindowBase::stop() { m_playSource->stop(); if (m_paneStack && m_paneStack->getCurrentPane()) { updateVisibleRangeDisplay(m_paneStack->getCurrentPane()); } else { m_myStatusMessage = ""; statusBar()->showMessage(""); } } MainWindowBase::AddPaneCommand::AddPaneCommand(MainWindowBase *mw) : m_mw(mw), m_pane(0), m_prevCurrentPane(0), m_added(false) { } MainWindowBase::AddPaneCommand::~AddPaneCommand() { if (m_pane && !m_added) { m_mw->m_paneStack->deletePane(m_pane); } } QString MainWindowBase::AddPaneCommand::getName() const { return tr("Add Pane"); } void MainWindowBase::AddPaneCommand::execute() { if (!m_pane) { m_prevCurrentPane = m_mw->m_paneStack->getCurrentPane(); m_pane = m_mw->m_paneStack->addPane(); connect(m_pane, SIGNAL(contextHelpChanged(const QString &)), m_mw, SLOT(contextHelpChanged(const QString &))); } else { m_mw->m_paneStack->showPane(m_pane); } m_mw->m_paneStack->setCurrentPane(m_pane); m_added = true; } void MainWindowBase::AddPaneCommand::unexecute() { m_mw->m_paneStack->hidePane(m_pane); m_mw->m_paneStack->setCurrentPane(m_prevCurrentPane); m_added = false; } MainWindowBase::RemovePaneCommand::RemovePaneCommand(MainWindowBase *mw, Pane *pane) : m_mw(mw), m_pane(pane), m_added(true) { } MainWindowBase::RemovePaneCommand::~RemovePaneCommand() { if (m_pane && !m_added) { m_mw->m_paneStack->deletePane(m_pane); } } QString MainWindowBase::RemovePaneCommand::getName() const { return tr("Remove Pane"); } void MainWindowBase::RemovePaneCommand::execute() { m_prevCurrentPane = m_mw->m_paneStack->getCurrentPane(); m_mw->m_paneStack->hidePane(m_pane); m_added = false; } void MainWindowBase::RemovePaneCommand::unexecute() { m_mw->m_paneStack->showPane(m_pane); m_mw->m_paneStack->setCurrentPane(m_prevCurrentPane); m_added = true; } void MainWindowBase::deleteCurrentPane() { CommandHistory::getInstance()->startCompoundOperation (tr("Delete Pane"), true); Pane *pane = m_paneStack->getCurrentPane(); if (pane) { while (pane->getLayerCount() > 0) { Layer *layer = pane->getLayer(0); if (layer) { m_document->removeLayerFromView(pane, layer); } else { break; } } RemovePaneCommand *command = new RemovePaneCommand(this, pane); CommandHistory::getInstance()->addCommand(command); } CommandHistory::getInstance()->endCompoundOperation(); updateMenuStates(); } void MainWindowBase::deleteCurrentLayer() { Pane *pane = m_paneStack->getCurrentPane(); if (pane) { Layer *layer = pane->getSelectedLayer(); if (layer) { m_document->removeLayerFromView(pane, layer); } } updateMenuStates(); } void MainWindowBase::editCurrentLayer() { Layer *layer = 0; Pane *pane = m_paneStack->getCurrentPane(); if (pane) layer = pane->getSelectedLayer(); if (!layer) return; Model *model = layer->getModel(); if (!model) return; TabularModel *tabular = dynamic_cast(model); if (!tabular) { //!!! how to prevent this function from being active if not //appropriate model type? or will we ultimately support //tabular display for all editable models? SVDEBUG << "NOTE: Not a tabular model" << endl; return; } if (m_layerDataDialogMap.find(layer) != m_layerDataDialogMap.end()) { if (!m_layerDataDialogMap[layer].isNull()) { m_layerDataDialogMap[layer]->show(); m_layerDataDialogMap[layer]->raise(); return; } } QString title = layer->getLayerPresentationName(); ModelDataTableDialog *dialog = new ModelDataTableDialog(tabular, title, this); dialog->setAttribute(Qt::WA_DeleteOnClose); connectLayerEditDialog(dialog); m_layerDataDialogMap[layer] = dialog; m_viewDataDialogMap[pane].insert(dialog); dialog->show(); } void MainWindowBase::connectLayerEditDialog(ModelDataTableDialog *dialog) { connect(m_viewManager, SIGNAL(globalCentreFrameChanged(unsigned long)), dialog, SLOT(userScrolledToFrame(unsigned long))); connect(m_viewManager, SIGNAL(playbackFrameChanged(unsigned long)), dialog, SLOT(playbackScrolledToFrame(unsigned long))); connect(dialog, SIGNAL(scrollToFrame(unsigned long)), m_viewManager, SLOT(setGlobalCentreFrame(unsigned long))); connect(dialog, SIGNAL(scrollToFrame(unsigned long)), m_viewManager, SLOT(setPlaybackFrame(unsigned long))); } void MainWindowBase::previousPane() { if (!m_paneStack) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { if (m_paneStack->getPane(i) == currentPane) { if (i == 0) return; m_paneStack->setCurrentPane(m_paneStack->getPane(i-1)); updateMenuStates(); return; } } } void MainWindowBase::nextPane() { if (!m_paneStack) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { if (m_paneStack->getPane(i) == currentPane) { if (i == m_paneStack->getPaneCount()-1) return; m_paneStack->setCurrentPane(m_paneStack->getPane(i+1)); updateMenuStates(); return; } } } void MainWindowBase::previousLayer() { //!!! Not right -- pane lists layers in stacking order if (!m_paneStack) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Layer *currentLayer = currentPane->getSelectedLayer(); if (!currentLayer) return; for (int i = 0; i < currentPane->getLayerCount(); ++i) { if (currentPane->getLayer(i) == currentLayer) { if (i == 0) return; m_paneStack->setCurrentLayer(currentPane, currentPane->getLayer(i-1)); updateMenuStates(); return; } } } void MainWindowBase::nextLayer() { //!!! Not right -- pane lists layers in stacking order if (!m_paneStack) return; Pane *currentPane = m_paneStack->getCurrentPane(); if (!currentPane) return; Layer *currentLayer = currentPane->getSelectedLayer(); if (!currentLayer) return; for (int i = 0; i < currentPane->getLayerCount(); ++i) { if (currentPane->getLayer(i) == currentLayer) { if (i == currentPane->getLayerCount()-1) return; m_paneStack->setCurrentLayer(currentPane, currentPane->getLayer(i+1)); updateMenuStates(); return; } } } void MainWindowBase::playbackFrameChanged(unsigned long frame) { if (!(m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; updatePositionStatusDisplays(); RealTime now = RealTime::frame2RealTime (frame, getMainModel()->getSampleRate()); if (now.sec == m_lastPlayStatusSec) return; RealTime then = RealTime::frame2RealTime (m_playSource->getPlayEndFrame(), getMainModel()->getSampleRate()); QString nowStr; QString thenStr; QString remainingStr; if (then.sec > 10) { nowStr = now.toSecText().c_str(); thenStr = then.toSecText().c_str(); remainingStr = (then - now).toSecText().c_str(); m_lastPlayStatusSec = now.sec; } else { nowStr = now.toText(true).c_str(); thenStr = then.toText(true).c_str(); remainingStr = (then - now).toText(true).c_str(); } m_myStatusMessage = tr("Playing: %1 of %2 (%3 remaining)") .arg(nowStr).arg(thenStr).arg(remainingStr); statusBar()->showMessage(m_myStatusMessage); } void MainWindowBase::globalCentreFrameChanged(unsigned long ) { if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; Pane *p = 0; if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; if (!p->getFollowGlobalPan()) return; updateVisibleRangeDisplay(p); } void MainWindowBase::viewCentreFrameChanged(View *v, unsigned long frame) { // SVDEBUG << "MainWindowBase::viewCentreFrameChanged(" << v << "," << frame << ")" << endl; if (m_viewDataDialogMap.find(v) != m_viewDataDialogMap.end()) { for (DataDialogSet::iterator i = m_viewDataDialogMap[v].begin(); i != m_viewDataDialogMap[v].end(); ++i) { (*i)->userScrolledToFrame(frame); } } if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; Pane *p = 0; if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; if (v == p) updateVisibleRangeDisplay(p); } void MainWindowBase::viewZoomLevelChanged(View *v, unsigned long , bool ) { if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; Pane *p = 0; if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; if (v == p) updateVisibleRangeDisplay(p); } void MainWindowBase::layerAdded(Layer *) { // SVDEBUG << "MainWindowBase::layerAdded(" << layer << ")" << endl; updateMenuStates(); } void MainWindowBase::layerRemoved(Layer *) { // SVDEBUG << "MainWindowBase::layerRemoved(" << layer << ")" << endl; updateMenuStates(); } void MainWindowBase::layerAboutToBeDeleted(Layer *layer) { // SVDEBUG << "MainWindowBase::layerAboutToBeDeleted(" << layer << ")" << endl; removeLayerEditDialog(layer); if (m_timeRulerLayer && (layer == m_timeRulerLayer)) { // cerr << "(this is the time ruler layer)" << endl; m_timeRulerLayer = 0; } } void MainWindowBase::layerInAView(Layer *layer, bool inAView) { // SVDEBUG << "MainWindowBase::layerInAView(" << layer << "," << inAView << ")" << endl; if (!inAView) removeLayerEditDialog(layer); // Check whether we need to add or remove model from play source Model *model = layer->getModel(); if (model) { if (inAView) { m_playSource->addModel(model); } else { bool found = false; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { Pane *pane = m_paneStack->getPane(i); if (!pane) continue; for (int j = 0; j < pane->getLayerCount(); ++j) { Layer *pl = pane->getLayer(j); if (pl && !dynamic_cast(pl) && (pl->getModel() == model)) { found = true; break; } } if (found) break; } if (!found) { m_playSource->removeModel(model); } } } updateMenuStates(); } void MainWindowBase::removeLayerEditDialog(Layer *layer) { if (m_layerDataDialogMap.find(layer) != m_layerDataDialogMap.end()) { ModelDataTableDialog *dialog = m_layerDataDialogMap[layer]; for (ViewDataDialogMap::iterator vi = m_viewDataDialogMap.begin(); vi != m_viewDataDialogMap.end(); ++vi) { vi->second.erase(dialog); } m_layerDataDialogMap.erase(layer); delete dialog; } } void MainWindowBase::modelAdded(Model *model) { // SVDEBUG << "MainWindowBase::modelAdded(" << model << ")" << endl; m_playSource->addModel(model); } void MainWindowBase::mainModelChanged(WaveFileModel *model) { // SVDEBUG << "MainWindowBase::mainModelChanged(" << model << ")" << endl; updateDescriptionLabel(); if (model) m_viewManager->setMainModelSampleRate(model->getSampleRate()); if (model && !m_playTarget && m_audioOutput) createPlayTarget(); } void MainWindowBase::modelAboutToBeDeleted(Model *model) { // SVDEBUG << "MainWindowBase::modelAboutToBeDeleted(" << model << ")" << endl; if (model == m_viewManager->getPlaybackModel()) { m_viewManager->setPlaybackModel(0); } m_playSource->removeModel(model); FFTDataServer::modelAboutToBeDeleted(model); } void MainWindowBase::paneDeleteButtonClicked(Pane *pane) { bool found = false; for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { if (m_paneStack->getPane(i) == pane) { found = true; break; } } if (!found) { SVDEBUG << "MainWindowBase::paneDeleteButtonClicked: Unknown pane " << pane << endl; return; } CommandHistory::getInstance()->startCompoundOperation (tr("Delete Pane"), true); while (pane->getLayerCount() > 0) { Layer *layer = pane->getLayer(0); if (layer) { m_document->removeLayerFromView(pane, layer); } else { break; } } RemovePaneCommand *command = new RemovePaneCommand(this, pane); CommandHistory::getInstance()->addCommand(command); CommandHistory::getInstance()->endCompoundOperation(); updateMenuStates(); } void MainWindowBase::pollOSC() { if (!m_oscQueue || m_oscQueue->isEmpty()) return; SVDEBUG << "MainWindowBase::pollOSC: have " << m_oscQueue->getMessagesAvailable() << " messages" << endl; if (m_openingAudioFile) return; OSCMessage message = m_oscQueue->readMessage(); if (message.getTarget() != 0) { return; //!!! for now -- this class is target 0, others not handled yet } handleOSCMessage(message); } void MainWindowBase::inProgressSelectionChanged() { Pane *currentPane = 0; if (m_paneStack) currentPane = m_paneStack->getCurrentPane(); if (currentPane) updateVisibleRangeDisplay(currentPane); } void MainWindowBase::contextHelpChanged(const QString &s) { if (s == "" && m_myStatusMessage != "") { statusBar()->showMessage(m_myStatusMessage); return; } statusBar()->showMessage(s); } void MainWindowBase::openHelpUrl(QString url) { // This method mostly lifted from Qt Assistant source code QProcess *process = new QProcess(this); connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater())); QStringList args; #ifdef Q_OS_MAC args.append(url); process->start("open", args); #else #ifdef Q_OS_WIN32 QString pf(getenv("ProgramFiles")); QString command = pf + QString("\\Internet Explorer\\IEXPLORE.EXE"); args.append(url); process->start(command, args); #else #ifdef Q_WS_X11 if (!qgetenv("KDE_FULL_SESSION").isEmpty()) { args.append("exec"); args.append(url); process->start("kfmclient", args); } else if (!qgetenv("BROWSER").isEmpty()) { args.append(url); process->start(qgetenv("BROWSER"), args); } else { args.append(url); process->start("firefox", args); } #endif #endif #endif } sonic-visualiser-2.3~repack1.orig/svapp/framework/VersionTester.h0000644000175000017500000000257112252354725024052 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2009 Chris Cannam. */ #ifndef _VERSION_TESTER_H_ #define _VERSION_TESTER_H_ #include #include #include #include class QNetworkAccessManager; class VersionTester : public QObject { Q_OBJECT public: VersionTester(QString hostname, QString versionFilePath, QString myVersion); virtual ~VersionTester(); static bool isVersionNewerThan(QString, QString); signals: void newerVersionAvailable(QString); protected slots: void finished(); void error(QNetworkReply::NetworkError); private: QString m_myVersion; QNetworkReply *m_reply; bool m_httpFailed; QNetworkAccessManager *m_nm; }; #endif sonic-visualiser-2.3~repack1.orig/svapp/framework/VersionTester.cpp0000644000175000017500000000620412252354725024402 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2009 Chris Cannam. */ #include "VersionTester.h" #include "base/Debug.h" #include #include VersionTester::VersionTester(QString hostname, QString versionFilePath, QString myVersion) : m_myVersion(myVersion), m_reply(0), m_httpFailed(false), m_nm(new QNetworkAccessManager) { QUrl url(QString("http://%1/%2").arg(hostname).arg(versionFilePath)); cerr << "VersionTester: URL is " << url << endl; m_reply = m_nm->get(QNetworkRequest(url)); connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError))); connect(m_reply, SIGNAL(finished()), this, SLOT(finished())); } VersionTester::~VersionTester() { if (m_reply) { m_reply->abort(); m_reply->deleteLater(); } delete m_nm; } bool VersionTester::isVersionNewerThan(QString a, QString b) { QRegExp re("[._-]"); QStringList alist = a.split(re, QString::SkipEmptyParts); QStringList blist = b.split(re, QString::SkipEmptyParts); int ae = alist.size(); int be = blist.size(); int e = std::max(ae, be); for (int i = 0; i < e; ++i) { int an = 0, bn = 0; if (i < ae) { an = alist[i].toInt(); if (an == 0) an = -1; // non-numeric field -> "-pre1" etc } if (i < be) { bn = blist[i].toInt(); if (bn == 0) bn = -1; } if (an < bn) return false; if (an > bn) return true; } return false; } void VersionTester::error(QNetworkReply::NetworkError) { cerr << "VersionTester: error: " << m_reply->errorString() << endl; m_httpFailed = true; } void VersionTester::finished() { QNetworkReply *r = m_reply; m_reply = 0; r->deleteLater(); if (m_httpFailed) return; int status = r->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (status / 100 != 2) { cerr << "VersionTester: error: http status = " << status << endl; return; } QByteArray responseData = r->readAll(); QString str = QString::fromUtf8(responseData.data()); QStringList lines = str.split('\n', QString::SkipEmptyParts); if (lines.empty()) return; QString latestVersion = lines[0]; SVDEBUG << "Comparing current version \"" << m_myVersion << "\" with latest version \"" << latestVersion << "\"" << endl; if (isVersionNewerThan(latestVersion, m_myVersion)) { emit newerVersionAvailable(latestVersion); } } sonic-visualiser-2.3~repack1.orig/svapp/framework/Document.h0000644000175000017500000002657212252354725023023 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _DOCUMENT_H_ #define _DOCUMENT_H_ #include "layer/LayerFactory.h" #include "transform/Transform.h" #include "transform/ModelTransformer.h" #include "base/Command.h" #include #include class Model; class Layer; class View; class WaveFileModel; /** * A Sonic Visualiser document consists of a set of data models, and * also the visualisation layers used to display them. Changes to the * layers and their layout need to be stored and managed in much the * same way as changes to the underlying data. * * The document manages: * * - A main data Model, which provides the underlying sample rate and * such like. This must be a WaveFileModel. * * - Any number of imported Model objects, which contain data without any * requirement to remember where the data came from or how to * regenerate it. * * - Any number of Model objects that were generated by a Transformer * such as FeatureExtractionModelTransformer. For these, we also * record the source model and the name of the transform used to * generate the model so that we can regenerate it (potentially * from a different source) on demand. * * - A flat list of Layer objects. Elsewhere, the GUI may distribute these * across any number of View widgets. A layer may be viewable on more * than one view at once, in principle. A layer refers to one model, * but the same model can be in use in more than one layer. * * The document does *not* manage the existence or structure of Pane * and other view widgets. However, it does provide convenience * methods for reference-counted command-based management of the * association between layers and views (addLayerToView, * removeLayerFromView). */ class Document : public QObject, public XmlExportable { Q_OBJECT public: Document(); virtual ~Document(); /** * Create and return a new layer of the given type, associated * with no model. The caller may set any model on this layer, but * the model must also be registered with the document via the * add-model methods below. */ Layer *createLayer(LayerFactory::LayerType); /** * Create and return a new layer of the given type, associated * with the current main model (if appropriate to the layer type). */ Layer *createMainModelLayer(LayerFactory::LayerType); /** * Create and return a new layer associated with the given model, * and register the model as an imported model. */ Layer *createImportedLayer(Model *); /** * Create and return a new layer of the given type, with an * appropriate empty model. If the given type is not one for * which an empty model can meaningfully be created, return 0. */ Layer *createEmptyLayer(LayerFactory::LayerType); /** * Create and return a new layer of the given type, associated * with the given transform name. This method does not run the * transform itself, nor create a model. The caller can safely * add a model to the layer later, but note that all models used * by a transform layer _must_ be registered with the document * using addDerivedModel below. */ Layer *createDerivedLayer(LayerFactory::LayerType, TransformId); /** * Create and return a suitable layer for the given transform, * running the transform and associating the resulting model with * the new layer. */ Layer *createDerivedLayer(const Transform &, const ModelTransformer::Input &); /** * Delete the given layer, and also its associated model if no * longer used by any other layer. In general, this should be the * only method used to delete layers -- doing so directly is a bit * of a social gaffe. */ void deleteLayer(Layer *, bool force = false); /** * Set the main model (the source for playback sample rate, etc) * to the given wave file model. This will regenerate any derived * models that were based on the previous main model. */ void setMainModel(WaveFileModel *); /** * Get the main model (the source for playback sample rate, etc). */ WaveFileModel *getMainModel() { return m_mainModel; } /** * Get the main model (the source for playback sample rate, etc). */ const WaveFileModel *getMainModel() const { return m_mainModel; } std::vector getTransformInputModels(); bool isKnownModel(const Model *) const; /** * Add a derived model associated with the given transform, * running the transform and returning the resulting model. */ Model *addDerivedModel(const Transform &transform, const ModelTransformer::Input &input, QString &returnedMessage); /** * Add a derived model associated with the given transform. This * is necessary to register any derived model that was not created * by the document using createDerivedModel or createDerivedLayer. */ void addDerivedModel(const Transform &transform, const ModelTransformer::Input &input, Model *outputModelToAdd); /** * Add an imported (non-derived, non-main) model. This is * necessary to register any imported model that is associated * with a layer. */ void addImportedModel(Model *); /** * Associate the given model with the given layer. The model must * have already been registered using one of the addXXModel * methods above. */ void setModel(Layer *, Model *); /** * Set the given layer to use the given channel of its model (-1 * means all available channels). */ void setChannel(Layer *, int); /** * Add the given layer to the given view. If the layer is * intended to show a particular model, the model should normally * be set using setModel before this method is called. */ void addLayerToView(View *, Layer *); /** * Remove the given layer from the given view. */ void removeLayerFromView(View *, Layer *); /** * Return true if alignment is supported (i.e. if the necessary * plugin is found). */ static bool canAlign(); /** * Specify whether models added via addImportedModel should be * automatically aligned against the main model if appropriate. */ void setAutoAlignment(bool on) { m_autoAlignment = on; } /** * Generate alignments for all appropriate models against the main * model. Existing alignments will not be re-calculated unless * the main model has changed since they were calculated. */ void alignModels(); void toXml(QTextStream &, QString indent, QString extraAttributes) const; void toXmlAsTemplate(QTextStream &, QString indent, QString extraAttributes) const; signals: void layerAdded(Layer *); void layerRemoved(Layer *); void layerAboutToBeDeleted(Layer *); // Emitted when a layer is first added to a view, or when it is // last removed from a view void layerInAView(Layer *, bool); void modelAdded(Model *); void mainModelChanged(WaveFileModel *); // emitted after modelAdded void modelAboutToBeDeleted(Model *); void modelGenerationFailed(QString transformName, QString message); void modelGenerationWarning(QString transformName, QString message); void modelRegenerationFailed(QString layerName, QString transformName, QString message); void modelRegenerationWarning(QString layerName, QString transformName, QString message); void alignmentFailed(QString transformName, QString message); void activity(QString); protected: void releaseModel(Model *model); /** * If model is suitable for alignment, align it against the main * model and store the alignment in the model. (If the model has * an alignment already for the current main model, leave it * unchanged.) */ void alignModel(Model *); /* * Every model that is in use by a layer in the document must be * found in either m_mainModel or m_models. We own and control * the lifespan of all of these models. */ /** * The model that provides the underlying sample rate, etc. This * model is not reference counted for layers, and is not freed * unless it is replaced or the document is deleted. */ WaveFileModel *m_mainModel; struct ModelRecord { // Information associated with a non-main model. If this // model is derived from another, then source will be non-NULL // and the transform name will be set appropriately. If the // transform name is set but source is NULL, then there was a // transform involved but the (target) model has been modified // since being generated from it. // This does not use ModelTransformer::Input, because it would // be confusing to have Input objects hanging around with NULL // models in them. const Model *source; int channel; Transform transform; // Count of the number of layers using this model. int refcount; }; typedef std::map ModelMap; ModelMap m_models; class AddLayerCommand : public Command { public: AddLayerCommand(Document *d, View *view, Layer *layer); virtual ~AddLayerCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; protected: Document *m_d; View *m_view; // I don't own this Layer *m_layer; // Document owns this, but I determine its lifespan QString m_name; bool m_added; }; class RemoveLayerCommand : public Command { public: RemoveLayerCommand(Document *d, View *view, Layer *layer); virtual ~RemoveLayerCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; protected: Document *m_d; View *m_view; // I don't own this Layer *m_layer; // Document owns this, but I determine its lifespan QString m_name; bool m_added; }; typedef std::map > LayerViewMap; LayerViewMap m_layerViewMap; void addToLayerViewMap(Layer *, View *); void removeFromLayerViewMap(Layer *, View *); QString getUniqueLayerName(QString candidate); void writeBackwardCompatibleDerivation(QTextStream &, QString, Model *, const ModelRecord &) const; static TransformId getAlignmentTransformName(); void toXml(QTextStream &, QString, QString, bool asTemplate) const; void writePlaceholderMainModel(QTextStream &, QString) const; /** * And these are the layers. We also control the lifespans of * these (usually through the commands used to add and remove them). */ typedef std::set LayerSet; LayerSet m_layers; bool m_autoAlignment; }; #endif sonic-visualiser-2.3~repack1.orig/svapp/framework/TransformUserConfigurator.cpp0000644000175000017500000001527512252354725026773 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "TransformUserConfigurator.h" #include "transform/TransformFactory.h" #include "widgets/PluginParameterDialog.h" #include "plugin/FeatureExtractionPluginFactory.h" #include "plugin/RealTimePluginFactory.h" #include "plugin/RealTimePluginInstance.h" #include "data/model/DenseTimeValueModel.h" #include #include #include bool TransformUserConfigurator::getChannelRange(TransformId identifier, Vamp::PluginBase *plugin, int &minChannels, int &maxChannels) { if (plugin && plugin->getType() == "Feature Extraction Plugin") { Vamp::Plugin *vp = static_cast(plugin); SVDEBUG << "TransformUserConfigurator::getChannelRange: is a VP" << endl; minChannels = vp->getMinChannelCount(); maxChannels = vp->getMaxChannelCount(); return true; } else { SVDEBUG << "TransformUserConfigurator::getChannelRange: is not a VP" << endl; return TransformFactory::getInstance()-> getTransformChannelRange(identifier, minChannels, maxChannels); } } bool TransformUserConfigurator::configure(ModelTransformer::Input &input, Transform &transform, Vamp::PluginBase *plugin, Model *&inputModel, AudioPlaySource *source, size_t startFrame, size_t duration, const QMap &modelMap, QStringList candidateModelNames, QString defaultModelName) { bool ok = false; QString id = transform.getPluginIdentifier(); QString output = transform.getOutput(); QString outputLabel = ""; QString outputDescription = ""; bool frequency = false; bool effect = false; bool generator = false; if (!plugin) return false; if (FeatureExtractionPluginFactory::instanceFor(id)) { Vamp::Plugin *vp = static_cast(plugin); frequency = (vp->getInputDomain() == Vamp::Plugin::FrequencyDomain); std::vector od = vp->getOutputDescriptors(); cerr << "configure: looking for output: " << output << endl; if (od.size() > 1) { for (size_t i = 0; i < od.size(); ++i) { if (od[i].identifier == output.toStdString()) { outputLabel = od[i].name.c_str(); outputDescription = od[i].description.c_str(); break; } } } } else if (RealTimePluginFactory::instanceFor(id)) { RealTimePluginFactory *factory = RealTimePluginFactory::instanceFor(id); const RealTimePluginDescriptor *desc = factory->getPluginDescriptor(id); if (desc->audioInputPortCount > 0 && desc->audioOutputPortCount > 0 && !desc->isSynth) { effect = true; } if (desc->audioInputPortCount == 0) { generator = true; } if (output != "A") { int outputNo = output.toInt(); if (outputNo >= 0 && outputNo < int(desc->controlOutputPortCount)) { outputLabel = desc->controlOutputPortNames[outputNo].c_str(); } } RealTimePluginInstance *rtp = static_cast(plugin); if (effect && source) { SVDEBUG << "Setting auditioning effect" << endl; source->setAuditioningEffect(rtp); } } int sourceChannels = 1; if (dynamic_cast(inputModel)) { sourceChannels = dynamic_cast(inputModel) ->getChannelCount(); } int minChannels = 1, maxChannels = sourceChannels; getChannelRange(transform.getIdentifier(), plugin, minChannels, maxChannels); int targetChannels = sourceChannels; if (!effect) { if (sourceChannels < minChannels) targetChannels = minChannels; if (sourceChannels > maxChannels) targetChannels = maxChannels; } int defaultChannel = -1; //!!! no longer saved! [was context.channel] PluginParameterDialog *dialog = new PluginParameterDialog(plugin); dialog->setMoreInfoUrl(TransformFactory::getInstance()-> getTransformInfoUrl(transform.getIdentifier())); if (candidateModelNames.size() > 1 && !generator) { dialog->setCandidateInputModels(candidateModelNames, defaultModelName); } if (startFrame != 0 || duration != 0) { dialog->setShowSelectionOnlyOption(true); } if (targetChannels > 0) { dialog->setChannelArrangement(sourceChannels, targetChannels, defaultChannel); } dialog->setOutputLabel(outputLabel, outputDescription); dialog->setShowProcessingOptions(true, frequency); if (dialog->exec() == QDialog::Accepted) { ok = true; } QString selectedInput = dialog->getInputModel(); if (selectedInput != "") { if (modelMap.contains(selectedInput)) { inputModel = modelMap.value(selectedInput); cerr << "Found selected input \"" << selectedInput << "\" in model map, result is " << inputModel << endl; } else { cerr << "Failed to find selected input \"" << selectedInput << "\" in model map" << endl; } } else { cerr << "Selected input empty: \"" << selectedInput << "\"" << endl; } // Write parameters back to transform object TransformFactory::getInstance()-> setParametersFromPlugin(transform, plugin); input.setChannel(dialog->getChannel()); //!!! The dialog ought to be taking & returning transform //objects and input objects and stuff rather than passing //around all this misc stuff, but that's for tomorrow //(whenever that may be) if (startFrame != 0 || duration != 0) { if (dialog->getSelectionOnly()) { transform.setStartTime(RealTime::frame2RealTime (startFrame, inputModel->getSampleRate())); transform.setDuration(RealTime::frame2RealTime (duration, inputModel->getSampleRate())); } } size_t stepSize = 0, blockSize = 0; WindowType windowType = HanningWindow; dialog->getProcessingParameters(stepSize, blockSize, windowType); transform.setStepSize(stepSize); transform.setBlockSize(blockSize); transform.setWindowType(windowType); delete dialog; if (effect && source) { source->setAuditioningEffect(0); } return ok; } sonic-visualiser-2.3~repack1.orig/svapp/framework/framework.pro0000644000175000017500000000101612252354725023575 0ustar miramiraTEMPLATE = lib SV_UNIT_PACKAGES = vamp vamp-hostsdk # required because we use transform headers load(../prf/sv.prf) CONFIG += sv staticlib qt thread warn_on stl rtti exceptions QT += xml network TARGET = svframework DEPENDPATH += .. INCLUDEPATH += . .. OBJECTS_DIR = tmp_obj MOC_DIR = tmp_moc HEADERS += Document.h \ MainWindowBase.h \ SVFileReader.h \ VersionTester.h SOURCES += Document.cpp \ MainWindowBase.cpp \ SVFileReader.cpp \ VersionTester.cpp sonic-visualiser-2.3~repack1.orig/svapp/framework/TransformUserConfigurator.h0000644000175000017500000000261012252354725026425 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TRANSFORM_USER_CONFIGURATOR_H_ #define _TRANSFORM_USER_CONFIGURATOR_H_ #include "transform/ModelTransformerFactory.h" class TransformUserConfigurator : public ModelTransformerFactory::UserConfigurator { public: // This is of course absolutely gross virtual bool configure(ModelTransformer::Input &input, Transform &transform, Vamp::PluginBase *plugin, Model *&inputModel, AudioPlaySource *source, size_t startFrame, size_t duration, const QMap &modelMap, QStringList candidateModelNames, QString defaultModelName); private: bool getChannelRange(TransformId identifier, Vamp::PluginBase *plugin, int &min, int &max); }; #endif sonic-visualiser-2.3~repack1.orig/svapp/framework/SVFileReader.cpp0000644000175000017500000012131412252354725024041 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "SVFileReader.h" #include "layer/Layer.h" #include "view/View.h" #include "base/PlayParameters.h" #include "base/PlayParameterRepository.h" #include "base/Preferences.h" #include "data/fileio/AudioFileReaderFactory.h" #include "data/fileio/FileSource.h" #include "data/fileio/FileFinder.h" #include "data/model/WaveFileModel.h" #include "data/model/EditableDenseThreeDimensionalModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/NoteModel.h" #include "data/model/RegionModel.h" #include "data/model/TextModel.h" #include "data/model/ImageModel.h" #include "data/model/AlignmentModel.h" #include "transform/TransformFactory.h" #include "view/Pane.h" #include "widgets/ProgressDialog.h" #include "Document.h" #include #include #include #include SVFileReader::SVFileReader(Document *document, SVFileReaderPaneCallback &callback, QString location) : m_document(document), m_paneCallback(callback), m_location(location), m_currentPane(0), m_currentDataset(0), m_currentDerivedModel(0), m_currentDerivedModelId(-1), m_currentPlayParameters(0), m_currentTransformSource(0), m_datasetSeparator(" "), m_inRow(false), m_inLayer(false), m_inView(false), m_rowNumber(0), m_ok(false) { } void SVFileReader::parse(const QString &xmlData) { QXmlInputSource inputSource; inputSource.setData(xmlData); parse(inputSource); } void SVFileReader::parse(QXmlInputSource &inputSource) { QXmlSimpleReader reader; reader.setContentHandler(this); reader.setErrorHandler(this); m_ok = reader.parse(inputSource); } bool SVFileReader::isOK() { return m_ok; } SVFileReader::~SVFileReader() { if (!m_awaitingDatasets.empty()) { cerr << "WARNING: SV-XML: File ended with " << m_awaitingDatasets.size() << " unfilled model dataset(s)" << endl; } std::set unaddedModels; for (std::map::iterator i = m_models.begin(); i != m_models.end(); ++i) { if (m_addedModels.find(i->second) == m_addedModels.end()) { unaddedModels.insert(i->second); } } if (!unaddedModels.empty()) { cerr << "WARNING: SV-XML: File contained " << unaddedModels.size() << " unused models" << endl; while (!unaddedModels.empty()) { delete *unaddedModels.begin(); unaddedModels.erase(unaddedModels.begin()); } } } bool SVFileReader::startElement(const QString &, const QString &, const QString &qName, const QXmlAttributes &attributes) { QString name = qName.toLower(); bool ok = false; // Valid element names: // // sv // data // dataset // display // derivation // playparameters // layer // model // point // row // view // window // plugin // transform // selections // selection // measurement if (name == "sv") { // nothing needed ok = true; } else if (name == "data") { // nothing needed m_inData = true; ok = true; } else if (name == "display") { // nothing needed ok = true; } else if (name == "window") { ok = readWindow(attributes); } else if (name == "model") { ok = readModel(attributes); } else if (name == "dataset") { ok = readDatasetStart(attributes); } else if (name == "bin") { ok = addBinToDataset(attributes); } else if (name == "point") { ok = addPointToDataset(attributes); } else if (name == "row") { ok = addRowToDataset(attributes); } else if (name == "layer") { addUnaddedModels(); // all models must be specified before first layer ok = readLayer(attributes); } else if (name == "view") { m_inView = true; ok = readView(attributes); } else if (name == "derivation") { ok = readDerivation(attributes); } else if (name == "playparameters") { ok = readPlayParameters(attributes); } else if (name == "plugin") { ok = readPlugin(attributes); } else if (name == "selections") { m_inSelections = true; ok = true; } else if (name == "selection") { ok = readSelection(attributes); } else if (name == "measurement") { ok = readMeasurement(attributes); } else if (name == "transform") { ok = readTransform(attributes); } else if (name == "parameter") { ok = readParameter(attributes); } else { cerr << "WARNING: SV-XML: Unexpected element \"" << name << "\"" << endl; } if (!ok) { cerr << "WARNING: SV-XML: Failed to completely process element \"" << name << "\"" << endl; } return true; } bool SVFileReader::characters(const QString &text) { bool ok = false; if (m_inRow) { ok = readRowData(text); if (!ok) { cerr << "WARNING: SV-XML: Failed to read row data content for row " << m_rowNumber << endl; } } return true; } bool SVFileReader::endElement(const QString &, const QString &, const QString &qName) { QString name = qName.toLower(); if (name == "dataset") { if (m_currentDataset) { bool foundInAwaiting = false; for (std::map::iterator i = m_awaitingDatasets.begin(); i != m_awaitingDatasets.end(); ++i) { if (haveModel(i->second) && m_models[i->second] == m_currentDataset) { m_awaitingDatasets.erase(i); foundInAwaiting = true; break; } } if (!foundInAwaiting) { cerr << "WARNING: SV-XML: Dataset precedes model, or no model uses dataset" << endl; } } m_currentDataset = 0; } else if (name == "data") { addUnaddedModels(); m_inData = false; } else if (name == "derivation") { if (!m_currentDerivedModel) { if (m_currentDerivedModel < 0) { cerr << "WARNING: SV-XML: Bad derivation output model id " << m_currentDerivedModelId << endl; } else if (haveModel(m_currentDerivedModelId)) { cerr << "WARNING: SV-XML: Derivation has existing model " << m_currentDerivedModelId << " as target, not regenerating" << endl; } else { QString message; m_currentDerivedModel = m_models[m_currentDerivedModelId] = m_document->addDerivedModel (m_currentTransform, ModelTransformer::Input(m_currentTransformSource, m_currentTransformChannel), message); if (!m_currentDerivedModel) { emit modelRegenerationFailed(tr("(derived model in SV-XML)"), m_currentTransform.getIdentifier(), message); } else if (message != "") { emit modelRegenerationWarning(tr("(derived model in SV-XML)"), m_currentTransform.getIdentifier(), message); } } } else { m_document->addDerivedModel (m_currentTransform, ModelTransformer::Input(m_currentTransformSource, m_currentTransformChannel), m_currentDerivedModel); } m_addedModels.insert(m_currentDerivedModel); m_currentDerivedModel = 0; m_currentDerivedModelId = -1; m_currentTransformSource = 0; m_currentTransform = Transform(); m_currentTransformChannel = -1; } else if (name == "row") { m_inRow = false; } else if (name == "layer") { m_inLayer = false; } else if (name == "view") { m_inView = false; } else if (name == "selections") { m_inSelections = false; } else if (name == "playparameters") { m_currentPlayParameters = 0; } return true; } bool SVFileReader::error(const QXmlParseException &exception) { m_errorString = QString("ERROR: SV-XML: %1 at line %2, column %3") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); cerr << m_errorString << endl; return QXmlDefaultHandler::error(exception); } bool SVFileReader::fatalError(const QXmlParseException &exception) { m_errorString = QString("FATAL ERROR: SV-XML: %1 at line %2, column %3") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); cerr << m_errorString << endl; return QXmlDefaultHandler::fatalError(exception); } #define READ_MANDATORY(TYPE, NAME, CONVERSION) \ TYPE NAME = attributes.value(#NAME).trimmed().CONVERSION(&ok); \ if (!ok) { \ cerr << "WARNING: SV-XML: Missing or invalid mandatory " #TYPE " attribute \"" #NAME "\"" << endl; \ return false; \ } bool SVFileReader::readWindow(const QXmlAttributes &attributes) { bool ok = false; READ_MANDATORY(int, width, toInt); READ_MANDATORY(int, height, toInt); m_paneCallback.setWindowSize(width, height); return true; } void SVFileReader::addUnaddedModels() { std::set unaddedModels; for (std::map::iterator i = m_models.begin(); i != m_models.end(); ++i) { if (m_addedModels.find(i->second) == m_addedModels.end()) { unaddedModels.insert(i->second); } } for (std::set::iterator i = unaddedModels.begin(); i != unaddedModels.end(); ++i) { Model *model = *i; // don't want to add these models, because their lifespans // are entirely dictated by the models that "own" them even // though they were read independently from the .sv file. // (pity we don't have a nicer way) if (!dynamic_cast(model) && !dynamic_cast(model)) { m_document->addImportedModel(model); } // but we add all models here, so they don't get deleted // when the file loader is destroyed m_addedModels.insert(model); } } bool SVFileReader::readModel(const QXmlAttributes &attributes) { bool ok = false; READ_MANDATORY(int, id, toInt); if (haveModel(id)) { cerr << "WARNING: SV-XML: Ignoring duplicate model id " << id << endl; return false; } QString name = attributes.value("name"); SVDEBUG << "SVFileReader::readModel: model name \"" << name << "\"" << endl; READ_MANDATORY(int, sampleRate, toInt); QString type = attributes.value("type").trimmed(); bool mainModel = (attributes.value("mainModel").trimmed() == "true"); if (type == "wavefile") { WaveFileModel *model = 0; FileFinder *ff = FileFinder::getInstance(); QString originalPath = attributes.value("file"); QString path = ff->find(FileFinder::AudioFile, originalPath, m_location); SVDEBUG << "Wave file originalPath = " << originalPath << ", path = " << path << endl; ProgressDialog dialog(tr("Opening file or URL..."), true, 2000); FileSource file(path, &dialog); file.waitForStatus(); if (!file.isOK()) { cerr << "SVFileReader::readModel: Failed to retrieve file \"" << path << "\" for wave file model: " << file.getErrorString() << endl; } else if (!file.isAvailable()) { cerr << "SVFileReader::readModel: Failed to retrieve file \"" << path << "\" for wave file model: Source unavailable" << endl; } else { file.waitForData(); size_t rate = 0; if (!mainModel && Preferences::getInstance()->getResampleOnLoad()) { WaveFileModel *mm = m_document->getMainModel(); if (mm) rate = mm->getSampleRate(); } model = new WaveFileModel(file, rate); if (!model->isOK()) { delete model; model = 0; } } if (!model) return false; model->setObjectName(name); m_models[id] = model; if (mainModel) { m_document->setMainModel(model); m_addedModels.insert(model); } // Derived models will be added when their derivation // is found. return true; } else if (type == "dense") { READ_MANDATORY(int, dimensions, toInt); // Currently the only dense model we support here is the dense // 3d model. Dense time-value models are always file-backed // waveform data, at this point, and they come in as wavefile // models. if (dimensions == 3) { READ_MANDATORY(int, windowSize, toInt); READ_MANDATORY(int, yBinCount, toInt); EditableDenseThreeDimensionalModel *model = new EditableDenseThreeDimensionalModel (sampleRate, windowSize, yBinCount, EditableDenseThreeDimensionalModel::NoCompression); float minimum = attributes.value("minimum").trimmed().toFloat(&ok); if (ok) model->setMinimumLevel(minimum); float maximum = attributes.value("maximum").trimmed().toFloat(&ok); if (ok) model->setMaximumLevel(maximum); int dataset = attributes.value("dataset").trimmed().toInt(&ok); if (ok) m_awaitingDatasets[dataset] = id; int startFrame = attributes.value("startFrame").trimmed().toInt(&ok); if (ok) model->setStartFrame(startFrame); model->setObjectName(name); m_models[id] = model; return true; } else { cerr << "WARNING: SV-XML: Unexpected dense model dimension (" << dimensions << ")" << endl; } } else if (type == "sparse") { READ_MANDATORY(int, dimensions, toInt); if (dimensions == 1) { READ_MANDATORY(int, resolution, toInt); if (attributes.value("subtype") == "image") { bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true"); ImageModel *model = new ImageModel(sampleRate, resolution, notifyOnAdd); model->setObjectName(name); m_models[id] = model; } else { SparseOneDimensionalModel *model = new SparseOneDimensionalModel (sampleRate, resolution); model->setObjectName(name); m_models[id] = model; } int dataset = attributes.value("dataset").trimmed().toInt(&ok); if (ok) m_awaitingDatasets[dataset] = id; return true; } else if (dimensions == 2 || dimensions == 3) { READ_MANDATORY(int, resolution, toInt); bool haveMinMax = true; float minimum = attributes.value("minimum").trimmed().toFloat(&ok); if (!ok) haveMinMax = false; float maximum = attributes.value("maximum").trimmed().toFloat(&ok); if (!ok) haveMinMax = false; float valueQuantization = attributes.value("valueQuantization").trimmed().toFloat(&ok); bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true"); QString units = attributes.value("units"); if (dimensions == 2) { if (attributes.value("subtype") == "text") { TextModel *model = new TextModel (sampleRate, resolution, notifyOnAdd); model->setObjectName(name); m_models[id] = model; } else if (attributes.value("subtype") == "path") { PathModel *model = new PathModel (sampleRate, resolution, notifyOnAdd); model->setObjectName(name); m_models[id] = model; } else { SparseTimeValueModel *model; if (haveMinMax) { model = new SparseTimeValueModel (sampleRate, resolution, minimum, maximum, notifyOnAdd); } else { model = new SparseTimeValueModel (sampleRate, resolution, notifyOnAdd); } model->setScaleUnits(units); model->setObjectName(name); m_models[id] = model; } } else { if (attributes.value("subtype") == "region") { RegionModel *model; if (haveMinMax) { model = new RegionModel (sampleRate, resolution, minimum, maximum, notifyOnAdd); } else { model = new RegionModel (sampleRate, resolution, notifyOnAdd); } model->setValueQuantization(valueQuantization); model->setScaleUnits(units); model->setObjectName(name); m_models[id] = model; } else { // note models written out by SV 1.3 and earlier // have no subtype, so we can't test that NoteModel *model; if (haveMinMax) { model = new NoteModel (sampleRate, resolution, minimum, maximum, notifyOnAdd); } else { model = new NoteModel (sampleRate, resolution, notifyOnAdd); } model->setValueQuantization(valueQuantization); model->setScaleUnits(units); model->setObjectName(name); m_models[id] = model; } } int dataset = attributes.value("dataset").trimmed().toInt(&ok); if (ok) m_awaitingDatasets[dataset] = id; return true; } else { cerr << "WARNING: SV-XML: Unexpected sparse model dimension (" << dimensions << ")" << endl; } } else if (type == "alignment") { READ_MANDATORY(int, reference, toInt); READ_MANDATORY(int, aligned, toInt); READ_MANDATORY(int, path, toInt); Model *refModel = 0, *alignedModel = 0, *pathModel = 0; if (m_models.find(reference) != m_models.end()) { refModel = m_models[reference]; } else { cerr << "WARNING: SV-XML: Unknown reference model id " << reference << " in alignment model id " << id << endl; } if (m_models.find(aligned) != m_models.end()) { alignedModel = m_models[aligned]; } else { cerr << "WARNING: SV-XML: Unknown aligned model id " << aligned << " in alignment model id " << id << endl; } if (m_models.find(path) != m_models.end()) { pathModel = m_models[path]; } else { cerr << "WARNING: SV-XML: Unknown path model id " << path << " in alignment model id " << id << endl; } if (refModel && alignedModel && pathModel) { AlignmentModel *model = new AlignmentModel (refModel, alignedModel, 0, 0); PathModel *pm = dynamic_cast(pathModel); if (!pm) { cerr << "WARNING: SV-XML: Model id " << path << " referenced as path for alignment " << id << " is not a path model" << endl; } else { model->setPath(pm); pm->setCompletion(100); } model->setObjectName(name); m_models[id] = model; alignedModel->setAlignment(model); return true; } } else { cerr << "WARNING: SV-XML: Unexpected model type \"" << type << "\" for model id " << id << endl; } return false; } bool SVFileReader::readView(const QXmlAttributes &attributes) { QString type = attributes.value("type"); m_currentPane = 0; if (type != "pane") { cerr << "WARNING: SV-XML: Unexpected view type \"" << type << "\"" << endl; return false; } m_currentPane = m_paneCallback.addPane(); if (!m_currentPane) { cerr << "WARNING: SV-XML: Internal error: Failed to add pane!" << endl; return false; } bool ok = false; View *view = m_currentPane; // The view properties first READ_MANDATORY(size_t, centre, toUInt); READ_MANDATORY(size_t, zoom, toUInt); READ_MANDATORY(int, followPan, toInt); READ_MANDATORY(int, followZoom, toInt); QString tracking = attributes.value("tracking"); // Specify the follow modes before we set the actual values view->setFollowGlobalPan(followPan); view->setFollowGlobalZoom(followZoom); view->setPlaybackFollow(tracking == "scroll" ? PlaybackScrollContinuous : tracking == "page" ? PlaybackScrollPage : PlaybackIgnore); // Then set these values view->setCentreFrame(centre); view->setZoomLevel(zoom); // And pane properties READ_MANDATORY(int, centreLineVisible, toInt); m_currentPane->setCentreLineVisible(centreLineVisible); int height = attributes.value("height").toInt(&ok); if (ok) { m_currentPane->resize(m_currentPane->width(), height); } return true; } bool SVFileReader::readLayer(const QXmlAttributes &attributes) { QString type = attributes.value("type"); int id; bool ok = false; id = attributes.value("id").trimmed().toInt(&ok); if (!ok) { cerr << "WARNING: SV-XML: No layer id for layer of type \"" << type << "\"" << endl; return false; } Layer *layer = 0; bool isNewLayer = false; // Layers are expected to be defined in layer elements in the data // section, and referred to in layer elements in the view // sections. So if we're in the data section, we expect this // layer not to exist already; if we're in the view section, we // expect it to exist. if (m_inData) { if (m_layers.find(id) != m_layers.end()) { cerr << "WARNING: SV-XML: Ignoring duplicate layer id " << id << " in data section" << endl; return false; } layer = m_layers[id] = m_document->createLayer (LayerFactory::getInstance()->getLayerTypeForName(type)); if (layer) { m_layers[id] = layer; isNewLayer = true; } } else { if (!m_currentPane) { cerr << "WARNING: SV-XML: No current pane for layer " << id << " in view section" << endl; return false; } if (m_layers.find(id) != m_layers.end()) { layer = m_layers[id]; } else { cerr << "WARNING: SV-XML: Layer id " << id << " in view section has not been defined -- defining it here" << endl; layer = m_document->createLayer (LayerFactory::getInstance()->getLayerTypeForName(type)); if (layer) { m_layers[id] = layer; isNewLayer = true; } } } if (!layer) { cerr << "WARNING: SV-XML: Failed to add layer of type \"" << type << "\"" << endl; return false; } if (isNewLayer) { QString name = attributes.value("name"); layer->setObjectName(name); QString presentationName = attributes.value("presentationName"); layer->setPresentationName(presentationName); int modelId; bool modelOk = false; modelId = attributes.value("model").trimmed().toInt(&modelOk); if (modelOk) { if (haveModel(modelId)) { Model *model = m_models[modelId]; m_document->setModel(layer, model); } else { cerr << "WARNING: SV-XML: Unknown model id " << modelId << " in layer definition" << endl; } } layer->setProperties(attributes); } if (!m_inData && m_currentPane) { QString visible = attributes.value("visible"); bool dormant = (visible == "false"); // We need to do this both before and after adding the layer // to the view -- we need it to be dormant if appropriate // before it's actually added to the view so that any property // box gets the right state when it's added, but the add layer // command sets dormant to false because it assumes it may be // restoring a previously dormant layer, so we need to set it // again afterwards too. Hm layer->setLayerDormant(m_currentPane, dormant); m_document->addLayerToView(m_currentPane, layer); layer->setLayerDormant(m_currentPane, dormant); } m_currentLayer = layer; m_inLayer = true; return true; } bool SVFileReader::readDatasetStart(const QXmlAttributes &attributes) { bool ok = false; READ_MANDATORY(int, id, toInt); READ_MANDATORY(int, dimensions, toInt); if (m_awaitingDatasets.find(id) == m_awaitingDatasets.end()) { cerr << "WARNING: SV-XML: Unwanted dataset " << id << endl; return false; } int modelId = m_awaitingDatasets[id]; Model *model = 0; if (haveModel(modelId)) { model = m_models[modelId]; } else { cerr << "WARNING: SV-XML: Internal error: Unknown model " << modelId << " expecting dataset " << id << endl; return false; } bool good = false; switch (dimensions) { case 1: if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) good = true; break; case 2: if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) good = true; break; case 3: if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) good = true; else if (dynamic_cast(model)) { m_datasetSeparator = attributes.value("separator"); good = true; } break; } if (!good) { cerr << "WARNING: SV-XML: Model id " << modelId << " has wrong number of dimensions or inappropriate type for " << dimensions << "-D dataset " << id << endl; m_currentDataset = 0; return false; } m_currentDataset = model; return true; } bool SVFileReader::addPointToDataset(const QXmlAttributes &attributes) { bool ok = false; READ_MANDATORY(int, frame, toInt); // SVDEBUG << "SVFileReader::addPointToDataset: frame = " << frame << endl; SparseOneDimensionalModel *sodm = dynamic_cast (m_currentDataset); if (sodm) { // cerr << "Current dataset is a sparse one dimensional model" << endl; QString label = attributes.value("label"); sodm->addPoint(SparseOneDimensionalModel::Point(frame, label)); return true; } SparseTimeValueModel *stvm = dynamic_cast (m_currentDataset); if (stvm) { // cerr << "Current dataset is a sparse time-value model" << endl; float value = 0.0; value = attributes.value("value").trimmed().toFloat(&ok); QString label = attributes.value("label"); stvm->addPoint(SparseTimeValueModel::Point(frame, value, label)); return ok; } NoteModel *nm = dynamic_cast(m_currentDataset); if (nm) { // cerr << "Current dataset is a note model" << endl; float value = 0.0; value = attributes.value("value").trimmed().toFloat(&ok); size_t duration = 0; duration = attributes.value("duration").trimmed().toUInt(&ok); QString label = attributes.value("label"); float level = attributes.value("level").trimmed().toFloat(&ok); if (!ok) { // level is optional level = 1.f; ok = true; } nm->addPoint(NoteModel::Point(frame, value, duration, level, label)); return ok; } RegionModel *rm = dynamic_cast(m_currentDataset); if (rm) { // cerr << "Current dataset is a note model" << endl; float value = 0.0; value = attributes.value("value").trimmed().toFloat(&ok); size_t duration = 0; duration = attributes.value("duration").trimmed().toUInt(&ok); QString label = attributes.value("label"); rm->addPoint(RegionModel::Point(frame, value, duration, label)); return ok; } TextModel *tm = dynamic_cast(m_currentDataset); if (tm) { // cerr << "Current dataset is a text model" << endl; float height = 0.0; height = attributes.value("height").trimmed().toFloat(&ok); QString label = attributes.value("label"); // SVDEBUG << "SVFileReader::addPointToDataset: TextModel: frame = " << frame << ", height = " << height << ", label = " << label << ", ok = " << ok << endl; tm->addPoint(TextModel::Point(frame, height, label)); return ok; } PathModel *pm = dynamic_cast(m_currentDataset); if (pm) { // cerr << "Current dataset is a path model" << endl; int mapframe = attributes.value("mapframe").trimmed().toInt(&ok); // SVDEBUG << "SVFileReader::addPointToDataset: PathModel: frame = " << frame << ", mapframe = " << mapframe << ", ok = " << ok << endl; pm->addPoint(PathModel::Point(frame, mapframe)); return ok; } ImageModel *im = dynamic_cast(m_currentDataset); if (im) { // cerr << "Current dataset is an image model" << endl; QString image = attributes.value("image"); QString label = attributes.value("label"); // SVDEBUG << "SVFileReader::addPointToDataset: ImageModel: frame = " << frame << ", image = " << image << ", label = " << label << ", ok = " << ok << endl; im->addPoint(ImageModel::Point(frame, image, label)); return ok; } cerr << "WARNING: SV-XML: Point element found in non-point dataset" << endl; return false; } bool SVFileReader::addBinToDataset(const QXmlAttributes &attributes) { EditableDenseThreeDimensionalModel *dtdm = dynamic_cast (m_currentDataset); if (dtdm) { bool ok = false; int n = attributes.value("number").trimmed().toInt(&ok); if (!ok) { cerr << "WARNING: SV-XML: Missing or invalid bin number" << endl; return false; } QString name = attributes.value("name"); dtdm->setBinName(n, name); return true; } cerr << "WARNING: SV-XML: Bin definition found in incompatible dataset" << endl; return false; } bool SVFileReader::addRowToDataset(const QXmlAttributes &attributes) { m_inRow = false; bool ok = false; m_rowNumber = attributes.value("n").trimmed().toInt(&ok); if (!ok) { cerr << "WARNING: SV-XML: Missing or invalid row number" << endl; return false; } m_inRow = true; // cerr << "SV-XML: In row " << m_rowNumber << endl; return true; } bool SVFileReader::readRowData(const QString &text) { EditableDenseThreeDimensionalModel *dtdm = dynamic_cast (m_currentDataset); bool warned = false; if (dtdm) { QStringList data = text.split(m_datasetSeparator); DenseThreeDimensionalModel::Column values; for (QStringList::iterator i = data.begin(); i != data.end(); ++i) { if (values.size() == dtdm->getHeight()) { if (!warned) { cerr << "WARNING: SV-XML: Too many y-bins in 3-D dataset row " << m_rowNumber << endl; warned = true; } } bool ok; float value = i->toFloat(&ok); if (!ok) { cerr << "WARNING: SV-XML: Bad floating-point value " << i->toLocal8Bit().data() << " in row data" << endl; } else { values.push_back(value); } } dtdm->setColumn(m_rowNumber, values); return true; } cerr << "WARNING: SV-XML: Row data found in non-row dataset" << endl; return false; } bool SVFileReader::readDerivation(const QXmlAttributes &attributes) { int modelId = 0; bool modelOk = false; modelId = attributes.value("model").trimmed().toInt(&modelOk); if (!modelOk) { cerr << "WARNING: SV-XML: No model id specified for derivation" << endl; return false; } if (haveModel(modelId)) { m_currentDerivedModel = m_models[modelId]; } else { // we'll regenerate the model when the derivation element ends m_currentDerivedModel = 0; } m_currentDerivedModelId = modelId; int sourceId = 0; bool sourceOk = false; sourceId = attributes.value("source").trimmed().toInt(&sourceOk); if (sourceOk && haveModel(sourceId)) { m_currentTransformSource = m_models[sourceId]; } else { m_currentTransformSource = m_document->getMainModel(); } m_currentTransform = Transform(); bool ok = false; int channel = attributes.value("channel").trimmed().toInt(&ok); if (ok) m_currentTransformChannel = channel; else m_currentTransformChannel = -1; QString type = attributes.value("type"); if (type == "transform") { m_currentTransformIsNewStyle = true; return true; } else { m_currentTransformIsNewStyle = false; SVDEBUG << "NOTE: SV-XML: Reading old-style derivation element" << endl; } QString transformId = attributes.value("transform"); m_currentTransform.setIdentifier(transformId); int stepSize = attributes.value("stepSize").trimmed().toInt(&ok); if (ok) m_currentTransform.setStepSize(stepSize); int blockSize = attributes.value("blockSize").trimmed().toInt(&ok); if (ok) m_currentTransform.setBlockSize(blockSize); int windowType = attributes.value("windowType").trimmed().toInt(&ok); if (ok) m_currentTransform.setWindowType(WindowType(windowType)); if (!m_currentTransformSource) return true; QString startFrameStr = attributes.value("startFrame"); QString durationStr = attributes.value("duration"); size_t startFrame = 0; size_t duration = 0; if (startFrameStr != "") { startFrame = startFrameStr.trimmed().toInt(&ok); if (!ok) startFrame = 0; } if (durationStr != "") { duration = durationStr.trimmed().toInt(&ok); if (!ok) duration = 0; } m_currentTransform.setStartTime (RealTime::frame2RealTime (startFrame, m_currentTransformSource->getSampleRate())); m_currentTransform.setDuration (RealTime::frame2RealTime (duration, m_currentTransformSource->getSampleRate())); return true; } bool SVFileReader::readPlayParameters(const QXmlAttributes &attributes) { m_currentPlayParameters = 0; int modelId = 0; bool modelOk = false; modelId = attributes.value("model").trimmed().toInt(&modelOk); if (!modelOk) { cerr << "WARNING: SV-XML: No model id specified for play parameters" << endl; return false; } if (haveModel(modelId)) { bool ok = false; PlayParameters *parameters = PlayParameterRepository::getInstance()-> getPlayParameters(m_models[modelId]); if (!parameters) { cerr << "WARNING: SV-XML: Play parameters for model " << modelId << " not found - has model been added to document?" << endl; return false; } bool muted = (attributes.value("mute").trimmed() == "true"); parameters->setPlayMuted(muted); float pan = attributes.value("pan").toFloat(&ok); if (ok) parameters->setPlayPan(pan); float gain = attributes.value("gain").toFloat(&ok); if (ok) parameters->setPlayGain(gain); QString pluginId = attributes.value("pluginId"); if (pluginId != "") parameters->setPlayPluginId(pluginId); m_currentPlayParameters = parameters; // cerr << "Current play parameters for model: " << m_models[modelId] << ": " << m_currentPlayParameters << endl; } else { cerr << "WARNING: SV-XML: Unknown model " << modelId << " for play parameters" << endl; return false; } return true; } bool SVFileReader::readPlugin(const QXmlAttributes &attributes) { if (m_currentDerivedModelId < 0 && !m_currentPlayParameters) { cerr << "WARNING: SV-XML: Plugin found outside derivation or play parameters" << endl; return false; } if (!m_currentPlayParameters && m_currentTransformIsNewStyle) { return true; } QString configurationXml = "setPlayPluginConfiguration(configurationXml); } else { TransformFactory::getInstance()-> setParametersFromPluginConfigurationXml(m_currentTransform, configurationXml); } return true; } bool SVFileReader::readTransform(const QXmlAttributes &attributes) { if (m_currentDerivedModelId < 0) { cerr << "WARNING: SV-XML: Transform found outside derivation" << endl; return false; } m_currentTransform = Transform(); m_currentTransform.setFromXmlAttributes(attributes); return true; } bool SVFileReader::readParameter(const QXmlAttributes &attributes) { if (m_currentDerivedModelId < 0) { cerr << "WARNING: SV-XML: Parameter found outside derivation" << endl; return false; } QString name = attributes.value("name"); if (name == "") { cerr << "WARNING: SV-XML: Ignoring nameless transform parameter" << endl; return false; } float value = attributes.value("value").trimmed().toFloat(); m_currentTransform.setParameter(name, value); return true; } bool SVFileReader::readSelection(const QXmlAttributes &attributes) { bool ok; READ_MANDATORY(int, start, toInt); READ_MANDATORY(int, end, toInt); m_paneCallback.addSelection(start, end); return true; } bool SVFileReader::readMeasurement(const QXmlAttributes &attributes) { SVDEBUG << "SVFileReader::readMeasurement: inLayer " << m_inLayer << ", layer " << m_currentLayer << endl; if (!m_inLayer) { cerr << "WARNING: SV-XML: Measurement found outside layer" << endl; return false; } m_currentLayer->addMeasurementRect(attributes); return true; } SVFileReaderPaneCallback::~SVFileReaderPaneCallback() { } class SVFileIdentifier : public QXmlDefaultHandler { public: SVFileIdentifier() : m_inSv(false), m_inData(false), m_type(SVFileReader::UnknownFileType) { } virtual ~SVFileIdentifier() { } void parse(QXmlInputSource &source) { QXmlSimpleReader reader; reader.setContentHandler(this); reader.setErrorHandler(this); reader.parse(source); } SVFileReader::FileType getType() const { return m_type; } virtual bool startElement(const QString &, const QString &, const QString &qName, const QXmlAttributes& atts) { QString name = qName.toLower(); // SV session files have an sv element containing a data // element containing a model element with mainModel="true". // If the sv element is present but the rest does not satisfy, // then it's (probably) an SV layer file. // Otherwise, it's of unknown type. if (name == "sv") { m_inSv = true; if (m_type == SVFileReader::UnknownFileType) { m_type = SVFileReader::SVLayerFile; } return true; } else if (name == "data") { if (!m_inSv) return true; m_inData = true; } else if (name == "model") { if (!m_inData) return true; if (atts.value("mainModel").trimmed() == "true") { if (m_type == SVFileReader::SVLayerFile) { m_type = SVFileReader::SVSessionFile; return false; // done } } } return true; } virtual bool endElement(const QString &, const QString &, const QString &qName) { QString name = qName.toLower(); if (name == "sv") { if (m_inSv) { m_inSv = false; return false; // done } } else if (name == "data") { if (m_inData) { m_inData = false; return false; // also done, nothing after the first // data element is of use here } } return true; } private: bool m_inSv; bool m_inData; SVFileReader::FileType m_type; }; SVFileReader::FileType SVFileReader::identifyXmlFile(QString path) { QFile file(path); SVFileIdentifier identifier; QXmlInputSource source(&file); identifier.parse(source); return identifier.getType(); } sonic-visualiser-2.3~repack1.orig/svapp/framework/Document.cpp0000644000175000017500000011370312252354725023347 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Document.h" #include "data/model/WaveFileModel.h" #include "data/model/WritableWaveFileModel.h" #include "data/model/DenseThreeDimensionalModel.h" #include "data/model/DenseTimeValueModel.h" #include "layer/Layer.h" #include "widgets/CommandHistory.h" #include "base/Command.h" #include "view/View.h" #include "base/PlayParameterRepository.h" #include "base/PlayParameters.h" #include "transform/TransformFactory.h" #include "transform/ModelTransformerFactory.h" #include #include #include #include #include // For alignment: #include "data/model/AggregateWaveModel.h" #include "data/model/SparseTimeValueModel.h" #include "data/model/AlignmentModel.h" //#define DEBUG_DOCUMENT 1 //!!! still need to handle command history, documentRestored/documentModified Document::Document() : m_mainModel(0), m_autoAlignment(false) { connect(this, SIGNAL(modelAboutToBeDeleted(Model *)), ModelTransformerFactory::getInstance(), SLOT(modelAboutToBeDeleted(Model *))); } Document::~Document() { //!!! Document should really own the command history. atm we //still refer to it in various places that don't have access to //the document, be nice to fix that #ifdef DEBUG_DOCUMENT cerr << "\n\nDocument::~Document: about to clear command history" << endl; #endif CommandHistory::getInstance()->clear(); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::~Document: about to delete layers" << endl; #endif while (!m_layers.empty()) { deleteLayer(*m_layers.begin(), true); } if (!m_models.empty()) { SVDEBUG << "Document::~Document: WARNING: " << m_models.size() << " model(s) still remain -- " << "should have been garbage collected when deleting layers" << endl; while (!m_models.empty()) { Model *model = m_models.begin()->first; if (model == m_mainModel) { // just in case! SVDEBUG << "Document::~Document: WARNING: Main model is also" << " in models list!" << endl; } else if (model) { model->aboutToDelete(); emit modelAboutToBeDeleted(model); delete model; } m_models.erase(m_models.begin()); } } #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::~Document: About to get rid of main model" << endl; #endif if (m_mainModel) { m_mainModel->aboutToDelete(); emit modelAboutToBeDeleted(m_mainModel); } emit mainModelChanged(0); delete m_mainModel; } Layer * Document::createLayer(LayerFactory::LayerType type) { Layer *newLayer = LayerFactory::getInstance()->createLayer(type); if (!newLayer) return 0; newLayer->setObjectName(getUniqueLayerName(newLayer->objectName())); m_layers.insert(newLayer); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::createLayer: Added layer of type " << type << ", now have " << m_layers.size() << " layers" << endl; #endif emit layerAdded(newLayer); return newLayer; } Layer * Document::createMainModelLayer(LayerFactory::LayerType type) { Layer *newLayer = createLayer(type); if (!newLayer) return 0; setModel(newLayer, m_mainModel); return newLayer; } Layer * Document::createImportedLayer(Model *model) { LayerFactory::LayerTypeSet types = LayerFactory::getInstance()->getValidLayerTypes(model); if (types.empty()) { cerr << "WARNING: Document::importLayer: no valid display layer for model" << endl; return 0; } //!!! for now, just use the first suitable layer type LayerFactory::LayerType type = *types.begin(); Layer *newLayer = LayerFactory::getInstance()->createLayer(type); if (!newLayer) return 0; newLayer->setObjectName(getUniqueLayerName(newLayer->objectName())); addImportedModel(model); setModel(newLayer, model); //!!! and all channels setChannel(newLayer, -1); m_layers.insert(newLayer); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::createImportedLayer: Added layer of type " << type << ", now have " << m_layers.size() << " layers" << endl; #endif emit layerAdded(newLayer); return newLayer; } Layer * Document::createEmptyLayer(LayerFactory::LayerType type) { if (!m_mainModel) return 0; Model *newModel = LayerFactory::getInstance()->createEmptyModel(type, m_mainModel); if (!newModel) return 0; Layer *newLayer = createLayer(type); if (!newLayer) { delete newModel; return 0; } addImportedModel(newModel); setModel(newLayer, newModel); return newLayer; } Layer * Document::createDerivedLayer(LayerFactory::LayerType type, TransformId transform) { Layer *newLayer = createLayer(type); if (!newLayer) return 0; newLayer->setObjectName(getUniqueLayerName (TransformFactory::getInstance()-> getTransformFriendlyName(transform))); return newLayer; } Layer * Document::createDerivedLayer(const Transform &transform, const ModelTransformer::Input &input) { QString message; Model *newModel = addDerivedModel(transform, input, message); if (!newModel) { emit modelGenerationFailed(transform.getIdentifier(), message); return 0; } else if (message != "") { emit modelGenerationWarning(transform.getIdentifier(), message); } LayerFactory::LayerTypeSet types = LayerFactory::getInstance()->getValidLayerTypes(newModel); if (types.empty()) { cerr << "WARNING: Document::createLayerForTransformer: no valid display layer for output of transform " << transform.getIdentifier() << endl; newModel->aboutToDelete(); emit modelAboutToBeDeleted(newModel); m_models.erase(newModel); delete newModel; return 0; } //!!! for now, just use the first suitable layer type Layer *newLayer = createLayer(*types.begin()); setModel(newLayer, newModel); //!!! We need to clone the model when adding the layer, so that it //can be edited without affecting other layers that are based on //the same model. Unfortunately we can't just clone it now, //because it probably hasn't been completed yet -- the transform //runs in the background. Maybe the transform has to handle //cloning and cacheing models itself. // // Once we do clone models here, of course, we'll have to avoid // leaking them too. // // We want the user to be able to add a model to a second layer // _while it's still being calculated in the first_ and have it // work quickly. That means we need to put the same physical // model pointer in both layers, so they can't actually be cloned. if (newLayer) { newLayer->setObjectName(getUniqueLayerName (TransformFactory::getInstance()-> getTransformFriendlyName (transform.getIdentifier()))); } emit layerAdded(newLayer); return newLayer; } void Document::setMainModel(WaveFileModel *model) { Model *oldMainModel = m_mainModel; m_mainModel = model; emit modelAdded(m_mainModel); if (model) { emit activity(tr("Set main model to %1").arg(model->objectName())); } else { emit activity(tr("Clear main model")); } std::vector obsoleteLayers; std::set failedTransformers; // We need to ensure that no layer is left using oldMainModel or // any of the old derived models as its model. Either replace the // model, or delete the layer for each layer that is currently // using one of these. Carry out this replacement before we // delete any of the models. #ifdef DEBUG_DOCUMENT cerr << "Document::setMainModel: Have " << m_layers.size() << " layers" << endl; cerr << "Models now: "; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { cerr << i->first << " "; } cerr << endl; cerr << "Old main model: " << oldMainModel << endl; #endif for (LayerSet::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { Layer *layer = *i; Model *model = layer->getModel(); #ifdef DEBUG_DOCUMENT cerr << "Document::setMainModel: inspecting model " << (model ? model->objectName(): "(null)") << " in layer " << layer->objectName() << endl; #endif if (model == oldMainModel) { #ifdef DEBUG_DOCUMENT cerr << "... it uses the old main model, replacing" << endl; #endif LayerFactory::getInstance()->setModel(layer, m_mainModel); continue; } if (!model) { cerr << "WARNING: Document::setMainModel: Null model in layer " << layer << endl; // get rid of this hideous degenerate obsoleteLayers.push_back(layer); continue; } if (m_models.find(model) == m_models.end()) { cerr << "WARNING: Document::setMainModel: Unknown model " << model << " in layer " << layer << endl; // and this one obsoleteLayers.push_back(layer); continue; } if (m_models[model].source && (m_models[model].source == oldMainModel)) { #ifdef DEBUG_DOCUMENT cerr << "... it uses a model derived from the old main model, regenerating" << endl; #endif // This model was derived from the previous main // model: regenerate it. const Transform &transform = m_models[model].transform; QString transformId = transform.getIdentifier(); //!!! We have a problem here if the number of channels in //the main model has changed. QString message; Model *replacementModel = addDerivedModel(transform, ModelTransformer::Input (m_mainModel, m_models[model].channel), message); if (!replacementModel) { cerr << "WARNING: Document::setMainModel: Failed to regenerate model for transform \"" << transformId << "\"" << " in layer " << layer << endl; if (failedTransformers.find(transformId) == failedTransformers.end()) { emit modelRegenerationFailed(layer->objectName(), transformId, message); failedTransformers.insert(transformId); } obsoleteLayers.push_back(layer); } else { if (message != "") { emit modelRegenerationWarning(layer->objectName(), transformId, message); } #ifdef DEBUG_DOCUMENT cerr << "Replacing model " << model << " (type " << typeid(*model).name() << ") with model " << replacementModel << " (type " << typeid(*replacementModel).name() << ") in layer " << layer << " (name " << layer->objectName() << ")" << endl; #endif RangeSummarisableTimeValueModel *rm = dynamic_cast(replacementModel); #ifdef DEBUG_DOCUMENT if (rm) { cerr << "new model has " << rm->getChannelCount() << " channels " << endl; } else { cerr << "new model " << replacementModel << " is not a RangeSummarisableTimeValueModel!" << endl; } #endif setModel(layer, replacementModel); } } } for (size_t k = 0; k < obsoleteLayers.size(); ++k) { deleteLayer(obsoleteLayers[k], true); } for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { Model *m = i->first; #ifdef DEBUG_DOCUMENT SVDEBUG << "considering alignment for model " << m << " (name \"" << m->objectName() << "\")" << endl; #endif if (m_autoAlignment) { alignModel(m); } else if (oldMainModel && (m->getAlignmentReference() == oldMainModel)) { alignModel(m); } } if (oldMainModel) { oldMainModel->aboutToDelete(); emit modelAboutToBeDeleted(oldMainModel); } if (m_autoAlignment) { alignModel(m_mainModel); } emit mainModelChanged(m_mainModel); delete oldMainModel; } void Document::addDerivedModel(const Transform &transform, const ModelTransformer::Input &input, Model *outputModelToAdd) { if (m_models.find(outputModelToAdd) != m_models.end()) { cerr << "WARNING: Document::addDerivedModel: Model already added" << endl; return; } #ifdef DEBUG_DOCUMENT if (input.getModel()) { cerr << "Document::addDerivedModel: source is " << input.getModel() << " \"" << input.getModel()->objectName() << "\"" << endl; } else { cerr << "Document::addDerivedModel: source is " << input.getModel() << endl; } #endif ModelRecord rec; rec.source = input.getModel(); rec.channel = input.getChannel(); rec.transform = transform; rec.refcount = 0; outputModelToAdd->setSourceModel(input.getModel()); m_models[outputModelToAdd] = rec; #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::addDerivedModel: Added model " << outputModelToAdd << endl; cerr << "Models now: "; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { cerr << i->first << " "; } cerr << endl; #endif emit modelAdded(outputModelToAdd); } void Document::addImportedModel(Model *model) { if (m_models.find(model) != m_models.end()) { cerr << "WARNING: Document::addImportedModel: Model already added" << endl; return; } ModelRecord rec; rec.source = 0; rec.refcount = 0; m_models[model] = rec; #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::addImportedModel: Added model " << model << endl; cerr << "Models now: "; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { cerr << i->first << " "; } cerr << endl; #endif if (m_autoAlignment) alignModel(model); emit modelAdded(model); } Model * Document::addDerivedModel(const Transform &transform, const ModelTransformer::Input &input, QString &message) { Model *model = 0; for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { if (i->second.transform == transform && i->second.source == input.getModel() && i->second.channel == input.getChannel()) { return i->first; } } model = ModelTransformerFactory::getInstance()->transform (transform, input, message); // The transform we actually used was presumably identical to the // one asked for, except that the version of the plugin may // differ. It's possible that the returned message contains a // warning about this; that doesn't concern us here, but we do // need to ensure that the transform we remember is correct for // what was actually applied, with the current plugin version. Transform applied = transform; applied.setPluginVersion (TransformFactory::getInstance()-> getDefaultTransformFor(transform.getIdentifier(), lrintf(transform.getSampleRate())) .getPluginVersion()); if (!model) { cerr << "WARNING: Document::addDerivedModel: no output model for transform " << transform.getIdentifier() << endl; } else { addDerivedModel(applied, input, model); } return model; } void Document::releaseModel(Model *model) // Will _not_ release main model! { if (model == 0) { return; } if (model == m_mainModel) { return; } bool toDelete = false; if (m_models.find(model) != m_models.end()) { if (m_models[model].refcount == 0) { cerr << "WARNING: Document::releaseModel: model " << model << " reference count is zero already!" << endl; } else { if (--m_models[model].refcount == 0) { toDelete = true; } } } else { cerr << "WARNING: Document::releaseModel: Unfound model " << model << endl; toDelete = true; } if (toDelete) { int sourceCount = 0; for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { if (i->second.source == model) { ++sourceCount; i->second.source = 0; } } if (sourceCount > 0) { SVDEBUG << "Document::releaseModel: Deleting model " << model << " even though it is source for " << sourceCount << " other derived model(s) -- resetting " << "their source fields appropriately" << endl; } model->aboutToDelete(); emit modelAboutToBeDeleted(model); m_models.erase(model); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::releaseModel: Deleted model " << model << endl; cerr << "Models now: "; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { cerr << i->first << " "; } cerr << endl; #endif delete model; } } void Document::deleteLayer(Layer *layer, bool force) { if (m_layerViewMap.find(layer) != m_layerViewMap.end() && m_layerViewMap[layer].size() > 0) { cerr << "WARNING: Document::deleteLayer: Layer " << layer << " [" << layer->objectName() << "]" << " is still used in " << m_layerViewMap[layer].size() << " views!" << endl; if (force) { #ifdef DEBUG_DOCUMENT cerr << "(force flag set -- deleting from all views)" << endl; #endif for (std::set::iterator j = m_layerViewMap[layer].begin(); j != m_layerViewMap[layer].end(); ++j) { // don't use removeLayerFromView, as it issues a command layer->setLayerDormant(*j, true); (*j)->removeLayer(layer); } m_layerViewMap.erase(layer); } else { return; } } if (m_layers.find(layer) == m_layers.end()) { SVDEBUG << "Document::deleteLayer: Layer " << layer << " (" << typeid(layer).name() << ") does not exist, or has already been deleted " << "(this may not be as serious as it sounds)" << endl; return; } m_layers.erase(layer); #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::deleteLayer: Removing, now have " << m_layers.size() << " layers" << endl; #endif releaseModel(layer->getModel()); emit layerRemoved(layer); emit layerAboutToBeDeleted(layer); delete layer; } void Document::setModel(Layer *layer, Model *model) { if (model && model != m_mainModel && m_models.find(model) == m_models.end()) { cerr << "ERROR: Document::setModel: Layer " << layer << " (\"" << layer->objectName() << "\") wants to use unregistered model " << model << ": register the layer's model before setting it!" << endl; return; } Model *previousModel = layer->getModel(); if (previousModel == model) { SVDEBUG << "NOTE: Document::setModel: Layer " << layer << " (\"" << layer->objectName() << "\") is already set to model " << model << " (\"" << (model ? model->objectName(): "(null)") << "\")" << endl; return; } if (model && model != m_mainModel) { m_models[model].refcount ++; } if (model && previousModel) { PlayParameterRepository::getInstance()->copyParameters (previousModel, model); } LayerFactory::getInstance()->setModel(layer, model); if (previousModel) { releaseModel(previousModel); } } void Document::setChannel(Layer *layer, int channel) { LayerFactory::getInstance()->setChannel(layer, channel); } void Document::addLayerToView(View *view, Layer *layer) { Model *model = layer->getModel(); if (!model) { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::addLayerToView: Layer (\"" << layer->objectName() << "\") with no model being added to view: " << "normally you want to set the model first" << endl; #endif } else { if (model != m_mainModel && m_models.find(model) == m_models.end()) { cerr << "ERROR: Document::addLayerToView: Layer " << layer << " has unregistered model " << model << " -- register the layer's model before adding the layer!" << endl; return; } } CommandHistory::getInstance()->addCommand (new Document::AddLayerCommand(this, view, layer)); } void Document::removeLayerFromView(View *view, Layer *layer) { CommandHistory::getInstance()->addCommand (new Document::RemoveLayerCommand(this, view, layer)); } void Document::addToLayerViewMap(Layer *layer, View *view) { bool firstView = (m_layerViewMap.find(layer) == m_layerViewMap.end() || m_layerViewMap[layer].empty()); if (m_layerViewMap[layer].find(view) != m_layerViewMap[layer].end()) { cerr << "WARNING: Document::addToLayerViewMap:" << " Layer " << layer << " -> view " << view << " already in" << " layer view map -- internal inconsistency" << endl; } m_layerViewMap[layer].insert(view); if (firstView) emit layerInAView(layer, true); } void Document::removeFromLayerViewMap(Layer *layer, View *view) { if (m_layerViewMap[layer].find(view) == m_layerViewMap[layer].end()) { cerr << "WARNING: Document::removeFromLayerViewMap:" << " Layer " << layer << " -> view " << view << " not in" << " layer view map -- internal inconsistency" << endl; } m_layerViewMap[layer].erase(view); if (m_layerViewMap[layer].empty()) { m_layerViewMap.erase(layer); emit layerInAView(layer, false); } } QString Document::getUniqueLayerName(QString candidate) { for (int count = 1; ; ++count) { QString adjusted = (count > 1 ? QString("%1 <%2>").arg(candidate).arg(count) : candidate); bool duplicate = false; for (LayerSet::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { if ((*i)->objectName() == adjusted) { duplicate = true; break; } } if (!duplicate) return adjusted; } } std::vector Document::getTransformInputModels() { std::vector models; if (!m_mainModel) return models; models.push_back(m_mainModel); //!!! This will pick up all models, including those that aren't visible... for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { Model *model = i->first; if (!model || model == m_mainModel) continue; DenseTimeValueModel *dtvm = dynamic_cast(model); if (dtvm) { models.push_back(dtvm); } } return models; } bool Document::isKnownModel(const Model *model) const { if (model == m_mainModel) return true; return (m_models.find(const_cast(model)) != m_models.end()); } TransformId Document::getAlignmentTransformName() { QSettings settings; settings.beginGroup("Alignment"); TransformId id = settings.value("transform-id", "vamp:match-vamp-plugin:match:path").toString(); settings.endGroup(); return id; } bool Document::canAlign() { TransformId id = getAlignmentTransformName(); TransformFactory *factory = TransformFactory::getInstance(); return factory->haveTransform(id); } void Document::alignModel(Model *model) { if (!m_mainModel) return; RangeSummarisableTimeValueModel *rm = dynamic_cast(model); if (!rm) return; if (rm->getAlignmentReference() == m_mainModel) { SVDEBUG << "Document::alignModel: model " << rm << " is already aligned to main model " << m_mainModel << endl; return; } if (model == m_mainModel) { // The reference has an empty alignment to itself. This makes // it possible to distinguish between the reference and any // unaligned model just by looking at the model itself, // without also knowing what the main model is SVDEBUG << "Document::alignModel(" << model << "): is main model, setting appropriately" << endl; rm->setAlignment(new AlignmentModel(model, model, 0, 0)); return; } // This involves creating three new models: // 1. an AggregateWaveModel to provide the mixdowns of the main // model and the new model in its two channels, as input to the // MATCH plugin // 2. a SparseTimeValueModel, which is the model automatically // created by FeatureExtractionPluginTransformer when running the // MATCH plugin (thus containing the alignment path) // 3. an AlignmentModel, which stores the path model and carries // out alignment lookups on it. // The first two of these are provided as arguments to the // constructor for the third, which takes responsibility for // deleting them. The AlignmentModel, meanwhile, is passed to the // new model we are aligning, which also takes responsibility for // it. We should not have to delete any of these new models here. AggregateWaveModel::ChannelSpecList components; components.push_back(AggregateWaveModel::ModelChannelSpec (m_mainModel, -1)); components.push_back(AggregateWaveModel::ModelChannelSpec (rm, -1)); Model *aggregateModel = new AggregateWaveModel(components); ModelTransformer::Input aggregate(aggregateModel); TransformId id = "vamp:match-vamp-plugin:match:path"; //!!! configure TransformFactory *tf = TransformFactory::getInstance(); Transform transform = tf->getDefaultTransformFor (id, aggregateModel->getSampleRate()); transform.setStepSize(transform.getBlockSize()/2); transform.setParameter("serialise", 1); SVDEBUG << "Document::alignModel: Alignment transform step size " << transform.getStepSize() << ", block size " << transform.getBlockSize() << endl; ModelTransformerFactory *mtf = ModelTransformerFactory::getInstance(); QString message; Model *transformOutput = mtf->transform(transform, aggregate, message); if (!transformOutput) { transform.setStepSize(0); transformOutput = mtf->transform(transform, aggregate, message); } SparseTimeValueModel *path = dynamic_cast (transformOutput); if (!path) { cerr << "Document::alignModel: ERROR: Failed to create alignment path (no MATCH plugin?)" << endl; emit alignmentFailed(id, message); delete transformOutput; delete aggregateModel; return; } path->setCompletion(0); AlignmentModel *alignmentModel = new AlignmentModel (m_mainModel, model, aggregateModel, path); rm->setAlignment(alignmentModel); } void Document::alignModels() { for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { alignModel(i->first); } alignModel(m_mainModel); } Document::AddLayerCommand::AddLayerCommand(Document *d, View *view, Layer *layer) : m_d(d), m_view(view), m_layer(layer), m_name(qApp->translate("AddLayerCommand", "Add %1 Layer").arg(layer->objectName())), m_added(false) { } Document::AddLayerCommand::~AddLayerCommand() { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::AddLayerCommand::~AddLayerCommand" << endl; #endif if (!m_added) { m_d->deleteLayer(m_layer); } } QString Document::AddLayerCommand::getName() const { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::AddLayerCommand::getName(): Name is " << m_name << endl; #endif return m_name; } void Document::AddLayerCommand::execute() { for (int i = 0; i < m_view->getLayerCount(); ++i) { if (m_view->getLayer(i) == m_layer) { // already there m_layer->setLayerDormant(m_view, false); m_added = true; return; } } m_view->addLayer(m_layer); m_layer->setLayerDormant(m_view, false); m_d->addToLayerViewMap(m_layer, m_view); m_added = true; } void Document::AddLayerCommand::unexecute() { m_view->removeLayer(m_layer); m_layer->setLayerDormant(m_view, true); m_d->removeFromLayerViewMap(m_layer, m_view); m_added = false; } Document::RemoveLayerCommand::RemoveLayerCommand(Document *d, View *view, Layer *layer) : m_d(d), m_view(view), m_layer(layer), m_name(qApp->translate("RemoveLayerCommand", "Delete %1 Layer").arg(layer->objectName())), m_added(true) { } Document::RemoveLayerCommand::~RemoveLayerCommand() { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::RemoveLayerCommand::~RemoveLayerCommand" << endl; #endif if (!m_added) { m_d->deleteLayer(m_layer); } } QString Document::RemoveLayerCommand::getName() const { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::RemoveLayerCommand::getName(): Name is " << m_name << endl; #endif return m_name; } void Document::RemoveLayerCommand::execute() { bool have = false; for (int i = 0; i < m_view->getLayerCount(); ++i) { if (m_view->getLayer(i) == m_layer) { have = true; break; } } if (!have) { // not there! m_layer->setLayerDormant(m_view, true); m_added = false; return; } m_view->removeLayer(m_layer); m_layer->setLayerDormant(m_view, true); m_d->removeFromLayerViewMap(m_layer, m_view); m_added = false; } void Document::RemoveLayerCommand::unexecute() { m_view->addLayer(m_layer); m_layer->setLayerDormant(m_view, false); m_d->addToLayerViewMap(m_layer, m_view); m_added = true; } void Document::toXml(QTextStream &out, QString indent, QString extraAttributes) const { toXml(out, indent, extraAttributes, false); } void Document::toXmlAsTemplate(QTextStream &out, QString indent, QString extraAttributes) const { toXml(out, indent, extraAttributes, true); } void Document::toXml(QTextStream &out, QString indent, QString extraAttributes, bool asTemplate) const { out << indent + QString("\n") .arg(extraAttributes == "" ? "" : " ").arg(extraAttributes); if (m_mainModel) { if (asTemplate) { writePlaceholderMainModel(out, indent + " "); } else { m_mainModel->toXml(out, indent + " ", "mainModel=\"true\""); } PlayParameters *playParameters = PlayParameterRepository::getInstance()->getPlayParameters(m_mainModel); if (playParameters) { playParameters->toXml (out, indent + " ", QString("model=\"%1\"") .arg(XmlExportable::getObjectExportId(m_mainModel))); } } // Models that are not used in a layer that is in a view should // not be written. Get our list of required models first. std::set used; for (LayerViewMap::const_iterator i = m_layerViewMap.begin(); i != m_layerViewMap.end(); ++i) { if (i->first && !i->second.empty() && i->first->getModel()) { used.insert(i->first->getModel()); } } std::set written; for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { Model *model = i->first; const ModelRecord &rec = i->second; if (used.find(model) == used.end()) continue; // We need an intelligent way to determine which models need // to be streamed (i.e. have been edited, or are small) and // which should not be (i.e. remain as generated by a // transform, and are large). // // At the moment we can get away with deciding not to stream // dense 3d models or writable wave file models, provided they // were generated from a transform, because at the moment there // is no way to edit those model types so it should be safe to // regenerate them. That won't always work in future though. // It would be particularly nice to be able to ask the user, // as well as making an intelligent guess. bool writeModel = true; bool haveDerivation = false; if (rec.source && rec.transform.getIdentifier() != "") { haveDerivation = true; } if (haveDerivation) { if (dynamic_cast(model)) { writeModel = false; } else if (dynamic_cast(model)) { writeModel = false; } } if (writeModel) { model->toXml(out, indent + " "); written.insert(model); } if (haveDerivation) { writeBackwardCompatibleDerivation(out, indent + " ", model, rec); } //!!! We should probably own the PlayParameterRepository PlayParameters *playParameters = PlayParameterRepository::getInstance()->getPlayParameters(model); if (playParameters) { playParameters->toXml (out, indent + " ", QString("model=\"%1\"") .arg(XmlExportable::getObjectExportId(model))); } } //!!! // We should write out the alignment models here. AlignmentModel // needs a toXml that writes out the export IDs of its reference // and aligned models, and then streams its path model. Note that // this will only work when the alignment is complete, so we // should probably wait for it if it isn't already by this point. for (std::set::const_iterator i = written.begin(); i != written.end(); ++i) { const Model *model = *i; const AlignmentModel *alignment = model->getAlignment(); if (!alignment) continue; alignment->toXml(out, indent + " "); } for (LayerSet::const_iterator i = m_layers.begin(); i != m_layers.end(); ++i) { (*i)->toXml(out, indent + " "); } out << indent + "\n"; } void Document::writePlaceholderMainModel(QTextStream &out, QString indent) const { out << indent; out << QString("\n") .arg(getObjectExportId(m_mainModel)) .arg(m_mainModel->getSampleRate()); } void Document::writeBackwardCompatibleDerivation(QTextStream &out, QString indent, Model *targetModel, const ModelRecord &rec) const { // There is a lot of redundancy in the XML we output here, because // we want it to work with older SV session file reading code as // well. // // Formerly, a transform was described using a derivation element // which set out the source and target models, execution context // (step size, input channel etc) and transform id, containing a // plugin element which set out the transform parameters and so // on. (The plugin element came from a "configurationXml" string // obtained from PluginXml.) // // This has been replaced by a derivation element setting out the // source and target models and input channel, containing a // transform element which sets out everything in the Transform. // // In order to retain compatibility with older SV code, however, // we have to write out the same stuff into the derivation as // before, and manufacture an appropriate plugin element as well // as the transform element. In order that newer code knows it's // dealing with a newer format, we will also write an attribute // 'type="transform"' in the derivation element. const Transform &transform = rec.transform; // Just for reference, this is what we would write if we didn't // have to be backward compatible: // // out << indent // << QString("\n") // .arg(XmlExportable::getObjectExportId(rec.source)) // .arg(XmlExportable::getObjectExportId(targetModel)) // .arg(rec.channel); // // transform.toXml(out, indent + " "); // // out << indent << "\n"; // // Unfortunately, we can't just do that. So we do this... QString extentsAttributes; if (transform.getStartTime() != RealTime::zeroTime || transform.getDuration() != RealTime::zeroTime) { extentsAttributes = QString("startFrame=\"%1\" duration=\"%2\" ") .arg(RealTime::realTime2Frame(transform.getStartTime(), targetModel->getSampleRate())) .arg(RealTime::realTime2Frame(transform.getDuration(), targetModel->getSampleRate())); } out << indent; out << QString("\n") .arg(XmlExportable::getObjectExportId(rec.source)) .arg(XmlExportable::getObjectExportId(targetModel)) .arg(rec.channel) .arg(TransformFactory::getInstance()->getTransformInputDomain (transform.getIdentifier())) .arg(transform.getStepSize()) .arg(transform.getBlockSize()) .arg(extentsAttributes) .arg(int(transform.getWindowType())) .arg(XmlExportable::encodeEntities(transform.getIdentifier())); transform.toXml(out, indent + " "); out << indent << " " << TransformFactory::getInstance()->getPluginConfigurationXml(transform); out << indent << "\n"; } sonic-visualiser-2.3~repack1.orig/svapp/framework/MainWindowBase.h0000644000175000017500000003131412252354725024102 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _MAIN_WINDOW_BASE_H_ #define _MAIN_WINDOW_BASE_H_ #include #include #include #include #include #include #include "base/Command.h" #include "view/ViewManager.h" #include "base/PropertyContainer.h" #include "base/RecentFiles.h" #include "base/FrameTimer.h" #include "layer/LayerFactory.h" #include "transform/Transform.h" #include "SVFileReader.h" #include "data/fileio/FileFinder.h" #include "data/fileio/FileSource.h" #include "data/osc/OSCQueue.h" #include class Document; class PaneStack; class Pane; class View; class Fader; class Overview; class Layer; class WaveformLayer; class WaveFileModel; class AudioCallbackPlaySource; class AudioCallbackPlayTarget; class CommandHistory; class QMenu; class AudioDial; class QLabel; class QCheckBox; class PreferencesDialog; class QTreeView; class QPushButton; class OSCMessage; class MIDIInput; class KeyReference; class Labeller; class ModelDataTableDialog; /** * The base class for the SV main window. This includes everything to * do with general document and pane stack management, but nothing * that involves user interaction -- this doesn't create the widget or * menu structures or editing tools, and if a function needs to open a * dialog, it shouldn't be in here. This permits "variations on SV" * to use different subclasses retaining the same general structure. */ class MainWindowBase : public QMainWindow, public FrameTimer { Q_OBJECT public: MainWindowBase(bool withAudioOutput, bool withMIDIInput); virtual ~MainWindowBase(); enum AudioFileOpenMode { ReplaceSession, ReplaceMainModel, CreateAdditionalModel, ReplaceCurrentPane, AskUser }; enum FileOpenStatus { FileOpenSucceeded, FileOpenFailed, FileOpenCancelled, FileOpenWrongMode // attempted to open layer when no main model present }; virtual FileOpenStatus open(QString fileOrUrl, AudioFileOpenMode = AskUser); virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser); virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser, QString templateName = ""); virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser); virtual FileOpenStatus openLayer(FileSource source); virtual FileOpenStatus openImage(FileSource source); virtual FileOpenStatus openSessionFile(QString fileOrUrl); virtual FileOpenStatus openSession(FileSource source); virtual FileOpenStatus openSessionTemplate(QString templateName); virtual FileOpenStatus openSessionTemplate(FileSource source); virtual bool saveSessionFile(QString path); virtual bool saveSessionTemplate(QString path); /// Implementation of FrameTimer interface method virtual unsigned long getFrame() const; signals: // Used to toggle the availability of menu actions void canAddPane(bool); void canDeleteCurrentPane(bool); void canAddLayer(bool); void canImportMoreAudio(bool); void canReplaceMainAudio(bool); void canImportLayer(bool); void canChangeSessionTemplate(bool); void canExportAudio(bool); void canExportLayer(bool); void canExportImage(bool); void canRenameLayer(bool); void canEditLayer(bool); void canEditLayerTabular(bool); void canMeasureLayer(bool); void canSelect(bool); void canClearSelection(bool); void canEditSelection(bool); void canDeleteSelection(bool); void canPaste(bool); void canInsertInstant(bool); void canInsertInstantsAtBoundaries(bool); void canInsertItemAtSelection(bool); void canRenumberInstants(bool); void canDeleteCurrentLayer(bool); void canZoom(bool); void canScroll(bool); void canPlay(bool); void canFfwd(bool); void canRewind(bool); void canPlaySelection(bool); void canSpeedUpPlayback(bool); void canSlowDownPlayback(bool); void canChangePlaybackSpeed(bool); void canSelectPreviousPane(bool); void canSelectNextPane(bool); void canSelectPreviousLayer(bool); void canSelectNextLayer(bool); void canSave(bool); void hideSplash(); void replacedDocument(); void activity(QString); public slots: virtual void preferenceChanged(PropertyContainer::PropertyName); virtual void resizeConstrained(QSize); protected slots: virtual void zoomIn(); virtual void zoomOut(); virtual void zoomToFit(); virtual void zoomDefault(); virtual void scrollLeft(); virtual void scrollRight(); virtual void jumpLeft(); virtual void jumpRight(); virtual void peekLeft(); virtual void peekRight(); virtual void showNoOverlays(); virtual void showMinimalOverlays(); virtual void showAllOverlays(); virtual void toggleTimeRulers(); virtual void toggleZoomWheels(); virtual void togglePropertyBoxes(); virtual void toggleStatusBar(); virtual void toggleCentreLine(); virtual void play(); virtual void ffwd(); virtual void ffwdEnd(); virtual void rewind(); virtual void rewindStart(); virtual void stop(); virtual void ffwdSimilar(); virtual void rewindSimilar(); virtual void deleteCurrentPane(); virtual void deleteCurrentLayer(); virtual void editCurrentLayer(); virtual void previousPane(); virtual void nextPane(); virtual void previousLayer(); virtual void nextLayer(); virtual void playLoopToggled(); virtual void playSelectionToggled(); virtual void playSoloToggled(); virtual void sampleRateMismatch(size_t, size_t, bool) = 0; virtual void audioOverloadPluginDisabled() = 0; virtual void audioTimeStretchMultiChannelDisabled() = 0; virtual void playbackFrameChanged(unsigned long); virtual void globalCentreFrameChanged(unsigned long); virtual void viewCentreFrameChanged(View *, unsigned long); virtual void viewZoomLevelChanged(View *, unsigned long, bool); virtual void outputLevelsChanged(float, float) = 0; virtual void currentPaneChanged(Pane *); virtual void currentLayerChanged(Pane *, Layer *); virtual void selectAll(); virtual void selectToStart(); virtual void selectToEnd(); virtual void selectVisible(); virtual void clearSelection(); virtual void cut(); virtual void copy(); virtual void paste(); virtual void pasteAtPlaybackPosition(); virtual void pasteRelative(int offset); virtual void deleteSelected(); virtual void insertInstant(); virtual void insertInstantAt(size_t); virtual void insertInstantsAtBoundaries(); virtual void insertItemAtSelection(); virtual void insertItemAt(size_t, size_t); virtual void renumberInstants(); virtual void documentModified(); virtual void documentRestored(); virtual void layerAdded(Layer *); virtual void layerRemoved(Layer *); virtual void layerAboutToBeDeleted(Layer *); virtual void layerInAView(Layer *, bool); virtual void mainModelChanged(WaveFileModel *); virtual void modelAdded(Model *); virtual void modelAboutToBeDeleted(Model *); virtual void updateMenuStates(); virtual void updateDescriptionLabel() = 0; virtual void modelGenerationFailed(QString, QString) = 0; virtual void modelGenerationWarning(QString, QString) = 0; virtual void modelRegenerationFailed(QString, QString, QString) = 0; virtual void modelRegenerationWarning(QString, QString, QString) = 0; virtual void alignmentFailed(QString, QString) = 0; virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0; virtual void paneAdded(Pane *) = 0; virtual void paneHidden(Pane *) = 0; virtual void paneAboutToBeDeleted(Pane *) = 0; virtual void paneDropAccepted(Pane *, QStringList) = 0; virtual void paneDropAccepted(Pane *, QString) = 0; virtual void paneDeleteButtonClicked(Pane *); virtual void oscReady(); virtual void pollOSC(); virtual void handleOSCMessage(const OSCMessage &) = 0; virtual void contextHelpChanged(const QString &); virtual void inProgressSelectionChanged(); virtual FileOpenStatus openSessionFromRDF(FileSource source); virtual FileOpenStatus openLayersFromRDF(FileSource source); virtual void closeSession() = 0; virtual void newerVersionAvailable(QString) { } protected: QString m_sessionFile; QString m_audioFile; Document *m_document; PaneStack *m_paneStack; ViewManager *m_viewManager; Layer *m_timeRulerLayer; bool m_audioOutput; AudioCallbackPlaySource *m_playSource; AudioCallbackPlayTarget *m_playTarget; class OSCQueueStarter : public QThread { public: OSCQueueStarter(MainWindowBase *mwb) : QThread(mwb), m_mwb(mwb) { } virtual void run() { OSCQueue *queue = new OSCQueue(); // can take a long time m_mwb->m_oscQueue = queue; } private: MainWindowBase *m_mwb; }; OSCQueue *m_oscQueue; OSCQueueStarter *m_oscQueueStarter; void startOSCQueue(); MIDIInput *m_midiInput; RecentFiles m_recentFiles; RecentFiles m_recentTransforms; bool m_documentModified; bool m_openingAudioFile; bool m_abandoning; Labeller *m_labeller; int m_lastPlayStatusSec; mutable QString m_myStatusMessage; bool m_initialDarkBackground; WaveFileModel *getMainModel(); const WaveFileModel *getMainModel() const; void createDocument(); Pane *addPaneToStack(); Layer *getSnapLayer() const; typedef std::map > LayerDataDialogMap; typedef std::set > DataDialogSet; typedef std::map ViewDataDialogMap; LayerDataDialogMap m_layerDataDialogMap; ViewDataDialogMap m_viewDataDialogMap; void removeLayerEditDialog(Layer *); class PaneCallback : public SVFileReaderPaneCallback { public: PaneCallback(MainWindowBase *mw) : m_mw(mw) { } virtual Pane *addPane() { return m_mw->addPaneToStack(); } virtual void setWindowSize(int width, int height) { m_mw->resizeConstrained(QSize(width, height)); } virtual void addSelection(int start, int end) { m_mw->m_viewManager->addSelection(Selection(start, end)); } protected: MainWindowBase *m_mw; }; class AddPaneCommand : public Command { public: AddPaneCommand(MainWindowBase *mw); virtual ~AddPaneCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; Pane *getPane() { return m_pane; } protected: MainWindowBase *m_mw; Pane *m_pane; // Main window owns this, but I determine its lifespan Pane *m_prevCurrentPane; // I don't own this bool m_added; }; class RemovePaneCommand : public Command { public: RemovePaneCommand(MainWindowBase *mw, Pane *pane); virtual ~RemovePaneCommand(); virtual void execute(); virtual void unexecute(); virtual QString getName() const; protected: MainWindowBase *m_mw; Pane *m_pane; // Main window owns this, but I determine its lifespan Pane *m_prevCurrentPane; // I don't own this bool m_added; }; virtual bool checkSaveModified() = 0; virtual QString getOpenFileName(FileFinder::FileType type); virtual QString getSaveFileName(FileFinder::FileType type); virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path); virtual QString getDefaultSessionTemplate() const; virtual void setDefaultSessionTemplate(QString); virtual void createPlayTarget(); virtual void openHelpUrl(QString url); virtual void setupMenus() = 0; virtual void updateVisibleRangeDisplay(Pane *p) const = 0; virtual void updatePositionStatusDisplays() const = 0; virtual bool shouldCreateNewSessionForRDFAudio(bool *) { return true; } virtual void connectLayerEditDialog(ModelDataTableDialog *dialog); virtual void toXml(QTextStream &stream, bool asTemplate); }; #endif sonic-visualiser-2.3~repack1.orig/svapp/framework/SVFileReader.h0000644000175000017500000002047012252354725023507 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SV_FILE_READER_H_ #define _SV_FILE_READER_H_ #include "layer/LayerFactory.h" #include "transform/Transform.h" #include #include class Pane; class Model; class Document; class PlayParameters; class SVFileReaderPaneCallback { public: virtual ~SVFileReaderPaneCallback(); virtual Pane *addPane() = 0; virtual void setWindowSize(int width, int height) = 0; virtual void addSelection(int start, int end) = 0; }; /** SVFileReader loads Sonic Visualiser XML files. (The SV file format is bzipped XML.) Some notes about the SV XML format follow. We're very lazy with our XML: there's no schema or DTD, and we depend heavily on elements being in a particular order. \verbatim \endverbatim */ class SVFileReader : public QObject, QXmlDefaultHandler { Q_OBJECT public: SVFileReader(Document *document, SVFileReaderPaneCallback &callback, QString location = ""); // for audio file locate mechanism virtual ~SVFileReader(); void parse(const QString &xmlData); void parse(QXmlInputSource &source); bool isOK(); QString getErrorString() const { return m_errorString; } // For loading a single layer onto an existing pane void setCurrentPane(Pane *pane) { m_currentPane = pane; } virtual bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes& atts); virtual bool characters(const QString &); virtual bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName); bool error(const QXmlParseException &exception); bool fatalError(const QXmlParseException &exception); enum FileType { SVSessionFile, SVLayerFile, UnknownFileType }; static FileType identifyXmlFile(QString path); signals: void modelRegenerationFailed(QString layerName, QString transformName, QString message); void modelRegenerationWarning(QString layerName, QString transformName, QString message); protected: bool readWindow(const QXmlAttributes &); bool readModel(const QXmlAttributes &); bool readView(const QXmlAttributes &); bool readLayer(const QXmlAttributes &); bool readDatasetStart(const QXmlAttributes &); bool addBinToDataset(const QXmlAttributes &); bool addPointToDataset(const QXmlAttributes &); bool addRowToDataset(const QXmlAttributes &); bool readRowData(const QString &); bool readDerivation(const QXmlAttributes &); bool readPlayParameters(const QXmlAttributes &); bool readPlugin(const QXmlAttributes &); bool readTransform(const QXmlAttributes &); bool readParameter(const QXmlAttributes &); bool readSelection(const QXmlAttributes &); bool readMeasurement(const QXmlAttributes &); void addUnaddedModels(); bool haveModel(int id) { return (m_models.find(id) != m_models.end()) && m_models[id]; } Document *m_document; SVFileReaderPaneCallback &m_paneCallback; QString m_location; Pane *m_currentPane; std::map m_layers; std::map m_models; std::set m_addedModels; std::map m_awaitingDatasets; // map dataset id -> model id Layer *m_currentLayer; Model *m_currentDataset; Model *m_currentDerivedModel; int m_currentDerivedModelId; PlayParameters *m_currentPlayParameters; Transform m_currentTransform; Model *m_currentTransformSource; int m_currentTransformChannel; bool m_currentTransformIsNewStyle; QString m_datasetSeparator; bool m_inRow; bool m_inLayer; bool m_inView; bool m_inData; bool m_inSelections; int m_rowNumber; QString m_errorString; bool m_ok; }; #endif sonic-visualiser-2.3~repack1.orig/svapp/svapp.pro0000644000175000017500000000335412252354725020743 0ustar miramira TEMPLATE = lib exists(config.pri) { include(config.pri) } win* { !exists(config.pri) { DEFINES += HAVE_PORTAUDIO_2_0 } } CONFIG += staticlib qt thread warn_on stl rtti exceptions QT += network xml gui widgets TARGET = svapp DEPENDPATH += . ../svcore ../svgui INCLUDEPATH += . ../svcore ../svgui OBJECTS_DIR = o MOC_DIR = o win32-g++ { INCLUDEPATH += ../sv-dependency-builds/win32-mingw/include } win32-msvc* { INCLUDEPATH += ../sv-dependency-builds/win32-msvc/include } HEADERS += audioio/AudioCallbackPlaySource.h \ audioio/AudioCallbackPlayTarget.h \ audioio/AudioCoreAudioTarget.h \ audioio/AudioGenerator.h \ audioio/AudioJACKTarget.h \ audioio/AudioPortAudioTarget.h \ audioio/AudioPulseAudioTarget.h \ audioio/AudioTargetFactory.h \ audioio/PlaySpeedRangeMapper.h SOURCES += audioio/AudioCallbackPlaySource.cpp \ audioio/AudioCallbackPlayTarget.cpp \ audioio/AudioCoreAudioTarget.cpp \ audioio/AudioGenerator.cpp \ audioio/AudioJACKTarget.cpp \ audioio/AudioPortAudioTarget.cpp \ audioio/AudioPulseAudioTarget.cpp \ audioio/AudioTargetFactory.cpp \ audioio/PlaySpeedRangeMapper.cpp HEADERS += framework/Document.h \ framework/MainWindowBase.h \ framework/SVFileReader.h \ framework/TransformUserConfigurator.h \ framework/VersionTester.h SOURCES += framework/Document.cpp \ framework/MainWindowBase.cpp \ framework/SVFileReader.cpp \ framework/TransformUserConfigurator.cpp \ framework/VersionTester.cpp sonic-visualiser-2.3~repack1.orig/svapp/install-sh0000755000175000017500000003246412252354725021100 0ustar miramira#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sonic-visualiser-2.3~repack1.orig/svapp/acinclude.m40000644000175000017500000000777612252354725021275 0ustar miramira AC_DEFUN([SV_MODULE_REQUIRED], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE"],[AC_MSG_ERROR([Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE])]) if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_ERROR([Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE])]) fi fi ]) AC_DEFUN([SV_MODULE_OPTIONAL], [ SV_MODULE_MODULE=$1 SV_MODULE_VERSION_TEST="$2" SV_MODULE_HEADER=$3 SV_MODULE_LIB=$4 SV_MODULE_FUNC=$5 SV_MODULE_HAVE=HAVE_$(echo $1 | tr '[a-z]' '[A-Z]') SV_MODULE_FAILED=1 if test -n "$$1_LIBS" ; then AC_MSG_NOTICE([User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE]) CXXFLAGS="$CXXFLAGS $$1_CFLAGS" LIBS="$LIBS $$1_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then PKG_CHECK_MODULES($1,[$SV_MODULE_VERSION_TEST],[HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $$1_CFLAGS";LIBS="$LIBS $$1_LIBS";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means])]) fi if test -n "$SV_MODULE_FAILED"; then AC_CHECK_HEADER([$SV_MODULE_HEADER],[HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED=""],[AC_MSG_NOTICE([Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE])]) if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then AC_CHECK_LIB([$SV_MODULE_LIB],[$SV_MODULE_FUNC],[LIBS="$LIBS -l$SV_MODULE_LIB"],[AC_MSG_NOTICE([Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE])]) fi fi fi ]) # Check for Qt. The only part of Qt we use directly is qmake. AC_DEFUN([SV_CHECK_QT], [ AC_REQUIRE([AC_PROG_CXX]) if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, $QTDIR/bin/qmake-qt5,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, $QTDIR/bin/qmake,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake.exe, $QTDIR/bin/qmake.exe,,$QTDIR/bin/) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake-qt5, qmake-qt5,,$PATH) fi if test x$QMAKE = x ; then AC_CHECK_PROG(QMAKE, qmake, qmake,,$PATH) fi if test x$QMAKE = x ; then AC_MSG_ERROR([ Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. ]) fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) AC_MSG_WARN([ *** The version of qmake found in "$QMAKE" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. ]) esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac ]) sonic-visualiser-2.3~repack1.orig/svapp/Doxyfile0000644000175000017500000014253312252354725020601 0ustar miramira# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = svapp # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.9 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = audioio framework # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. #USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = Q* *.h # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = HAVE_FFTW3F HAVE_FISHSOUND HAVE_JACK HAVE_LIBLO HAVE_LRDF HAVE_MAD HAVE_OGGZ HAVE_PORTAUDIO HAVE_SAMPLERATE HAVE_SNDFILE HAVE_VAMP # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO sonic-visualiser-2.3~repack1.orig/svapp/bootstrap.sh0000644000175000017500000000004412252354725021432 0ustar miramira#!/bin/sh aclocal -I . && autoconf sonic-visualiser-2.3~repack1.orig/svapp/configure.ac0000644000175000017500000001063512252354725021356 0ustar miramira AC_INIT([SVapp], [2.1], cannam@all-day-breakfast.com) AC_CONFIG_SRCDIR(framework/Document.h) # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi AC_LANG_CPLUSPLUS AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_MKDIR_P AC_HEADER_STDC # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" PKG_PROG_PKG_CONFIG SV_CHECK_QT SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_DEBUG="-Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe" CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe" CXXFLAGS_MINIMAL="-g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build]) QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"]) if test x"$USER_CXXFLAGS" != x; then AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".]) AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.) CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen]) SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute]) SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute]) SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open]) SV_MODULE_REQUIRED([samplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new]) SV_MODULE_REQUIRED([vamp],[vamp >= 2.1],[vamp/vamp.h],[],[]) SV_MODULE_REQUIRED([vamphostsdk],[vamp-hostsdk >= 2.5],[vamp-hostsdk/PluginLoader.h],[vamp-hostsdk],[libvamphostsdk_v_2_5_present]) SV_MODULE_REQUIRED([rubberband],[rubberband],[rubberband/RubberBandStretcher.h],[rubberband],[rubberband_new]) SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new]) SV_MODULE_OPTIONAL([portaudio_2_0],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported]) SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open]) SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new]) SV_MODULE_OPTIONAL([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init]) SV_MODULE_OPTIONAL([oggz],[oggz >= 1.0.0],[oggz/oggz.h],[oggz],[oggz_run]) SV_MODULE_OPTIONAL([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new]) SV_MODULE_OPTIONAL([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init]) SV_MODULE_OPTIONAL([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new]) AC_SUBST(PERL) AC_SUBST(XARGS) AC_SUBST(MAKEDEPEND) AC_SUBST(SHA1SUM) AC_SUBST(CUT) AC_SUBST(CFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(CXXFLAGS_MINIMAL) AC_SUBST(HAVES) AC_SUBST(LIBS) AC_SUBST(CC) AC_SUBST(CXX) AC_SUBST(QMAKE_CONFIG) AC_CONFIG_FILES([config.pri]) AC_OUTPUT if ! $QMAKE -r svapp.pro; then AC_MSG_ERROR([qmake failed: Command was "$QMAKE -r"]) fi AC_MSG_NOTICE([ Configuration complete. Please check the above messages for any warnings that you might care about, and then run "make". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run "$QMAKE -r" again to regenerate the Makefile. ]) sonic-visualiser-2.3~repack1.orig/svapp/configure0000755000175000017500000076357412252354725021020 0ustar miramira#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for SVapp 2.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: cannam@all-day-breakfast.com about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='SVapp' PACKAGE_TARNAME='svapp' PACKAGE_VERSION='2.1' PACKAGE_STRING='SVapp 2.1' PACKAGE_BUGREPORT='cannam@all-day-breakfast.com' PACKAGE_URL='' ac_unique_file="framework/Document.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS QMAKE_CONFIG HAVES CXXFLAGS_MINIMAL CUT SHA1SUM MAKEDEPEND XARGS PERL id3tag_LIBS id3tag_CFLAGS mad_LIBS mad_CFLAGS fishsound_LIBS fishsound_CFLAGS oggz_LIBS oggz_CFLAGS lrdf_LIBS lrdf_CFLAGS libpulse_LIBS libpulse_CFLAGS JACK_LIBS JACK_CFLAGS portaudio_2_0_LIBS portaudio_2_0_CFLAGS liblo_LIBS liblo_CFLAGS rubberband_LIBS rubberband_CFLAGS vamphostsdk_LIBS vamphostsdk_CFLAGS vamp_LIBS vamp_CFLAGS samplerate_LIBS samplerate_CFLAGS sndfile_LIBS sndfile_CFLAGS fftw3f_LIBS fftw3f_CFLAGS fftw3_LIBS fftw3_CFLAGS bz2_LIBS bz2_CFLAGS QMAKE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG EGREP GREP CXXCPP MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM ac_ct_CXX CXXFLAGS CXX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR bz2_CFLAGS bz2_LIBS fftw3_CFLAGS fftw3_LIBS fftw3f_CFLAGS fftw3f_LIBS sndfile_CFLAGS sndfile_LIBS samplerate_CFLAGS samplerate_LIBS vamp_CFLAGS vamp_LIBS vamphostsdk_CFLAGS vamphostsdk_LIBS rubberband_CFLAGS rubberband_LIBS liblo_CFLAGS liblo_LIBS portaudio_2_0_CFLAGS portaudio_2_0_LIBS JACK_CFLAGS JACK_LIBS libpulse_CFLAGS libpulse_LIBS lrdf_CFLAGS lrdf_LIBS oggz_CFLAGS oggz_LIBS fishsound_CFLAGS fishsound_LIBS mad_CFLAGS mad_LIBS id3tag_CFLAGS id3tag_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures SVapp 2.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/svapp] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of SVapp 2.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debug support [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path bz2_CFLAGS C compiler flags for bz2, overriding pkg-config bz2_LIBS linker flags for bz2, overriding pkg-config fftw3_CFLAGS C compiler flags for fftw3, overriding pkg-config fftw3_LIBS linker flags for fftw3, overriding pkg-config fftw3f_CFLAGS C compiler flags for fftw3f, overriding pkg-config fftw3f_LIBS linker flags for fftw3f, overriding pkg-config sndfile_CFLAGS C compiler flags for sndfile, overriding pkg-config sndfile_LIBS linker flags for sndfile, overriding pkg-config samplerate_CFLAGS C compiler flags for samplerate, overriding pkg-config samplerate_LIBS linker flags for samplerate, overriding pkg-config vamp_CFLAGS C compiler flags for vamp, overriding pkg-config vamp_LIBS linker flags for vamp, overriding pkg-config vamphostsdk_CFLAGS C compiler flags for vamphostsdk, overriding pkg-config vamphostsdk_LIBS linker flags for vamphostsdk, overriding pkg-config rubberband_CFLAGS C compiler flags for rubberband, overriding pkg-config rubberband_LIBS linker flags for rubberband, overriding pkg-config liblo_CFLAGS C compiler flags for liblo, overriding pkg-config liblo_LIBS linker flags for liblo, overriding pkg-config portaudio_2_0_CFLAGS C compiler flags for portaudio_2_0, overriding pkg-config portaudio_2_0_LIBS linker flags for portaudio_2_0, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config libpulse_CFLAGS C compiler flags for libpulse, overriding pkg-config libpulse_LIBS linker flags for libpulse, overriding pkg-config lrdf_CFLAGS C compiler flags for lrdf, overriding pkg-config lrdf_LIBS linker flags for lrdf, overriding pkg-config oggz_CFLAGS C compiler flags for oggz, overriding pkg-config oggz_LIBS linker flags for oggz, overriding pkg-config fishsound_CFLAGS C compiler flags for fishsound, overriding pkg-config fishsound_LIBS linker flags for fishsound, overriding pkg-config mad_CFLAGS C compiler flags for mad, overriding pkg-config mad_LIBS linker flags for mad, overriding pkg-config id3tag_CFLAGS C compiler flags for id3tag, overriding pkg-config id3tag_LIBS linker flags for id3tag, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF SVapp configure 2.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to cannam@all-day-breakfast.com ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by SVapp $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake.exe", so it can be a program name with args. set dummy qmake.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then as_fn_error $? " Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. " "$LINENO" 5 fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&5 $as_echo "$as_me: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&2;} esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_DEBUG="-Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe" CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe" CXXFLAGS_MINIMAL="-g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; { $as_echo "$as_me:${as_lineno-$LINENO}: enabling debug build" >&5 $as_echo "$as_me: enabling debug build" >&6;} QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG" fi if test x"$USER_CXXFLAGS" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&5 $as_echo "$as_me: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Overriding default compiler flags with the above user setting." >&5 $as_echo "$as_me: Overriding default compiler flags with the above user setting." >&6;} CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done SV_MODULE_MODULE=bz2 SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=bzlib.h SV_MODULE_LIB=bz2 SV_MODULE_FUNC=BZ2_bzReadOpen SV_MODULE_HAVE=HAVE_$(echo bz2 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$bz2_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $bz2_CFLAGS" LIBS="$LIBS $bz2_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bz2" >&5 $as_echo_n "checking for bz2... " >&6; } if test -n "$bz2_CFLAGS"; then pkg_cv_bz2_CFLAGS="$bz2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$bz2_LIBS"; then pkg_cv_bz2_LIBS="$bz2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then bz2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else bz2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$bz2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else bz2_CFLAGS=$pkg_cv_bz2_CFLAGS bz2_LIBS=$pkg_cv_bz2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $bz2_CFLAGS";LIBS="$LIBS $bz2_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3 SV_MODULE_VERSION_TEST="fftw3 >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3 SV_MODULE_FUNC=fftw_execute SV_MODULE_HAVE=HAVE_$(echo fftw3 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS" LIBS="$LIBS $fftw3_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3" >&5 $as_echo_n "checking for fftw3... " >&6; } if test -n "$fftw3_CFLAGS"; then pkg_cv_fftw3_CFLAGS="$fftw3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3_LIBS"; then pkg_cv_fftw3_LIBS="$fftw3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3_CFLAGS=$pkg_cv_fftw3_CFLAGS fftw3_LIBS=$pkg_cv_fftw3_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS";LIBS="$LIBS $fftw3_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3f SV_MODULE_VERSION_TEST="fftw3f >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3f SV_MODULE_FUNC=fftwf_execute SV_MODULE_HAVE=HAVE_$(echo fftw3f | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3f_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS" LIBS="$LIBS $fftw3f_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3f" >&5 $as_echo_n "checking for fftw3f... " >&6; } if test -n "$fftw3f_CFLAGS"; then pkg_cv_fftw3f_CFLAGS="$fftw3f_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3f_LIBS"; then pkg_cv_fftw3f_LIBS="$fftw3f_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3f_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3f_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3f_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3f_CFLAGS=$pkg_cv_fftw3f_CFLAGS fftw3f_LIBS=$pkg_cv_fftw3f_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS";LIBS="$LIBS $fftw3f_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sndfile SV_MODULE_VERSION_TEST="sndfile >= 1.0.16" SV_MODULE_HEADER=sndfile.h SV_MODULE_LIB=sndfile SV_MODULE_FUNC=sf_open SV_MODULE_HAVE=HAVE_$(echo sndfile | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sndfile_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS" LIBS="$LIBS $sndfile_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sndfile" >&5 $as_echo_n "checking for sndfile... " >&6; } if test -n "$sndfile_CFLAGS"; then pkg_cv_sndfile_CFLAGS="$sndfile_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sndfile_LIBS"; then pkg_cv_sndfile_LIBS="$sndfile_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sndfile_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sndfile_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sndfile_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sndfile_CFLAGS=$pkg_cv_sndfile_CFLAGS sndfile_LIBS=$pkg_cv_sndfile_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS";LIBS="$LIBS $sndfile_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=samplerate SV_MODULE_VERSION_TEST="samplerate >= 0.1.2" SV_MODULE_HEADER=samplerate.h SV_MODULE_LIB=samplerate SV_MODULE_FUNC=src_new SV_MODULE_HAVE=HAVE_$(echo samplerate | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$samplerate_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS" LIBS="$LIBS $samplerate_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for samplerate" >&5 $as_echo_n "checking for samplerate... " >&6; } if test -n "$samplerate_CFLAGS"; then pkg_cv_samplerate_CFLAGS="$samplerate_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$samplerate_LIBS"; then pkg_cv_samplerate_LIBS="$samplerate_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then samplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else samplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$samplerate_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else samplerate_CFLAGS=$pkg_cv_samplerate_CFLAGS samplerate_LIBS=$pkg_cv_samplerate_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS";LIBS="$LIBS $samplerate_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=vamp SV_MODULE_VERSION_TEST="vamp >= 2.1" SV_MODULE_HEADER=vamp/vamp.h SV_MODULE_LIB= SV_MODULE_FUNC= SV_MODULE_HAVE=HAVE_$(echo vamp | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$vamp_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $vamp_CFLAGS" LIBS="$LIBS $vamp_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vamp" >&5 $as_echo_n "checking for vamp... " >&6; } if test -n "$vamp_CFLAGS"; then pkg_cv_vamp_CFLAGS="$vamp_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamp_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$vamp_LIBS"; then pkg_cv_vamp_LIBS="$vamp_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamp_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then vamp_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else vamp_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$vamp_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else vamp_CFLAGS=$pkg_cv_vamp_CFLAGS vamp_LIBS=$pkg_cv_vamp_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $vamp_CFLAGS";LIBS="$LIBS $vamp_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=vamphostsdk SV_MODULE_VERSION_TEST="vamp-hostsdk >= 2.5" SV_MODULE_HEADER=vamp-hostsdk/PluginLoader.h SV_MODULE_LIB=vamp-hostsdk SV_MODULE_FUNC=libvamphostsdk_v_2_5_present SV_MODULE_HAVE=HAVE_$(echo vamphostsdk | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$vamphostsdk_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $vamphostsdk_CFLAGS" LIBS="$LIBS $vamphostsdk_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vamphostsdk" >&5 $as_echo_n "checking for vamphostsdk... " >&6; } if test -n "$vamphostsdk_CFLAGS"; then pkg_cv_vamphostsdk_CFLAGS="$vamphostsdk_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamphostsdk_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$vamphostsdk_LIBS"; then pkg_cv_vamphostsdk_LIBS="$vamphostsdk_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamphostsdk_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then vamphostsdk_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else vamphostsdk_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$vamphostsdk_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else vamphostsdk_CFLAGS=$pkg_cv_vamphostsdk_CFLAGS vamphostsdk_LIBS=$pkg_cv_vamphostsdk_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $vamphostsdk_CFLAGS";LIBS="$LIBS $vamphostsdk_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=rubberband SV_MODULE_VERSION_TEST="rubberband" SV_MODULE_HEADER=rubberband/RubberBandStretcher.h SV_MODULE_LIB=rubberband SV_MODULE_FUNC=rubberband_new SV_MODULE_HAVE=HAVE_$(echo rubberband | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$rubberband_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS" LIBS="$LIBS $rubberband_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rubberband" >&5 $as_echo_n "checking for rubberband... " >&6; } if test -n "$rubberband_CFLAGS"; then pkg_cv_rubberband_CFLAGS="$rubberband_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$rubberband_LIBS"; then pkg_cv_rubberband_LIBS="$rubberband_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then rubberband_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else rubberband_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$rubberband_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else rubberband_CFLAGS=$pkg_cv_rubberband_CFLAGS rubberband_LIBS=$pkg_cv_rubberband_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS";LIBS="$LIBS $rubberband_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=liblo SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=lo/lo.h SV_MODULE_LIB=lo SV_MODULE_FUNC=lo_address_new SV_MODULE_HAVE=HAVE_$(echo liblo | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$liblo_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $liblo_CFLAGS" LIBS="$LIBS $liblo_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for liblo" >&5 $as_echo_n "checking for liblo... " >&6; } if test -n "$liblo_CFLAGS"; then pkg_cv_liblo_CFLAGS="$liblo_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$liblo_LIBS"; then pkg_cv_liblo_LIBS="$liblo_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then liblo_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else liblo_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$liblo_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else liblo_CFLAGS=$pkg_cv_liblo_CFLAGS liblo_LIBS=$pkg_cv_liblo_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $liblo_CFLAGS";LIBS="$LIBS $liblo_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=portaudio_2_0 SV_MODULE_VERSION_TEST="portaudio-2.0 >= 19" SV_MODULE_HEADER=portaudio.h SV_MODULE_LIB=portaudio SV_MODULE_FUNC=Pa_IsFormatSupported SV_MODULE_HAVE=HAVE_$(echo portaudio_2_0 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$portaudio_2_0_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS" LIBS="$LIBS $portaudio_2_0_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio_2_0" >&5 $as_echo_n "checking for portaudio_2_0... " >&6; } if test -n "$portaudio_2_0_CFLAGS"; then pkg_cv_portaudio_2_0_CFLAGS="$portaudio_2_0_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$portaudio_2_0_LIBS"; then pkg_cv_portaudio_2_0_LIBS="$portaudio_2_0_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$portaudio_2_0_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else portaudio_2_0_CFLAGS=$pkg_cv_portaudio_2_0_CFLAGS portaudio_2_0_LIBS=$pkg_cv_portaudio_2_0_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS";LIBS="$LIBS $portaudio_2_0_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=JACK SV_MODULE_VERSION_TEST="jack >= 0.100" SV_MODULE_HEADER=jack/jack.h SV_MODULE_LIB=jack SV_MODULE_FUNC=jack_client_open SV_MODULE_HAVE=HAVE_$(echo JACK | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$JACK_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $JACK_CFLAGS";LIBS="$LIBS $JACK_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=libpulse SV_MODULE_VERSION_TEST="libpulse >= 0.9" SV_MODULE_HEADER=pulse/pulseaudio.h SV_MODULE_LIB=pulse SV_MODULE_FUNC=pa_stream_new SV_MODULE_HAVE=HAVE_$(echo libpulse | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$libpulse_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS" LIBS="$LIBS $libpulse_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpulse" >&5 $as_echo_n "checking for libpulse... " >&6; } if test -n "$libpulse_CFLAGS"; then pkg_cv_libpulse_CFLAGS="$libpulse_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libpulse_LIBS"; then pkg_cv_libpulse_LIBS="$libpulse_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libpulse_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else libpulse_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libpulse_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else libpulse_CFLAGS=$pkg_cv_libpulse_CFLAGS libpulse_LIBS=$pkg_cv_libpulse_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS";LIBS="$LIBS $libpulse_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=lrdf SV_MODULE_VERSION_TEST="lrdf >= 0.2" SV_MODULE_HEADER=lrdf.h SV_MODULE_LIB=lrdf SV_MODULE_FUNC=lrdf_init SV_MODULE_HAVE=HAVE_$(echo lrdf | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$lrdf_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS" LIBS="$LIBS $lrdf_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrdf" >&5 $as_echo_n "checking for lrdf... " >&6; } if test -n "$lrdf_CFLAGS"; then pkg_cv_lrdf_CFLAGS="$lrdf_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$lrdf_LIBS"; then pkg_cv_lrdf_LIBS="$lrdf_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then lrdf_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else lrdf_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$lrdf_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else lrdf_CFLAGS=$pkg_cv_lrdf_CFLAGS lrdf_LIBS=$pkg_cv_lrdf_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS";LIBS="$LIBS $lrdf_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=oggz SV_MODULE_VERSION_TEST="oggz >= 1.0.0" SV_MODULE_HEADER=oggz/oggz.h SV_MODULE_LIB=oggz SV_MODULE_FUNC=oggz_run SV_MODULE_HAVE=HAVE_$(echo oggz | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$oggz_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $oggz_CFLAGS" LIBS="$LIBS $oggz_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oggz" >&5 $as_echo_n "checking for oggz... " >&6; } if test -n "$oggz_CFLAGS"; then pkg_cv_oggz_CFLAGS="$oggz_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$oggz_LIBS"; then pkg_cv_oggz_LIBS="$oggz_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then oggz_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else oggz_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$oggz_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else oggz_CFLAGS=$pkg_cv_oggz_CFLAGS oggz_LIBS=$pkg_cv_oggz_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $oggz_CFLAGS";LIBS="$LIBS $oggz_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=fishsound SV_MODULE_VERSION_TEST="fishsound >= 1.0.0" SV_MODULE_HEADER=fishsound/fishsound.h SV_MODULE_LIB=fishsound SV_MODULE_FUNC=fish_sound_new SV_MODULE_HAVE=HAVE_$(echo fishsound | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fishsound_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS" LIBS="$LIBS $fishsound_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fishsound" >&5 $as_echo_n "checking for fishsound... " >&6; } if test -n "$fishsound_CFLAGS"; then pkg_cv_fishsound_CFLAGS="$fishsound_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fishsound_LIBS"; then pkg_cv_fishsound_LIBS="$fishsound_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fishsound_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fishsound_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fishsound_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fishsound_CFLAGS=$pkg_cv_fishsound_CFLAGS fishsound_LIBS=$pkg_cv_fishsound_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS";LIBS="$LIBS $fishsound_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=mad SV_MODULE_VERSION_TEST="mad >= 0.15.0" SV_MODULE_HEADER=mad.h SV_MODULE_LIB=mad SV_MODULE_FUNC=mad_decoder_init SV_MODULE_HAVE=HAVE_$(echo mad | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$mad_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $mad_CFLAGS" LIBS="$LIBS $mad_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mad" >&5 $as_echo_n "checking for mad... " >&6; } if test -n "$mad_CFLAGS"; then pkg_cv_mad_CFLAGS="$mad_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$mad_LIBS"; then pkg_cv_mad_LIBS="$mad_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then mad_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else mad_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$mad_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else mad_CFLAGS=$pkg_cv_mad_CFLAGS mad_LIBS=$pkg_cv_mad_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $mad_CFLAGS";LIBS="$LIBS $mad_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=id3tag SV_MODULE_VERSION_TEST="id3tag >= 0.15.0" SV_MODULE_HEADER=id3tag.h SV_MODULE_LIB=id3tag SV_MODULE_FUNC=id3_tag_new SV_MODULE_HAVE=HAVE_$(echo id3tag | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$id3tag_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS" LIBS="$LIBS $id3tag_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for id3tag" >&5 $as_echo_n "checking for id3tag... " >&6; } if test -n "$id3tag_CFLAGS"; then pkg_cv_id3tag_CFLAGS="$id3tag_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$id3tag_LIBS"; then pkg_cv_id3tag_LIBS="$id3tag_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then id3tag_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else id3tag_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$id3tag_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else id3tag_CFLAGS=$pkg_cv_id3tag_CFLAGS id3tag_LIBS=$pkg_cv_id3tag_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS";LIBS="$LIBS $id3tag_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi ac_config_files="$ac_config_files config.pri" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by SVapp $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ SVapp config.status 2.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.pri") CONFIG_FILES="$CONFIG_FILES config.pri" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if ! $QMAKE -r svapp.pro; then as_fn_error $? "qmake failed: Command was \"$QMAKE -r\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&5 $as_echo "$as_me: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&6;} sonic-visualiser-2.3~repack1.orig/svapp/config.pri.in0000644000175000017500000000062112252354725021450 0ustar miramira CONFIG += @QMAKE_CONFIG@ DEFINES += @HAVES@ QMAKE_CC = @CC@ QMAKE_CXX = @CXX@ QMAKE_LINK = @CXX@ QMAKE_CFLAGS += @CFLAGS@ QMAKE_CXXFLAGS += @CXXFLAGS@ linux*:LIBS += -lasound macx*:DEFINES += HAVE_QUICKTIME macx*:LIBS += -framework QuickTime -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices LIBS += @LIBS@ sonic-visualiser-2.3~repack1.orig/svapp/COPYING0000644000175000017500000003543312252354725020126 0ustar miramira GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS sonic-visualiser-2.3~repack1.orig/svapp/audioio/0000755000175000017500000000000012264464201020506 5ustar miramirasonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioPortAudioTarget.h0000644000175000017500000000336212252354725024730 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_PORT_AUDIO_TARGET_H_ #define _AUDIO_PORT_AUDIO_TARGET_H_ #ifdef HAVE_PORTAUDIO_2_0 // This code requires PortAudio v19 -- it won't work with v18. #include #include #include "AudioCallbackPlayTarget.h" class AudioCallbackPlaySource; class AudioPortAudioTarget : public AudioCallbackPlayTarget { Q_OBJECT public: AudioPortAudioTarget(AudioCallbackPlaySource *source); virtual ~AudioPortAudioTarget(); virtual void shutdown(); virtual bool isOK() const; virtual double getCurrentTime() const; public slots: virtual void sourceModelReplaced(); protected: int process(const void *input, void *output, unsigned long frames, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags); static int processStatic(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *, PaStreamCallbackFlags, void *); PaStream *m_stream; int m_bufferSize; int m_sampleRate; int m_latency; bool m_prioritySet; bool m_done; }; #endif /* HAVE_PORTAUDIO */ #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioCallbackPlayTarget.h0000644000175000017500000000335612252354725025347 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_CALLBACK_PLAY_TARGET_H_ #define _AUDIO_CALLBACK_PLAY_TARGET_H_ #include class AudioCallbackPlaySource; class AudioCallbackPlayTarget : public QObject { Q_OBJECT public: AudioCallbackPlayTarget(AudioCallbackPlaySource *source); virtual ~AudioCallbackPlayTarget(); virtual bool isOK() const = 0; virtual void shutdown() = 0; virtual double getCurrentTime() const = 0; float getOutputGain() const { return m_outputGain; } public slots: /** * Set the playback gain (0.0 = silence, 1.0 = levels unmodified) */ virtual void setOutputGain(float gain); /** * The main source model (providing the playback sample rate) has * been changed. The target should query the source's sample * rate, set its output sample rate accordingly, and call back on * the source's setTargetSampleRate to indicate what sample rate * it succeeded in setting at the output. If this differs from * the model rate, the source will resample. */ virtual void sourceModelReplaced() = 0; protected: AudioCallbackPlaySource *m_source; float m_outputGain; }; #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioPulseAudioTarget.cpp0000644000175000017500000003035212252354725025426 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifdef HAVE_LIBPULSE #include "AudioPulseAudioTarget.h" #include "AudioCallbackPlaySource.h" #include #include #include #include #define DEBUG_AUDIO_PULSE_AUDIO_TARGET 1 //#define DEBUG_AUDIO_PULSE_AUDIO_TARGET_PLAY 1 AudioPulseAudioTarget::AudioPulseAudioTarget(AudioCallbackPlaySource *source) : AudioCallbackPlayTarget(source), m_mutex(QMutex::Recursive), m_loop(0), m_api(0), m_context(0), m_stream(0), m_loopThread(0), m_bufferSize(0), m_sampleRate(0), m_latency(0), m_done(false) { #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET cerr << "AudioPulseAudioTarget: Initialising for PulseAudio" << endl; #endif m_loop = pa_mainloop_new(); if (!m_loop) { cerr << "ERROR: AudioPulseAudioTarget: Failed to create main loop" << endl; return; } m_api = pa_mainloop_get_api(m_loop); //!!! handle signals how? m_bufferSize = 20480; m_sampleRate = 44100; if (m_source && (m_source->getSourceSampleRate() != 0)) { m_sampleRate = m_source->getSourceSampleRate(); } m_spec.rate = m_sampleRate; m_spec.channels = 2; m_spec.format = PA_SAMPLE_FLOAT32NE; #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET cerr << "AudioPulseAudioTarget: Creating context" << endl; #endif m_context = pa_context_new(m_api, source->getClientName().toLocal8Bit().data()); if (!m_context) { cerr << "ERROR: AudioPulseAudioTarget: Failed to create context object" << endl; return; } pa_context_set_state_callback(m_context, contextStateChangedStatic, this); #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET cerr << "AudioPulseAudioTarget: Connecting to default server..." << endl; #endif pa_context_connect(m_context, 0, // default server (pa_context_flags_t)PA_CONTEXT_NOAUTOSPAWN, 0); #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET cerr << "AudioPulseAudioTarget: Starting main loop" << endl; #endif m_loopThread = new MainLoopThread(m_loop); m_loopThread->start(); #ifdef DEBUG_PULSE_AUDIO_TARGET cerr << "AudioPulseAudioTarget: initialised OK" << endl; #endif } AudioPulseAudioTarget::~AudioPulseAudioTarget() { SVDEBUG << "AudioPulseAudioTarget::~AudioPulseAudioTarget()" << endl; if (m_source) { m_source->setTarget(0, m_bufferSize); } shutdown(); QMutexLocker locker(&m_mutex); if (m_stream) pa_stream_unref(m_stream); if (m_context) pa_context_unref(m_context); if (m_loop) { pa_signal_done(); pa_mainloop_free(m_loop); } m_stream = 0; m_context = 0; m_loop = 0; SVDEBUG << "AudioPulseAudioTarget::~AudioPulseAudioTarget() done" << endl; } void AudioPulseAudioTarget::shutdown() { m_done = true; } bool AudioPulseAudioTarget::isOK() const { return (m_context != 0); } double AudioPulseAudioTarget::getCurrentTime() const { if (!m_stream) return 0.0; pa_usec_t usec = 0; pa_stream_get_time(m_stream, &usec); return usec / 1000000.f; } void AudioPulseAudioTarget::sourceModelReplaced() { m_source->setTargetSampleRate(m_sampleRate); } void AudioPulseAudioTarget::streamWriteStatic(pa_stream *stream, size_t length, void *data) { AudioPulseAudioTarget *target = (AudioPulseAudioTarget *)data; assert(stream == target->m_stream); target->streamWrite(length); } void AudioPulseAudioTarget::streamWrite(size_t requested) { #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET_PLAY cout << "AudioPulseAudioTarget::streamWrite(" << requested << ")" << endl; #endif if (m_done) return; QMutexLocker locker(&m_mutex); pa_usec_t latency = 0; int negative = 0; if (!pa_stream_get_latency(m_stream, &latency, &negative)) { int latframes = (latency / 1000000.f) * float(m_sampleRate); if (latframes > 0) m_source->setTargetPlayLatency(latframes); } static float *output = 0; static float **tmpbuf = 0; static size_t tmpbufch = 0; static size_t tmpbufsz = 0; size_t sourceChannels = m_source->getSourceChannelCount(); // Because we offer pan, we always want at least 2 channels if (sourceChannels < 2) sourceChannels = 2; size_t nframes = requested / (sourceChannels * sizeof(float)); if (nframes > m_bufferSize) { cerr << "WARNING: AudioPulseAudioTarget::streamWrite: nframes " << nframes << " > m_bufferSize " << m_bufferSize << endl; } #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET_PLAY cout << "AudioPulseAudioTarget::streamWrite: nframes = " << nframes << endl; #endif if (!tmpbuf || tmpbufch != sourceChannels || int(tmpbufsz) < nframes) { if (tmpbuf) { for (size_t i = 0; i < tmpbufch; ++i) { delete[] tmpbuf[i]; } delete[] tmpbuf; } if (output) { delete[] output; } tmpbufch = sourceChannels; tmpbufsz = nframes; tmpbuf = new float *[tmpbufch]; for (size_t i = 0; i < tmpbufch; ++i) { tmpbuf[i] = new float[tmpbufsz]; } output = new float[tmpbufsz * tmpbufch]; } size_t received = m_source->getSourceSamples(nframes, tmpbuf); #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET_PLAY cerr << "requested " << nframes << ", received " << received << endl; if (received < nframes) { cerr << "*** WARNING: Wrong number of frames received" << endl; } #endif float peakLeft = 0.0, peakRight = 0.0; for (size_t ch = 0; ch < 2; ++ch) { float peak = 0.0; if (ch < sourceChannels) { // PulseAudio samples are interleaved for (size_t i = 0; i < nframes; ++i) { if (i < received) { output[i * 2 + ch] = tmpbuf[ch][i] * m_outputGain; float sample = fabsf(output[i * 2 + ch]); if (sample > peak) peak = sample; } else { output[i * 2 + ch] = 0; } } } else if (ch == 1 && sourceChannels == 1) { for (size_t i = 0; i < nframes; ++i) { if (i < received) { output[i * 2 + ch] = tmpbuf[0][i] * m_outputGain; float sample = fabsf(output[i * 2 + ch]); if (sample > peak) peak = sample; } else { output[i * 2 + ch] = 0; } } } else { for (size_t i = 0; i < nframes; ++i) { output[i * 2 + ch] = 0; } } if (ch == 0) peakLeft = peak; if (ch > 0 || sourceChannels == 1) peakRight = peak; } #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET_PLAY SVDEBUG << "calling pa_stream_write with " << nframes * tmpbufch * sizeof(float) << " bytes" << endl; #endif pa_stream_write(m_stream, output, nframes * tmpbufch * sizeof(float), 0, 0, PA_SEEK_RELATIVE); m_source->setOutputLevels(peakLeft, peakRight); return; } void AudioPulseAudioTarget::streamStateChangedStatic(pa_stream *stream, void *data) { AudioPulseAudioTarget *target = (AudioPulseAudioTarget *)data; assert(stream == target->m_stream); target->streamStateChanged(); } void AudioPulseAudioTarget::streamStateChanged() { #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET SVDEBUG << "AudioPulseAudioTarget::streamStateChanged" << endl; #endif QMutexLocker locker(&m_mutex); switch (pa_stream_get_state(m_stream)) { case PA_STREAM_CREATING: case PA_STREAM_TERMINATED: break; case PA_STREAM_READY: { SVDEBUG << "AudioPulseAudioTarget::streamStateChanged: Ready" << endl; pa_usec_t latency = 0; int negative = 0; if (pa_stream_get_latency(m_stream, &latency, &negative)) { cerr << "AudioPulseAudioTarget::streamStateChanged: Failed to query latency" << endl; } cerr << "Latency = " << latency << " usec" << endl; int latframes = (latency / 1000000.f) * float(m_sampleRate); cerr << "that's " << latframes << " frames" << endl; const pa_buffer_attr *attr; if (!(attr = pa_stream_get_buffer_attr(m_stream))) { SVDEBUG << "AudioPulseAudioTarget::streamStateChanged: Cannot query stream buffer attributes" << endl; m_source->setTarget(this, m_bufferSize); m_source->setTargetSampleRate(m_sampleRate); if (latframes != 0) m_source->setTargetPlayLatency(latframes); } else { int targetLength = attr->tlength; SVDEBUG << "AudioPulseAudioTarget::streamStateChanged: stream target length = " << targetLength << endl; m_source->setTarget(this, targetLength); m_source->setTargetSampleRate(m_sampleRate); if (latframes == 0) latframes = targetLength; cerr << "latency = " << latframes << endl; m_source->setTargetPlayLatency(latframes); } } break; case PA_STREAM_FAILED: default: cerr << "AudioPulseAudioTarget::streamStateChanged: Error: " << pa_strerror(pa_context_errno(m_context)) << endl; //!!! do something... break; } } void AudioPulseAudioTarget::contextStateChangedStatic(pa_context *context, void *data) { AudioPulseAudioTarget *target = (AudioPulseAudioTarget *)data; assert(context == target->m_context); target->contextStateChanged(); } void AudioPulseAudioTarget::contextStateChanged() { #ifdef DEBUG_AUDIO_PULSE_AUDIO_TARGET SVDEBUG << "AudioPulseAudioTarget::contextStateChanged" << endl; #endif QMutexLocker locker(&m_mutex); switch (pa_context_get_state(m_context)) { case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; case PA_CONTEXT_READY: SVDEBUG << "AudioPulseAudioTarget::contextStateChanged: Ready" << endl; m_stream = pa_stream_new(m_context, "stream", &m_spec, 0); assert(m_stream); //!!! pa_stream_set_state_callback(m_stream, streamStateChangedStatic, this); pa_stream_set_write_callback(m_stream, streamWriteStatic, this); pa_stream_set_overflow_callback(m_stream, streamOverflowStatic, this); pa_stream_set_underflow_callback(m_stream, streamUnderflowStatic, this); if (pa_stream_connect_playback (m_stream, 0, 0, pa_stream_flags_t(PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE), 0, 0)) { //??? return value cerr << "AudioPulseAudioTarget: Failed to connect playback stream" << endl; } break; case PA_CONTEXT_TERMINATED: SVDEBUG << "AudioPulseAudioTarget::contextStateChanged: Terminated" << endl; //!!! do something... break; case PA_CONTEXT_FAILED: default: cerr << "AudioPulseAudioTarget::contextStateChanged: Error: " << pa_strerror(pa_context_errno(m_context)) << endl; //!!! do something... break; } } void AudioPulseAudioTarget::streamOverflowStatic(pa_stream *, void *) { SVDEBUG << "AudioPulseAudioTarget::streamOverflowStatic: Overflow!" << endl; } void AudioPulseAudioTarget::streamUnderflowStatic(pa_stream *, void *data) { SVDEBUG << "AudioPulseAudioTarget::streamUnderflowStatic: Underflow!" << endl; AudioPulseAudioTarget *target = (AudioPulseAudioTarget *)data; if (target && target->m_source) { target->m_source->audioProcessingOverload(); } } #endif /* HAVE_PULSEAUDIO */ sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioGenerator.cpp0000644000175000017500000004746012252354725024143 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "AudioGenerator.h" #include "base/TempDirectory.h" #include "base/PlayParameters.h" #include "base/PlayParameterRepository.h" #include "base/Pitch.h" #include "base/Exceptions.h" #include "data/model/NoteModel.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "plugin/RealTimePluginFactory.h" #include "plugin/RealTimePluginInstance.h" #include "plugin/PluginIdentifier.h" #include "plugin/PluginXml.h" #include "plugin/api/alsa/seq_event.h" #include #include #include #include const size_t AudioGenerator::m_pluginBlockSize = 2048; QString AudioGenerator::m_sampleDir = ""; //#define DEBUG_AUDIO_GENERATOR 1 AudioGenerator::AudioGenerator() : m_sourceSampleRate(0), m_targetChannelCount(1), m_soloing(false) { initialiseSampleDir(); connect(PlayParameterRepository::getInstance(), SIGNAL(playPluginIdChanged(const Playable *, QString)), this, SLOT(playPluginIdChanged(const Playable *, QString))); connect(PlayParameterRepository::getInstance(), SIGNAL(playPluginConfigurationChanged(const Playable *, QString)), this, SLOT(playPluginConfigurationChanged(const Playable *, QString))); } AudioGenerator::~AudioGenerator() { #ifdef DEBUG_AUDIO_GENERATOR SVDEBUG << "AudioGenerator::~AudioGenerator" << endl; #endif } void AudioGenerator::initialiseSampleDir() { if (m_sampleDir != "") return; try { m_sampleDir = TempDirectory::getInstance()->getSubDirectoryPath("samples"); } catch (DirectoryCreationFailed f) { cerr << "WARNING: AudioGenerator::initialiseSampleDir:" << " Failed to create temporary sample directory" << endl; m_sampleDir = ""; return; } QDir sampleResourceDir(":/samples", "*.wav"); for (unsigned int i = 0; i < sampleResourceDir.count(); ++i) { QString fileName(sampleResourceDir[i]); QFile file(sampleResourceDir.filePath(fileName)); QString target = QDir(m_sampleDir).filePath(fileName); if (!file.copy(target)) { cerr << "WARNING: AudioGenerator::getSampleDir: " << "Unable to copy " << fileName << " into temporary directory \"" << m_sampleDir << "\"" << endl; } else { QFile tf(target); tf.setPermissions(tf.permissions() | QFile::WriteOwner | QFile::WriteUser); } } } bool AudioGenerator::addModel(Model *model) { if (m_sourceSampleRate == 0) { m_sourceSampleRate = model->getSampleRate(); } else { DenseTimeValueModel *dtvm = dynamic_cast(model); if (dtvm) { m_sourceSampleRate = model->getSampleRate(); return true; } } RealTimePluginInstance *plugin = loadPluginFor(model); if (plugin) { QMutexLocker locker(&m_mutex); m_synthMap[model] = plugin; return true; } return false; } void AudioGenerator::playPluginIdChanged(const Playable *playable, QString) { const Model *model = dynamic_cast(playable); if (!model) { cerr << "WARNING: AudioGenerator::playPluginIdChanged: playable " << playable << " is not a supported model type" << endl; return; } if (m_synthMap.find(model) == m_synthMap.end()) return; RealTimePluginInstance *plugin = loadPluginFor(model); if (plugin) { QMutexLocker locker(&m_mutex); delete m_synthMap[model]; m_synthMap[model] = plugin; } } void AudioGenerator::playPluginConfigurationChanged(const Playable *playable, QString configurationXml) { // SVDEBUG << "AudioGenerator::playPluginConfigurationChanged" << endl; const Model *model = dynamic_cast(playable); if (!model) { cerr << "WARNING: AudioGenerator::playPluginIdChanged: playable " << playable << " is not a supported model type" << endl; return; } if (m_synthMap.find(model) == m_synthMap.end()) { SVDEBUG << "AudioGenerator::playPluginConfigurationChanged: We don't know about this plugin" << endl; return; } RealTimePluginInstance *plugin = m_synthMap[model]; if (plugin) { PluginXml(plugin).setParametersFromXml(configurationXml); } } void AudioGenerator::setSampleDir(RealTimePluginInstance *plugin) { if (m_sampleDir != "") { plugin->configure("sampledir", m_sampleDir.toStdString()); } } RealTimePluginInstance * AudioGenerator::loadPluginFor(const Model *model) { QString pluginId, configurationXml; const Playable *playable = model; if (!playable || !playable->canPlay()) return 0; PlayParameters *parameters = PlayParameterRepository::getInstance()->getPlayParameters(playable); if (parameters) { pluginId = parameters->getPlayPluginId(); configurationXml = parameters->getPlayPluginConfiguration(); } if (pluginId == "") return 0; RealTimePluginInstance *plugin = loadPlugin(pluginId, ""); if (!plugin) return 0; if (configurationXml != "") { PluginXml(plugin).setParametersFromXml(configurationXml); setSampleDir(plugin); } configurationXml = PluginXml(plugin).toXmlString(); if (parameters) { parameters->setPlayPluginId(pluginId); parameters->setPlayPluginConfiguration(configurationXml); } return plugin; } RealTimePluginInstance * AudioGenerator::loadPlugin(QString pluginId, QString program) { RealTimePluginFactory *factory = RealTimePluginFactory::instanceFor(pluginId); if (!factory) { cerr << "Failed to get plugin factory" << endl; return 0; } RealTimePluginInstance *instance = factory->instantiatePlugin (pluginId, 0, 0, m_sourceSampleRate, m_pluginBlockSize, m_targetChannelCount); if (!instance) { cerr << "Failed to instantiate plugin " << pluginId << endl; return 0; } setSampleDir(instance); for (unsigned int i = 0; i < instance->getParameterCount(); ++i) { instance->setParameterValue(i, instance->getParameterDefault(i)); } std::string defaultProgram = instance->getProgram(0, 0); if (defaultProgram != "") { // cerr << "first selecting default program " << defaultProgram << endl; instance->selectProgram(defaultProgram); } if (program != "") { // cerr << "now selecting desired program " << program << endl; instance->selectProgram(program.toStdString()); } instance->setIdealChannelCount(m_targetChannelCount); // reset! return instance; } void AudioGenerator::removeModel(Model *model) { SparseOneDimensionalModel *sodm = dynamic_cast(model); if (!sodm) return; // nothing to do QMutexLocker locker(&m_mutex); if (m_synthMap.find(sodm) == m_synthMap.end()) return; RealTimePluginInstance *instance = m_synthMap[sodm]; m_synthMap.erase(sodm); delete instance; } void AudioGenerator::clearModels() { QMutexLocker locker(&m_mutex); while (!m_synthMap.empty()) { RealTimePluginInstance *instance = m_synthMap.begin()->second; m_synthMap.erase(m_synthMap.begin()); delete instance; } } void AudioGenerator::reset() { QMutexLocker locker(&m_mutex); for (PluginMap::iterator i = m_synthMap.begin(); i != m_synthMap.end(); ++i) { if (i->second) { i->second->silence(); i->second->discardEvents(); } } m_noteOffs.clear(); } void AudioGenerator::setTargetChannelCount(size_t targetChannelCount) { if (m_targetChannelCount == targetChannelCount) return; // SVDEBUG << "AudioGenerator::setTargetChannelCount(" << targetChannelCount << ")" << endl; QMutexLocker locker(&m_mutex); m_targetChannelCount = targetChannelCount; for (PluginMap::iterator i = m_synthMap.begin(); i != m_synthMap.end(); ++i) { if (i->second) i->second->setIdealChannelCount(targetChannelCount); } } size_t AudioGenerator::getBlockSize() const { return m_pluginBlockSize; } void AudioGenerator::setSoloModelSet(std::set s) { QMutexLocker locker(&m_mutex); m_soloModelSet = s; m_soloing = true; } void AudioGenerator::clearSoloModelSet() { QMutexLocker locker(&m_mutex); m_soloModelSet.clear(); m_soloing = false; } size_t AudioGenerator::mixModel(Model *model, size_t startFrame, size_t frameCount, float **buffer, size_t fadeIn, size_t fadeOut) { if (m_sourceSampleRate == 0) { cerr << "WARNING: AudioGenerator::mixModel: No base source sample rate available" << endl; return frameCount; } QMutexLocker locker(&m_mutex); Playable *playable = model; if (!playable || !playable->canPlay()) return frameCount; PlayParameters *parameters = PlayParameterRepository::getInstance()->getPlayParameters(playable); if (!parameters) return frameCount; bool playing = !parameters->isPlayMuted(); if (!playing) { #ifdef DEBUG_AUDIO_GENERATOR cout << "AudioGenerator::mixModel(" << model << "): muted" << endl; #endif return frameCount; } if (m_soloing) { if (m_soloModelSet.find(model) == m_soloModelSet.end()) { #ifdef DEBUG_AUDIO_GENERATOR cout << "AudioGenerator::mixModel(" << model << "): not one of the solo'd models" << endl; #endif return frameCount; } } float gain = parameters->getPlayGain(); float pan = parameters->getPlayPan(); DenseTimeValueModel *dtvm = dynamic_cast(model); if (dtvm) { return mixDenseTimeValueModel(dtvm, startFrame, frameCount, buffer, gain, pan, fadeIn, fadeOut); } bool synthetic = (qobject_cast(model) || qobject_cast(model)); if (synthetic) { return mixSyntheticNoteModel(model, startFrame, frameCount, buffer, gain, pan, fadeIn, fadeOut); } return frameCount; } size_t AudioGenerator::mixDenseTimeValueModel(DenseTimeValueModel *dtvm, size_t startFrame, size_t frames, float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut) { static float **channelBuffer = 0; static size_t channelBufSiz = 0; static size_t channelBufCount = 0; size_t totalFrames = frames + fadeIn/2 + fadeOut/2; size_t modelChannels = dtvm->getChannelCount(); if (channelBufSiz < totalFrames || channelBufCount < modelChannels) { for (size_t c = 0; c < channelBufCount; ++c) { delete[] channelBuffer[c]; } delete[] channelBuffer; channelBuffer = new float *[modelChannels]; for (size_t c = 0; c < modelChannels; ++c) { channelBuffer[c] = new float[totalFrames]; } channelBufCount = modelChannels; channelBufSiz = totalFrames; } size_t got = 0; if (startFrame >= fadeIn/2) { got = dtvm->getData(0, modelChannels - 1, startFrame - fadeIn/2, frames + fadeOut/2 + fadeIn/2, channelBuffer); } else { size_t missing = fadeIn/2 - startFrame; for (size_t c = 0; c < modelChannels; ++c) { channelBuffer[c] += missing; } got = dtvm->getData(0, modelChannels - 1, startFrame, frames + fadeOut/2, channelBuffer); for (size_t c = 0; c < modelChannels; ++c) { channelBuffer[c] -= missing; } got += missing; } for (size_t c = 0; c < m_targetChannelCount; ++c) { size_t sourceChannel = (c % modelChannels); // SVDEBUG << "mixing channel " << c << " from source channel " << sourceChannel << endl; float channelGain = gain; if (pan != 0.0) { if (c == 0) { if (pan > 0.0) channelGain *= 1.0 - pan; } else { if (pan < 0.0) channelGain *= pan + 1.0; } } for (size_t i = 0; i < fadeIn/2; ++i) { float *back = buffer[c]; back -= fadeIn/2; back[i] += (channelGain * channelBuffer[sourceChannel][i] * i) / fadeIn; } for (size_t i = 0; i < frames + fadeOut/2; ++i) { float mult = channelGain; if (i < fadeIn/2) { mult = (mult * i) / fadeIn; } if (i > frames - fadeOut/2) { mult = (mult * ((frames + fadeOut/2) - i)) / fadeOut; } float val = channelBuffer[sourceChannel][i]; if (i >= got) val = 0.f; buffer[c][i] += mult * val; } } return got; } size_t AudioGenerator::mixSyntheticNoteModel(Model *model, size_t startFrame, size_t frames, float **buffer, float gain, float pan, size_t /* fadeIn */, size_t /* fadeOut */) { RealTimePluginInstance *plugin = m_synthMap[model]; if (!plugin) return 0; size_t latency = plugin->getLatency(); size_t blocks = frames / m_pluginBlockSize; //!!! hang on -- the fact that the audio callback play source's //buffer is a multiple of the plugin's buffer size doesn't mean //that we always get called for a multiple of it here (because it //also depends on the JACK block size). how should we ensure that //all models write the same amount in to the mix, and that we //always have a multiple of the plugin buffer size? I guess this //class has to be queryable for the plugin buffer size & the //callback play source has to use that as a multiple for all the //calls to mixModel size_t got = blocks * m_pluginBlockSize; #ifdef DEBUG_AUDIO_GENERATOR cout << "mixModel [synthetic note]: frames " << frames << ", blocks " << blocks << endl; #endif snd_seq_event_t onEv; onEv.type = SND_SEQ_EVENT_NOTEON; onEv.data.note.channel = 0; snd_seq_event_t offEv; offEv.type = SND_SEQ_EVENT_NOTEOFF; offEv.data.note.channel = 0; offEv.data.note.velocity = 0; NoteOffSet ¬eOffs = m_noteOffs[model]; for (size_t i = 0; i < blocks; ++i) { size_t reqStart = startFrame + i * m_pluginBlockSize; NoteList notes = getNotes(model, reqStart + latency, reqStart + latency + m_pluginBlockSize); Vamp::RealTime blockTime = Vamp::RealTime::frame2RealTime (startFrame + i * m_pluginBlockSize, m_sourceSampleRate); for (NoteList::const_iterator ni = notes.begin(); ni != notes.end(); ++ni) { size_t noteFrame = ni->start; if (noteFrame >= latency) noteFrame -= latency; if (noteFrame < reqStart || noteFrame >= reqStart + m_pluginBlockSize) continue; while (noteOffs.begin() != noteOffs.end() && noteOffs.begin()->frame <= noteFrame) { Vamp::RealTime eventTime = Vamp::RealTime::frame2RealTime (noteOffs.begin()->frame, m_sourceSampleRate); offEv.data.note.note = noteOffs.begin()->pitch; #ifdef DEBUG_AUDIO_GENERATOR cerr << "mixModel [synthetic]: sending note-off event at time " << eventTime << " frame " << noteOffs.begin()->frame << " pitch " << noteOffs.begin()->pitch << endl; #endif plugin->sendEvent(eventTime, &offEv); noteOffs.erase(noteOffs.begin()); } Vamp::RealTime eventTime = Vamp::RealTime::frame2RealTime (noteFrame, m_sourceSampleRate); if (ni->isMidiPitchQuantized) { onEv.data.note.note = ni->midiPitch; } else { #ifdef DEBUG_AUDIO_GENERATOR cerr << "mixModel [synthetic]: non-pitch-quantized notes are not supported [yet], quantizing" << endl; #endif onEv.data.note.note = Pitch::getPitchForFrequency(ni->frequency); } onEv.data.note.velocity = ni->velocity; plugin->sendEvent(eventTime, &onEv); #ifdef DEBUG_AUDIO_GENERATOR cout << "mixModel [synthetic]: note at frame " << noteFrame << ", block start " << (startFrame + i * m_pluginBlockSize) << ", resulting time " << eventTime << endl; #endif noteOffs.insert (NoteOff(onEv.data.note.note, noteFrame + ni->duration)); } while (noteOffs.begin() != noteOffs.end() && noteOffs.begin()->frame <= startFrame + i * m_pluginBlockSize + m_pluginBlockSize) { Vamp::RealTime eventTime = Vamp::RealTime::frame2RealTime (noteOffs.begin()->frame, m_sourceSampleRate); offEv.data.note.note = noteOffs.begin()->pitch; #ifdef DEBUG_AUDIO_GENERATOR cerr << "mixModel [synthetic]: sending leftover note-off event at time " << eventTime << " frame " << noteOffs.begin()->frame << " pitch " << noteOffs.begin()->pitch << endl; #endif plugin->sendEvent(eventTime, &offEv); noteOffs.erase(noteOffs.begin()); } plugin->run(blockTime); float **outs = plugin->getAudioOutputBuffers(); for (size_t c = 0; c < m_targetChannelCount; ++c) { #ifdef DEBUG_AUDIO_GENERATOR cout << "mixModel [synthetic]: adding " << m_pluginBlockSize << " samples from plugin output " << c << endl; #endif size_t sourceChannel = (c % plugin->getAudioOutputCount()); float channelGain = gain; if (pan != 0.0) { if (c == 0) { if (pan > 0.0) channelGain *= 1.0 - pan; } else { if (pan < 0.0) channelGain *= pan + 1.0; } } for (size_t j = 0; j < m_pluginBlockSize; ++j) { buffer[c][i * m_pluginBlockSize + j] += channelGain * outs[sourceChannel][j]; } } } return got; } AudioGenerator::NoteList AudioGenerator::getNotes(Model *model, size_t startFrame, size_t endFrame) { NoteList notes; SparseOneDimensionalModel *sodm = qobject_cast(model); if (sodm) { SparseOneDimensionalModel::PointList points = sodm->getPoints(startFrame, endFrame); for (SparseOneDimensionalModel::PointList::iterator pli = points.begin(); pli != points.end(); ++pli) { notes.push_back (NoteData(pli->frame, m_sourceSampleRate / 6, // arbitrary short duration 64, // default pitch 100)); // default velocity } return notes; } NoteModel *nm = qobject_cast(model); if (nm) { NoteModel::PointList points = nm->getPoints(startFrame, endFrame); for (NoteModel::PointList::iterator pli = points.begin(); pli != points.end(); ++pli) { size_t duration = pli->duration; if (duration == 0 || duration == 1) { duration = m_sourceSampleRate / 20; } int pitch = lrintf(pli->value); int velocity = 100; if (pli->level > 0.f && pli->level <= 1.f) { velocity = lrintf(pli->level * 127); } NoteData note(pli->frame, duration, pitch, velocity); if (nm->getScaleUnits() == "Hz") { note.frequency = pli->value; note.isMidiPitchQuantized = false; } notes.push_back(note); } return notes; } return notes; } sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioCoreAudioTarget.h0000644000175000017500000000313112252354725024666 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_CORE_AUDIO_TARGET_H_ #define _AUDIO_CORE_AUDIO_TARGET_H_ #ifdef HAVE_COREAUDIO #include #include #include #include #include #include #include #include #include "AudioCallbackPlayTarget.h" class AudioCallbackPlaySource; class AudioCoreAudioTarget : public AudioCallbackPlayTarget { Q_OBJECT public: AudioCoreAudioTarget(AudioCallbackPlaySource *source); ~AudioCoreAudioTarget(); virtual bool isOK() const; public slots: virtual void sourceModelReplaced(); protected: OSStatus process(void *data, AudioUnitRenderActionFlags *flags, const AudioTimeStamp *timestamp, unsigned int inbus, unsigned int inframes, AudioBufferList *ioData); int m_bufferSize; int m_sampleRate; int m_latency; }; #endif /* HAVE_COREAUDIO */ #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioPulseAudioTarget.h0000644000175000017500000000436012252354725025073 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_PULSE_AUDIO_TARGET_H_ #define _AUDIO_PULSE_AUDIO_TARGET_H_ #ifdef HAVE_LIBPULSE #include #include #include #include "base/Thread.h" #include "AudioCallbackPlayTarget.h" class AudioCallbackPlaySource; class AudioPulseAudioTarget : public AudioCallbackPlayTarget { Q_OBJECT public: AudioPulseAudioTarget(AudioCallbackPlaySource *source); virtual ~AudioPulseAudioTarget(); virtual void shutdown(); virtual bool isOK() const; virtual double getCurrentTime() const; public slots: virtual void sourceModelReplaced(); protected: void streamWrite(size_t); void streamStateChanged(); void contextStateChanged(); static void streamWriteStatic(pa_stream *, size_t, void *); static void streamStateChangedStatic(pa_stream *, void *); static void streamOverflowStatic(pa_stream *, void *); static void streamUnderflowStatic(pa_stream *, void *); static void contextStateChangedStatic(pa_context *, void *); QMutex m_mutex; class MainLoopThread : public Thread { public: MainLoopThread(pa_mainloop *loop) : Thread(NonRTThread), m_loop(loop) { } //!!! or RTThread virtual void run() { int rv = 0; pa_mainloop_run(m_loop, &rv); //!!! check return value from this, and rv } private: pa_mainloop *m_loop; }; pa_mainloop *m_loop; pa_mainloop_api *m_api; pa_context *m_context; pa_stream *m_stream; pa_sample_spec m_spec; MainLoopThread *m_loopThread; int m_bufferSize; int m_sampleRate; int m_latency; bool m_done; }; #endif /* HAVE_PULSEAUDIO */ #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/PlaySpeedRangeMapper.cpp0000644000175000017500000000622212252354725025232 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PlaySpeedRangeMapper.h" #include #include PlaySpeedRangeMapper::PlaySpeedRangeMapper(int minpos, int maxpos) : m_minpos(minpos), m_maxpos(maxpos) { } int PlaySpeedRangeMapper::getPositionForValue(float value) const { // value is percent float factor = getFactorForValue(value); int position = getPositionForFactor(factor); return position; } int PlaySpeedRangeMapper::getPositionForFactor(float factor) const { bool slow = (factor > 1.0); if (!slow) factor = 1.0 / factor; int half = (m_maxpos + m_minpos) / 2; factor = sqrtf((factor - 1.0) * 1000.f); int position = lrintf(((factor * (half - m_minpos)) / 100.0) + m_minpos); if (slow) { position = half - position; } else { position = position + half; } // cerr << "value = " << value << " slow = " << slow << " factor = " << factor << " position = " << position << endl; return position; } float PlaySpeedRangeMapper::getValueForPosition(int position) const { float factor = getFactorForPosition(position); float pc = getValueForFactor(factor); return pc; } float PlaySpeedRangeMapper::getValueForFactor(float factor) const { float pc; if (factor < 1.0) pc = ((1.0 / factor) - 1.0) * 100.0; else pc = (1.0 - factor) * 100.0; // cerr << "position = " << position << " percent = " << pc << endl; return pc; } float PlaySpeedRangeMapper::getFactorForValue(float value) const { // value is percent float factor; if (value <= 0) { factor = 1.0 - (value / 100.0); } else { factor = 1.0 / (1.0 + (value / 100.0)); } // cerr << "value = " << value << " factor = " << factor << endl; return factor; } float PlaySpeedRangeMapper::getFactorForPosition(int position) const { bool slow = false; if (position < m_minpos) position = m_minpos; if (position > m_maxpos) position = m_maxpos; int half = (m_maxpos + m_minpos) / 2; if (position < half) { slow = true; position = half - position; } else { position = position - half; } // position is between min and half (inclusive) float factor; if (position == m_minpos) { factor = 1.0; } else { factor = ((position - m_minpos) * 100.0) / (half - m_minpos); factor = 1.0 + (factor * factor) / 1000.f; } if (!slow) factor = 1.0 / factor; // cerr << "position = " << position << " slow = " << slow << " factor = " << factor << endl; return factor; } QString PlaySpeedRangeMapper::getUnit() const { return "%"; } sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioCallbackPlayTarget.cpp0000644000175000017500000000207412252354725025676 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "AudioCallbackPlayTarget.h" #include "AudioCallbackPlaySource.h" #include AudioCallbackPlayTarget::AudioCallbackPlayTarget(AudioCallbackPlaySource *source) : m_source(source), m_outputGain(1.0) { if (m_source) { connect(m_source, SIGNAL(modelReplaced()), this, SLOT(sourceModelReplaced())); } } AudioCallbackPlayTarget::~AudioCallbackPlayTarget() { } void AudioCallbackPlayTarget::setOutputGain(float gain) { m_outputGain = gain; } sonic-visualiser-2.3~repack1.orig/svapp/audioio/PlaySpeedRangeMapper.h0000644000175000017500000000231312252354725024674 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PLAY_SPEED_RANGE_MAPPER_H_ #define _PLAY_SPEED_RANGE_MAPPER_H_ #include "base/RangeMapper.h" class PlaySpeedRangeMapper : public RangeMapper { public: PlaySpeedRangeMapper(int minpos, int maxpos); virtual int getPositionForValue(float value) const; virtual float getValueForPosition(int position) const; int getPositionForFactor(float factor) const; float getValueForFactor(float factor) const; float getFactorForPosition(int position) const; float getFactorForValue(float value) const; virtual QString getUnit() const; protected: int m_minpos; int m_maxpos; }; #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioCallbackPlaySource.cpp0000644000175000017500000015150412252354725025713 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "AudioCallbackPlaySource.h" #include "AudioGenerator.h" #include "data/model/Model.h" #include "base/ViewManagerBase.h" #include "base/PlayParameterRepository.h" #include "base/Preferences.h" #include "data/model/DenseTimeValueModel.h" #include "data/model/WaveFileModel.h" #include "data/model/SparseOneDimensionalModel.h" #include "plugin/RealTimePluginInstance.h" #include "AudioCallbackPlayTarget.h" #include using namespace RubberBand; #include #include //#define DEBUG_AUDIO_PLAY_SOURCE 1 //#define DEBUG_AUDIO_PLAY_SOURCE_PLAYING 1 static const size_t DEFAULT_RING_BUFFER_SIZE = 131071; AudioCallbackPlaySource::AudioCallbackPlaySource(ViewManagerBase *manager, QString clientName) : m_viewManager(manager), m_audioGenerator(new AudioGenerator()), m_clientName(clientName), m_readBuffers(0), m_writeBuffers(0), m_readBufferFill(0), m_writeBufferFill(0), m_bufferScavenger(1), m_sourceChannelCount(0), m_blockSize(1024), m_sourceSampleRate(0), m_targetSampleRate(0), m_playLatency(0), m_target(0), m_lastRetrievalTimestamp(0.0), m_lastRetrievedBlockSize(0), m_trustworthyTimestamps(true), m_lastCurrentFrame(0), m_playing(false), m_exiting(false), m_lastModelEndFrame(0), m_ringBufferSize(DEFAULT_RING_BUFFER_SIZE), m_outputLeft(0.0), m_outputRight(0.0), m_auditioningPlugin(0), m_auditioningPluginBypassed(false), m_playStartFrame(0), m_playStartFramePassed(false), m_timeStretcher(0), m_monoStretcher(0), m_stretchRatio(1.0), m_stretcherInputCount(0), m_stretcherInputs(0), m_stretcherInputSizes(0), m_fillThread(0), m_converter(0), m_crapConverter(0), m_resampleQuality(Preferences::getInstance()->getResampleQuality()) { m_viewManager->setAudioPlaySource(this); connect(m_viewManager, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); connect(m_viewManager, SIGNAL(playLoopModeChanged()), this, SLOT(playLoopModeChanged())); connect(m_viewManager, SIGNAL(playSelectionModeChanged()), this, SLOT(playSelectionModeChanged())); connect(this, SIGNAL(playStatusChanged(bool)), m_viewManager, SLOT(playStatusChanged(bool))); connect(PlayParameterRepository::getInstance(), SIGNAL(playParametersChanged(PlayParameters *)), this, SLOT(playParametersChanged(PlayParameters *))); connect(Preferences::getInstance(), SIGNAL(propertyChanged(PropertyContainer::PropertyName)), this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); } AudioCallbackPlaySource::~AudioCallbackPlaySource() { #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::~AudioCallbackPlaySource entering" << endl; #endif m_exiting = true; if (m_fillThread) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource dtor: awakening thread" << endl; #endif m_condition.wakeAll(); m_fillThread->wait(); delete m_fillThread; } clearModels(); if (m_readBuffers != m_writeBuffers) { delete m_readBuffers; } delete m_writeBuffers; delete m_audioGenerator; for (size_t i = 0; i < m_stretcherInputCount; ++i) { delete[] m_stretcherInputs[i]; } delete[] m_stretcherInputSizes; delete[] m_stretcherInputs; delete m_timeStretcher; delete m_monoStretcher; m_bufferScavenger.scavenge(true); m_pluginScavenger.scavenge(true); #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::~AudioCallbackPlaySource finishing" << endl; #endif } void AudioCallbackPlaySource::addModel(Model *model) { if (m_models.find(model) != m_models.end()) return; bool canPlay = m_audioGenerator->addModel(model); m_mutex.lock(); m_models.insert(model); if (model->getEndFrame() > m_lastModelEndFrame) { m_lastModelEndFrame = model->getEndFrame(); } bool buffersChanged = false, srChanged = false; size_t modelChannels = 1; DenseTimeValueModel *dtvm = dynamic_cast(model); if (dtvm) modelChannels = dtvm->getChannelCount(); if (modelChannels > m_sourceChannelCount) { m_sourceChannelCount = modelChannels; } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Adding model with " << modelChannels << " channels at rate " << model->getSampleRate() << endl; #endif if (m_sourceSampleRate == 0) { m_sourceSampleRate = model->getSampleRate(); srChanged = true; } else if (model->getSampleRate() != m_sourceSampleRate) { // If this is a dense time-value model and we have no other, we // can just switch to this model's sample rate if (dtvm) { bool conflicting = false; for (std::set::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { // Only wave file models can be considered conflicting -- // writable wave file models are derived and we shouldn't // take their rates into account. Also, don't give any // particular weight to a file that's already playing at // the wrong rate anyway WaveFileModel *wfm = dynamic_cast(*i); if (wfm && wfm != dtvm && wfm->getSampleRate() != model->getSampleRate() && wfm->getSampleRate() == m_sourceSampleRate) { SVDEBUG << "AudioCallbackPlaySource::addModel: Conflicting wave file model " << *i << " found" << endl; conflicting = true; break; } } if (conflicting) { SVDEBUG << "AudioCallbackPlaySource::addModel: ERROR: " << "New model sample rate does not match" << endl << "existing model(s) (new " << model->getSampleRate() << " vs " << m_sourceSampleRate << "), playback will be wrong" << endl; emit sampleRateMismatch(model->getSampleRate(), m_sourceSampleRate, false); } else { m_sourceSampleRate = model->getSampleRate(); srChanged = true; } } } if (!m_writeBuffers || (m_writeBuffers->size() < getTargetChannelCount())) { clearRingBuffers(true, getTargetChannelCount()); buffersChanged = true; } else { if (canPlay) clearRingBuffers(true); } if (buffersChanged || srChanged) { if (m_converter) { src_delete(m_converter); src_delete(m_crapConverter); m_converter = 0; m_crapConverter = 0; } } rebuildRangeLists(); m_mutex.unlock(); m_audioGenerator->setTargetChannelCount(getTargetChannelCount()); if (!m_fillThread) { m_fillThread = new FillThread(*this); m_fillThread->start(); } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::addModel: now have " << m_models.size() << " model(s) -- emitting modelReplaced" << endl; #endif if (buffersChanged || srChanged) { emit modelReplaced(); } connect(model, SIGNAL(modelChanged(size_t, size_t)), this, SLOT(modelChanged(size_t, size_t))); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::addModel: awakening thread" << endl; #endif m_condition.wakeAll(); } void AudioCallbackPlaySource::modelChanged(size_t startFrame, size_t endFrame) { #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::modelChanged(" << startFrame << "," << endFrame << ")" << endl; #endif if (endFrame > m_lastModelEndFrame) { m_lastModelEndFrame = endFrame; rebuildRangeLists(); } } void AudioCallbackPlaySource::removeModel(Model *model) { m_mutex.lock(); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::removeModel(" << model << ")" << endl; #endif disconnect(model, SIGNAL(modelChanged(size_t, size_t)), this, SLOT(modelChanged(size_t, size_t))); m_models.erase(model); if (m_models.empty()) { if (m_converter) { src_delete(m_converter); src_delete(m_crapConverter); m_converter = 0; m_crapConverter = 0; } m_sourceSampleRate = 0; } size_t lastEnd = 0; for (std::set::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::removeModel(" << model << "): checking end frame on model " << *i << endl; #endif if ((*i)->getEndFrame() > lastEnd) lastEnd = (*i)->getEndFrame(); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "(done, lastEnd now " << lastEnd << ")" << endl; #endif } m_lastModelEndFrame = lastEnd; m_audioGenerator->removeModel(model); m_mutex.unlock(); clearRingBuffers(); } void AudioCallbackPlaySource::clearModels() { m_mutex.lock(); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::clearModels()" << endl; #endif m_models.clear(); if (m_converter) { src_delete(m_converter); src_delete(m_crapConverter); m_converter = 0; m_crapConverter = 0; } m_lastModelEndFrame = 0; m_sourceSampleRate = 0; m_mutex.unlock(); m_audioGenerator->clearModels(); clearRingBuffers(); } void AudioCallbackPlaySource::clearRingBuffers(bool haveLock, size_t count) { if (!haveLock) m_mutex.lock(); rebuildRangeLists(); if (count == 0) { if (m_writeBuffers) count = m_writeBuffers->size(); } m_writeBufferFill = getCurrentBufferedFrame(); if (m_readBuffers != m_writeBuffers) { delete m_writeBuffers; } m_writeBuffers = new RingBufferVector; for (size_t i = 0; i < count; ++i) { m_writeBuffers->push_back(new RingBuffer(m_ringBufferSize)); } // cout << "AudioCallbackPlaySource::clearRingBuffers: Created " // << count << " write buffers" << endl; if (!haveLock) { m_mutex.unlock(); } } void AudioCallbackPlaySource::play(size_t startFrame) { if (m_viewManager->getPlaySelectionMode() && !m_viewManager->getSelections().empty()) { SVDEBUG << "AudioCallbackPlaySource::play: constraining frame " << startFrame << " to selection = "; startFrame = m_viewManager->constrainFrameToSelection(startFrame); SVDEBUG << startFrame << endl; } else { if (startFrame >= m_lastModelEndFrame) { startFrame = 0; } } #ifdef DEBUG_AUDIO_PLAY_SOURCE cerr << "play(" << startFrame << ") -> playback model "; #endif startFrame = m_viewManager->alignReferenceToPlaybackFrame(startFrame); #ifdef DEBUG_AUDIO_PLAY_SOURCE cerr << startFrame << endl; #endif // The fill thread will automatically empty its buffers before // starting again if we have not so far been playing, but not if // we're just re-seeking. // NO -- we can end up playing some first -- always reset here m_mutex.lock(); if (m_timeStretcher) { m_timeStretcher->reset(); } if (m_monoStretcher) { m_monoStretcher->reset(); } m_readBufferFill = m_writeBufferFill = startFrame; if (m_readBuffers) { for (size_t c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *rb = getReadRingBuffer(c); #ifdef DEBUG_AUDIO_PLAY_SOURCE cerr << "reset ring buffer for channel " << c << endl; #endif if (rb) rb->reset(); } } if (m_converter) src_reset(m_converter); if (m_crapConverter) src_reset(m_crapConverter); m_mutex.unlock(); m_audioGenerator->reset(); m_playStartFrame = startFrame; m_playStartFramePassed = false; m_playStartedAt = RealTime::zeroTime; if (m_target) { m_playStartedAt = RealTime::fromSeconds(m_target->getCurrentTime()); } bool changed = !m_playing; m_lastRetrievalTimestamp = 0; m_lastCurrentFrame = 0; m_playing = true; #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::play: awakening thread" << endl; #endif m_condition.wakeAll(); if (changed) { emit playStatusChanged(m_playing); emit activity(tr("Play from %1").arg (RealTime::frame2RealTime (m_playStartFrame, m_sourceSampleRate).toText().c_str())); } } void AudioCallbackPlaySource::stop() { #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::stop()" << endl; #endif bool changed = m_playing; m_playing = false; #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::stop: awakening thread" << endl; #endif m_condition.wakeAll(); m_lastRetrievalTimestamp = 0; if (changed) { emit playStatusChanged(m_playing); emit activity(tr("Stop at %1").arg (RealTime::frame2RealTime (m_lastCurrentFrame, m_sourceSampleRate).toText().c_str())); } m_lastCurrentFrame = 0; } void AudioCallbackPlaySource::selectionChanged() { if (m_viewManager->getPlaySelectionMode()) { clearRingBuffers(); } } void AudioCallbackPlaySource::playLoopModeChanged() { clearRingBuffers(); } void AudioCallbackPlaySource::playSelectionModeChanged() { if (!m_viewManager->getSelections().empty()) { clearRingBuffers(); } } void AudioCallbackPlaySource::playParametersChanged(PlayParameters *) { clearRingBuffers(); } void AudioCallbackPlaySource::preferenceChanged(PropertyContainer::PropertyName n) { if (n == "Resample Quality") { setResampleQuality(Preferences::getInstance()->getResampleQuality()); } } void AudioCallbackPlaySource::audioProcessingOverload() { cerr << "Audio processing overload!" << endl; if (!m_playing) return; RealTimePluginInstance *ap = m_auditioningPlugin; if (ap && !m_auditioningPluginBypassed) { m_auditioningPluginBypassed = true; emit audioOverloadPluginDisabled(); return; } if (m_timeStretcher && m_timeStretcher->getTimeRatio() < 1.0 && m_stretcherInputCount > 1 && m_monoStretcher && !m_stretchMono) { m_stretchMono = true; emit audioTimeStretchMultiChannelDisabled(); return; } } void AudioCallbackPlaySource::setTarget(AudioCallbackPlayTarget *target, size_t size) { m_target = target; cout << "AudioCallbackPlaySource::setTarget: Block size -> " << size << endl; if (size != 0) { m_blockSize = size; } if (size * 4 > m_ringBufferSize) { SVDEBUG << "AudioCallbackPlaySource::setTarget: Buffer size " << size << " > a quarter of ring buffer size " << m_ringBufferSize << ", calling for more ring buffer" << endl; m_ringBufferSize = size * 4; if (m_writeBuffers && !m_writeBuffers->empty()) { clearRingBuffers(); } } } size_t AudioCallbackPlaySource::getTargetBlockSize() const { // cout << "AudioCallbackPlaySource::getTargetBlockSize() -> " << m_blockSize << endl; return m_blockSize; } void AudioCallbackPlaySource::setTargetPlayLatency(size_t latency) { m_playLatency = latency; } size_t AudioCallbackPlaySource::getTargetPlayLatency() const { return m_playLatency; } size_t AudioCallbackPlaySource::getCurrentPlayingFrame() { // This method attempts to estimate which audio sample frame is // "currently coming through the speakers". size_t targetRate = getTargetSampleRate(); size_t latency = m_playLatency; // at target rate RealTime latency_t = RealTime::frame2RealTime(latency, targetRate); return getCurrentFrame(latency_t); } size_t AudioCallbackPlaySource::getCurrentBufferedFrame() { return getCurrentFrame(RealTime::zeroTime); } size_t AudioCallbackPlaySource::getCurrentFrame(RealTime latency_t) { bool resample = false; double resampleRatio = 1.0; // We resample when filling the ring buffer, and time-stretch when // draining it. The buffer contains data at the "target rate" and // the latency provided by the target is also at the target rate. // Because of the multiple rates involved, we do the actual // calculation using RealTime instead. size_t sourceRate = getSourceSampleRate(); size_t targetRate = getTargetSampleRate(); if (sourceRate == 0 || targetRate == 0) return 0; size_t inbuffer = 0; // at target rate for (size_t c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *rb = getReadRingBuffer(c); if (rb) { size_t here = rb->getReadSpace(); if (c == 0 || here < inbuffer) inbuffer = here; } } size_t readBufferFill = m_readBufferFill; size_t lastRetrievedBlockSize = m_lastRetrievedBlockSize; double lastRetrievalTimestamp = m_lastRetrievalTimestamp; double currentTime = 0.0; if (m_target) currentTime = m_target->getCurrentTime(); bool looping = m_viewManager->getPlayLoopMode(); RealTime inbuffer_t = RealTime::frame2RealTime(inbuffer, targetRate); size_t stretchlat = 0; double timeRatio = 1.0; if (m_timeStretcher) { stretchlat = m_timeStretcher->getLatency(); timeRatio = m_timeStretcher->getTimeRatio(); } RealTime stretchlat_t = RealTime::frame2RealTime(stretchlat, targetRate); // When the target has just requested a block from us, the last // sample it obtained was our buffer fill frame count minus the // amount of read space (converted back to source sample rate) // remaining now. That sample is not expected to be played until // the target's play latency has elapsed. By the time the // following block is requested, that sample will be at the // target's play latency minus the last requested block size away // from being played. RealTime sincerequest_t = RealTime::zeroTime; RealTime lastretrieved_t = RealTime::zeroTime; if (m_target && m_trustworthyTimestamps && lastRetrievalTimestamp != 0.0) { lastretrieved_t = RealTime::frame2RealTime (lastRetrievedBlockSize, targetRate); // calculate number of frames at target rate that have elapsed // since the end of the last call to getSourceSamples if (m_trustworthyTimestamps && !looping) { // this adjustment seems to cause more problems when looping double elapsed = currentTime - lastRetrievalTimestamp; if (elapsed > 0.0) { sincerequest_t = RealTime::fromSeconds(elapsed); } } } else { lastretrieved_t = RealTime::frame2RealTime (getTargetBlockSize(), targetRate); } RealTime bufferedto_t = RealTime::frame2RealTime(readBufferFill, sourceRate); if (timeRatio != 1.0) { lastretrieved_t = lastretrieved_t / timeRatio; sincerequest_t = sincerequest_t / timeRatio; latency_t = latency_t / timeRatio; } #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cerr << "\nbuffered to: " << bufferedto_t << ", in buffer: " << inbuffer_t << ", time ratio " << timeRatio << "\n stretcher latency: " << stretchlat_t << ", device latency: " << latency_t << "\n since request: " << sincerequest_t << ", last retrieved quantity: " << lastretrieved_t << endl; #endif RealTime end = RealTime::frame2RealTime(m_lastModelEndFrame, sourceRate); // Normally the range lists should contain at least one item each // -- if playback is unconstrained, that item should report the // entire source audio duration. if (m_rangeStarts.empty()) { rebuildRangeLists(); } if (m_rangeStarts.empty()) { // this code is only used in case of error in rebuildRangeLists RealTime playing_t = bufferedto_t - latency_t - stretchlat_t - lastretrieved_t - inbuffer_t + sincerequest_t; if (playing_t < RealTime::zeroTime) playing_t = RealTime::zeroTime; size_t frame = RealTime::realTime2Frame(playing_t, sourceRate); return m_viewManager->alignPlaybackFrameToReference(frame); } int inRange = 0; int index = 0; for (size_t i = 0; i < m_rangeStarts.size(); ++i) { if (bufferedto_t >= m_rangeStarts[i]) { inRange = index; } else { break; } ++index; } if (inRange >= m_rangeStarts.size()) inRange = m_rangeStarts.size()-1; RealTime playing_t = bufferedto_t; playing_t = playing_t - latency_t - stretchlat_t - lastretrieved_t - inbuffer_t + sincerequest_t; // This rather gross little hack is used to ensure that latency // compensation doesn't result in the playback pointer appearing // to start earlier than the actual playback does. It doesn't // work properly (hence the bail-out in the middle) because if we // are playing a relatively short looped region, the playing time // estimated from the buffer fill frame may have wrapped around // the region boundary and end up being much smaller than the // theoretical play start frame, perhaps even for the entire // duration of playback! if (!m_playStartFramePassed) { RealTime playstart_t = RealTime::frame2RealTime(m_playStartFrame, sourceRate); if (playing_t < playstart_t) { // cerr << "playing_t " << playing_t << " < playstart_t " // << playstart_t << endl; if (/*!!! sincerequest_t > RealTime::zeroTime && */ m_playStartedAt + latency_t + stretchlat_t < RealTime::fromSeconds(currentTime)) { // cerr << "but we've been playing for long enough that I think we should disregard it (it probably results from loop wrapping)" << endl; m_playStartFramePassed = true; } else { playing_t = playstart_t; } } else { m_playStartFramePassed = true; } } #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cerr << "playing_t " << playing_t; #endif playing_t = playing_t - m_rangeStarts[inRange]; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cerr << " as offset into range " << inRange << " (start =" << m_rangeStarts[inRange] << " duration =" << m_rangeDurations[inRange] << ") = " << playing_t << endl; #endif while (playing_t < RealTime::zeroTime) { if (inRange == 0) { if (looping) { inRange = m_rangeStarts.size() - 1; } else { break; } } else { --inRange; } playing_t = playing_t + m_rangeDurations[inRange]; } playing_t = playing_t + m_rangeStarts[inRange]; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cerr << " playing time: " << playing_t << endl; #endif if (!looping) { if (inRange == m_rangeStarts.size()-1 && playing_t >= m_rangeStarts[inRange] + m_rangeDurations[inRange]) { cerr << "Not looping, inRange " << inRange << " == rangeStarts.size()-1, playing_t " << playing_t << " >= m_rangeStarts[inRange] " << m_rangeStarts[inRange] << " + m_rangeDurations[inRange] " << m_rangeDurations[inRange] << " -- stopping" << endl; stop(); } } if (playing_t < RealTime::zeroTime) playing_t = RealTime::zeroTime; size_t frame = RealTime::realTime2Frame(playing_t, sourceRate); if (m_lastCurrentFrame > 0 && !looping) { if (frame < m_lastCurrentFrame) { frame = m_lastCurrentFrame; } } m_lastCurrentFrame = frame; return m_viewManager->alignPlaybackFrameToReference(frame); } void AudioCallbackPlaySource::rebuildRangeLists() { bool constrained = (m_viewManager->getPlaySelectionMode()); m_rangeStarts.clear(); m_rangeDurations.clear(); size_t sourceRate = getSourceSampleRate(); if (sourceRate == 0) return; RealTime end = RealTime::frame2RealTime(m_lastModelEndFrame, sourceRate); if (end == RealTime::zeroTime) return; if (!constrained) { m_rangeStarts.push_back(RealTime::zeroTime); m_rangeDurations.push_back(end); return; } MultiSelection::SelectionList selections = m_viewManager->getSelections(); MultiSelection::SelectionList::const_iterator i; #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::rebuildRangeLists" << endl; #endif if (!selections.empty()) { for (i = selections.begin(); i != selections.end(); ++i) { RealTime start = (RealTime::frame2RealTime (m_viewManager->alignReferenceToPlaybackFrame(i->getStartFrame()), sourceRate)); RealTime duration = (RealTime::frame2RealTime (m_viewManager->alignReferenceToPlaybackFrame(i->getEndFrame()) - m_viewManager->alignReferenceToPlaybackFrame(i->getStartFrame()), sourceRate)); m_rangeStarts.push_back(start); m_rangeDurations.push_back(duration); } } else { m_rangeStarts.push_back(RealTime::zeroTime); m_rangeDurations.push_back(end); } #ifdef DEBUG_AUDIO_PLAY_SOURCE cerr << "Now have " << m_rangeStarts.size() << " play ranges" << endl; #endif } void AudioCallbackPlaySource::setOutputLevels(float left, float right) { m_outputLeft = left; m_outputRight = right; } bool AudioCallbackPlaySource::getOutputLevels(float &left, float &right) { left = m_outputLeft; right = m_outputRight; return true; } void AudioCallbackPlaySource::setTargetSampleRate(size_t sr) { bool first = (m_targetSampleRate == 0); m_targetSampleRate = sr; initialiseConverter(); if (first && (m_stretchRatio != 1.f)) { // couldn't create a stretcher before because we had no sample // rate: make one now setTimeStretch(m_stretchRatio); } } void AudioCallbackPlaySource::initialiseConverter() { m_mutex.lock(); if (m_converter) { src_delete(m_converter); src_delete(m_crapConverter); m_converter = 0; m_crapConverter = 0; } if (getSourceSampleRate() != getTargetSampleRate()) { int err = 0; m_converter = src_new(m_resampleQuality == 2 ? SRC_SINC_BEST_QUALITY : m_resampleQuality == 1 ? SRC_SINC_MEDIUM_QUALITY : m_resampleQuality == 0 ? SRC_SINC_FASTEST : SRC_SINC_MEDIUM_QUALITY, getTargetChannelCount(), &err); if (m_converter) { m_crapConverter = src_new(SRC_LINEAR, getTargetChannelCount(), &err); } if (!m_converter || !m_crapConverter) { cerr << "AudioCallbackPlaySource::setModel: ERROR in creating samplerate converter: " << src_strerror(err) << endl; if (m_converter) { src_delete(m_converter); m_converter = 0; } if (m_crapConverter) { src_delete(m_crapConverter); m_crapConverter = 0; } m_mutex.unlock(); emit sampleRateMismatch(getSourceSampleRate(), getTargetSampleRate(), false); } else { m_mutex.unlock(); emit sampleRateMismatch(getSourceSampleRate(), getTargetSampleRate(), true); } } else { m_mutex.unlock(); } } void AudioCallbackPlaySource::setResampleQuality(int q) { if (q == m_resampleQuality) return; m_resampleQuality = q; #ifdef DEBUG_AUDIO_PLAY_SOURCE SVDEBUG << "AudioCallbackPlaySource::setResampleQuality: setting to " << m_resampleQuality << endl; #endif initialiseConverter(); } void AudioCallbackPlaySource::setAuditioningEffect(Auditionable *a) { RealTimePluginInstance *plugin = dynamic_cast(a); if (a && !plugin) { cerr << "WARNING: AudioCallbackPlaySource::setAuditioningEffect: auditionable object " << a << " is not a real-time plugin instance" << endl; } m_mutex.lock(); m_auditioningPlugin = plugin; m_auditioningPluginBypassed = false; m_mutex.unlock(); } void AudioCallbackPlaySource::setSoloModelSet(std::set s) { m_audioGenerator->setSoloModelSet(s); clearRingBuffers(); } void AudioCallbackPlaySource::clearSoloModelSet() { m_audioGenerator->clearSoloModelSet(); clearRingBuffers(); } size_t AudioCallbackPlaySource::getTargetSampleRate() const { if (m_targetSampleRate) return m_targetSampleRate; else return getSourceSampleRate(); } size_t AudioCallbackPlaySource::getSourceChannelCount() const { return m_sourceChannelCount; } size_t AudioCallbackPlaySource::getTargetChannelCount() const { if (m_sourceChannelCount < 2) return 2; return m_sourceChannelCount; } size_t AudioCallbackPlaySource::getSourceSampleRate() const { return m_sourceSampleRate; } void AudioCallbackPlaySource::setTimeStretch(float factor) { m_stretchRatio = factor; if (!getTargetSampleRate()) return; // have to make our stretcher later if (m_timeStretcher || (factor == 1.f)) { // stretch ratio will be set in next process call if appropriate } else { m_stretcherInputCount = getTargetChannelCount(); RubberBandStretcher *stretcher = new RubberBandStretcher (getTargetSampleRate(), m_stretcherInputCount, RubberBandStretcher::OptionProcessRealTime, factor); RubberBandStretcher *monoStretcher = new RubberBandStretcher (getTargetSampleRate(), 1, RubberBandStretcher::OptionProcessRealTime, factor); m_stretcherInputs = new float *[m_stretcherInputCount]; m_stretcherInputSizes = new size_t[m_stretcherInputCount]; for (size_t c = 0; c < m_stretcherInputCount; ++c) { m_stretcherInputSizes[c] = 16384; m_stretcherInputs[c] = new float[m_stretcherInputSizes[c]]; } m_monoStretcher = monoStretcher; m_timeStretcher = stretcher; } emit activity(tr("Change time-stretch factor to %1").arg(factor)); } size_t AudioCallbackPlaySource::getSourceSamples(size_t ucount, float **buffer) { int count = ucount; if (!m_playing) { #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING SVDEBUG << "AudioCallbackPlaySource::getSourceSamples: Not playing" << endl; #endif for (size_t ch = 0; ch < getTargetChannelCount(); ++ch) { for (int i = 0; i < count; ++i) { buffer[ch][i] = 0.0; } } return 0; } #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING SVDEBUG << "AudioCallbackPlaySource::getSourceSamples: Playing" << endl; #endif // Ensure that all buffers have at least the amount of data we // need -- else reduce the size of our requests correspondingly for (size_t ch = 0; ch < getTargetChannelCount(); ++ch) { RingBuffer *rb = getReadRingBuffer(ch); if (!rb) { cerr << "WARNING: AudioCallbackPlaySource::getSourceSamples: " << "No ring buffer available for channel " << ch << ", returning no data here" << endl; count = 0; break; } size_t rs = rb->getReadSpace(); if (rs < count) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cerr << "WARNING: AudioCallbackPlaySource::getSourceSamples: " << "Ring buffer for channel " << ch << " has only " << rs << " (of " << count << ") samples available (" << "ring buffer size is " << rb->getSize() << ", write " << "space " << rb->getWriteSpace() << "), " << "reducing request size" << endl; #endif count = rs; } } if (count == 0) return 0; RubberBandStretcher *ts = m_timeStretcher; RubberBandStretcher *ms = m_monoStretcher; float ratio = ts ? ts->getTimeRatio() : 1.f; if (ratio != m_stretchRatio) { if (!ts) { cerr << "WARNING: AudioCallbackPlaySource::getSourceSamples: Time ratio change to " << m_stretchRatio << " is pending, but no stretcher is set" << endl; m_stretchRatio = 1.f; } else { ts->setTimeRatio(m_stretchRatio); if (ms) ms->setTimeRatio(m_stretchRatio); if (m_stretchRatio >= 1.0) m_stretchMono = false; } } int stretchChannels = m_stretcherInputCount; if (m_stretchMono) { if (ms) { ts = ms; stretchChannels = 1; } else { m_stretchMono = false; } } if (m_target) { m_lastRetrievedBlockSize = count; m_lastRetrievalTimestamp = m_target->getCurrentTime(); } if (!ts || ratio == 1.f) { int got = 0; for (size_t ch = 0; ch < getTargetChannelCount(); ++ch) { RingBuffer *rb = getReadRingBuffer(ch); if (rb) { // this is marginally more likely to leave our channels in // sync after a processing failure than just passing "count": size_t request = count; if (ch > 0) request = got; got = rb->read(buffer[ch], request); #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cout << "AudioCallbackPlaySource::getSamples: got " << got << " (of " << count << ") samples on channel " << ch << ", signalling for more (possibly)" << endl; #endif } for (size_t ch = 0; ch < getTargetChannelCount(); ++ch) { for (int i = got; i < count; ++i) { buffer[ch][i] = 0.0; } } } applyAuditioningEffect(count, buffer); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::getSamples: awakening thread" << endl; #endif m_condition.wakeAll(); return got; } size_t channels = getTargetChannelCount(); size_t available; int warned = 0; size_t fedToStretcher = 0; // The input block for a given output is approx output / ratio, // but we can't predict it exactly, for an adaptive timestretcher. while ((available = ts->available()) < count) { size_t reqd = lrintf((count - available) / ratio); reqd = std::max(reqd, ts->getSamplesRequired()); if (reqd == 0) reqd = 1; size_t got = reqd; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cerr << "reqd = " <= m_stretcherInputCount) continue; RingBuffer *rb = getReadRingBuffer(c); if (rb) { size_t gotHere; if (stretchChannels == 1 && c > 0) { gotHere = rb->readAdding(m_stretcherInputs[0], got); } else { gotHere = rb->read(m_stretcherInputs[c], got); } if (gotHere < got) got = gotHere; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING if (c == 0) { SVDEBUG << "feeding stretcher: got " << gotHere << ", " << rb->getReadSpace() << " remain" << endl; } #endif } else { cerr << "WARNING: No ring buffer available for channel " << c << " in stretcher input block" << endl; } } if (got < reqd) { cerr << "WARNING: Read underrun in playback (" << got << " < " << reqd << ")" << endl; } ts->process(m_stretcherInputs, got, false); fedToStretcher += got; if (got == 0) break; if (ts->available() == available) { cerr << "WARNING: AudioCallbackPlaySource::getSamples: Added " << got << " samples to time stretcher, created no new available output samples (warned = " << warned << ")" << endl; if (++warned == 5) break; } } ts->retrieve(buffer, count); for (int c = stretchChannels; c < getTargetChannelCount(); ++c) { for (int i = 0; i < count; ++i) { buffer[c][i] = buffer[0][i]; } } applyAuditioningEffect(count, buffer); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySource::getSamples [stretched]: awakening thread" << endl; #endif m_condition.wakeAll(); return count; } void AudioCallbackPlaySource::applyAuditioningEffect(size_t count, float **buffers) { if (m_auditioningPluginBypassed) return; RealTimePluginInstance *plugin = m_auditioningPlugin; if (!plugin) return; if (plugin->getAudioInputCount() != getTargetChannelCount()) { // cerr << "plugin input count " << plugin->getAudioInputCount() // << " != our channel count " << getTargetChannelCount() // << endl; return; } if (plugin->getAudioOutputCount() != getTargetChannelCount()) { // cerr << "plugin output count " << plugin->getAudioOutputCount() // << " != our channel count " << getTargetChannelCount() // << endl; return; } if (plugin->getBufferSize() < count) { // cerr << "plugin buffer size " << plugin->getBufferSize() // << " < our block size " << count // << endl; return; } float **ib = plugin->getAudioInputBuffers(); float **ob = plugin->getAudioOutputBuffers(); for (size_t c = 0; c < getTargetChannelCount(); ++c) { for (size_t i = 0; i < count; ++i) { ib[c][i] = buffers[c][i]; } } plugin->run(Vamp::RealTime::zeroTime, count); for (size_t c = 0; c < getTargetChannelCount(); ++c) { for (size_t i = 0; i < count; ++i) { buffers[c][i] = ob[c][i]; } } } // Called from fill thread, m_playing true, mutex held bool AudioCallbackPlaySource::fillBuffers() { static float *tmp = 0; static size_t tmpSize = 0; size_t space = 0; for (size_t c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *wb = getWriteRingBuffer(c); if (wb) { size_t spaceHere = wb->getWriteSpace(); if (c == 0 || spaceHere < space) space = spaceHere; } } if (space == 0) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: no space to fill" << endl; #endif return false; } size_t f = m_writeBufferFill; bool readWriteEqual = (m_readBuffers == m_writeBuffers); #ifdef DEBUG_AUDIO_PLAY_SOURCE if (!readWriteEqual) { cout << "AudioCallbackPlaySourceFillThread: note read buffers != write buffers" << endl; } cout << "AudioCallbackPlaySourceFillThread: filling " << space << " frames" << endl; #endif #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "buffered to " << f << " already" << endl; #endif bool resample = (getSourceSampleRate() != getTargetSampleRate()); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << (resample ? "" : "not ") << "resampling (source " << getSourceSampleRate() << ", target " << getTargetSampleRate() << ")" << endl; #endif size_t channels = getTargetChannelCount(); size_t orig = space; size_t got = 0; static float **bufferPtrs = 0; static size_t bufferPtrCount = 0; if (bufferPtrCount < channels) { if (bufferPtrs) delete[] bufferPtrs; bufferPtrs = new float *[channels]; bufferPtrCount = channels; } size_t generatorBlockSize = m_audioGenerator->getBlockSize(); if (resample && !m_converter) { static bool warned = false; if (!warned) { cerr << "WARNING: sample rates differ, but no converter available!" << endl; warned = true; } } if (resample && m_converter) { double ratio = double(getTargetSampleRate()) / double(getSourceSampleRate()); orig = size_t(orig / ratio + 0.1); // orig must be a multiple of generatorBlockSize orig = (orig / generatorBlockSize) * generatorBlockSize; if (orig == 0) return false; size_t work = std::max(orig, space); // We only allocate one buffer, but we use it in two halves. // We place the non-interleaved values in the second half of // the buffer (orig samples for channel 0, orig samples for // channel 1 etc), and then interleave them into the first // half of the buffer. Then we resample back into the second // half (interleaved) and de-interleave the results back to // the start of the buffer for insertion into the ringbuffers. // What a faff -- especially as we've already de-interleaved // the audio data from the source file elsewhere before we // even reach this point. if (tmpSize < channels * work * 2) { delete[] tmp; tmp = new float[channels * work * 2]; tmpSize = channels * work * 2; } float *nonintlv = tmp + channels * work; float *intlv = tmp; float *srcout = tmp + channels * work; for (size_t c = 0; c < channels; ++c) { for (size_t i = 0; i < orig; ++i) { nonintlv[channels * i + c] = 0.0f; } } for (size_t c = 0; c < channels; ++c) { bufferPtrs[c] = nonintlv + c * orig; } got = mixModels(f, orig, bufferPtrs); // also modifies f // and interleave into first half for (size_t c = 0; c < channels; ++c) { for (size_t i = 0; i < got; ++i) { float sample = nonintlv[c * got + i]; intlv[channels * i + c] = sample; } } SRC_DATA data; data.data_in = intlv; data.data_out = srcout; data.input_frames = got; data.output_frames = work; data.src_ratio = ratio; data.end_of_input = 0; int err = 0; if (m_timeStretcher && m_timeStretcher->getTimeRatio() < 0.4) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Using crappy converter" << endl; #endif err = src_process(m_crapConverter, &data); } else { err = src_process(m_converter, &data); } size_t toCopy = size_t(got * ratio + 0.1); if (err) { cerr << "AudioCallbackPlaySourceFillThread: ERROR in samplerate conversion: " << src_strerror(err) << endl; //!!! Then what? } else { got = data.input_frames_used; toCopy = data.output_frames_gen; #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Resampled " << got << " frames to " << toCopy << " frames" << endl; #endif } for (size_t c = 0; c < channels; ++c) { for (size_t i = 0; i < toCopy; ++i) { tmp[i] = srcout[channels * i + c]; } RingBuffer *wb = getWriteRingBuffer(c); if (wb) wb->write(tmp, toCopy); } m_writeBufferFill = f; if (readWriteEqual) m_readBufferFill = f; } else { // space must be a multiple of generatorBlockSize size_t reqSpace = space; space = (reqSpace / generatorBlockSize) * generatorBlockSize; if (space == 0) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "requested fill of " << reqSpace << " is less than generator block size of " << generatorBlockSize << ", leaving it" << endl; #endif return false; } if (tmpSize < channels * space) { delete[] tmp; tmp = new float[channels * space]; tmpSize = channels * space; } for (size_t c = 0; c < channels; ++c) { bufferPtrs[c] = tmp + c * space; for (size_t i = 0; i < space; ++i) { tmp[c * space + i] = 0.0f; } } size_t got = mixModels(f, space, bufferPtrs); // also modifies f for (size_t c = 0; c < channels; ++c) { RingBuffer *wb = getWriteRingBuffer(c); if (wb) { size_t actual = wb->write(bufferPtrs[c], got); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Wrote " << actual << " samples for ch " << c << ", now " << wb->getReadSpace() << " to read" << endl; #endif if (actual < got) { cerr << "WARNING: Buffer overrun in channel " << c << ": wrote " << actual << " of " << got << " samples" << endl; } } } m_writeBufferFill = f; if (readWriteEqual) m_readBufferFill = f; #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Read buffer fill is now " << m_readBufferFill << endl; #endif //!!! how do we know when ended? need to mark up a fully-buffered flag and check this if we find the buffers empty in getSourceSamples } return true; } size_t AudioCallbackPlaySource::mixModels(size_t &frame, size_t count, float **buffers) { size_t processed = 0; size_t chunkStart = frame; size_t chunkSize = count; size_t selectionSize = 0; size_t nextChunkStart = chunkStart + chunkSize; bool looping = m_viewManager->getPlayLoopMode(); bool constrained = (m_viewManager->getPlaySelectionMode() && !m_viewManager->getSelections().empty()); static float **chunkBufferPtrs = 0; static size_t chunkBufferPtrCount = 0; size_t channels = getTargetChannelCount(); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Selection playback: start " << frame << ", size " << count <<", channels " << channels << endl; #endif if (chunkBufferPtrCount < channels) { if (chunkBufferPtrs) delete[] chunkBufferPtrs; chunkBufferPtrs = new float *[channels]; chunkBufferPtrCount = channels; } for (size_t c = 0; c < channels; ++c) { chunkBufferPtrs[c] = buffers[c]; } while (processed < count) { chunkSize = count - processed; nextChunkStart = chunkStart + chunkSize; selectionSize = 0; size_t fadeIn = 0, fadeOut = 0; if (constrained) { size_t rChunkStart = m_viewManager->alignPlaybackFrameToReference(chunkStart); Selection selection = m_viewManager->getContainingSelection(rChunkStart, true); if (selection.isEmpty()) { if (looping) { selection = *m_viewManager->getSelections().begin(); chunkStart = m_viewManager->alignReferenceToPlaybackFrame (selection.getStartFrame()); fadeIn = 50; } } if (selection.isEmpty()) { chunkSize = 0; nextChunkStart = chunkStart; } else { size_t sf = m_viewManager->alignReferenceToPlaybackFrame (selection.getStartFrame()); size_t ef = m_viewManager->alignReferenceToPlaybackFrame (selection.getEndFrame()); selectionSize = ef - sf; if (chunkStart < sf) { chunkStart = sf; fadeIn = 50; } nextChunkStart = chunkStart + chunkSize; if (nextChunkStart >= ef) { nextChunkStart = ef; fadeOut = 50; } chunkSize = nextChunkStart - chunkStart; } } else if (looping && m_lastModelEndFrame > 0) { if (chunkStart >= m_lastModelEndFrame) { chunkStart = 0; } if (chunkSize > m_lastModelEndFrame - chunkStart) { chunkSize = m_lastModelEndFrame - chunkStart; } nextChunkStart = chunkStart + chunkSize; } // cout << "chunkStart " << chunkStart << ", chunkSize " << chunkSize << ", nextChunkStart " << nextChunkStart << ", frame " << frame << ", count " << count << ", processed " << processed << endl; if (!chunkSize) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Ending selection playback at " << nextChunkStart << endl; #endif // We need to maintain full buffers so that the other // thread can tell where it's got to in the playback -- so // return the full amount here frame = frame + count; return count; } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Selection playback: chunk at " << chunkStart << " -> " << nextChunkStart << " (size " << chunkSize << ")" << endl; #endif size_t got = 0; if (selectionSize < 100) { fadeIn = 0; fadeOut = 0; } else if (selectionSize < 300) { if (fadeIn > 0) fadeIn = 10; if (fadeOut > 0) fadeOut = 10; } if (fadeIn > 0) { if (processed * 2 < fadeIn) { fadeIn = processed * 2; } } if (fadeOut > 0) { if ((count - processed - chunkSize) * 2 < fadeOut) { fadeOut = (count - processed - chunkSize) * 2; } } for (std::set::iterator mi = m_models.begin(); mi != m_models.end(); ++mi) { got = m_audioGenerator->mixModel(*mi, chunkStart, chunkSize, chunkBufferPtrs, fadeIn, fadeOut); } for (size_t c = 0; c < channels; ++c) { chunkBufferPtrs[c] += chunkSize; } processed += chunkSize; chunkStart = nextChunkStart; } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "Returning selection playback " << processed << " frames to " << nextChunkStart << endl; #endif frame = nextChunkStart; return processed; } void AudioCallbackPlaySource::unifyRingBuffers() { if (m_readBuffers == m_writeBuffers) return; // only unify if there will be something to read for (size_t c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *wb = getWriteRingBuffer(c); if (wb) { if (wb->getReadSpace() < m_blockSize * 2) { if ((m_writeBufferFill + m_blockSize * 2) < m_lastModelEndFrame) { // OK, we don't have enough and there's more to // read -- don't unify until we can do better #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING SVDEBUG << "AudioCallbackPlaySource::unifyRingBuffers: Not unifying: write buffer has less (" << wb->getReadSpace() << ") than " << m_blockSize*2 << " to read and write buffer fill (" << m_writeBufferFill << ") is not close to end frame (" << m_lastModelEndFrame << ")" << endl; #endif return; } } break; } } size_t rf = m_readBufferFill; RingBuffer *rb = getReadRingBuffer(0); if (rb) { size_t rs = rb->getReadSpace(); //!!! incorrect when in non-contiguous selection, see comments elsewhere // cout << "rs = " << rs << endl; if (rs < rf) rf -= rs; else rf = 0; } #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING SVDEBUG << "AudioCallbackPlaySource::unifyRingBuffers: m_readBufferFill = " << m_readBufferFill << ", rf = " << rf << ", m_writeBufferFill = " << m_writeBufferFill << endl; #endif size_t wf = m_writeBufferFill; size_t skip = 0; for (size_t c = 0; c < getTargetChannelCount(); ++c) { RingBuffer *wb = getWriteRingBuffer(c); if (wb) { if (c == 0) { size_t wrs = wb->getReadSpace(); // cout << "wrs = " << wrs << endl; if (wrs < wf) wf -= wrs; else wf = 0; // cout << "wf = " << wf << endl; if (wf < rf) skip = rf - wf; if (skip == 0) break; } // cout << "skipping " << skip << endl; wb->skip(skip); } } m_bufferScavenger.claim(m_readBuffers); m_readBuffers = m_writeBuffers; m_readBufferFill = m_writeBufferFill; #ifdef DEBUG_AUDIO_PLAY_SOURCE_PLAYING cerr << "unified" << endl; #endif } void AudioCallbackPlaySource::FillThread::run() { AudioCallbackPlaySource &s(m_source); #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread starting" << endl; #endif s.m_mutex.lock(); bool previouslyPlaying = s.m_playing; bool work = false; while (!s.m_exiting) { s.unifyRingBuffers(); s.m_bufferScavenger.scavenge(); s.m_pluginScavenger.scavenge(); if (work && s.m_playing && s.getSourceSampleRate()) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: not waiting" << endl; #endif s.m_mutex.unlock(); s.m_mutex.lock(); } else { float ms = 100; if (s.getSourceSampleRate() > 0) { ms = float(s.m_ringBufferSize) / float(s.getSourceSampleRate()) * 1000.0; } if (s.m_playing) ms /= 10; #ifdef DEBUG_AUDIO_PLAY_SOURCE if (!s.m_playing) cout << endl; cout << "AudioCallbackPlaySourceFillThread: waiting for " << ms << "ms..." << endl; #endif s.m_condition.wait(&s.m_mutex, size_t(ms)); } #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: awoken" << endl; #endif work = false; if (!s.getSourceSampleRate()) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: source sample rate is zero" << endl; #endif continue; } bool playing = s.m_playing; if (playing && !previouslyPlaying) { #ifdef DEBUG_AUDIO_PLAY_SOURCE cout << "AudioCallbackPlaySourceFillThread: playback state changed, resetting" << endl; #endif for (size_t c = 0; c < s.getTargetChannelCount(); ++c) { RingBuffer *rb = s.getReadRingBuffer(c); if (rb) rb->reset(); } } previouslyPlaying = playing; work = s.fillBuffers(); } s.m_mutex.unlock(); } sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioCoreAudioTarget.cpp0000644000175000017500000000123712252354725025226 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifdef HAVE_COREAUDIO #include "AudioCoreAudioTarget.h" #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioGenerator.h0000644000175000017500000001076312252354725023604 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_GENERATOR_H_ #define _AUDIO_GENERATOR_H_ class Model; class NoteModel; class DenseTimeValueModel; class SparseOneDimensionalModel; class RealTimePluginInstance; class Playable; #include #include #include #include #include class AudioGenerator : public QObject { Q_OBJECT public: AudioGenerator(); virtual ~AudioGenerator(); /** * Add a data model to be played from and initialise any necessary * audio generation code. Returns true if the model will be * played. The model will be added regardless of the return * value. */ virtual bool addModel(Model *model); /** * Remove a model. */ virtual void removeModel(Model *model); /** * Remove all models. */ virtual void clearModels(); /** * Reset playback, clearing plugins and the like. */ virtual void reset(); /** * Set the target channel count. The buffer parameter to mixModel * must always point to at least this number of arrays. */ virtual void setTargetChannelCount(size_t channelCount); /** * Return the internal processing block size. The frameCount * argument to all mixModel calls must be a multiple of this * value. */ virtual size_t getBlockSize() const; /** * Mix a single model into an output buffer. */ virtual size_t mixModel(Model *model, size_t startFrame, size_t frameCount, float **buffer, size_t fadeIn = 0, size_t fadeOut = 0); /** * Specify that only the given set of models should be played. */ virtual void setSoloModelSet(std::sets); /** * Specify that all models should be played as normal (if not * muted). */ virtual void clearSoloModelSet(); protected slots: void playPluginIdChanged(const Playable *, QString); void playPluginConfigurationChanged(const Playable *, QString); protected: size_t m_sourceSampleRate; size_t m_targetChannelCount; bool m_soloing; std::set m_soloModelSet; struct NoteData { NoteData(size_t _start, size_t _dur, int _mp, int _vel) : start(_start), duration(_dur), midiPitch(_mp), frequency(0), isMidiPitchQuantized(true), velocity(_vel) { }; size_t start; // audio sample frame size_t duration; // in audio sample frames int midiPitch; // 0-127 int frequency; // Hz, to be used if isMidiPitchQuantized false bool isMidiPitchQuantized; int velocity; // MIDI-style 0-127 }; typedef std::vector NoteList; struct NoteOff { NoteOff(int _p, size_t _f) : pitch(_p), frame(_f) { } int pitch; size_t frame; struct Comparator { bool operator()(const NoteOff &n1, const NoteOff &n2) const { return n1.frame < n2.frame; } }; }; typedef std::map PluginMap; typedef std::multiset NoteOffSet; typedef std::map NoteOffMap; QMutex m_mutex; PluginMap m_synthMap; NoteOffMap m_noteOffs; static QString m_sampleDir; virtual RealTimePluginInstance *loadPluginFor(const Model *model); virtual RealTimePluginInstance *loadPlugin(QString id, QString program); static void initialiseSampleDir(); static void setSampleDir(RealTimePluginInstance *plugin); virtual size_t mixDenseTimeValueModel (DenseTimeValueModel *model, size_t startFrame, size_t frameCount, float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut); virtual size_t mixSyntheticNoteModel (Model *model, size_t startFrame, size_t frameCount, float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut); NoteList getNotes(Model *model, size_t startFrame, size_t endFrame); static const size_t m_pluginBlockSize; }; #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioTargetFactory.h0000644000175000017500000000252312252354725024427 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_TARGET_FACTORY_H_ #define _AUDIO_TARGET_FACTORY_H_ #include #include #include "base/Debug.h" class AudioCallbackPlaySource; class AudioCallbackPlayTarget; class AudioTargetFactory { public: static AudioTargetFactory *getInstance(); std::vector getCallbackTargetNames(bool includeAuto = true) const; QString getCallbackTargetDescription(QString name) const; QString getDefaultCallbackTarget() const; bool isAutoCallbackTarget(QString name) const; void setDefaultCallbackTarget(QString name); AudioCallbackPlayTarget *createCallbackTarget(AudioCallbackPlaySource *); protected: AudioTargetFactory(); static AudioTargetFactory *m_instance; QString m_default; }; #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioTargetFactory.cpp0000644000175000017500000001133312252354725024761 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "AudioTargetFactory.h" #include "AudioJACKTarget.h" #include "AudioCoreAudioTarget.h" #include "AudioPortAudioTarget.h" #include "AudioPulseAudioTarget.h" #include "AudioCallbackPlayTarget.h" #include #include AudioTargetFactory * AudioTargetFactory::m_instance = 0; AudioTargetFactory * AudioTargetFactory::getInstance() { if (!m_instance) m_instance = new AudioTargetFactory(); return m_instance; } AudioTargetFactory::AudioTargetFactory() { } std::vector AudioTargetFactory::getCallbackTargetNames(bool includeAuto) const { std::vector names; if (includeAuto) names.push_back("auto"); #ifdef HAVE_JACK names.push_back("jack"); #endif #ifdef HAVE_LIBPULSE names.push_back("pulse"); #endif #ifdef HAVE_COREAUDIO names.push_back("core"); #endif #ifdef HAVE_PORTAUDIO_2_0 names.push_back("port"); #endif return names; } QString AudioTargetFactory::getCallbackTargetDescription(QString name) const { if (name == "auto") { return QCoreApplication::translate("AudioTargetFactory", "(auto)"); } if (name == "jack") { return QCoreApplication::translate("AudioTargetFactory", "JACK Audio Connection Kit"); } if (name == "pulse") { return QCoreApplication::translate("AudioTargetFactory", "PulseAudio Server"); } if (name == "core") { return QCoreApplication::translate("AudioTargetFactory", "Core Audio Device"); } if (name == "port") { return QCoreApplication::translate("AudioTargetFactory", "Default Soundcard Device"); } return "(unknown)"; } QString AudioTargetFactory::getDefaultCallbackTarget() const { if (m_default == "") return "auto"; return m_default; } bool AudioTargetFactory::isAutoCallbackTarget(QString name) const { return (name == "auto" || name == ""); } void AudioTargetFactory::setDefaultCallbackTarget(QString target) { m_default = target; } AudioCallbackPlayTarget * AudioTargetFactory::createCallbackTarget(AudioCallbackPlaySource *source) { AudioCallbackPlayTarget *target = 0; if (m_default != "" && m_default != "auto") { #ifdef HAVE_JACK if (m_default == "jack") target = new AudioJACKTarget(source); #endif #ifdef HAVE_LIBPULSE if (m_default == "pulse") target = new AudioPulseAudioTarget(source); #endif #ifdef HAVE_COREAUDIO if (m_default == "core") target = new AudioCoreAudioTarget(source); #endif #ifdef HAVE_PORTAUDIO_2_0 if (m_default == "port") target = new AudioPortAudioTarget(source); #endif if (!target || !target->isOK()) { cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open the requested target (\"" << m_default << "\")" << endl; delete target; return 0; } else { return target; } } #ifdef HAVE_JACK target = new AudioJACKTarget(source); if (target->isOK()) return target; else { cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open JACK target" << endl; delete target; } #endif #ifdef HAVE_LIBPULSE target = new AudioPulseAudioTarget(source); if (target->isOK()) return target; else { cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open PulseAudio target" << endl; delete target; } #endif #ifdef HAVE_COREAUDIO target = new AudioCoreAudioTarget(source); if (target->isOK()) return target; else { cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open CoreAudio target" << endl; delete target; } #endif #ifdef HAVE_PORTAUDIO_2_0 target = new AudioPortAudioTarget(source); if (target->isOK()) return target; else { cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open PortAudio target" << endl; delete target; } #endif cerr << "WARNING: AudioTargetFactory::createCallbackTarget: No suitable targets available" << endl; return 0; } sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioJACKTarget.h0000644000175000017500000000307212252354725023530 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_JACK_TARGET_H_ #define _AUDIO_JACK_TARGET_H_ #ifdef HAVE_JACK #include #include #include "AudioCallbackPlayTarget.h" #include class AudioCallbackPlaySource; class AudioJACKTarget : public AudioCallbackPlayTarget { Q_OBJECT public: AudioJACKTarget(AudioCallbackPlaySource *source); virtual ~AudioJACKTarget(); virtual void shutdown(); virtual bool isOK() const; virtual double getCurrentTime() const; public slots: virtual void sourceModelReplaced(); protected: int process(jack_nframes_t nframes); int xrun(); static int processStatic(jack_nframes_t, void *); static int xrunStatic(void *); jack_client_t *m_client; std::vector m_outputs; jack_nframes_t m_bufferSize; jack_nframes_t m_sampleRate; QMutex m_mutex; bool m_done; }; #endif /* HAVE_JACK */ #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioPortAudioTarget.cpp0000644000175000017500000002014712252354725025263 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifdef HAVE_PORTAUDIO_2_0 #include "AudioPortAudioTarget.h" #include "AudioCallbackPlaySource.h" #include #include #include #ifndef _WIN32 #include #endif //#define DEBUG_AUDIO_PORT_AUDIO_TARGET 1 AudioPortAudioTarget::AudioPortAudioTarget(AudioCallbackPlaySource *source) : AudioCallbackPlayTarget(source), m_stream(0), m_bufferSize(0), m_sampleRate(0), m_latency(0), m_prioritySet(false), m_done(false) { PaError err; #ifdef DEBUG_AUDIO_PORT_AUDIO_TARGET cerr << "AudioPortAudioTarget: Initialising for PortAudio v19" << endl; #endif err = Pa_Initialize(); if (err != paNoError) { cerr << "ERROR: AudioPortAudioTarget: Failed to initialize PortAudio: " << Pa_GetErrorText(err) << endl; return; } m_bufferSize = 2048; m_sampleRate = 44100; if (m_source && (m_source->getSourceSampleRate() != 0)) { m_sampleRate = m_source->getSourceSampleRate(); } PaStreamParameters op; op.device = Pa_GetDefaultOutputDevice(); op.channelCount = 2; op.sampleFormat = paFloat32; op.suggestedLatency = 0.2; op.hostApiSpecificStreamInfo = 0; err = Pa_OpenStream(&m_stream, 0, &op, m_sampleRate, paFramesPerBufferUnspecified, paNoFlag, processStatic, this); if (err != paNoError) { cerr << "WARNING: AudioPortAudioTarget: Failed to open PortAudio stream with default frames per buffer, trying again with fixed frames per buffer..." << endl; err = Pa_OpenStream(&m_stream, 0, &op, m_sampleRate, 1024, paNoFlag, processStatic, this); m_bufferSize = 1024; } if (err != paNoError) { cerr << "ERROR: AudioPortAudioTarget: Failed to open PortAudio stream: " << Pa_GetErrorText(err) << endl; cerr << "Note: device ID was " << op.device << endl; m_stream = 0; Pa_Terminate(); return; } const PaStreamInfo *info = Pa_GetStreamInfo(m_stream); m_latency = int(info->outputLatency * m_sampleRate + 0.001); if (m_bufferSize < m_latency) m_bufferSize = m_latency; cerr << "PortAudio latency = " << m_latency << " frames" << endl; err = Pa_StartStream(m_stream); if (err != paNoError) { cerr << "ERROR: AudioPortAudioTarget: Failed to start PortAudio stream: " << Pa_GetErrorText(err) << endl; Pa_CloseStream(m_stream); m_stream = 0; Pa_Terminate(); return; } if (m_source) { cerr << "AudioPortAudioTarget: block size " << m_bufferSize << endl; m_source->setTarget(this, m_bufferSize); m_source->setTargetSampleRate(m_sampleRate); m_source->setTargetPlayLatency(m_latency); } #ifdef DEBUG_PORT_AUDIO_TARGET cerr << "AudioPortAudioTarget: initialised OK" << endl; #endif } AudioPortAudioTarget::~AudioPortAudioTarget() { SVDEBUG << "AudioPortAudioTarget::~AudioPortAudioTarget()" << endl; if (m_source) { m_source->setTarget(0, m_bufferSize); } shutdown(); if (m_stream) { SVDEBUG << "closing stream" << endl; PaError err; err = Pa_CloseStream(m_stream); if (err != paNoError) { cerr << "ERROR: AudioPortAudioTarget: Failed to close PortAudio stream: " << Pa_GetErrorText(err) << endl; } cerr << "terminating" << endl; err = Pa_Terminate(); if (err != paNoError) { cerr << "ERROR: AudioPortAudioTarget: Failed to terminate PortAudio: " << Pa_GetErrorText(err) << endl; } } m_stream = 0; SVDEBUG << "AudioPortAudioTarget::~AudioPortAudioTarget() done" << endl; } void AudioPortAudioTarget::shutdown() { #ifdef DEBUG_PORT_AUDIO_TARGET SVDEBUG << "AudioPortAudioTarget::shutdown" << endl; #endif m_done = true; } bool AudioPortAudioTarget::isOK() const { return (m_stream != 0); } double AudioPortAudioTarget::getCurrentTime() const { if (!m_stream) return 0.0; else return Pa_GetStreamTime(m_stream); } int AudioPortAudioTarget::processStatic(const void *input, void *output, unsigned long nframes, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags flags, void *data) { return ((AudioPortAudioTarget *)data)->process(input, output, nframes, timeInfo, flags); } void AudioPortAudioTarget::sourceModelReplaced() { m_source->setTargetSampleRate(m_sampleRate); } int AudioPortAudioTarget::process(const void *, void *outputBuffer, unsigned long nframes, const PaStreamCallbackTimeInfo *, PaStreamCallbackFlags) { #ifdef DEBUG_AUDIO_PORT_AUDIO_TARGET SVDEBUG << "AudioPortAudioTarget::process(" << nframes << ")" << endl; #endif if (!m_source || m_done) { #ifdef DEBUG_AUDIO_PORT_AUDIO_TARGET SVDEBUG << "AudioPortAudioTarget::process: Doing nothing, no source or application done" << endl; #endif return 0; } if (!m_prioritySet) { #ifndef _WIN32 sched_param param; param.sched_priority = 20; if (pthread_setschedparam(pthread_self(), SCHED_RR, ¶m)) { SVDEBUG << "AudioPortAudioTarget: NOTE: couldn't set RT scheduling class" << endl; } else { SVDEBUG << "AudioPortAudioTarget: NOTE: successfully set RT scheduling class" << endl; } #endif m_prioritySet = true; } float *output = (float *)outputBuffer; assert(nframes <= m_bufferSize); static float **tmpbuf = 0; static size_t tmpbufch = 0; static size_t tmpbufsz = 0; size_t sourceChannels = m_source->getSourceChannelCount(); // Because we offer pan, we always want at least 2 channels if (sourceChannels < 2) sourceChannels = 2; if (!tmpbuf || tmpbufch != sourceChannels || int(tmpbufsz) < m_bufferSize) { if (tmpbuf) { for (size_t i = 0; i < tmpbufch; ++i) { delete[] tmpbuf[i]; } delete[] tmpbuf; } tmpbufch = sourceChannels; tmpbufsz = m_bufferSize; tmpbuf = new float *[tmpbufch]; for (size_t i = 0; i < tmpbufch; ++i) { tmpbuf[i] = new float[tmpbufsz]; } } size_t received = m_source->getSourceSamples(nframes, tmpbuf); float peakLeft = 0.0, peakRight = 0.0; for (size_t ch = 0; ch < 2; ++ch) { float peak = 0.0; if (ch < sourceChannels) { // PortAudio samples are interleaved for (size_t i = 0; i < nframes; ++i) { if (i < received) { output[i * 2 + ch] = tmpbuf[ch][i] * m_outputGain; float sample = fabsf(output[i * 2 + ch]); if (sample > peak) peak = sample; } else { output[i * 2 + ch] = 0; } } } else if (ch == 1 && sourceChannels == 1) { for (size_t i = 0; i < nframes; ++i) { if (i < received) { output[i * 2 + ch] = tmpbuf[0][i] * m_outputGain; float sample = fabsf(output[i * 2 + ch]); if (sample > peak) peak = sample; } else { output[i * 2 + ch] = 0; } } } else { for (size_t i = 0; i < nframes; ++i) { output[i * 2 + ch] = 0; } } if (ch == 0) peakLeft = peak; if (ch > 0 || sourceChannels == 1) peakRight = peak; } m_source->setOutputLevels(peakLeft, peakRight); if (Pa_GetStreamCpuLoad(m_stream) > 0.7) { if (m_source) m_source->audioProcessingOverload(); } return 0; } #endif /* HAVE_PORTAUDIO */ sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioJACKTarget.cpp0000644000175000017500000003373112252354725024070 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifdef HAVE_JACK #include "AudioJACKTarget.h" #include "AudioCallbackPlaySource.h" #include #include #include //#define DEBUG_AUDIO_JACK_TARGET 1 #ifdef BUILD_STATIC #ifdef Q_OS_LINUX // Some lunacy to enable JACK support in static builds. JACK isn't // supposed to be linked statically, because it depends on a // consistent shared memory layout between client library and daemon, // so it's very fragile in the face of version mismatches. // // Therefore for static builds on Linux we avoid linking against JACK // at all during the build, instead using dlopen and runtime symbol // lookup to switch on JACK support at runtime. The following big // mess (down to the #endifs) is the code that implements this. static void *symbol(const char *name) { static bool attempted = false; static void *library = 0; static std::map symbols; if (symbols.find(name) != symbols.end()) return symbols[name]; if (!library) { if (!attempted) { library = ::dlopen("libjack.so.1", RTLD_NOW); if (!library) library = ::dlopen("libjack.so.0", RTLD_NOW); if (!library) library = ::dlopen("libjack.so", RTLD_NOW); if (!library) { cerr << "WARNING: AudioJACKTarget: Failed to load JACK library: " << ::dlerror() << " (tried .so, .so.0, .so.1)" << endl; } attempted = true; } if (!library) return 0; } void *symbol = ::dlsym(library, name); if (!symbol) { cerr << "WARNING: AudioJACKTarget: Failed to locate symbol " << name << ": " << ::dlerror() << endl; } symbols[name] = symbol; return symbol; } static jack_client_t *dynamic_jack_client_open(const char *client_name, jack_options_t options, jack_status_t *status, ...) { typedef jack_client_t *(*func)(const char *client_name, jack_options_t options, jack_status_t *status, ...); void *s = symbol("jack_client_open"); if (!s) return 0; func f = (func)s; return f(client_name, options, status); // varargs not supported here } static int dynamic_jack_set_process_callback(jack_client_t *client, JackProcessCallback process_callback, void *arg) { typedef int (*func)(jack_client_t *client, JackProcessCallback process_callback, void *arg); void *s = symbol("jack_set_process_callback"); if (!s) return 1; func f = (func)s; return f(client, process_callback, arg); } static int dynamic_jack_set_xrun_callback(jack_client_t *client, JackXRunCallback xrun_callback, void *arg) { typedef int (*func)(jack_client_t *client, JackXRunCallback xrun_callback, void *arg); void *s = symbol("jack_set_xrun_callback"); if (!s) return 1; func f = (func)s; return f(client, xrun_callback, arg); } static const char **dynamic_jack_get_ports(jack_client_t *client, const char *port_name_pattern, const char *type_name_pattern, unsigned long flags) { typedef const char **(*func)(jack_client_t *client, const char *port_name_pattern, const char *type_name_pattern, unsigned long flags); void *s = symbol("jack_get_ports"); if (!s) return 0; func f = (func)s; return f(client, port_name_pattern, type_name_pattern, flags); } static jack_port_t *dynamic_jack_port_register(jack_client_t *client, const char *port_name, const char *port_type, unsigned long flags, unsigned long buffer_size) { typedef jack_port_t *(*func)(jack_client_t *client, const char *port_name, const char *port_type, unsigned long flags, unsigned long buffer_size); void *s = symbol("jack_port_register"); if (!s) return 0; func f = (func)s; return f(client, port_name, port_type, flags, buffer_size); } static int dynamic_jack_connect(jack_client_t *client, const char *source, const char *dest) { typedef int (*func)(jack_client_t *client, const char *source, const char *dest); void *s = symbol("jack_connect"); if (!s) return 1; func f = (func)s; return f(client, source, dest); } static void *dynamic_jack_port_get_buffer(jack_port_t *port, jack_nframes_t sz) { typedef void *(*func)(jack_port_t *, jack_nframes_t); void *s = symbol("jack_port_get_buffer"); if (!s) return 0; func f = (func)s; return f(port, sz); } static int dynamic_jack_port_unregister(jack_client_t *client, jack_port_t *port) { typedef int(*func)(jack_client_t *, jack_port_t *); void *s = symbol("jack_port_unregister"); if (!s) return 0; func f = (func)s; return f(client, port); } #define dynamic1(rv, name, argtype, failval) \ static rv dynamic_##name(argtype arg) { \ typedef rv (*func) (argtype); \ void *s = symbol(#name); \ if (!s) return failval; \ func f = (func) s; \ return f(arg); \ } dynamic1(jack_client_t *, jack_client_new, const char *, 0); dynamic1(jack_nframes_t, jack_get_buffer_size, jack_client_t *, 0); dynamic1(jack_nframes_t, jack_get_sample_rate, jack_client_t *, 0); dynamic1(int, jack_activate, jack_client_t *, 1); dynamic1(int, jack_deactivate, jack_client_t *, 1); dynamic1(int, jack_client_close, jack_client_t *, 1); dynamic1(jack_nframes_t, jack_frame_time, jack_client_t *, 0); dynamic1(jack_nframes_t, jack_port_get_latency, jack_port_t *, 0); dynamic1(const char *, jack_port_name, const jack_port_t *, 0); #define jack_client_new dynamic_jack_client_new #define jack_client_open dynamic_jack_client_open #define jack_get_buffer_size dynamic_jack_get_buffer_size #define jack_get_sample_rate dynamic_jack_get_sample_rate #define jack_set_process_callback dynamic_jack_set_process_callback #define jack_set_xrun_callback dynamic_jack_set_xrun_callback #define jack_activate dynamic_jack_activate #define jack_deactivate dynamic_jack_deactivate #define jack_client_close dynamic_jack_client_close #define jack_frame_time dynamic_jack_frame_time #define jack_get_ports dynamic_jack_get_ports #define jack_port_register dynamic_jack_port_register #define jack_port_unregister dynamic_jack_port_unregister #define jack_port_get_latency dynamic_jack_port_get_latency #define jack_port_name dynamic_jack_port_name #define jack_connect dynamic_jack_connect #define jack_port_get_buffer dynamic_jack_port_get_buffer #endif #endif AudioJACKTarget::AudioJACKTarget(AudioCallbackPlaySource *source) : AudioCallbackPlayTarget(source), m_client(0), m_bufferSize(0), m_sampleRate(0), m_done(false) { JackOptions options = JackNullOption; #ifdef HAVE_PORTAUDIO_2_0 options = JackNoStartServer; #endif #ifdef HAVE_LIBPULSE options = JackNoStartServer; #endif JackStatus status = JackStatus(0); m_client = jack_client_open(source->getClientName().toLocal8Bit().data(), options, &status); if (!m_client) { cerr << "AudioJACKTarget: Failed to connect to JACK server: status code " << status << endl; return; } m_bufferSize = jack_get_buffer_size(m_client); m_sampleRate = jack_get_sample_rate(m_client); jack_set_xrun_callback(m_client, xrunStatic, this); jack_set_process_callback(m_client, processStatic, this); if (jack_activate(m_client)) { cerr << "ERROR: AudioJACKTarget: Failed to activate JACK client" << endl; } if (m_source) { sourceModelReplaced(); } // Mainstream JACK (though not jackdmp) calls mlockall() to lock // down all memory for real-time operation. That isn't a terribly // good idea in an application like this that may have very high // dynamic memory usage in other threads, as mlockall() applies // across all threads. We're far better off undoing it here and // accepting the possible loss of true RT capability. MUNLOCKALL(); } AudioJACKTarget::~AudioJACKTarget() { SVDEBUG << "AudioJACKTarget::~AudioJACKTarget()" << endl; if (m_source) { m_source->setTarget(0, m_bufferSize); } shutdown(); if (m_client) { while (m_outputs.size() > 0) { std::vector::iterator itr = m_outputs.end(); --itr; jack_port_t *port = *itr; cerr << "unregister " << m_outputs.size() << endl; if (port) jack_port_unregister(m_client, port); m_outputs.erase(itr); } cerr << "Deactivating... "; jack_deactivate(m_client); cerr << "done\nClosing... "; jack_client_close(m_client); cerr << "done" << endl; } m_client = 0; SVDEBUG << "AudioJACKTarget::~AudioJACKTarget() done" << endl; } void AudioJACKTarget::shutdown() { m_done = true; } bool AudioJACKTarget::isOK() const { return (m_client != 0); } double AudioJACKTarget::getCurrentTime() const { if (m_client && m_sampleRate) { return double(jack_frame_time(m_client)) / double(m_sampleRate); } else { return 0.0; } } int AudioJACKTarget::processStatic(jack_nframes_t nframes, void *arg) { return ((AudioJACKTarget *)arg)->process(nframes); } int AudioJACKTarget::xrunStatic(void *arg) { return ((AudioJACKTarget *)arg)->xrun(); } void AudioJACKTarget::sourceModelReplaced() { m_mutex.lock(); m_source->setTarget(this, m_bufferSize); m_source->setTargetSampleRate(m_sampleRate); size_t channels = m_source->getSourceChannelCount(); // Because we offer pan, we always want at least 2 channels if (channels < 2) channels = 2; if (channels == m_outputs.size() || !m_client) { m_mutex.unlock(); return; } const char **ports = jack_get_ports(m_client, NULL, NULL, JackPortIsPhysical | JackPortIsInput); size_t physicalPortCount = 0; while (ports[physicalPortCount]) ++physicalPortCount; #ifdef DEBUG_AUDIO_JACK_TARGET SVDEBUG << "AudioJACKTarget::sourceModelReplaced: have " << channels << " channels and " << physicalPortCount << " physical ports" << endl; #endif while (m_outputs.size() < channels) { char name[20]; jack_port_t *port; sprintf(name, "out %d", int(m_outputs.size() + 1)); port = jack_port_register(m_client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); if (!port) { cerr << "ERROR: AudioJACKTarget: Failed to create JACK output port " << m_outputs.size() << endl; } else { m_source->setTargetPlayLatency(jack_port_get_latency(port)); } if (m_outputs.size() < physicalPortCount) { jack_connect(m_client, jack_port_name(port), ports[m_outputs.size()]); } m_outputs.push_back(port); } while (m_outputs.size() > channels) { std::vector::iterator itr = m_outputs.end(); --itr; jack_port_t *port = *itr; if (port) jack_port_unregister(m_client, port); m_outputs.erase(itr); } m_mutex.unlock(); } int AudioJACKTarget::process(jack_nframes_t nframes) { if (m_done) return 0; if (!m_mutex.tryLock()) { return 0; } if (m_outputs.empty()) { m_mutex.unlock(); return 0; } #ifdef DEBUG_AUDIO_JACK_TARGET cout << "AudioJACKTarget::process(" << nframes << "): have a source" << endl; #endif #ifdef DEBUG_AUDIO_JACK_TARGET if (m_bufferSize != nframes) { cerr << "WARNING: m_bufferSize != nframes (" << m_bufferSize << " != " << nframes << ")" << endl; } #endif float **buffers = (float **)alloca(m_outputs.size() * sizeof(float *)); for (size_t ch = 0; ch < m_outputs.size(); ++ch) { buffers[ch] = (float *)jack_port_get_buffer(m_outputs[ch], nframes); } size_t received = 0; if (m_source) { received = m_source->getSourceSamples(nframes, buffers); } for (size_t ch = 0; ch < m_outputs.size(); ++ch) { for (size_t i = received; i < nframes; ++i) { buffers[ch][i] = 0.0; } } float peakLeft = 0.0, peakRight = 0.0; for (size_t ch = 0; ch < m_outputs.size(); ++ch) { float peak = 0.0; for (size_t i = 0; i < nframes; ++i) { buffers[ch][i] *= m_outputGain; float sample = fabsf(buffers[ch][i]); if (sample > peak) peak = sample; } if (ch == 0) peakLeft = peak; if (ch > 0 || m_outputs.size() == 1) peakRight = peak; } if (m_source) { m_source->setOutputLevels(peakLeft, peakRight); } m_mutex.unlock(); return 0; } int AudioJACKTarget::xrun() { cerr << "AudioJACKTarget: xrun!" << endl; if (m_source) m_source->audioProcessingOverload(); return 0; } #endif /* HAVE_JACK */ sonic-visualiser-2.3~repack1.orig/svapp/audioio/AudioCallbackPlaySource.h0000644000175000017500000002733112252354725025360 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_CALLBACK_PLAY_SOURCE_H_ #define _AUDIO_CALLBACK_PLAY_SOURCE_H_ #include "base/RingBuffer.h" #include "base/AudioPlaySource.h" #include "base/PropertyContainer.h" #include "base/Scavenger.h" #include #include #include #include "base/Thread.h" #include "base/RealTime.h" #include #include #include namespace RubberBand { class RubberBandStretcher; } class Model; class ViewManagerBase; class AudioGenerator; class PlayParameters; class RealTimePluginInstance; class AudioCallbackPlayTarget; /** * AudioCallbackPlaySource manages audio data supply to callback-based * audio APIs such as JACK or CoreAudio. It maintains one ring buffer * per channel, filled during playback by a non-realtime thread, and * provides a method for a realtime thread to pick up the latest * available sample data from these buffers. */ class AudioCallbackPlaySource : public QObject, public AudioPlaySource { Q_OBJECT public: AudioCallbackPlaySource(ViewManagerBase *, QString clientName); virtual ~AudioCallbackPlaySource(); /** * Add a data model to be played from. The source can mix * playback from a number of sources including dense and sparse * models. The models must match in sample rate, but they don't * have to have identical numbers of channels. */ virtual void addModel(Model *model); /** * Remove a model. */ virtual void removeModel(Model *model); /** * Remove all models. (Silence will ensue.) */ virtual void clearModels(); /** * Start making data available in the ring buffers for playback, * from the given frame. If playback is already under way, reseek * to the given frame and continue. */ virtual void play(size_t startFrame); /** * Stop playback and ensure that no more data is returned. */ virtual void stop(); /** * Return whether playback is currently supposed to be happening. */ virtual bool isPlaying() const { return m_playing; } /** * Return the frame number that is currently expected to be coming * out of the speakers. (i.e. compensating for playback latency.) */ virtual size_t getCurrentPlayingFrame(); /** * Return the last frame that would come out of the speakers if we * stopped playback right now. */ virtual size_t getCurrentBufferedFrame(); /** * Return the frame at which playback is expected to end (if not looping). */ virtual size_t getPlayEndFrame() { return m_lastModelEndFrame; } /** * Set the target and the block size of the target audio device. * This should be called by the target class. */ void setTarget(AudioCallbackPlayTarget *, size_t blockSize); /** * Get the block size of the target audio device. This may be an * estimate or upper bound, if the target has a variable block * size; the source should behave itself even if this value turns * out to be inaccurate. */ size_t getTargetBlockSize() const; /** * Set the playback latency of the target audio device, in frames * at the target sample rate. This is the difference between the * frame currently "leaving the speakers" and the last frame (or * highest last frame across all channels) requested via * getSamples(). The default is zero. */ void setTargetPlayLatency(size_t); /** * Get the playback latency of the target audio device. */ size_t getTargetPlayLatency() const; /** * Specify that the target audio device has a fixed sample rate * (i.e. cannot accommodate arbitrary sample rates based on the * source). If the target sets this to something other than the * source sample rate, this class will resample automatically to * fit. */ void setTargetSampleRate(size_t); /** * Return the sample rate set by the target audio device (or the * source sample rate if the target hasn't set one). */ virtual size_t getTargetSampleRate() const; /** * Set the current output levels for metering (for call from the * target) */ void setOutputLevels(float left, float right); /** * Return the current (or thereabouts) output levels in the range * 0.0 -> 1.0, for metering purposes. */ virtual bool getOutputLevels(float &left, float &right); /** * Get the number of channels of audio that in the source models. * This may safely be called from a realtime thread. Returns 0 if * there is no source yet available. */ size_t getSourceChannelCount() const; /** * Get the number of channels of audio that will be provided * to the play target. This may be more than the source channel * count: for example, a mono source will provide 2 channels * after pan. * This may safely be called from a realtime thread. Returns 0 if * there is no source yet available. */ size_t getTargetChannelCount() const; /** * Get the actual sample rate of the source material. This may * safely be called from a realtime thread. Returns 0 if there is * no source yet available. */ virtual size_t getSourceSampleRate() const; /** * Get "count" samples (at the target sample rate) of the mixed * audio data, in all channels. This may safely be called from a * realtime thread. */ size_t getSourceSamples(size_t count, float **buffer); /** * Set the time stretcher factor (i.e. playback speed). */ void setTimeStretch(float factor); /** * Set the resampler quality, 0 - 2 where 0 is fastest and 2 is * highest quality. */ void setResampleQuality(int q); /** * Set a single real-time plugin as a processing effect for * auditioning during playback. * * The plugin must have been initialised with * getTargetChannelCount() channels and a getTargetBlockSize() * sample frame processing block size. * * This playback source takes ownership of the plugin, which will * be deleted at some point after the following call to * setAuditioningEffect (depending on real-time constraints). * * Pass a null pointer to remove the current auditioning plugin, * if any. */ void setAuditioningEffect(Auditionable *plugin); /** * Specify that only the given set of models should be played. */ void setSoloModelSet(std::sets); /** * Specify that all models should be played as normal (if not * muted). */ void clearSoloModelSet(); QString getClientName() const { return m_clientName; } signals: void modelReplaced(); void playStatusChanged(bool isPlaying); void sampleRateMismatch(size_t requested, size_t available, bool willResample); void audioOverloadPluginDisabled(); void audioTimeStretchMultiChannelDisabled(); void activity(QString); public slots: void audioProcessingOverload(); protected slots: void selectionChanged(); void playLoopModeChanged(); void playSelectionModeChanged(); void playParametersChanged(PlayParameters *); void preferenceChanged(PropertyContainer::PropertyName); void modelChanged(size_t startFrame, size_t endFrame); protected: ViewManagerBase *m_viewManager; AudioGenerator *m_audioGenerator; QString m_clientName; class RingBufferVector : public std::vector *> { public: virtual ~RingBufferVector() { while (!empty()) { delete *begin(); erase(begin()); } } }; std::set m_models; RingBufferVector *m_readBuffers; RingBufferVector *m_writeBuffers; size_t m_readBufferFill; size_t m_writeBufferFill; Scavenger m_bufferScavenger; size_t m_sourceChannelCount; size_t m_blockSize; size_t m_sourceSampleRate; size_t m_targetSampleRate; size_t m_playLatency; AudioCallbackPlayTarget *m_target; double m_lastRetrievalTimestamp; size_t m_lastRetrievedBlockSize; bool m_trustworthyTimestamps; size_t m_lastCurrentFrame; bool m_playing; bool m_exiting; size_t m_lastModelEndFrame; size_t m_ringBufferSize; float m_outputLeft; float m_outputRight; RealTimePluginInstance *m_auditioningPlugin; bool m_auditioningPluginBypassed; Scavenger m_pluginScavenger; size_t m_playStartFrame; bool m_playStartFramePassed; RealTime m_playStartedAt; RingBuffer *getWriteRingBuffer(size_t c) { if (m_writeBuffers && c < m_writeBuffers->size()) { return (*m_writeBuffers)[c]; } else { return 0; } } RingBuffer *getReadRingBuffer(size_t c) { RingBufferVector *rb = m_readBuffers; if (rb && c < rb->size()) { return (*rb)[c]; } else { return 0; } } void clearRingBuffers(bool haveLock = false, size_t count = 0); void unifyRingBuffers(); RubberBand::RubberBandStretcher *m_timeStretcher; RubberBand::RubberBandStretcher *m_monoStretcher; float m_stretchRatio; bool m_stretchMono; size_t m_stretcherInputCount; float **m_stretcherInputs; size_t *m_stretcherInputSizes; // Called from fill thread, m_playing true, mutex held // Return true if work done bool fillBuffers(); // Called from fillBuffers. Return the number of frames written, // which will be count or fewer. Return in the frame argument the // new buffered frame position (which may be earlier than the // frame argument passed in, in the case of looping). size_t mixModels(size_t &frame, size_t count, float **buffers); // Called from getSourceSamples. void applyAuditioningEffect(size_t count, float **buffers); // Ranges of current selections, if play selection is active std::vector m_rangeStarts; std::vector m_rangeDurations; void rebuildRangeLists(); size_t getCurrentFrame(RealTime outputLatency); class FillThread : public Thread { public: FillThread(AudioCallbackPlaySource &source) : Thread(Thread::NonRTThread), m_source(source) { } virtual void run(); protected: AudioCallbackPlaySource &m_source; }; QMutex m_mutex; QWaitCondition m_condition; FillThread *m_fillThread; SRC_STATE *m_converter; SRC_STATE *m_crapConverter; // for use when playing very fast int m_resampleQuality; void initialiseConverter(); }; #endif sonic-visualiser-2.3~repack1.orig/svapp/audioio/audioio.pro0000644000175000017500000000164512252354725022675 0ustar miramiraTEMPLATE = lib SV_UNIT_PACKAGES = fftw3f samplerate jack portaudio-2.0 libpulse rubberband load(../prf/sv.prf) CONFIG += sv staticlib qt thread warn_on stl rtti exceptions QT -= gui TARGET = svaudioio DEPENDPATH += .. INCLUDEPATH += . .. OBJECTS_DIR = tmp_obj MOC_DIR = tmp_moc HEADERS += AudioCallbackPlaySource.h \ AudioCallbackPlayTarget.h \ AudioCoreAudioTarget.h \ AudioGenerator.h \ AudioJACKTarget.h \ AudioPortAudioTarget.h \ AudioPulseAudioTarget.h \ AudioTargetFactory.h \ PlaySpeedRangeMapper.h SOURCES += AudioCallbackPlaySource.cpp \ AudioCallbackPlayTarget.cpp \ AudioCoreAudioTarget.cpp \ AudioGenerator.cpp \ AudioJACKTarget.cpp \ AudioPortAudioTarget.cpp \ AudioPulseAudioTarget.cpp \ AudioTargetFactory.cpp \ PlaySpeedRangeMapper.cpp sonic-visualiser-2.3~repack1.orig/icons/0000755000175000017500000000000012264464201017037 5ustar miramirasonic-visualiser-2.3~repack1.orig/icons/sv-icon-light.svg0000644000175000017500000004365412252354725022265 0ustar miramira image/svg+xml sonic-visualiser-2.3~repack1.orig/icons/spectrum.png0000644000175000017500000000025612252354725021420 0ustar miramiraPNG  IHDRauIDAT8c`,?`  ꂈI2Sq p.\|do$P:b 3? 0   kDf3.'6qz@ bذ'vFJh WeIENDB`sonic-visualiser-2.3~repack1.orig/icons/fileclose.png0000644000175000017500000000200312252354725021513 0ustar miramiraPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbtg@~-cbbr($?bbA W2??/##_n޼_u捣̌-LL;`z [Gxx=77؀_1ܸa}+Wn\ &&) }fwff ,, ? 5(py?}z  fe߿vpWÛ7?~tw 4 e/^Vz @1[[HHJEE @ACC7@1))aqqA;wAPP  3m/?00pr5IJ0((H׷a͚ >aЛ?^ 00!/G]!1яANN  ֮30,X0@B۷ O}d001ܿn0ܺu_s@͉l 04|X@aL!쌜 QQkӻIENDB`sonic-visualiser-2.3~repack1.orig/icons/sv-22x22.png0000644000175000017500000000126412252354725020763 0ustar miramiraPNG  IHDRĴl;sBIT|d pHYs G GIRNtEXtSoftwarewww.inkscape.org<1IDAT8MkSQ7^kJIM?66D ;HJ] w ĝ+@vK"(Wn$+Z5XK I䎋`ToK:p<3Q.9ns H5VYNn̄@* ,pД%E]|{K' @>4,ip:@ܩ]%m.%E(w~5`x | i w+ݞѿ!\#W(~xw|vC] {B,+?L>Y`c6$'4>F4vFrxF3璼-׈ DYZX/sR:(~/1Tfke\X@]SM Լ7!`-?80of~+@K-K*̬,)[\[j8Ā/ޭlfךF3%}WQ\棋}I=vxT䵀/&ͼ M)Pb﵋弯IENDB`sonic-visualiser-2.3~repack1.orig/icons/pane.png0000644000175000017500000000014612252354725020477 0ustar miramiraPNG  IHDRa-IDAT8c`P?c76T0t0 X'IENDB`sonic-visualiser-2.3~repack1.orig/icons/filesave-22.png0000644000175000017500000000146512252354725021600 0ustar miramiraPNG  IHDRĴl;bKGD pHYs  ~tIME/IDATxՔ=Eٝ5w>2?1"uEbH@ A!sB2ddɾw3U3;k;vK O[6?Q]OT3zBvĤd)f,jnq9wb7>_ẞʵKPq>~ &p]>}޺_ᔔ. հryzm/#&a{U _•O1)8w*,1z·x_dҳu/,,?,͔b4:Jq;x͌t!bfۈ{+;e2}Ƚ1bH4˖:p|giQIDAT8c`t؅'R;#y1,&KŌ$H3|i1.@ b0T̈́.@U? @`FTwIENDB`sonic-visualiser-2.3~repack1.orig/icons/datadelete.png0000644000175000017500000000155612252354725021656 0ustar miramiraPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDATxUMHTQ{3o@ʦ:2U$c.<P[O}C*.Zfm{ׯzp *V[XD+t޶!st͓VowNgmm$Ja]U Vh"ea">i$?GU!0x/.Ӥ(WW#G+*K`^F&,avGNRQ~? L]F LXŞeUԜhu`Dle̊yf3LknK&Ǿ 9C_\D6OOLmɛ$y91TֶJt_Fg~Nޢܓڂy=w9tNIENDB`sonic-visualiser-2.3~repack1.orig/icons/colour3d.png0000644000175000017500000000022312252354725021302 0ustar miramiraPNG  IHDRaZIDAT8풱 0cd1]>E*^P".8I:XGV$u Xw>Wy8yL,Hx=JHDIENDB`sonic-visualiser-2.3~repack1.orig/icons/show-peaks.png0000644000175000017500000000023212252354725021631 0ustar miramiraPNG  IHDR Vu\aIDAT( 0DNy#dgF0]?ZBBLAJ{' | z,pJNrIc'նt،.o)hR?3_?D2>2IENDB`sonic-visualiser-2.3~repack1.orig/icons/ffwd-end.png0000644000175000017500000000051712252354725021250 0ustar miramiraPNG  IHDRĴl;bKGD pHYs  tIME /̤NtEXtCommentCreated with The GIMPd%nIDAT8= A F"x ؉Sy7Kace=nɂ(YN!x !VVGoPz<90(8J_އ—#\W /`U7u x{1W FQ3 qLPk7`!nW4< -j'`,3wu@IENDB`sonic-visualiser-2.3~repack1.orig/icons/help.png0000644000175000017500000000135212252354725020504 0ustar miramiraPNG  IHDRabKGD pHYs  #utIME 1q,(wIDATxuKawgFS#aFC:P@iUܹp^Z¶pmY,#$hS"[:::;-tF*=p6眗8ú$$BTJ܈JV y*} ]XS]lH4cjTRmPw ]\16˿ [|]uлRXe#L_GpDXZfAENxc 0Yc_N=M$d -8~G`;@Q#WP0*pa2, ڤw vE#0t Iȱl @h]20Q]E_Bрg9h39tCKajݽ-ucQ%\Cj| B&8FHeD!F#_EpHʚQC Kmk̲CbQx6G$Ɲ c[{s*^S9. Wnu8?&~lډaڧ%TҼe)Mbmܛp;iCwB.~+b<|ǂӂfvKL-YHC. !e1]̕2ekbڸs;*IENDB`sonic-visualiser-2.3~repack1.orig/icons/waveform.png0000644000175000017500000000036312252354725021403 0ustar miramiraPNG  IHDRa pHYs  IDAT8=aF%4D!@!q Bp*ht$Df?aw2H5doLF[ ^sQЃs (M Z؆`"1̛A샟bvhؠz3jxл/#fg(W5IENDB`sonic-visualiser-2.3~repack1.orig/icons/redo.png0000644000175000017500000000116412252354725020506 0ustar miramiraPNG  IHDRabKGD pHYs  d_tIME 8veIDATx͒;hQ{wfgggfwnVP4•DETXXXM"FERX(!ME K3{bIWuNq>klDe*PXH0ۺFďiPƢjZ(y3Cҹ\Ϸԛ!M L6/16mHPl ,]<]mܙ-^f<]~ 2q0vrB9ZhCW) E̬~z.}cLQׂ`gu,!ӛ1b]lP4lh;3N= )znldz=t@)!{ `ߎZº,*t#*AHā-eEWpߚ?/-p!;(ׅ=NߦddɈŤyו(:@YyǨ_ȀHta\msmQLU4* image/svg+xml SONIC VISUALISER QUEEN MARY, UNIVERSITY OF LONDON sonic-visualiser-2.3~repack1.orig/icons/zoom-fit.png0000644000175000017500000000151612252354725021322 0ustar miramiraPNG  IHDRabKGD pHYs  tIME &O)IDATxmKh\ew;̙[Lgx6&* qYLA(҅tQE[ E]RI))h24LL29s=7*1λ~>/8۔am~lh4P.=~'NgȈsRږ%Hҍl À0`m槭ԩ7~1H\ͤ,M‰Ǧ3~XqHnS)L DZH&b 8>,9M%JI&Ĉ6<ߛ(-ro}$VD{ vvc[*[޼b>:!^t_m'j bgy X$?w0_>/=wvRM~e߈DpA䗸x~"YmhÓ^vp. u;gGэK_ v;OdBR7Sc釦b`ȝj{Z"/%nǁ_G7*JM>J+1\EuU??sm\(.?!=--ŲU5'XEIENDB`sonic-visualiser-2.3~repack1.orig/icons/playfollow-on.png0000644000175000017500000000031412252354725022353 0ustar miramiraPNG  IHDRasRGBbKGD pHYs  tIME#<LIDAT8c`b‚Mp>L 8ψ.H X@)Z?YјXx image/svg+xml sonic-visualiser-2.3~repack1.orig/icons/playloop-on.png0000644000175000017500000000040512252354725022023 0ustar miramiraPNG  IHDRasRGBbKGD pHYs  tIME"65 IDAT8c`X'F-#.`hX\"F d(z( / ֏ŰE'cgA/BQx|?L0ۖ^\L3DbFdlQ,RF\N;IENDB`sonic-visualiser-2.3~repack1.orig/icons/zoom-out.png0000644000175000017500000000144012252354725021343 0ustar miramiraPNG  IHDRabKGD pHYs  tIME-"IDATxڕKHTa;g(=$ljRڗ % E( Zhe.Zhː,ҞcƩqfw9F:9n@Hֶ쉂a\.x2 ENO^)  |6*=s^[c==Vv4-,(Wl%P*C(Q\`g.s*h+B $ƠPU>776AqTYbFP9WUpp}Uj`N)EPķG$2.@IDTVm! P@DFAȢ.ˀ4K٪)cрذlq@)$࢈ODU\"y9BA p]T2ϰ[jKBζpȫ*@ A"GT(քӱwZ=9ۻx]CMk!O+R*V cQ<5/η2B[U7GN9/ιo슬L_8i!d%ܝ~2^ zvټ#Oimw|ŷX<)={hn S)_[*^;9QVi}샾<.nm3mwFg?:Rl\k:? M[IENDB`sonic-visualiser-2.3~repack1.orig/icons/solo.png0000644000175000017500000000047112252354725020531 0ustar miramiraPNG  IHDRabKGD pHYs  tIME  +#Q^iHtEXtCommentCreated with The GIMPd%nIDAT8=AQ4:FlH(AXZkKCs%ކI&L93:PZ~ulpOQ S%h}l#m0kRЩb=P~ ߚ< V?8zmR$"Ě#FAAB.k4k "ÀDDX3H+==]J*:t萬SSS\I=HDd HD$3;wN1oV"r= HDdZƵk׬nGt9>HDd5YYZիW\5A4 q6ÀDDf]tIv`@""\- qa@""q-??W\X 9 HDdR=H(..VBeÀDD&ݺu YYY%Pl֬cÀDD&){05);;ADLrŀpLc@""" Hf#"S$gA*))AbbUm0 ) HDd3/ZClDd t@RVĽ؃DD0 QEEEDݺu%헙iMIȨdJ{V!6"2v؁ (((FAaa! _/g[.]?OluA""SR+|rL*]kPTTd1 1 HDUƍ iEY|!g HJ?Ҳu@BҥK었sGZصk~iF7n`IZ!Jtܹsܹs5®]ЬY3GDŀDTl޼gϞuӧe'==wޕoƍZjIrln=撓ѣG?~QQQVlClDU̒%Kdsȹvƍ@0+yIoFFnj><ﲏHH^^^PCl$GDÀDTݻעfgg^/"5[[=sAڷoaHؿ?V ٹsfڻ=l]yvMYGeퟕe|0"?$*Ruu@JII|o8 \r=z0 UV͙;wGjp$ Y_GZ ?^q/^|Dd_ HDU5Gd{?Q%ki@-O*"$*b׮]V/F{#W),tHGKjRÆ +er8$ }E˓k#WŒ$hI H5,A-:j`@":d Z9*5 ]p㲲gѱDd? HDUG@ٵ4}>u@]!b[IID^$"ǀDT('j[2A)Xݻ~}m݃i1 9?$"'WPPǏ+ҖP"54 !Z/'T H'[:ŀD_e#-$vK H^$K'hk1 9?$"'^$y ? 1 99%Cl"""aaat c@"rb "%șc$[$mhSTWmkY;f[ؙ3gf!6KԠAm-//7$;;VADŀDEۓJ,VY2/J<$95-97$"'#@Z@Dj֬ JK Hy-ƀDT=0 91Clzg"Lٸsl1ƀDT=0 9DjI6kL~J ݈eddPҾNb@"rn HDNJNѠA$=HRS`Y =z`@"rRRR͚5qK7??&)((R HDNJj@޽;%k*!&c5j԰RRR,vڒo+% +v$"ƀDq%I",,LrۦB8(^-/Tk!9;$"'$GL9s}L _)}Hk\ɦd@؋D5t >>>tPbUh9S@rVi+) I H;wݐUP"urHHyFJ əU6#Z܃tIE#"0 9={VҾ+1lrknܸaռ(%o7tb@"r2Fii}- HJ Q2 Y;'u!9CR{N:!}Ⱦ5wwwtM=كdqPZFQQ,i\\xQҾDd_ HDNFj@pQD{ )I),, >>>Wbr?.y_9'$"'RXXǏKڷ /E"RZZj-kC[:u! SZJߏ@I3 9'$"'_I%g,jKjCf6 !""BRJ ծ]h߾?HgQJUǥ~ߒѣGkժ%8cIDzܮT@{N:fN־~BD҇F???HKKCfffa1 y:ZlIzMy{'KڭI޽c[U |K4ݻDr[WÁӻ9yZހz@yw$ ?@4H!._#\3G+}]$]=Fmͺe{*$*@i7Xb: -+3;QLUE+Pv6:_ JTe1 UA  ʏc( ]؉QWb@)1 e.5n:PRZ֤ØJt-"r> HDULP߿@i Hr`~n H&ztSbL=H6n*Lyȹ0 U1zD? H$H~RزM7]b@ xx7- 0<&'|@ v"r2 HDULGw:̖ #h,زMAڃd(pؽf( I]U'k {$$*X = IIb%us12\@ӓFM% *$ mS;=;vl;PՉo,X audjg~@Wܖ5U41ԟ}sm+?Q `%g?J:1C}`C*Oɕc@"iQ/!*|1S׮];Լãm v Uo.vR8S_)]/_ײt&7[Wkp\B@R{Ujz7n`ÇcAK * kFdd$]OT1 7ݯ0ۍK:UVk{ iW4wo8Q nD۝a˖-p^&j2:/Ns!\%7ʂZt\˖-%bm@JMM|-Z@-$GDID.DjRvK"m>97ϕj[w]7ԕ{"r~ HD.Ē!6͛7U HS !P1 HDȅH H999h4IDGGGZynnn HP_Hj@*1 $""5!pVj&[L֒:fM@J֭ wwwI?:|||f*DT0 =Hٜ! eddTzL!i(؃tDT50 9);;[ ރXzb@"r!R؀$9+,b@"A"r!E~eee˒uwwXܹSb" ]rE\ {\RW5nei@z&''$ȹ!6KԊ_VVrrr< "!6"#ɖ+H^^PP;wn*uX!!!iԨ}!-ȵ0 ŋ6]ȻHFF. ɹHR{$˜ 4U 97Clܦ=Ra6[  $d"00PV-D\^۷oKO=sHEJNNmj(lOOOIZ,֒:)))c@"r1JtxMK$j I HA"8I(=Y%Z~u?[]|EEE6{\ I]꯽a%#G͚5kuV/5 ݸqBIq?a@"rAJhEVa ȮApsS=HD) uֲ&mHxx YP^=5F+1  RnV=H HD.ʚ!Ν;VZbp>%P8F\5=@>[/ڛ^#re HD.cǎt@r$%{\ ZAQQQ\ R%)Zl 77كD\XndtClV_0u1 ѣG>{8F\X~P^=W^סd@rssL& ըQa#ra HD.O?'L///P2 խ[eM@Rb9/tqI/[^ۤ„RkЦMUb9/$"װaClܸ͛77OTT6lؠXό>9c3GɀԬY3{\Q50h ;w_~%"""*lQ~gڴٔ H&) HD ٳg#00W_Yu[Zd@,: HDśoK.aڵ9r]=He Bddusa@"BCCO|+>$" g Hm۶}K:(Z9$" % yzzN: TSрd?tPk "€DDvDRz$]Iʪ!66Vȹ0 ](IէOɽBO]GADDNClDDDDz0 a@""""ÀDDDDH$""""= HDDDDz0 a@""""ÀDDDDH$""""=.7o⯿իW !v`F !SN!99s玢5z{{#00ሉAǎgtɓ'UѫW/nZ`͚58tP>}c{=Ԯ]x?z*ܹhR,_ܪ;vO|XQ(--UnSv튱c1o<}ۜvsYnJJ O8qk^z޽;v5j>Dž 駟f13g͛7+=>vXt18s RSS IDATΘ2e Zlip[zz:N_n- _>6mN:9G߾}jk ??Juw1X_QQXphڴkƍW\1XvZh!vܩlĉ3c !Fk9|ѧO~:upss3vPPq0ܹsZ3f0@nn={ qeر9btw+-nsCףuBV>3&**`M|M}ȑ#{jJJx%7BpBQ{b߾}~)Iҷo_5:[NNv;4t ӦMCbbZ ZO?dq;ϟ?g}F uVKQDOܖwyǦ6m̙3.b_K.a())|̹sЫW/ܾ}ۆ98tk֬k׮]Cǎl2:/Rr4a$%%9 ۷ocȑ8xU\C qT3g *rN>|8 ]J%5j222]?~<]AN233aGaԢE2t1ejڼy3Ǝkpc֭[,Gڵkc̙i4+d ,V"݋-[X|~+W(Xڿ?GaqGQ%ܼy?0iҙ3g]I˖-st ={u7T">}%ԩSmpۮ]{nE…   ^RR(h46mUm]j™ksFΝst 9*xT*L>111PTvJ$ݺuC׮]ѪU+)9qQ:tׯ_7o=zl磏>]v%7w\DGGc„ Vm)cL6 vH9ޘ?> bp+޽{seff7 .ݦ P64~}uSFv.{Yr^ꘘ< \xsA~~~}ׯ_)S{6ь&kժӧ#**ʮkNS^{5o^eۣ0w\pܖrd(jo9g͚eޗ˗/Yf_zO>$x aȐ!FO4 4@߾}^&Ljj7x`D|| G=0w\glݺ{ 6}Y༳ `„ _յ:SɌ \護SO=?h/yyyyY]TTdr͛7b ;USY۶mvnSfsΎ.@W-ܾ}{FΝ; /عᥗ^Bƍ n۰aOY-YBϞ=e˖NћxKe?vBBB^ݻl+;+V#JUE~ H]b^^jj*}YGa 0{ŊXQ >m4Ų~CV\־K=o?<5k&^x͛77đ#G,љ)BPvO>eT9vb$XtVsNOL-7bDq(v>ڵk ͛)ٲe kFY}_/l[h?_UuԲ~[JMMeU56YUF  0[0ػw/ziX%%%9r$TTsU@@sssRRqqmmیXJLLD޽%D):$,,|;wMQQۯ|V-':W?6>W \Yfػw3mH{Gĉ@wpO6 ׯI`}6ߏ_|IIIU獉u.?}4,[Lmx۷o7zVW1ydM[,YDwE<>>(((O\\nq@@7n߾m{U|/Ƌ/hpZƤI0i$בqo>;:<.\0]c>e̘1^^^7:DE٤ƹsB| 86[Fk4iZbѻ{xx(~Abg՘{My Y,\O?ݻwwF5 ĥ:* ˺-yyy&h_~_Lgt|}}ѯ_? / 11xR ۶mktA8aϿ}Q޽kvرcѡC[-PHH"""p5me* Gx1~ !0uT>| 4@pp0 aﯝ\yMiF7'ܕ]=gکS'ܹ}1 IB1nuYӽ{ 9}GNw1W_}擥?S &Pub㣏>R"(>=z}{:ѣGa#GKsWGo Ӯ];L*v۷#h0zh]ΕÀd@PPVZU-Z믿VzGM.V֬Y\>oZnm`̙6Yl<==+ /\Rf{;wnҥK kPk⑯:޽/.Ȯm۶z_;"ǻyfܮ Iڠ4i6l0x7ѣGc߾}]ٳgcӦM'~'̛7PYp!Ǝkϟ;:f̘1o~j֭]txHH6m;WF ̘1/1S_}UDFFڬ!)))X`ԩM6 m%66?S 0p@,ZZ$7n4:OU]Q} wvڈD1h <&8zꅄ۷ N:dΝ;@#&&={ēO>@E#O1cয়~֭[ R|||wҥK+Wʕ+}U5yf̞=GA\\~~~ҥ z3f(@Y~C=s￱}v[/_ƕ+Wfk&!22С^z%Ԯ][_ aPpBk`޼y7nw8lܸ֭իWׯWMق'"""P~}DEEaܸqK7nVX?)))rѫcݺu6ln%nycƌYA}b׮](~ݻwWz$"""$""""= HDDDDz0 a@""""ÀDDDDHOHii)_ QB:* !!!pxG}4 5kDÆ HKKCNNZEFF"44pm@@ٍQϟ?FJKoPJJ 111Fo{$&&&f%%%HIIAnn.@jojhD6Z[bb[Cff&nн8{ۢE x{{WV#==@}%V{ҪU+$&&*  3FZZ2226_O///I~Μ9SṫT*!77WkACvvcZj!""m4 qMYunݺ8{,}=?OQPP"@ƍ`tLꎍ6{F4dgg} G:u*!Vq JyjڵknݺF'$$hѢv }6^{/0ׯ3{q&o=EEEHHHP<===uPN7 h4v,ޝ>}ZaÆ 2[Srr2rrr6mz>DW"1}t_9'OwB.-ZH>wVVA !XrUcҥX=ZYFzz XFĞ={L>1c/,,4^~ٯך5kDڵ+ۻwo޺uK4mڴҹze{ǢѪU+ᅨ [?~s={ءC|n߽{:i9Rw\ZZ6Gddؼy6L_V  "**J$&& ///@ Z-Qfg}V5'oÇ֠AqA![nճI&۷o>G⺀ܕ+WVx޺uK4kLf_'999bĉԏ o F#y=ӧQhҤו!;v][āB,\61vX{!ɺ_uxb_b?/e(fΜ)JJJFyȑ#&> |}}-T}54f͚e՛ĉk׮ kYtXbUP@t;Ś@S=ȑ#C4uTϱMy$m-@/ߌJٱcnZ}B. *J,YhB꫺>ٚ+Աn:<`}@ 7n,4 HB/1cFiii0`nO?駟ٳg !h߾m: ]vMԬY˗+$GDNNs++WB1ay $KF HjP8i$jVbb">3`ڵX|"lܢE L2E񱱱Xd#G"66VV7k ={ĪUh0~xԫW>64h> Zbƍ:t}N6l~7ܺu/.] ƛo Fw}0f]^^^XxPXX9s@V#..ڵ7|'x)))1bvޭ뒿x"FR_~n8,///L2-󵿧~G[111h۶-~aԨQؿ?:w,9U7Fq%Fk׮]e#6YYY mٲE'|"!xꩧtm$''[ԆBn:RP_Kz+qFZuݗ}v>111Tץߛ 6wuO0q$_fΜ;k&(oժ Į]$tRe=YK____Uj\B|嗺} !Djj@0ErrXve˖I~nA:'&Mw9x 0ԃd̢EtܹlۙQF B!~gfE~~ٶRRR,~mڴ(,,ԵӧOYHam믿O;*E^{BҁD^^ҥWjTҦMd=u lõkt 2DV;>oo =HB k6=HըIWֱ5j_(Zejժ s= ׯWzl|2f̘G5ژcǎ8y$~z1>ݻwczHkꫯUV^@LLL6W IDAT޽+/w1{イښ:uju%Y<.0-[K.|2+DGG7ް`#|||t{")) ̓ZFqaԬY]S Hlٲ< JJJo>ΟuT\9sw#v>{VRtUN<wc/>35t*\իWɓz1uT̛7YYYܹ3x_^ŋ+|nn^TF{᧟~Bjj*zzjΝ˗/K>wnnb{澾JRTבSZuE͚5q-ر}̙3tiӦ I˘mVX3m߾}ϛ6mnj7/^ܹsqMt=z0+{nAԩSy󦮖0"33+z!Ito|ñct nܹsgܸqAABUVu(1g!ǏZdgg[uݎO>Dlڴɪ:M i8qE Qv9C|RBBn5Vpp”G{ ebɩb'i޼yv!ٳgϞgϞbժU&u)ԡC!0ك`zI$!51bDj싴XlUlEEE_'ɚ`9n=HB)k8YNK>V^m{  DttmDEEl=HB=Q:H*J޽[!ć~hU[}$>XuAVb{gftMҭ sVZӧ>L8-HLBtt4̙~5kĶm+ 4/Ff͌޺B ;vĉ'0bSN4hP?ǽ˺G;z7oT^^fΜ)@޽:t]Oɽ9998x ]v濾Xb:u$6P@Gذaƌ#(Q,)Uзo_ڵ={ࡇ¡Cd_Гl_~BUj< GDDUDMHF<ɘ=HDDDDz0 a@""""ÀDDDDH$""""= HDDDDz0 a@""""ÀDDDDH$""""=*BPtɓ'Yq:$""""= HDDDDz?6{\IENDB`sonic-visualiser-2.3~repack1.orig/icons/svicon32.png0000644000175000017500000000103512252354725021220 0ustar miramiraPNG  IHDR szzIDATX1K@Jb&\cX6bq@ /4x&Ŗ ~  Kڃ \FŻB3dfM,C2o&d1N;}FI) XJɛbYuM09&V9||*/O=<9{gϦHDEUELD6 ^\+Wf;N Q] eMϏd:IcZcJM&,Kh1͐{jtxAk*S"Xx/E/0~p ʲpe,01 P=2Ӫ}S}R_miPЫo}}+@ڈ㸓ws8FD8:؇R3D[pbl}jc:rp Xի\]lӑ纒KN;w3 v̆tIENDB`sonic-visualiser-2.3~repack1.orig/icons/instants.png0000644000175000017500000000015112252354725021413 0ustar miramiraPNG  IHDRa0IDAT8c`F?9ژ']0j#)l4  (qIENDB`sonic-visualiser-2.3~repack1.orig/icons/playpause-on.png0000644000175000017500000000054212252354725022171 0ustar miramiraPNG  IHDR/sRGBbKGD pHYs  tIME! FDIDAT8˵jA?>BL~_"b$ byO0`Km&Bz IsOngv|,2 ojr ozLq i!u{Yw5)<ڲOEuU,UxQ'5o5Vjrs8@8|cHM y3_(Ty)%N{esҫTWi2CYg$IENDB`sonic-visualiser-2.3~repack1.orig/icons/rewind-start.png0000644000175000017500000000050212252354725022173 0ustar miramiraPNG  IHDRĴl;bKGD pHYs  tIME95BtEXtCommentCreated with The GIMPd%nIDAT8+ BAЃ p M5ܛMf,, Z&E` M=LX# 5ޱ'[xp8Ԫ Oyb=:YWuŻ+/-1.Qpap*oR58u0k>hޫ*H=IENDB`sonic-visualiser-2.3~repack1.orig/icons/filesaveas.png0000644000175000017500000000212012252354725021670 0ustar miramiraPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb??Ç>~ ?} d2]`l}AIj'x{7.pz/7 @@L3ׯ?7Cwwz gq_.'BHN8?@\PT? _~ ×/߀ e`< w3dY h?bXO?iˎɞG`>=517L4?|7Éw0°Û/_ w0<|+Р?~2|3h@E@ge8~'7 ? @C!;++#?" qil e8^ /×ϯ0(>gPc0Ֆ8', pL~>4ޫ kϞ(   ߿d/ë@W * \ ?0y/^~e ` ?/0 /pS(mp?t> ~ ɯtw7o1q3|F)cp毟.-H`| wb%YP&*tO`f7މh1fd?~A3p9 X| ?U~hO?0q10@1cb/1Y ~P|fW ׏ ʱc``2>vIENDB`sonic-visualiser-2.3~repack1.orig/icons/solo-on.png0000644000175000017500000000054712252354725021147 0ustar miramiraPNG  IHDRasRGBbKGD pHYs  tIME$"yz!iTXtCommentCreated with The GIMPmIDAT81jBQnb4B:^\ )݂  ."J'BVDH 4n#n3* =\4S3ZxȄAcw51Ud_#Ͱ[t:ҠϢؘ+ls?F <(jq! ` mqIENDB`sonic-visualiser-2.3~repack1.orig/icons/fileopen.png0000644000175000017500000000207012252354725021353 0ustar miramiraPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?% XT1X0|/Ьc'^2Xd'_X8X}>v#uo}uh8?b߼_ q_9YQׯ v V_Yt?FEĢʛ/?  ??I d˗@'108:7@  &6V/L  ~`)_GRW[o?@C/ëtD,$0# 0@t oy0X(Á @/T~p)qn}fQUF  @~s2:O f/_ @sGt`e4{sßOXA?++fv1| r< : 21 A{! h4y؅N\g`xà wcxó><|{!#.c3d*Ѐ1ǯ ~gJ8l$.ƿs/by'*?P 3w0 70&_0>y;܀\4$8} 7`}H߿~,3#@U4733 D (yp{S3nv&`S_7d C0gdeamIENDB`sonic-visualiser-2.3~repack1.orig/icons/hh.png0000644000175000017500000004161312252354725020157 0ustar miramiraPNG  IHDRkPLTEskkkcc֥{kkkZZcRR{ccsZZεkcsZRcJBƽ{{cZkZR{k{c)県{kcέƥ{skRƽscZRB9{ccBRRRΌsc޵kRBR9)111ƭ{s{cRk{ZBΥ{RZ1ƵcZRֽkZJB1!)オskcRJB{kZ91)scRs1)!ZJ9kRRB1kR9ƽ{kcZ)!{Jֵƥ{skJ{cBcJ)ZB!ΜB1sscJZJ1kR){kcZJZ{scZRB91!ƥcZJ)s1skcRRJ91)ƌZBcZBcνRJ1{BkcB{ccZRRJBB9kkZccRZZJkRRB))!ssZccJ!!sZZ9kZcJRc9JRBZkJRcBZcR!BR9RsJRZRJRJBJBcsc)1)JZJBRB!)!9J9!k{scsk9JBƽk{sckkΥRZZZccBJJ{9BB199ZkkJZZc{{9JJ1BBZks1BJ)9BBJR9BRRRZ99BJB)!RZJscBcBcBs{ckkJkkRcJkY pHYs  tIME  z5) IDATxmWk.-b&;s3LٙAC^t:w¬g^(SnAL,ZOtaGb Q0sBϚt?o&{wH4yO= #A>aS+H8h}iz%䭭- 5|nՄx#4*:A.͛-Qv,&k.rXC HJ h#Mf$ N6kX5#oW<kNI v2 / eDVH:"@`!VSmD K(Az~TVh̻\9 ۈ#ʓ97q=ƔImMzknQ !VGT+7T vp;"J G1^~q,>i k MkE88~ڠ?Өլxd$ ņfQf3=j9GiTVoRH =M5pSZNN&mo&9:d42ؖs"j]h$G>lv{>X׭uXd-zm淳0%rG-U$ޣ[§O&cBh4MM2HvDnYÑ Kdqz"uY8mڼ'5ዦD_Z؛I'Bp—1 d*QxK5C|-. +b/dZisޱ^ ?4nx.mDk !+(|ݡ)˷4zߢrݞPǏ[OQkL4 O-.ш9; }~~Ѿ3l]:=NX づdž"?w" Z#ѶooO;3=ߟ~l3ֱM8Q's% t?PH?u<do~-p0u3uyzƒDS74};}d`ѳiKh5')2#J(jNYIÙI$EFfj3hZ9kgLΘ/ -W{ v oeu,K}zC`nzBmZGr~!Мd: 3 >Bo | w{uk0=~=^v˱d58ss]\cǼy C}^ezlc>G52m6?[D<:E $Ȋ֕lǴ2{qqJw5s֥r90{ܭkwL781?;^.`#IhJՐjҔ Rwn` Èkaoe~pqfpf?3p}pyq͌|~h8{g-/~v74b觖A;Yװ9\Mozqo???g^]ZXY\2Ε w< ?4޴vݼn]/k=G=n8{{`+9i̟<Uf-JD m;_>r&-8G+3>,Dty!Q~> 8a[W8'wfFa@s3Å>m&g y˼.oxCM<6i7 4\e'4 ~~vuoM/zbĵ8i)3_09%i+nЌ1.˿w.AƳtn3vgˮ+]> :cpaZ5}#A$5! %՚0yuN^dpzݖ[#}f#;ni9;oSV"_f=w/ 4o ?=K cr;`4XoZ&WXVop:V/Xx5uʯ@v?n:h!L0K9|ɎR# {낝Iscd<닃Qf&9; 8S<l׺?sӬsrE7=xѣ?9ct\|wߠa{{ĶGf7jS áuznC:-sWd0}bY5t @) `#-`ZBԬۿ8~ 3G?'N6H۽^ηrbt''{ޱ' oC{@DUI0٧j.#lYyQPw&}޻|o2i岙Zc/o[z]۟~餘Qís_X;-k>dphg^kc_u6R8b?xQ[5ro)85{cꮝvWdyپdY-{墍]Gc3}~e4n~Dzr#r?M_ǟY]?ez wޱ^u޾=7EAv_FfN4JHGh9i_e suewOi ,S>b=s7z 2CGs{w?9瘵BSߝ]zɩk]:rGkö68oޜ_`-GS܀H6a )n6nX9ھd._X^zϷlwcx8bS8@9x֟4g\9jz氵ot{Ҫ͏ѕ;w.z}D.s~N\ŵJ!S8 eNOw{XќϿ3޽gP_6)lsW`|NP-)Ec 6Unc_}ܙ]gij:LgAkuckϪ Vh6>OMUpΑs S?w쾕 nڇ^uMMFGhm>81'ʴw?e/0F+g>]^1Lls~U c*oЍ ~xܨ;xìߑ6z xTƯ|g~wC{W1C.k_w^5r 3(*._|G7V,Ri444z{ҍ?{`374Ǔ=#ѥi.^E?K6[dȝx;ЊYUC BVF6Yҧ\p 39ND/_6O'3}[?'_, mc/ ;NdP&~,U%n`. WMp?߸Ke@ir[xz.ʲkK6"mqS4uv˹ř: m~57_MQSG܍(0LͺV,KMk |Pd.M9 o,6bY>G-\ $⩻i=C7 i$G֟pm^//p~LӘ!}) iOO\mS~c6~V]˷^cMfibj}aڲ4xάq;À"-4gܴݵnw / zAuj!y_pisgx=ƭp®n9Iag3vOaXTda6T=;La8k)~\ F]rr}'Izեw.cퟘ_30 ~l0Y&nbChrؖE+G* C6) 8?ehԼ 6kW&E#XR]]c(e M;?Xff5Ōhdfꔋ^}Bߣ?t7@nv[q4  @a@"M0Lj b\`sqˎw9Q6Ԇ2Rsׯa#wc7xGpc!=,[XEǒ ~S@̀F@Cn|>Ύi v3C) ʊ˗òq_[}.G }nR`D#Uz;vqFisj|Նlc8NgVs܁ӯCa+nߏ@_~vx@Q60]0mv'KҷSiIм֏O{D^1VK?fkGWAoq e.b9eս>m>xc#1#AR~͊s~҅+ÜQ|; U_q-Z, }}+Ea{-5=3v:ƒC@ eUnl|4FIECQ:ḿK34X s%[M~ˆʼ+#wZι. /܈;3}kuٞۿYh%Ng@(٧lᠡޘu]%F CI<8cp/ LXMx;#bwn t,+ӐW3C4?ӟcc4ud4 g>7M#pX%&@"BW' xBClU5(=fY>[r2;=kw#N;yȤbթeۊ{ђn̼o }_A(Q"H!0 aiwm9?>A4*8uVj"[Ot7g4 g'\Fn. qݽ0sS2znwcTiMZ+zjH2YjB^,Hqm;E {>;탓0^5r1ǛauN1xw}~5s~W ڜ,M7?A51݀eo#t*1CպrS#Lɔ" *DVq9;LXV07'\M @#fu<˨x|$rޟ]=f`fcC<{{qq㚢dgNŤSCkƤAL:hjFC)$FlDǃݏH+6КoD~D)B$郄$ 8wfgH=có ݆덷{wmvd™L>29aE֮U_`nFViLrIum2Hp<1[qޡ%UFw1Ĭ(*-S\̼/tTT[ͩ=l&^@h}p<TJhKBڳ*H!Qnn9Y)xNArrRs%^{Gl. g?\)B=`  zNUyڜx ^U2!bzxmH$'EUk(Йȉ x` #kE5\E c_`iڠ^8zau Q}n}W FĘ#Gu;֞EADۥxt*[-U hb!?CgsUs>hC 'v~xME,AH3CIAfUqL33NPk+3K4}et_X A۫sv֩[''.N g#ӿuC@0ޮxkLrO(0@PG(,HcPGv0b)ls\ )f3`q.ā0Diwi;>ۋGpd;N޺:A|9!G =CMQ6^%o6gŖY`:Qšqx%[G֫2d 7AEA1pdS^[m6B ?a~72RsxaqSGjs#|>(?35_0'"z#5޺D= 憊3 dH0hD,bXWaJNm"7:F;{s{a[a9w8pƋ,Az&XP7kwRm5g҃{͇ͭZlŶ[ bpe\)j] JlC"Z"XbXL#mâ6HSfciFwpswQy0>υKj9 BYw -x9ӭ RrCrVy̓kϤ _!Hf6PLR0~ɷ fs|/PFHȨQ+NdF *0X0;i ?0dPښ{Gh1!JZ֭! ֏NIjɒ,3Nt.UȈ OKmPrMu̹Wf3C1sFH|bY= nZzl.Ԙsb>4?:~&/߀eRB` %Ba1N3Hsv^)2+.cی#9ߪDy+6;BnӒd=qJ_]p1aI,JntC*!^׬8F~G%L4%bàQ&#! Y4gp |y0FchsfTNN^^ uXy밉茎u>bhvBgXnfћSԙ)̐$※VEpҶ)G8 h,8PM|cZ،FPy=D*AFIz,w‚okYJ=9 Cz hfInM [t1CMPp* IDAT $Qp"**RC( vG<YЮFOS Y*ώkqNDQ%^O!$MNZnfoObg8t:'~?kF釐$PDA5̜NqFՉ@)<-BFD|9ۉ{i0qoOct׼ aȍsDڜ3 X?=4(y|Sknaor%U*%S5 T 0&ԕ)QO)ua0bD$1%HBҶ3dFƝ]~awDď98UgzؤgL1cOP<ifN@O2۩ 5'W}ǫݎp3i hwCjg4Bćø9I 1W JvrՑ2<rX @On} mdx,]MXP`31]:]o+ƃCR6Dm]!*n5O.JdMP !$%@nPDж E0#Bd㩕39i֊ug6\Fp׳nDZbjz\vNfZn$B`" 6*X Ah XÈpDFS 1G`҂6Dzk&ٽR?mN<`2%{4aa@V:}BTܚ+~U$<5SHV@^kх^wP!( Х78kdWh]LWLT8,Z]p9{c,m6X|775?hof>Df>ߥU\6S*REBZ"ˡvh SP~E%=0,1h;nis/zAckD3wm6 usZϪ߈onnO:_DfU,G#5ҙ&F#Qh1ZTgHڷ '% \4:?5_vymfPy:Dh 'C#.fVϲ]p8($釰L|]M} NV$"7I ՚rlT9Y9r-ՠS0QhaYnVKKw2P36KNX4/Tv}o+DJ:o5RXvwNכ8Ƴ]1 >}jm/{` :{4QO4=2ŌA. >s|2B gJga>^Ur&[ZWlkU*w"uh<!fGgGzmz N+J8@:c~0ަipa7 2L&2̋=pT8F{o*/+&"р _gܾI}F[LUdg+*TZUT5Dj Ac٬?̢d&J]m@ܫ.*Ҳhd>c_ncaVy56*<}c)]8xr/2NAsCx"UHM0s"4zW`#)Y! f_7e=-ڵ%6H61l16Na%MT]F1кWDmsS*^^ijX贚P=Q^=>ퟠ]^f!U)H'{oi zY$eq7Zmb{Z!w0uά6D6c@fNI^Vذ![ьm&SUO^-r"Fϲ?={&ɽ{/_e*E$YzQմPepO-VT_AQV (s)Ξ(-4NF{_ HR+@~nE x[0-x& Q?Զ7kyvqrro/uJBS<(,nA%o_~m#XJ(:{%Hs6l6yXޫ-U[fH^0X]!FXZ r:"^H0A'Ʃw@K=URV򶒓Owu/_yIJ۠G\AޫQV-KɪTE7Tep+Wڼ|x;/ D*O!> (Gw ^3f|3IukabiɎmSUؙ'+ ,CqrHGY|^EG5[͜<)ʻdQMJdN=JV+ȝjR,(v˙c)t]Mr7m#p l8(Eƹ`,Ju>ftV᠈NV){{I/{@jXVzPPRUrQIUys#̉fTQǾUuh2c/L Iu';ֵaGdgo{dTW*'LJ{+1AQ́=٭9$wCIS2ݕdJBsR+7ojK3Wkug04G4C)$a!AK7AL̊fZ^inM~Q9sS,'{哗UPlJIT(*ɝ/'^x`2*x mL!|{ejn(mLGSi4g FV0] D&TW欝uCfpl}v0HM̅W99,_,Ţt"'y >*T JjgWJŔ1!4*wBI^oGikrb4;TPD=b"ɠ d8$Կd,.&\Kl߯esd랿~Y,Vt2a=wAPJdjAEʍ@+ͭVͅWA 3?(A"$UwJ,&EV3"{*-wH7HB]A#\pRU8'œzd{r)[_KL |ң $';eu;sSCg4,J{ K0@%iQ)m) ,ZdLq ȏg`~ (4Gj.v@ժGQRM@/Bv>yԘ$U^LYd>6sRIy[yZ2,AbaN(BJ(AS IW;ɾd6Mq2D# (7/ԃ, qv7S<)6,K򙓣2v\~[Qlmk/`W70lĘF(I *P``(YL[ئFq? 2ZO$ w=j5٣EvǡUdx\(q2W(=5MYHœÊZ.>/rMNRj׀ "21/B/3݀DQA kUhl qW67߾HJ5uD.$YTB/Ra,T@ˋr) +afe5wU^+oPM>'H~h!nMEi5c 8Vow 0mŏ !ee&EK5hI(:Ho^(HRVɧA,A<$5 :<,r)/R>\FI TS&żAdA#'ТWӍ!?#Ii4evOl3k}`!#J*Y8@r[^*t6I\:`Tr#@nMJ[SĬIuթ%CߚcRfz7vqy!ѕD(YIBlR>9QzZ&KdgL"ዓdz awg7OA0XJX  ȨPj ` ʲ^^sNiW)Mlנ~iEJ89Y#ĵCJR)!#N!LT99,{]yKR)Ye N.bД̫vᤔO( c QLDܠπI 9FZ} s CyJorrŝ) R XIM g`Z,cE22TɅj\QQb4 )Utz2  eCG#Pm6?N3J| ڮyU-p@كR> z\$%5hSS>Kc ͑FLpɽJ{rVD$ܻ@)OX )gJU|,f@dv6w'~+E$zz|TQsɃ͟7n1O(` F )$73ޤvT %wU\aWV?52N-NY,x 8 :"ɯМl,,?o+o^f`!J`L'J,5/O,X[-;ޏ]/[Q*LtGI!XN]hCJ8R@1QHD~}0 JH#9XuL8s2^}5^9_%Qnź RLS+P@ s8.K J+nQ,.n71S0&&7"`,]0*E Ye`FRQovBت徖sjcOnh;}&g|)[< d*Rr )0#A S%)wmd#bb``*IIofٓJY%9X A ŀ߁#$QHμiL|7HyZea*Ԡ?dtuG- }FL%I> eA ws9'a,LPłT>~M~ZmC-{_0hz.xh~QC=,*u ^oN*~yZ태IC/a!yHa IDATP7'9bS_Ԁ`gg'I$N;l#5 sMGLuuRrB@G\ 㕟Bdf~(yWUWZ!_~7xR_R~/iŒ"MIENDB`sonic-visualiser-2.3~repack1.orig/icons/undo.png0000644000175000017500000000111112252354725020512 0ustar miramiraPNG  IHDRabKGD pHYs  ~tIME 97IDATx͒=kawNfYA]"a;FX(M ;!,I#kio!XDMuw2߳JOuܧ8Kҁ<DOVz}Yii_.ճ%˻~@Btxg!?S2㰿bGh7쌚c*p~ Hz~H=I~W˂tF2SUAp;';/-/8VAI +-pam> GDEW|/{VÐc(^ku VX,{>DhGrV Y#}k40,BXwS c$B @ЏO Zu{EuE_wOKĝHL,I˳Ŝ4M'E!͠kQRB<&18I8yN3? Ǐ fx#ӟŃ [73j[SM ?uO egg? FFFE L$$EuEUwC8 Xgb663zl>~X߿"t?H-@auL@WMb勏 w>f``cCL@auv&7àk00?dx9++éGjb`y? _c`*b`ݻ-Vfff6B-;~`Wo2Nb`߻Som3&1i` #\ @$c`9Q;wXd->YDԓ@,0& .O3دnf`xᷖû 5|a&&p4@0YX8b`xo;P3#,! B/œ;+^dkd[ aWm@qrAmG rdo~E&3|^k,| ̯^120z ^0sb`tc/+~2|Xkz?^abknA>`)V ï^ +J OuN>dj6?4gs531|LP`^nJxIENDB`sonic-visualiser-2.3~repack1.orig/icons/image.png0000644000175000017500000000073612252354725020643 0ustar miramiraPNG  IHDRabKGDIDATxՒKQ?=yt] AD 7[!?!@FEA0EeIܺ_4D7J z<ܟ@qsUX} (kE^K5~Kᚯ-3z_@gH}s&$@hrF=ˣ{hϒ3Re/Z& E mGp.Hn2 X.6^%ATfv,'0>~ǫk̏ s.yo\)f|;:pRᄇ0 [f"-tB57|2u.Q|ȗ@dd"bͰ~S`̏=|k녷Xp$8@.ȔZ{K7[<IENDB`sonic-visualiser-2.3~repack1.orig/icons/playfollow.png0000644000175000017500000000016612252354725021746 0ustar miramiraPNG  IHDRa=IDAT8c` ?M a&Ѐz{Xp".Qq$&jҽIENDB`sonic-visualiser-2.3~repack1.orig/icons/sv-48x48.png0000644000175000017500000000261312252354725021002 0ustar miramiraPNG  IHDR00WsBIT|d pHYs2aptEXtSoftwarewww.inkscape.org<IDATh՚oE?B@Xi) #!< 1`H'#b+EW0H0D MD R)XBr|3pv/~͜sfv|=wQs-H? Gv`Wb}Kwן0ЫwdB6H]Y{'dy<lqǓ{[)4< E̾bLHSK1mNȄ@V)X荒Ec:y}FfF`M۪HofY#+3Rhu<S!LјH/DlE@R]q,SV}@pM 3ɋ HZ̔ʻo$6fFL@Cy:`'i̟e""ZmrlZ{fvIH_@D 30&)snEQHotm v8@k4wEIܦa.##tэk(5';^ɳ$vO`I>mZb(J%kH~W]8G'EQ.qk%*0o{D XI͒$ fc_jIvs\O}zIHR?A8GBNz抦^hc5tĻxϷo}w_Gx iC<[aIL׀a⩑[W242 PO=Pja Ƨ.f5Լ9W&$Q[Xzi_%Aይ_y\k\)3/i'pН'\r`ٞj.Jo1A.^릻q{"fv +Ovqa'b~i!Q3sJqz(\;2i?,')GW'թd!F`kOVzxgllelfv qhXH =**p=:!h`@e?~CeH\3[`fVjЭU{SY z^$^KPIENDB`sonic-visualiser-2.3~repack1.orig/icons/opaque.png0000644000175000017500000000027312252354725021047 0ustar miramiraPNG  IHDRHsRGBbKGD pHYs  tIME6tEXtCommentCreated with GIMPWIDATcd``π01 mPIENDB`sonic-visualiser-2.3~repack1.orig/icons/normalise-columns.png0000644000175000017500000000021612252354725023221 0ustar miramiraPNG  IHDR Vu\UIDAT(c` 0BĪi` iŊhB Q5l``hKDD`XB1 a Ř|N&$&jh`ϧ(IENDB`sonic-visualiser-2.3~repack1.orig/icons/sv-64x64.png0000644000175000017500000000354012252354725020776 0ustar miramiraPNG  IHDR@@iqsBIT|d pHYs ηͱtEXtSoftwarewww.inkscape.org<IDATxKlUgR@(< " aF] Ν&Ƙ0[GGKQS: =ߝMg42sϽ3|{w $FTPmZ҆T+V#`wuME̩0~]]V#U<*cUļ qD 47 I[(* gT`΂Q nv"2%nLmJ3go SI(\U@K(7'aEpPi/*9H18s hIpmP$!&Mw#H|p HOVYP-hu"R\27"""D*OFnq1L\Dd;pJ⺰}$@Dn7߱owF"\D>"L-(;"2ӴĴ- "|>#} <4~ߤF?t;c]/ ٷpK=c BIbe/n ѬK#Gr3ĸh3&J;blMU F`O1v=wE)X 8iYK0 <i_eL oًw#,d |)Ս"JB)"SM`Nwu47ԥO2KDĥ@_#6p˛@w4r?>EgwOxJ a-@JXxL9g]r@?~:LQ8? GMnft0Q}[Sj Q]= `Ѵ AL|K#Td\4 L~>&(}!aB@OHgF?7N 2x-gہjS6ܻ i:EN 0ᚠ}#"9 C^ڐy'>{9,SYU/ɭχ흪zwvpt!UU{}DWl;^ w0} Fޒ6(WMІ5FN^T  tvof\شu{T]wn.5r'!-@~9cy rQʀ$onfiO q\bcn%aH/~TSNmZa*wG&vS(&GUrQ0R-&|#osqNO˘Km@/SJU-IENDB`sonic-visualiser-2.3~repack1.orig/icons/zoom-reset.png0000644000175000017500000000042212252354725021655 0ustar miramiraPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8풱 1 ElMva똅atd i(pe닻32!m3p\}CGU]{ZOoIUל'RK)/~A`߃bJif}Ǫ g\4;(]IENDB`sonic-visualiser-2.3~repack1.orig/icons/align.png0000644000175000017500000000030512252354725020643 0ustar miramiraPNG  IHDRaIDAT8Œ 1 D_p9.rL7@XKPg$K?H+8̰CZ>Nv3rE*) NVrί[$E-G8x!B)I{idfCWi9 FცIENDB`sonic-visualiser-2.3~repack1.orig/icons/derivative.png0000644000175000017500000000041012252354725021710 0ustar miramiraPNG  IHDR |lsRGBbKGD̿ pHYsutIME&tEXtCommentCreated with GIMPWgIDATc` 2`x0S;v dI1f .lΰAa1$tc %~303000< 0AW  u1A}nR$"W%R:,7þՑkmPxvx#~Рg'\-X_Oڧ;܆C+g7ԕ5uN8dw7j.&+4}aϩtJu\p-6d;BIENDB`sonic-visualiser-2.3~repack1.orig/icons/sv-winicon.ico0000644000175000017500000004107612252354725021645 0ustar miramira@@ (B(@ N UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"UUUUUUUUU UUUUUUUUUUUUUUUUUU/UUUUUUUUUmUUUUUUUUU=UUUUUUUUUWUUUUUUUUUn;UUUUUUUUUU2UUUUUUUUUUUUUUUUUU7UUUUUUUUUS*UUUUUUUUUpNUUUUUUUUU-@uUUUUUUUUU._`UUUUUUUUUJUUUUUUUUUf(UUUUUUUUU=|UUUUUUUUUQg UUUUUUUUU<cT7*UUUUUUUUUZfwAfSsFUUUUUUUUTffffffff/,Hp9WbOtUUUUUUUUR0xU  R9UU QMF&^U94A+j< UUUUUUUURGU+U UUASPGU/v=K!RF 1{UUUUUUUUTUUUUUU,""333OUUUUUUUUU1UUUUUUUUUk5oUUUUUUUUU/hRNUUUUUUUUUlLn8u/UUUUUUUUUV0(dlNUUUUUUUUU|C=|G*UUUUUUUUU>1Qf(jUUUUUUUUUcS NUUUUUUUUU{A4ybUUUUUUUUU7, vUUUUUUUUUJp xUUUUUUUUUWUUUUUUUUU4ZUUUUUUUUU2UUUUUUUUU UUUUUUUUUpUUUUUUUUU1UUUUUUUUU]]vUUUUUUUUUU(UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU????>>>>xxyyyyO1N~"1~"1111sonic-visualiser-2.3~repack1.orig/icons/svicon16.png0000644000175000017500000000050612252354725021224 0ustar miramiraPNG  IHDRa pHYs  IDAT8ҿJAIj TRW [8llS^o3VvWM`, (؜+9N43ﰓ@*NTe֏R̋rRSՋkŌ@WfFw.VӒ4/F1N9v_\bx }c/mkx)F d =<eߨp# H"!861M,M M$D-͋}QmJd]ɘIENDB`sonic-visualiser-2.3~repack1.orig/icons/new.png0000644000175000017500000000126212252354725020345 0ustar miramiraPNG  IHDRsO/gAMA7tEXtSoftwareAdobe ImageReadyqe<DIDATxb`>U1_0b%A T:be lzZ0R@8 ``cgscrRfK@a5mC#cF  OD- u1A/Я9q3 "/cx>߿ _|d`` @= ƿ '0;Y%A}"@{N2~}Fo#P3Õi>[ha@}C|n+>L?ڼçmw2, J:x?Y"X Çw0l  JJ ~}'DR<?@(zȞ 1#ïMP f0=bO_93 oB :L @5pO4\`hՋv_  x NdP>05 :+Pρ'^&?_tyNU *sjn 6Q];>CY~8;R OU PTLھ7 J5m ,?,{+*l֑itg #=4snSՉJ2-k+ 5ehQZ Ni\; 8`^el4,xK'9!ih<ʤ!DJ`#p}5p{[`0#?2\lyo\6dlYWWV8I <E|휻:>o'NzTr`2JŦmYy| tVѼ|qK2 t/,,!ʉ*uMtUL28l>IENDB`sonic-visualiser-2.3~repack1.orig/icons/faders.png0000644000175000017500000000043612252354725021022 0ustar miramiraPNG  IHDR kbKGD pHYs  tIME"j6tEXtCommentCreated with The GIMPd%nIDAT(ϥ @lmLZ ع"V>Y zXTǩx ,31dD>[`ٵ=YkMz\kئDь!ty9V,IENDB`sonic-visualiser-2.3~repack1.orig/icons/fileopenaudio.png0000644000175000017500000000163112252354725022377 0ustar miramiraPNG  IHDRabKGD pHYs  tIME 2*&IDAT8˥[huߗ/MҘЬikfe]l:PcAapyEISQЗaH+,kqal뚭1}U|Ck ;E)U4Rĥ,;ֈ Gk'j;> |,ƒ.9+T]ӃaNt,\>Ô6QXJW\w=먒U9=Q̹Öe e`uv>e)%=> ktE(Xxhl2󎼒;Y3 YXGp֞ BiT?V[;bI-!Ai7$xp|>jƵz`cS':ߥ$xL$.^S).pzls)2+eKCמS 1{k!|-߿̒"9FgLQ^Ԭ!*ޛmmM>x$"&I2;7H~IENDB`sonic-visualiser-2.3~repack1.orig/icons/filenew-22.png0000644000175000017500000000126412252354725021430 0ustar miramiraPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe<FIDATxb?ùK3112`~a7߿>~ 0Ǯ  j!h鏟Ə`eؼB!,ff(egce05O@5h 3 3@ "àp"b`D4;3")IA.  }GSy1(a@ J9`IW[f >b"dfwp?3v#vȠo~/`ca`a/pP:agafz,a @]_HX!(YYXAʉ ׂhl X@efP gτzl X A\ >b AA # P F#Pɂ @:F$`9jL@Lx0Lఅa&FFQ@43 (Ǖ` p&7Paʁdu@("@PNr 0-bZL mT cv/AZIENDB`sonic-visualiser-2.3~repack1.orig/icons/timeruler.png0000644000175000017500000000014512252354725021563 0ustar miramiraPNG  IHDRa,IDAT8c`tI2Qj: l q&||. 0i(@XIENDB`sonic-visualiser-2.3~repack1.orig/icons/playselectionloop.png0000644000175000017500000000024312252354725023317 0ustar miramiraPNG  IHDRajIDAT8͒Q Cu=GN eDgyR~!fO^_/g & OP@Rt i'A51t w{k}-NO\Tm3s'IENDB`sonic-visualiser-2.3~repack1.orig/icons/draw-curve.png0000644000175000017500000000070612252354725021635 0ustar miramiraPNG  IHDRagAMA abKGD pHYs  ~tIME(LCIDATxڝӱKQyE"ƿBΠgrVXS'6UL+#vWbB=Yxr{07~S?ٔI%daCw o>@*;X1:@mtD 5yBתI;Ay3F׆1ɛ8`3L:L]ݪYDQ_Y7!. 6`˰x36xp^?0,F2eH^̨EF+Y`DL> Zlj5E7/+0/N4ə IENDB`sonic-visualiser-2.3~repack1.orig/icons/select.png0000644000175000017500000000145612252354725021040 0ustar miramiraPNG  IHDRbKGD pHYs  tIME  q'tEXtCommentCreated with The GIMPd%nIDAT8˕Kqܚ @Z8C1Q0K H:ѡCAa6 )R "̹wߧCɦQsy}<d2!.$QiT"]YY 4*' qbnnd I7IU R%"2==-""=$k "JcCLrH{LmCA9,Cw`ұ!Rɦ<'61y pq||3IW0~L;dyhNM|$]G63Iz􃭭mmd2 SSSI"Y]4p;Eb~iIENDB`sonic-visualiser-2.3~repack1.orig/icons/filesave.png0000644000175000017500000000150612252354725021353 0ustar miramiraPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?% X@ĒGqr }? _~g ×/~w Ow0\x @.XO?iˎɞG`>:z̟?oN+{ _a셯_1|:?>6V~c߿b7?116 s QTŘ!߽RĘ=*rǎ5C!Z @C!;++#3#';!^.W@O?  @; 4Xr`G(a= .]@@^ tf`|i ' Y_?>'v?A O80‚ hׯ ?;Û7؁3 LL@W`@~@Ac0?Pd 4ϟpb/^axSEׯO@ Z`F_??#Çׯ} @_7778l (Iׯ3 `2  IENDB`sonic-visualiser-2.3~repack1.orig/icons/filesaveas-22.png0000644000175000017500000000216112252354725022116 0ustar miramiraPNG  IHDRĴl;bKGD pHYs  ~tIME.*'#IDATxՓk]Us97KiK+Z:+ gӂ8с R,RŖU֛>ҤI{9g~8HL &koq>d< js}=u飹Ǐ8ܝ~q7vՑW5ogN;Nց>~H\'x$#M*Xk1b׎׸)Q] vʋ? /wi5}wĕcys<0k/ d_^'1@ӳxu҃77MPRN&4kd[?JudZ v/1;tF,Fa02yh7 # ;좹Ph ]HDrs:>̆ޕfq .nzc4 u F,{/>AmpWT{`v^rm/KC忁-"VVr::uXxv4A Ը8-|-yRkUiq:<6vo\BpRk`6\ba}UŦ˝jmG6m `zMKhmpR &Z0"tGpS5l64 mFpȖ93q|1B!b*'XV?"K\#E@7!n5"Tih2@k-8BS/07FR @!lS=13Ac ;>1b)CDIP݅2۱"OƄ#_;^'Z Zɲf@ұ4O64@TD\>S̃,%La#Mch@=LD)M+| bq# w$Pݛb#Y|R ei{7r Ww3!ՑBG[k婢$[jayTz'8 O9|cb_~JhK?iXB>M ݘ;#`N9&i* ˃+KKVb- !!_#)ISq豿f| /!tIENDB`sonic-visualiser-2.3~repack1.orig/icons/fileopen-22.png0000644000175000017500000000251412252354725021577 0ustar miramiraPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?-@1`b$UCyIgec2.IdA焋oJǥ @A @m)Sx_ϻ?9P6sQ>1~e`ï? k?}`CzW'y~^V?3Lsp03ԴOťQ mWh0 bre01/`><҆W .9< @,PSOx`g=Ϡ&`k(ۅ{/1  x >. rx#? 7d:n[34)P X]'+SI~,,u _ab^IZjs  0l@[Ocg``8l0;y hB {^3(2I0p1|} ~gÏ j ?YYN݃wWeE @+[Kt޾/g7@9×@O ݇ o^d ><c޿ L˟?C` +[Dn=a`^ w |+o X-|d-@Wbcq`1?k1L@@?`|pp`a`xdx/@~  h·^𗅝50g˰ ps3?Ë/ <@H*$Y>A?x1( 03߷ 7`'W UO8 e9wIENDB`sonic-visualiser-2.3~repack1.orig/icons/speaker.png0000644000175000017500000000160212252354725021204 0ustar miramiraPNG  IHDRagAMA79IDATxmK#w?$!u!DBmͶC!BڃЛ^RDEdX ?i%th&3qn;{^4555 z].r6HCX k&nvS,1M4T*n x!|!kDAY0 ]1MUUQݎhf&?*[@vMV$I!u^TUEeE!L室x<uUU#`/^ t:xjL&_D&a48;;tZ4 au]$ ""ȏM$i^e˅ndYCkKqʊpIOO^˅aݑ4_NNN `fP(h6r6%R*`||l6{K?>o, '&&fdd}RmIj%J%3  Pe;IENDB`sonic-visualiser-2.3~repack1.orig/icons/align-on.png0000644000175000017500000000054612252354725021264 0ustar miramiraPNG  IHDRasRGBbKGD pHYs  tIME%[kdIDAT8c`hp?9X`d&_p5(W \b{  12000xba0<ARF0' Pdx>0[S3 9q8z gpO4(8SwRF4Jt^`^ymIENDB`sonic-visualiser-2.3~repack1.orig/icons/fader_background.png0000644000175000017500000000041212252354725023030 0ustar miramiraPNG  IHDRtk pHYs  IDAThر 0/jV'35\[Z~PI?qpnxw$PI.'I۹+ I+@_qmSԘO.VqzJ[jfrTu޲q, `` = XarTbx|稿nIENDB`sonic-visualiser-2.3~repack1.orig/icons/qm-logo-smaller.png0000644000175000017500000001024512252354725022565 0ustar miramiraPNG  IHDR1NbKGD pHYs  tIME  S2IDATxyVUǿ00( B(eh&bbI-JmB%303LBED $HU6޷?x{e^{<9 t.$vb NC ;+ rݜNG ;# ]:%)lO*c]C!~+)OaG]z_4#Ú$I)PQz&9IVӝŽY~ri4= SfD_&0#vFR%zU[V`P0Pg),0x3EN4h-0r@W3[ʠ*C x)k!fjb{&oBO0% %;%=A=, J!xx8ĶSmfE'0Lq}$ݪgDʿI'[ҠQYnٹe*7r LJȷ )~˽hH>Le+ɸ6|ѴutcZ>Q'ѥO ܊*M["S qw6YXL>yvKq&՚r ,3I"9C%e/)3Ne~8$^1@!PB{{{h@Qƛ>뻳<徂Jo/|]4KJ,NwG5ׁɲY \[WVaҁܭ~ڌW[z2^B`DތKp 8ZxkuAGm4SdQ"%GbK2i=Y<{טּF|X2s^bvޖEk/+C"Я][kA7LsE༒ 8STlq5!kO^yOx'd*Y# 3&QPSϩ \"oeWӌ\ "' {p_Q7pN66 * x3䘍st*a$U,܈X8NZ(p6HZuO 㘦<#)Aktb?9´:{"QV T,ܬ6-+cW+p~SZ/h噯 Z)$% _gc YH)jsj($t0:5k=mֿdg T}y_$ʒAy?m&}Ζ](3 V*ʥK*`(}S+%E2= ͙qk|@ޯbO2.^FzC7KlF E,Muʰ'8,Mb,Dž,b =Kr =jC`(嶫%&&!T̃sj7o}B1GazS%A@H^ m'yȲ@!ՂB% jv)ӵxe-(6)\)GV81 *F'ԯqNil6:OUHݐ 8G})=c"dJN!Lr)F6=ҳiOEuE 7Qy8o>&e1 Ư#VyxSrG% <<$W$?PGEV}(-5]ESm ^F~*$n!JmgH P3I֥+Ά?OAˤvW$ľg<_,$0$iLM5?noˌhZ6^}#zs6É!K@Q(TSdq\hJF$h+aT]b֕{%cG6ca7uJ}?}x4.:XʛS#+Lݝ(j;Z$M{tRj=hQRLQoX ] ziZoCpnZ08Z>m>-9!~,/d>5SB~v7A0HƐ3"qe7'}0)x sC'? %geNL#~{$7'%ov%Ō{J>C>'& H=Ig#Z(Nz(__-s-6.n{ղ~{Yn<@m"[ 2 ֘EoQ eľ\.4:v3|.{9Zͅh1=g1%bPaH~ RO1]!bD(B GعI te4f3Qߌ}4u1" C + G;9Դu Ac=/Pݛg{|iۏ}R]_?,~jN[!1 yߒm?/0l"yسLHwّ [I>&b̋f~'rH>'i|\|gX\!MSR僣ArZNH~h A{s`Iα)b}B }賐ʬ0Lݎ; dBz\~it[DЦ,F3e]{E7 /3cTTvhisLqMnQ|qG&ĈS>(Te{}Uu!fJefI-Ekg N$ Quv˄p$.0)b1 sVNȱ+AfIfۤAe0YQQ$9w{IowD4k5SK%w\~)(^d֌$ РSgs\9ɴU+T=qg BKVʛ#3VZRdTC8:{ ;lx|=z8̗8ոzp' ԯ0Aփr*v=qGlf%cܹLmU̔mҽ2a(fr8W=[rÝ8n|V t#8kCsW]=|ɵډ _4Ĭ8݄ N쮹Y']VI<{GZs]pΙͪc;HE߲Z]ԗ mJ-xgYqkHDʈ|x؉ Pҷ*m%f+B!#b.+ͽpNlkq~Z$xq-%^N&Nƹ'IfAGN8vu͕8dS=KUGNm@p}t+;2QԟӘƘ|9m*e]t} !HҧzDžG"T458j\H"WL:͹n8O"!:S_)٢ IP%[rQ#*q1&>Jm(" ΓWmIe UClA$d}/3ΐfUqqW9RtZ%j@W6yF -M.ZEZP;爚sc^jsEO_g滲9}H"tYSwuTdؙ)Gz h^8;3NSpL"D`+gOq{Qwm=(v[|+vXgkAOƅ7 3RpqӅ" QzSm_I%Q7\B~4Z{Ӹp%[xNkcy׼-&h8U# dqP(m,-coTe!\8Wp J!%~!$!0mB~p:)p1as|\xDH=qLV+.Bc/wY~ +}'?N9R_tڄ{k}/xJ ޴ R؅{|u M O@,* IENDB`sonic-visualiser-2.3~repack1.orig/icons/info.png0000644000175000017500000000014512252354725020506 0ustar miramiraPNG  IHDR 2Ͻ,IDATc`bDX#kʡ[Bh܈)8b Ni8IENDB`sonic-visualiser-2.3~repack1.orig/icons/sv-128x128.png0000644000175000017500000000702612252354725021143 0ustar miramiraPNG  IHDR>asBIT|d pHYsAAU:tEXtSoftwarewww.inkscape.org< IDATxkeOiOО{zHKSE.5En1&&hDI&^B0A  BVM$Tހ8;ngy}Ξryywsy/+֠T(-u*tJ%GE"@QPrT(9z=ַ:*Ҍ| ~#zhBؼVƒ (9*.7 :ymEƘ L~ &4_ "꾜/+0V\$|)9^KWa)r.D@D-Z]O|j EDXӞ~ 5fGT2%pc5QvN> yYY  \k4Y4*@0먹 s3Y(t5Dd0|vtJ } ]M)%)s2Y(t; R`aYP0ZBEPæ"@"``W #[%[pYt-D8+8G@Pc U PpdQ/-"33=rpGGE jqH~2}ƾO?t :F L5 |ˣ Kv|?t :ACD|5K}1t"2܏,^K3z(@P "}"r&"w":VS.k,(\T}mt '"3}fgXjY|nK)pKJ{4xͥ3R#D |'?%ȝ0hw`8ӻhXH< "pOO:3[N(u6[\E @}OV_sGNSvuY 4:ZAAq?l r%@:`~"6Lʔv![y{T[.GTubB,w|֣V"@p;އB^_9KF`&4[;xnǞW,B> ac d3Z i{Ra_ H^j8B`y\zc`7p0;- 9 %bHmApWߢo0l&(@SQ h&x9@Uo;R3UU`y"jI㈓h.> wըI޺QIO{H1( Xn`İ"ճQ-mo|fwwjx5q|Tl^+Oām&0n0%Gp=hpZLς~jyMk`o?$:k"]>4}z-C] 7FG^^Uic#JJ^򚐱 ?;-63'ZpHݵsѮLBҶp*W/}TmOm p Sޯ u}omn; ;mgab_ّu=/\ p|v9/ifls aeO0+aYFW'M#y#X6z>yqɛOc1cA׸Y 7;L$5s!űLlk[6& 8t4dTu1HU'P85Nbtdm~!>zs0 l?¯ p\ |,.&+r'8cͮd8ĤaM'FxOy5q[9]H(( i>ʍ;RpB9; @6i.ݱu6V~'"xT%yXоEUxw] Ű[O]; VZS?Z8MU^|2/B@UF_0 yKTK#QDME nIMdj&;"rӱ`Z*ug*o[}gvQQ_ 0= p 0KR9ln%wI,0 0=mۥRqfq+HB_=]m+0`UӌNH#@t-a$V9*"Q)ќL -KkǯB] @1XnT%ﮚiMZ[t3iU|$aZ;"`!M_i6 C: s6 {ͪb~ADm6TG /hsVk=J[ +uXpmH훮lsAZpm mG`M̌㏁2$*}>! / YORϹR󽖭ъBPRAkuu(BT_Cᙔ<.pI?9ڶgm MIaZ)"TBv*=ݕBUn67]U}qT"M = < | 404]K4RUkHGQXD]6x 4CG{JuQzZ~ֈ"PpOR ou}fЌLZU o9S1Ky"@32OT-#U]Im _aQ %@KuU<يډ2)o*X|](rUnAE1BsvLa=ϟl+D'T"? QG@(adkW:*HsRF. FרܳѨaP6<X><"@ūSs LAuFjڎc#( J*4"@1ҧm *4#**t*PrT(9*J%GE"@Q?O4lϠIENDB`sonic-visualiser-2.3~repack1.orig/icons/zoom-in.png0000644000175000017500000000145212252354725021145 0ustar miramiraPNG  IHDRabKGD pHYs  tIME :irIDATxuKHTař3x#ENI-LAQ" ,jM",EPX"H"(b o9ʌm33"ӻzy95Jpvʁq9Ҵ=--Gt8tvv{yyϣʲ-'F_[Is3v{"~/D3dA% =wCK͏ _S}>/>T?ƠPvhtXK(0HFP$ nE,I`:'HRR/Bx] 8B` 0::]/ ܝ,,'w{}}O z/MI F,SC~ؗ # ЂpnE[["B1BQx}jjqZW?EQp<7<<پ_[& !V^B& puv2 3:֒L.C\c[{. UiN=q:j;st](:Rhf0FJW( 5cכOZр`5u@@k=%'gt]>/y5׈y-$Ukp؃%:OĴ@k}JpO,)/NngUoMYQ9u.B:RZC\FNǥrw[*R쉒ȣ#|Q/~U+3e]d)ӥrRk}4Xq,S*A5Y J>I!J)( Fܫւ|IJ @Lf7- %^hsO<0LZ\'ʋU o  28Փũf%mSOS 8G:}+}_rB,OIENDB`sonic-visualiser-2.3~repack1.orig/icons/erase.png0000644000175000017500000000232012252354725020647 0ustar miramiraPNG  IHDRĴl;bKGD pHYs  tIME 1 U]IDAT8˵]lUΝtivb  (X@BFQEJ_h"/h &U4ѤXD -ۖ׶]ٙIT 79o;sqDKJ]OM/8BSK=x-շ;GJ@[m>ɯՎul0?o<.Ogn>BHA]Xly,%@7$*~m(xs !/{޷VyЭXЦL2 f@3]H/ǯ'sWblPq˺t:1l ò,,.uJf?YQ?q?~ιt]lL%IX$Q9(D# RjO1L{ar* LI,a0 %*EE8dcRPR%,ʣgRz5QoLj*d$AUU )Ii)7~a";݋s]ގؑ#Gmoo\&% X(BE_:~R;hps0p1U_mmm]ϯXEQ,sMW^0y vW>|ۦx$innR1{ ?~{ӦM̾n1/6gcLD*IENDB`sonic-visualiser-2.3~repack1.orig/icons/zoom.png0000644000175000017500000000145712252354725020546 0ustar miramiraPNG  IHDRabKGD pHYs  tIME %;DIDATxmKHTq93י;(5%hIndP$UPѢ]EhX M(BaP9(3}}:$I(8B6,ƽb?"7ߧɲpl [_6Wn[Ho%k/mCT"bB>_"hKw4{`_he߯ގx[J<:in|>nv{DjjFw̱(b]Q{NۺUH}cff>T6Ic]Qש3۹#~2ʪJKfKP4+W>s}zE:P԰yE O?hs]UP]G"WH`IENDB`sonic-visualiser-2.3~repack1.orig/icons/sv-macicon.icns0000644000175000017500000007553012252354725021774 0ustar miramiraicns{Xics#His32ʎlddlddddddddd)dԪw 5PJԑ_ pUd dddddd dddldlԎUnUUUUUUUUUU)UUC/4 7RUU8%D U ,!EUU UUUUUU UUUUU s8mkW0000Q5000000W04p00[)009xM00jBьr/Hd&%d'E*:U߂߁U߂߁U߂߁U߂߁U߂߁U߂߁U߃߁U߈߁U߈߁U߈߁U߈߁Uߗ߁UUl8mk```````````````````````````<``h````@``?c ``^*``kB|I ^4``g[`` ``Fm/``YC1r``߹DWMUG``z_X``eA9``P߼#``;``%R``"n``7zQ``z4SF``f``F```````````````````````````````ich#Hih32uԎvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv:`yvO[`Ńy‡rش,EC6vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvԎUUggUUUUUUUUUUUUUUUUUUU{U0;.f fEOTrSYuLq>b 76'PRFknd]7Z~0\FwT)b}0n 9Ci L#`:X%U#/h_[v@7Sn,Kw'4_Gos!fGmzlm -OaP*\L07E4FjS(b p ~% w(DI4cNd@GO&t[y::o!Z&N~r 6^?<baV$ q"^v7E:@8|T)\!ip x>C(((((((((((((((((((((tF磦Ԙqqqrrsstttuuvvwwx{~<4I*8E@:wMx*F5>T)$V"ZW Rq r?=h&] f[!zP3zxy ~{ bV-b8E1Zt9T) Wqkq :TW7C./Bz^VU.m~0b Ei)Clk 3%yTy/hDe %Q~b1=b=L])Fe)y 4l;%uIvPs+_I%o3V h(>xesonic-visualiser-2.3~repack1.orig/icons/hh.gif0000644000175000017500000020404012252354725020133 0ustar miramiraGIF87aoskkkcc֥{kkkZZcRR{ccsZZεkcsZRcJBƽ{{cZkZR{k{c)県{kcέƥ{skRƽscZRB9{ccBRRRΌsc޵kRBR9)111ƭ{s{cRk{ZBΥ{RZ1ƵcZRֽkZJB1!)オskcRJB{kZ91)scRs1)!ZJ9kRRB1kR9ƽ{kcZ)!{Jֵƥ{skJ{cBcJ)ZB!ΜB1sscJZJ1kR){kcZJZ{scZRB91!ƥcZJ)s1skcRRJ91)ƌZBcZBcνRJ1{BkcB{ccZRRJBB9kkZccRZZJkRRB))!ssZccJ!!sZZ9kZcJRc9JRBZkJRcBZcR!BR9RsJRZRJRJBJBcsc)1)JZJBRB!)!9J9!k{scsk9JBƽk{sckkΥRZZZccBJJ{9BB199ZkkJZZc{{9JJ1BBZks1BJ)9BBJR9BRRRZ99BJB)!RZJscBcBcBs{ckkJkkRcJk,o80EiBzD#1Dv\@$Qe V<$6o2&KC,oٳ(QBy"%TOCNAj* Ww:iKX: ثN- TX:v#vHE&hR&pǏ"mxѣL([<̠%S2A)^m`P=a}Rz({bB}_|x@"/y͉@'Rv@]ts!G =:5x{4yJ&ZU%VZeUo%]W]Wbrb)FgdY&bd}fYFdD#0##An "a$d q4+-ّL-5Sv'M$J>Sy[jIzRd.|Yx_fUSXP?TZu"euT{U(^|e `FʨbmƢf#J(=h,F6j'h1>"ke&X| ՟J肃 6]B:b>fVzicH-(*ш;fl+oBvFzI.y¾4RHeཔJݤ%Lb{Nmmj nAEZ~^~tD "8^ V.`a]hZؿk c?N#-ܑIZ&7Bj 2ۭ-DF%4쯾rH,4'-O7COqmY&pxQ-uWn~m%Pnt] E`׃Ao}f#`j"[vtsj;Xmqlx KpEVNF9IM97ղDN [WP:5g=#}d;]hٓӾ△h?K|ńc }SSцf3qՋ75UB╌q$ 9IIV⑖`g9Dwӓ3ntl2餶2F0[Z6`]X)]yJiAsٗ mR*BPELِC&(UC WKHJ~u= S<ֱ\B%+}3SL$6MD̤:n@#πF<wQK͊0aH&D6>aZ6kx#?QUXU'O$k ,2"RhxC/)#EM@W@}3J8XӶE.BW?Sbf6{**iZxr22bľW 9mp#$*|='48fe\{y& <]*L.h@]" ->JE-:66:28ӎb!iDr.bEDRv}_ hXf1IP.e@d<Kt-J1.zbRq"h-sֲ-d x/Լ9*Zjlx6Qyh->5c^qPi ;Ht,`NjB|4Kծm a!Kp0C^ o Q4 u>xްcxH T/]@ F>cd^ὅP%LdG:% ԟWEDL&wZ*Uf*s>5 &odP!T =,ݑ7\Mnɋ;y .O:̦̹t5<0) B AiЁ ahBi3a: BC¼Ljbwƫ#0j}%*R^)zz:zerM& _) G?@$W2KbMXRe=⢖^P8 ߉!K0Bt0 ` p0 7, p :" <:G8Bù> X]RsMhADHrF I`=`<a`0i0b%PVc~^X  [uohR 0h[iX(L;5d3Yyy_CrkE1" f'h +If+YU$6[M"\2P?ٱK&n)jpB :|CDD@,PpTPȄD%pD PB T0w F< @RЇF n'B0dB`7o7oo0ox5IY0Г)sTGIGZv#z2Dq8%saf{$4,$V2b$q)Ka&gj0Z(f02 @F+%`3`D@Go a . B0=@ר=P}iXhi;~%@|a0i:RR%9u\du`Kp@UP0%D `Zy,@E|g0 ;10@S`3#`w9Sg׍H2fpjo :iRB o0Yx(pȘp}:BPicAN5za}AtN6r Nƛr%>Dt3UAJ?ԮU;3ɁVVvE"3$AxFQgPCph7@np~pC0a apvSP GP|2' hjp 0@ 9bi&`P<i7;UH:Ry7ɚgx4j0c$LvH>d$ׁQ"'O #zS+ 0JDF$דJB\?!уC:vmE-n4*I P:`b  E~o `F`PpfC :PpTpErpP`2Pk:2%@=`R PopT"@kv&:: PBS<`vanGq|5ciu0`<+$)(gpki,>s`)ZDY%9 s,"TVbvR(G`3&pnO;p` KF=b@p0 JpgJp|GP'F 0p;JqP0Z(@b8ߗ @)Apjw|v 0&0<;pf@%0;2`l}hk'C *(v!!G_dƭzJ5̮+ lٮlfPP=y9\{vuV2L`DI`kF @`J0&kM`JV J{P oyvIDIpDЎ,jP ܋p ``1С%PPDPЧϫ,w87}xa0}?jDe'eI6**5IZEEP^%f&N*aUfVu5e;A*v`pDP.P"jK0 ppPhqЩM@%@0Ngf"[<-a ljе"*=@K pi f,1-9 q`T@ B0&pI8AB`F %|RkCZY/BĬy"G=RzN08TU + D@B2Ttg;363FEPTSP<`<aB,3p~& p&Tf`HuUJpfZ, LΗPH\2`'gP ڹ+k0y p>UYjRo i hqǑ|q|X_ܚF#}[ZLz&1c{+JDm6acE$UEYm;!S  \"`a@C=cUl Jzo@c0(SвNla{< =4+EJ; I-VPp<Pfɴpƃ MŒL}ܡ<Рx=0%Pi o@a`  !G-2XE6,#6|4A)zQȆA4"#dR>f.)g J (Ϝ:hҡ?:CJM t[X ̎jhfB2dP?x!(D$F)G\|1FJ'r**|2j>*ꧭ"R)j(\r@D4d+А,rk*͠3ƒ$LXP?hx$47((鄘@ ?8x A$,h% 0Yb (p‰ V"B(#b%8@(ص(IJhdx#`̘b)xB"8 H_8$R\QE?*~q⩏jq&kGD!s)2 #L fH08c)LX <@ $($P"ƈAV *A ?TԠ @W @C t !.8d衂TU&z la 4Px#`*0H" ~! AH% x`0;.~3v8`) xC7:6 Cbb7-G,DHh#K `~%R"ID q\!J#=H$ [$3t%,SX4L.nK`" 0`0hbL8+( }"T.@D9A4(X TrЀ B>8>)1k tЀ0r+( <W( nErp?( ( XR <ʮ2=Hc8fSD͕-YJ6ږq%,TUf%L$!8=x,$9=ȤzЃy;$@LЀ`NYLV%Q3*HR6ćl,gВZ@%/ &΄USWd ! ( `< 8 Up&o8C&`8A%0 ԃ0Xa KЀ* 4f0o0%A :C% @ .0L`~ uW HHH@<6=@atட4D((A$!7;#<`@a !%硏r=x$E) OD6RdX(.k˔ &H>j0At< ~Nf$]>Q~tp~NQ(4 h?$A,t Դ֠ X >@B7A=5tHXP\ N`0 g#&+x*`.t=`H0P]<,@x.].ur%xP( M(Ȼ259d˙}”x S iA!9 -t ) C@PA)H#0#(XH H0ˀ0 HhS#850 xS8P!Pb)(x8+[03h+5'`RK38its 0*cӀz ^%8=9\0 k%( B 7 0$(  (nȀ cy P%21"xC(*)ƄS b9!  !-lt&fR-@@3k)h v!X*5b3d" SH"H*%$%0<' 97D%4>("9Д5H88I$0X5+(*5 H#P(X62 8M7'#*20H"?؁8 # LX5LE7Q2Dk 8cxAG80`Vj9ƺ,,tGjԉ< it&)ɦhځ(-> 3H )*`*M2 ћ05Xx'XPxX%P%0 Д)7(NXb3H#'P h9%P9 Xo4X+!q E00BMi(Jz?"@/*EJR$ !P `3Ȁ Hc+1@B(@(J7 2bd9RXƄ` J@Bl&ntZҦ?)?8?)3 聍7] } 0PPx87sP HMQЁZ$X 5p8 H@U˰X3h 00I">$= +D-/ PBA#%p"\!)8!8`/*8 X+ `>S QH02ꠀ*> ({Qǣ$*("0X҈89.m9S{xGxF gi1k<-<  \,*ȠJ2ƨ4 $A7O0%O!(! sڼ)5(8$B&_1H989X8ha;JC5*% !pN   (0`?C Ѐ18 T;0@`8UY!)X5|  #?8Z0\+!ظ0H2>2=F)*+-lF0x&`3̣82Y S" ( "`[) !h'Q1 pʀH )+֫%P/P$+#᭍0վPE#9ț&HC(`]%h x$x(7'x"!P5P] $` (r P#P+]8p1X!: QlEz3p*.-+81>(s2] 9@p !uLU ++}0e i&i39#I` %Š?x38*()\! `2#!@/C_)P33XQwD#8+4hg+0CՀd>& 8!^C1$h( p U3"P@M^H(8 l` '@h{.L #&khE96 3>hЮLҀ K>F0 ((~ʤ_H]}vJ' d*( V[XU B˰#0(\рplc U"ȧYqx]C10UC%p'PQhS)Ȁ#Xd݁#@W" Dj A*PmRR@(2,- R-e1fιY֟] nB"xP4H Hd^% >HS 0M0 z0u[%0`#&|#Hp%'  P#3PՓCnd35#%T` H#P-# H0һQ8% WC$8M[$Pi85#p!WPڙD0- '`U4(M+rY.FeV2ɜΜq Ϭ&H1d$#ᚂ4L  P5˕ >X58`;`x%.)U pB-A's[9< `! Pilɑ#Qg)x00%LAeꁧ4@ BUO@@p'  i>8KtGHK H]Y€+!;y&ck5 Y^LrR_RK/~3 ٙ9rz& $0P4*)wU8KmZ(ɘ +R'P]:xXZC5)X5!2wse]]5T%@h=PAQJ0jȡ$"h &,L b$ @bBT<B=rT!C 9ZѢ~[0]t/n1AI~T2]J D $J ڴѣA0 kHbt֯wq{4MT1<AjB"+85ā$B(@y402D FF8 D  X&V0P ~(!V 1CrE(j4D~!V8MJLa<*9@>\XP@T PP^J8qoXF30`0 aB 05#pR EX`92]z 22b6ZiZjlʺkllEF2(dppH&|PB`~4aK@/񃉄0pa$ jȡjЃMA DA<(F>Ap}P0  ABV @ȱD|'dJlBD r`& b 0o LDt@ BQ}oՈkq+gpNH` >Pn2i@PT@0w BP_"Fe,`f3cc "Zgj髩PhBbl&l.;k EP$S8jx@%LgD8oЏ@a ry@"j8$jJ@g=8x5 C  -T@TA1(a`h` < Pr a<pG%l{8Tj0P  YPԖ)o*!L* !d(L)Fjns|b*m"N'; 4;_R 7E Xd9gI<3 @HKA~p<(M d & B8C&lɚ= k|CǒdZD Ka ` ^ qH ~@ 0`%\G8p/#` IXA:@=H%ax *#4`V "A _e#<qc̠> К8g` *,jQ7ošJ@ R>9Tv+\35VvL&q.8|^ݡrX P@>@* PBN  MXt( uHBԠ8 f8B C0M1 E r  zK\+` @,! Q ;R@+d @X ,$T0cl@'"FqlK”B{EE!@T!'3lM(h @l1 o` `PJ"XfYcp# ꬎFmmNk*Ʊ4@ A@ HAJż@A`Ah KЀ Rn@ AA, D\lB5X0| - (A8 $x dld  MA!ڈ| $Xp=_10f@֝PB A!՞<@ȁPx3f08L`PzA 8#5~<+ #(y 'za^#8@@2N 4#2zH# *HA8hB 0+dH(ުA80#! θ2%&S4h)"@7Vx'8Ä"%f# 聊 L)5%&xN6*D@3t0@" DZA ΐAN䴥:N Ydvd8;=v+?C C PC% !h x&" X a P K2>2?P1+؏fFՇ3*45ި#0A *-Ll"2Ċ|H3"(?9$i#hd )0F&:a7޸ a '.x@0,:`6 8L8 (2Xͮ X0RuS4@(`v0@ xX`1?unkC\oNqy-7u^ƧA҄8"cLӊ&֐㈆P'9R"M ƒ8E K^%A'TvQh s(֝~0Hk^`N:p$'J ea!ZX A (ح@" c R!9@@  B:  & |mM|W?@`C8v`F!SiP! S(j94uqWwȇ.x|Os>{U!? 8"Ul qYҠ+` SZUB\eఄ <~,' $ X Zve!'$ <@aX(єvE %8BʁH48LC(4V&v'`A`7L1ȃ`TK l!h@+p@d+Ђ4`(`@UpvA 1h`")3 iHô&;wuvpDW)Sȋ|D'>лB * m AeB fiu05L2,@$` Y `GX` MD@'fEeNcnG4ߠA@2 ,G~  dgJ@ P L!Q< :O\C BK GX cuBo2aGt@$ BzJ^@c"h@lvG!c2 hgϏ~qL`? $LObĢ Ne `> "f2dh%@SGc,7G2V*@ a %gcŦ@{C:CRԀzloˀ|1(8N?TNe$B2c @*D-2A B,$h@"`kE |~,., ` ,.π$@a @> !a51<.$.a0 ! X@ + Qxh~A zTC @&,$ D`̀(p' x `(@P'uje  $L :UX #[:CR=c'>ӱO@?NNNNnX2d,~b,0)~Ԁ,4ZA0@b hDh @'"+}8x 6V H̄@-, Rc6\YD` B "@"Fx0d T|# z YJ  $/ 0L#gF)Ɠ Z3 Tr*Fl5 pC; 6e %A F:&Vf^#WɶE_ a$TiTPf~"jTb@J:Fi|c/F mA,"VG 42"&;e9-0@Ў@@`B01 , xaF4@ Hd "( >2` . nEGte'MVX@@7pt"fqd`7 3jn fA 9:TIDžs;\ޥ]>n׃vR)WcX,!b!-\,T/ɏ΢ Z r KD҄(FmwMQ i2Ҋs *O7dl@~\F|1@3բ+@(Ҕ` ZW@#(/I `4 5,Bo 2j 0btt"Dv`X:R# 8NiU :`5VLV^dl#?O?eo"P*lFx7@id2F{;+\۩ B0riHVQ ɕ\\Q2iS*,bh/L@@-v'e6Z0AJiU>q.s&2&aF;+'NDP,7*sx`~5H3 h &`!v=#.` Xr@* v »N Jj~`RdF˂Ϊk "`#@<|!֠  `ba`"`8Io$~ ގ `)uf!rBiKX+{ҁL>Om3>p'#bwt{QD /WeO+:KIvb `FWnF$ZeDb "8N2o*k T3$`:N.bo"٦X'LsV ڔLXYp~fG?Frdw2`@,@6ՠ@o @2ټ3ZXyT=lV?"=-()+>`v! ^"Sp"̶XnK%n'ˏȘѸD$,`@wxD`iNT,%f@^jf@}rL#H7@h ۹XS D{w"hAPt`"i > KHW@M?c&bD0 7@N >5 g<_,:Q Bi:{[\!'cc#'i9^@XnX;&+=HT"c)!Yߢ,$ bpnk.V VR․khh@ \tҜq , | `&(b(v"|@TL`*#bn]bF̆>@ .`ΠG¼$(" *f,Q&,{hi7 RCYBY̔R㠣=u˴ſW5$"{2F2z qs5nD>0Ւ?&\G:005jN@q IXhD2CF bp89QÁ?5rȡMV?My%VUOJ`RÏ@ttoXXxǚVHɡHMȉ$ǭ[+r8W>xB (2*~zR G=͛5k :thH 6]:iҀ*͇״k3vm8y~?&q(q9'N#}yGjMU)?J֬d&&izrK(>@QMXQGetgpAhp :Ă  U.5PpafaNap3I"?^G4 AA < H8@` M)qRH}p@ FE5T&P@1&['O<A,TGvDU@̯!d!GqpHj|"4@CN>"t$8 ~Ј>hV>Qa0|`@xp^~&@%L8!t2 "콧 0 x TH+  V: @KHI pL@@+!P$X1 4!B I"2U,fJ3*-Nn63rͬZ288C>8qhD#$ * F P ()%4 6R̍0 yFa0 ac SAFmq5A8!#l#K(01,)PxB@溜 V%}aOM@< 3hed4@,`L j#\% @N*0L !D@N`9dhRN4(Ekx94u M(SXFd\cQuP8A#l,RARZnGg4=&cLL"#MC$d>L ?(&fH@eA#$O0?CB&RqeeU_X!i0 F PU0 @ )TIPpFFNo\ +z @Zf< rJmP+{^SS@!Gᤡ*friFQ8;c{_Aqȕ]|gDy #m;LtZIio P`22w9`3,j&`P$;(K T-)`?kULIz` &H7`  t xՀ:D ,A d0 &{^*;`G 4`;5CpA ^\_Jfz~6^\˽jxFY;@T3 CsX5x( x ; BhLWĸ_YT|>Iv^P`jC@]S` 5|04tU' q H('Xp1RBB*("RBE#8W$8Q__w_XlwlASJ8+ Fp}Nx:ٖmI&r=iq#MPD\o zPpfiȥJ F h6-J0f03AbL'pCgpjBazJ @0E+I4$Dp^56TuBg~R )&k~g_&xR4xxht`2E|wkuVݑ YC.1inYV31'G0d~P V i>aƈweH2G;ߗf(}PT`f^0p# `;m1Bq&" @D2IN"F.9bo&"a `c<:u*+fE&q0C *@J' 6&|V]B ؙUkS_>إ&_xAS1yg [9?pO|a !Yۉ{NwYVH}00P!Md1!PQ VEq$R-dT-` BoUM& eA6K eVkpq@2je"0& %x?a8`PGCeng ڵzv3G}ŰD$Z0U`FS@kU)pE"9K+ȶx9ȋFiPȈgaajH&֨‰!9?\<f+6aM %00 0JY$bߡ-QaROPP&Dql-];tbEQ5gp Y PYr|Pp`40ivcUl`aGq:/AHG?$R"fPfR@(cCDT08qϢwW|_997u` kLe vzAa# b ! 0`~i{WTjPZf'HMG"jQII"pM1ge`K]Ԓ>3P0 8jb@2EUp 3IAHtPl_3ڥ]j3u `xf;w$,xғPA@ O 0Π-Qa~ qG&:2J&J0MaTGs&@3pJV'#%{toDUYQBVF >R"U`RX5!LWI\U 00`6LWY_kfp*P} ]uu|`E~'[|*Ꭱgl 9"xo~ $(d S՛`~V ?m}$"gU9Kb;n-/pq=uBԀ '[} 0_GJNϵtSBf /o4f 6waAHT;:`QtB Ch'Ё PCM"DIibJ>;&@QF ?~P$<,8O 4 G%4PG)}($@|J*QN*uWSW89 O*L(A>j tD6M( GV5_5kv  LԄС׬QĵRAB(!c(Xs2!087(é`2vVX£"EF P-Jv4Ys|!`7p(p ?ڃZ8!"b3b %LS"3*^c,3*a xC"J(R( .*, ~K.7?r3 v8C@:lR B8B|a 3& .4^L8&=!,"P#PP ?͵T9p OR QEiCX)@QΏ"5>ࣉ8PcHC A((" $ࡄ)x(%` &":p30T +qg-bRT&r C28Y`I(m tD@ k3AO*!> p@! _@8 *r@agPdĽ !A V!) H%$HR"z-9mM شЭ4-kY;˜*C].y0 PA4"TA)HE20AT?&Q0~t&D` G@E*  )ܜFrMp(%@ZT*!oX(9a>$ +d|`ICJI $P&X"5ALp8T h3`Q >0XOS& :5M YNw "BK@!P51gB͌ /[Sy4 gT#kAؐZ<]$NǵN xB 0Fd>4ME8H5{J@DKAM҉l8Х1BJnPéyMUJU5Iesր\,J @PTaL}1R$4r)*EnL/BӘC 6KlL#àr,a0?ĎV08vP@2pGuώ TjG2 2QA 2*0 qQZ+2_8QN+ n0-7N?r#bW< Ή PT, PN 'l&jRgd1Y &*Hj:*Y=OR#-X&) Dn G*!V D3GhjϞ%T`k`&ja A xÔ03B  W B$ OT0C[JwHȀ>hF>PbQ h )7@@8±h(S 7PC0&y c@L ;6IA(١91 |(t 3i(=ŨM A_یʐ ,„{(HB?2iЉNG9Y)ȱɭ7ڣ0B8h@))XP)PAH(0AhѬZ$ȡ+(7@A@Еhp#h"HC cH7J| l9@>08gPg#(3x3H)(**KCjL,G@ i3Qʮ(뺓!2/!hP#h>RHA Ǩ)¹ +ĩ; PLYQ^q8L09Nۻ1@ ѐ #p`=0 F 8Pߘ'373(+]?X q058$xײĪyI5X3"S9p3S(ف #H*(3Щ$Lq Qx10&(q.IcҊ$i̡jG*5 /7is41)  tCbM{NAd3=6+Q?B8#B6 i8jITi$ȹ ȭ8D21& @*1U'x䉄N<1 hZ\Zh1XH8XT#hQxe㡈:0pKA !@  l FLt>OC69mWTK¨9 `)X /b#0gd) P0@}MF, OU9?KU/tASL(rB  Yܲ0+Ua9mʀ x><*H+ɠc$?@4N9^иQQ0[>xr>X`1؂*&*xFGhL@!4pR58 "#2"XsDQ$0L ][- j4Jb^+C! C`1IĕݫC * )Ӏ-(p`9C#i @LD50 Nz7U4G #3٫<) 8 @ሃ *ЋJ3* JQS۾0$BHHS{xU( k)E/ 0m =ۄjIM^H#y$0N9C=:;𤇩Kٸ@HlńjE+$z3Lڐ@0;ȏ c؁ k=ސ78A-Ly䉍5"ۄFD[YHC(CfLF`dRε (F9ي gb$"?hN1fحI؄d@?$I p/;8 Z8Yi$\)p_8b Z@ XOi :Lm=NC_NV8HukO< >@@?*kTe' {(? tF4#Of ⴛ׺(Hqb_`A^ĐX&9&Ȁ:5H+Bm,3 '0?-,*0!z/:P? Hs8gJCI Oq@kxm<R7n/D]Cl`"4 9(ppx x0ph3@e4*h (t7>aY" C=JD >HD$'D>#H8L2 I@OQ&*]z䣢 aQIO?nԙ3_L`i*&D j &?Ji+@18dg*OC ҒU(Co7x|*59GB ~80sP&gjJ_?0NQsJ@0hGM>\]7P%% 8XI%v lp10)C`"3>N,1R!TfxP@{|W[@oL1PAoPA A$B':BE]rъK$7~I3QSL|$EO?UOKnRN:&0L &U5!q qZ G!d2`]dEHYV`Vąɖ}I`=XG@}AeMa~MVa}fE c)AZ5!Yp@geGpPE jGhEDXkܵ [{5 &QE-TW TQDT]mC#g(pRH!B @0#"HEY HG$eQ4(+lL<.]L\] 5IR< =ief~i]0!PZV$Y_}0_[~Y2g~a6omaGk&ZJaB&|`GpgqZ a*xZ>aɕ]!:P]qQFөaF - \; 1%@@ REtP%:pBLRHYq74!L-xL(_;&IWJ͕&j:x&5XKL\.Y]|C`"VY@'8#J tVe-}iB$r'Jad5$f5}1L `!J] Ao!UHå1|M#u &8CB.B!AI Ļ8CP0\@$(G7][^23)!T(PPHx` @8"1QXdb1h%5%N|&[ON)JY&sƳQ1 7Y٠  g!7ua+%Lw[Ј 7pS#mm7|UxkF$?lP[Nujq 8j8'})TP0Vc*_TCdF u o8BzBoB JvE V&­,]Wd&4RILZW! $52B0eglT3*9˛҂;qVYɲ9ux6+Q/(8GVNY"q&kKV4Y+mSݨr*X8,^iq(Bv͐*x5z`8` g($;@H PH` %B7x @b>'Gd҄#$ L0=f7濩EL !X0*!">Awi$}.}n$2!xtc|HoZ$3>w2(% %R9O6&pV)&|C, |N^ڙ@ _xM JQV$ei6-6x-7GH^a$h[ h5)T ]ت"z$۸|D Z Um 8@xDdQ@ߘI` @7 t, tD_A۹^ @vXx@x @)QACäH*#|}\@a IKɬDJU 1dF\ U03 R Y8&Cې9_@ xE(,amf1CD!^X= V|`B-P%tN#X!Ӧ`]PVF]p|Wd s!)PY lĆ$$ԅV#E.)DyA _8Z\X `T< XB`|Ŵ  LOUDwa*X&BDL=ŰUΈʤDHAPJ2T*SJP9TldNE\,dz~YV =ƒ#Z|kGm(B9DV^ IY(A$b `J^(eq=”Yn4HTǡI YBvP2KV4++tHām ,P ā~lXwD #ZH>g` KD͈M cC*bE G"֐a$ZOIFܾazٙdQatBEqEOX܅xʙ 5`CmS ] f˹ ):JAFfLg( `%WkE4lȭA@B Z#|s0@GiH|!NE;N4H;NȢ fo`edGR0R*=̎vfՌ?X؍JO%oLP29LE2H.V28R \[Nr'ZPGQ[XߔPn%IC!Q% =\/E$\5FRiar4cb| 2B$FM lAbd x xE$@iv Hp#(j-"ABs@+ ,$~Vc!JBωCHDL R@HJxij \hL$Ϥ3Ĕ8Д:2iԜya 啰't \_ZhSGSz5YX:PԌFřEఢrdEZ$|@U 8 F~RnT ]!@A!to'V4RHDJΝWR xB| AǾ6\ P&X"aCOͫ>F!+jڏKn,i%1@N6IOl&̕ :E$[cYRF^,ŖduVg5%DE<7Qm^t75ddR<^&TBG' u$ɮZ`Yj UܔV/@Al tjlD@]FPAE0@|@m @;F O*s\@Z*@@,m􁋨%gjA DmȸyċaȜK[OqUVGN3¿5.c)F eH%B,)Ŧl6Ig%_{QCn[fnÓUVP85KnX$VL D\@QaĆlN'RUK 8 Xd@\P̀V @ApHH"Ià$@~*l h PDA )TGYBU=ϻ>,͕@ATICTCC-Paby.b=b1{n>'iRv Y_l+4ILB\i0 ~KRCfQCjġj q%4#So"-AAJ D j̓PHPDXm# z svt$@KHR% TBe>ZAlEȋXu\m!0yD_& ޭ+C1?O Yꦓ!,of$..7)gEQH.&#ˊ1TENEP":kd 40lo%_V!Y\'Nl<@Fa `quL$d i@J Aô"68^ X_ @A TLfxea3#ELL#hd;HKIQ,g*?`aBiͶŮi6RH=iEWI_G2 LޅHTPQ[PdJ/!A Qp@Zt@vA(AS @8G_h#9HhTUw1ÙoKZNTcUXRnՈ.aD@&kK,P(x0ThSkS)Gp _瓼H9gM2RxSq;Z{YU`ötAEEMselo =a'5(A"zMbD0@zȁH]1\VmV@#7Ȗ $@Aڼt@nx  *ADJ 8p"'$+sHfv40h,ETޑ-!yo6WsOE=Hvr>!t3dr?\RִKɁBb| h Mz&ȂQD w\)X^呛^D%uj%"7A#(} B8 vN]쎂< iAXA*q=ȉ=طȏGB@/cqZx9EQXMM"}b^UYIj^RM%wO?k5z'(<6u(Ig?m HgHO,)ԪM?1ajB!B5ibsiZj4Qb?JիD%P)QHΉ@8o?V0BΚt8JyCF#P2qڥXC) )R*,h#x:p 4*(g Ej2@Tr'~x_?1>(!<?.iŕb*ĘᅗEN:Z`@ MVe%`)F^izi)G2 ~ќ*ɚ%_ėq#!Ĭ&~:"m/8?0B/?Sb05` N8Aď#L(8kL#``x#<(?xc! F0a@C (P3;NBWU Ya1 "y7s$Vk /!\ŝ0!,tD tDaT(Fb6Z8a$+6Et FfJG|Y"✒ʒb"B)b"%:*~H-H0,R- U9 5c#Pb8a7>H‡$}#ѕ&9V0 <͘?Th<maDU+@45p (&6%OM]v> BmZU`%aE^|W)d)ʝ3xz|X};6jGY%fҥ+Mzt&i&zg+b9{ 8 Q*P( b @Sh9df"qs !#H ~aXB )xρv KԢ}pTl`85w83!b@p|HNtb~ ?h$Ј E C8ёa pE:*Y$a ;ɋjē z<[AlzKb$Tea-*PaECjXB!?xZO踘1"?eL6 )<:*4Bu Q<2JL`T#ԕ嫒O'4-CO t%obyV %b%, ٽ@1DfGZ TULh(rLiB#?p HҠp 5,P$`wU^` y]0O 'SJL0>0]7ϷZ@L#0ހGb i@,YCAD`Z" vkuieA 9H!IJ#&E"  Vs$Ēh 'Ԅ84oh&`B MRUUIM|SM+sD@~EP^gҙ,-Of?!x'5O@pJ T⤦dg7b72cKB b`M!Y3J*c?pdn;0D`R$rK\Ϭsc[t]yA~#Dz`䃍8H4"4rqm.";!Xsv*$x: S,(:)gZa Xa6a4EĮE䒴z8҂BLnUfo0\EP>9&`jaٚ~ԆM6v֬g+A$*)@ Bj\A^g  T@L- #J(*kHA^N] LjvB "!DeBcB;-@$?*i'!?ŰjԂ\B֢4&YB0 Rb^Lb"PBJBشGz&43,8hBib0P|ԀR̀OLM^P%@@,QSi=d:Pv WK#:g¾6: K$Aj(\]օ$T+Fn~h \v  M(($v*8N.GGFt@`XONrEXdqbJc?yRbVAPPNajĂ UȤ-dBDq ` @ @ v`>`  x@Bbh:4c;UP4k/4Ct 5 XQVLXH0ab(s@T>8ტ( $=Rusj!,.LP<  @º B aM Bݪ.%lHj*Lª`T(RAl!@Ofa`Ъ* Vk6Sl"gF/' ښ&1L .`jO/B.jU(:~@\bUA E  @T Z&* #<uAjguj'B $|[ a"kvsf m 8ѷ`@V 1obpc0uS]|"GaT<n!n!rVNaFJj)֢.ךּMVe/nێ QԠ$ L"@(Pc*NX h᳔$d& *` 2q CfAG_zE T*``# @B7>H'@2L4$99e1d'LaAHu\F(=v@d) x/;,&)9*Va2``^@WhgaT@lb*A#hrAniS!,Sa `rIЕ-zF-ڎ}ag܂W>PEmM#m-gðxfd=01v{sc*L$@A ltP.r 0#5C p@86W @2@= hИ3v VаffNn 8Y` ,#vA6Qa=a @.A -p(+FHD&j@W`wj@ےzTa:sniAE~M]!_r•6ea),D@o q -v 1PteE h IN%0hS >@8`@C @Ze `:v!5 hlFG8;Q$Qv zB*ƥcɸ$YPvH0AĤBj|=Xb!f^Hˏ%zqb6frda$b @Xȅd\6A6~anbvnhWc@#EB.),^f(v-0D3(Dee= :* .NPF l,X ΀ 8wֺ-XFj bH4<܃>(c2?Og<vcQ(muysH Z= ڐ.8s{ss BP`aw@atf~TJ FzaHHF:TA$B j90!4bHpZFgf}g`a 4HLR-3n.C Q E=`@/4ŕHG-j:hbe=G)& GmH *+=UZ22tE8hm:Wr]i"jAhYh{kZao}C,aqX88A(LtaAiKZ'Js"L(I,b/}Bq]yg=Ci1 YAqh!}r%ɔ^AU00t-@#`_ h;2Gs:eOX96uG]~IxAJp `D" F&RD+T.]pakXlU WtE,(Rv6 .cOJjعկYTN*ZeSFԚJKg'_6]"`lU,^h}a٧NR`"DC m: dgGhD,(D 8_aį_d&pfu OpE.8!9AE,XOt Fq fгO:Q$|*eH0 aH!\ - ċK@!%|'n%Hc*D@ wZ`Ƙ]eeet PoKdte(P#\ 8YAcT!~BbH?, @vH0K)CJMMKos":\&ʀoڄ>Pd <oC @3a~߃?d\  >QC"D.2]  X.BTbQ#cp- &epZ/`4be"p *F N'EIr [f U3b'9 ;1!lNs*F|f2GHQ  3©#ǁ/K< s8(APs3T*P8 $k0J nK]txPDMe Kr*5AxChϽ|'ٟ&hAP %[0X#d N,֊v%Z YWp[]P 0<lL\%( =C#.Fޡ %/Aa`EG OPBT8Q pB`֢9i-~C̉d:@BGC.­⏀kB|A.TTWlCadSPCpmUu03$@Nd`)>l3JM@ ɉޖ9b),0 }PL I=#I}OPQ}D^ S`(XdYF] F&'BP`})@ˀUZЂ{ i:LcRA />$CJ=)S2hm ЦAN0`[" aw)8Z- %ʥ.}uRUbd5o2C>c5mEH'tgfS qǤ/x}F̔Z5 /[A- %Bp 0 ]t m f ;U|pw'x, @w0 &C@ 0a ,#PÖ3@$1 Đ1EOL%Urro&RtoPA6O0nnD&p 4 #+6Gb)Jb8G}{V7&Ua yCJc$P60WT#9!%\لH3 *y` 7|*}R}'b&G'fr}΀297kWT z},0pZ}f2{|P[M0sKs P0i oPEHtFZh M`W9 Ú BB "0 R)U 8 ~ mi `y Mfe0RxO45 QQP >QPb dnDQCoa'MyJY%iĒU1'@& @ oW6;!nqPA x[ :%頔WBXq*()[b"IJU6k q`k!fXHCP}Oj gQɻUs}@HB E/,oP/HKtau{x p 0 Hc4 ,uPx5 ]ԏnC K0H@Ri# ba.aLR i?Q`$Py+/i% z{t  ypBQ4 ɒFKGL m(7e#b?bQ`C9k58Yb)GVp)Ie`9JHG.M |V@0;\}@G~P2P[$(S}hndr4>aB>و ` Q 2Jc&CaP= 66s ə$ ]''(d2%`;̟0 iw NvUR|>:E9 F ~g $@R4 Ɛ%ֆ{q%Є? 4,kP)w*yq*7* FJ [/J?{&u}& " վ(AAF@ F R GSFl:H 8qv4Cc( 6`0'֪L`!bD ? 2yy5;_!I"DDd$"!DO *ngG9lC0k}QF2%ĀQ)aCRL'Ű-UZb%}ɑPpF|J2B)EUvpn59QtH@9k66<0uj >* 1?!0R` '}zT T4$sv7{xF <0 P%L4 @_26Ŭ !┑+c" Eiz`=kSgVb0R /(UNVXAfJp Hid,VȂ@{ f S/9L XʄPG?S!s o  0 N! p @ P".j] `>A&.(EC=4k] y{ 5 ?&Z/#P: l5 & j 0i}RyǛ!fgS1oFa6{ d$jYzHN|bzAMxx! +Q䗄`(~ Onȶ!9ҏ Q<`Y0xZ LP!d\FLدUmg+WpaJ(ɓQ%qRA'Xr 'Nbbڄ)TK`kإVB]51Or/Lzm3(OrQR-N+iEO#ka5BLr,bTWF, 㧒Q~Yvi֯`b5PA6}ҫ[ؠ|J}m+0qt !+M7Q#Α#U색P#H  c4CV~7idG8&gΚy "TP9ǎ3xc 8Ia$F KC??.QB0 i!fTɅW`%R\ z<\Zb"\ &T +^4aF(Be^dqO av\.مЮ ]<?sbpܢ/۲:̰id18C_Ir0FN| ̶Lsj4v-5vÍNc&#d8 `85 ;bb'C|9dل%`pAA>`*$L8)( 87B q$G0БGI/DG )K AtIF!Ea%SLHL|*Yjq\By BUJpEMj! Kr``@\DOp+^fK<ѥ$\'K++.8>T09BM𬘅@iPb>pE?0#F980C$0c!yPC!0‰#H6"Hd @,@ Ht1[&PX%N;ۈ$ Y oQX bl"T)(:)#YK]p;iO&qKp^YTѴaP$csOvQ >D% N.# pR']S[KG<>40~p&BʼnJR%\AabG+.q aW jZ_NV jMXGXJ0q?(4"9ToA~o0`1 M̚a@HC% YUANH"-D v* na (KB %d!Tj?RU0A ZqIdX,n^EV%,AtQBUH\Au,nfׄmQ4ӄ#( C`H@ba@B<ޑgX`8~p%T !`P#i K< W /cX22$.H*,h "VYUjj0( V /v ]"U~bMbJ/jJ4mvl‚(B. 9%Q\+ -dEH,*ķlʘUeWOx-e,>1]aJAN0Qvd8SZ1e5'f"S=.6#!eLJhY#?􆘍xKi*qFl:Jӛ6B*be y`pTD8D0>  oHÃq!Yc# ֊!B dx(j!Mt0Z`@'ZaG" )8 aM2R( -S\@ٱ"S(Oh V8<o@0D3s 3X-Oh@` 7̘F9:* 9 ٢gP"_x1a#Xp^YH?!1K0j"^hhV @5I\l =V!0h 3)>XٳMkORh C>V9H Y؅*jEʕKX^+P"a?PN1?2l"8L"d1>(?9_+ {9gb:qL?@h80?{:s-$9M1$ 1$ _O#\„L!A ]`Wa5!79V`aȄK3L4"<"?b3Q"]Q±hWѻʄV(/^˄PIyh(?ɣ]/OFR \Ѫف%:*D# BX`#88P@>>PHHH,p g؄CXZhAJ%<NE E8X?xO9jI:QKAJ '`АU<-!ۄOˠɉȅ ZhO蠩Mhi{iV 7م\5<̅Y PȒpȚH /}  ĄNP<" =<=֠KCta +ూk8 3x>@>9;WLkHA`QA;3@CXCBEA#% yR >)"NAZ8ktG#Yl9Q\"(:SkpYP.UM-!V="SBk`L5\2MK ;*GUÁPAPpA󨟩u bEɊùF8TH$?|U,1u&0;z>L t9OW/c50Vܨ:C 0F8?"> 4K3C\8VӢj*-Q@Bx T;F\㪟ܪ>AGHI޹+hD `"hKPuP8VP@ِL_ 㙏*Ȏ4;3ǽLAbj3Dm$41MJ0PW ƀL0 2O]񼢸C+!OP#ym{_ HIP.LpV!fƑ=.G!" >4P T|6{ հIZ,#BT,rIX?@>3%9C&OaLmfDj#ݍ82Ʊh?o"Dg<㘍jW׺b ?csCM )^QcxȅŨr7=͋ȣ0#!mbݴ4O}8+(!'yRąMop+YRK"bX g1ػ -=<q`ӨIz`jxaݐ$&y>TĄiFl(kPm?` -kj +?آ8?buiFt=-%kJwg*-|چXáp腰 W 104+c, *@,a#*j#NaM9*mL A;$^L\rGzMU{ 1e"nLI9ԯ -y=74Hc~j=AG5X/Yh 9J>tzxN` XWP=]ǕN>WGDb ü2 3S?q*sY&Ypʤ%?V8`DC `<@(Ap*zj" @= |L U\]c cS1c0 F?0R,5׶do°H//-ϫW9MwӬA@Ir:a>RM &uZRXN]ɱF`PbADJY1$cdI8HEѨas`"bB`BL00jǏMg!8ǐ#Gdhd"F"teIH2ɜ K8!]ć'L| APEcPN8 sE/,ɪĩ&5 O0Ze6S0 ԊX_vQiVc[EէOFKqE΅KZ 1q$kjZ}Yĉ¹B7.>l`DDFE*!GTcOH|P-2 NI3;Vt%8(:BԥZʫcƓyBz v!3& W \ >~-U.)M8!>~8Ba7x"cpdF;I"W! '9 PDh&B%J%p >cKd'xMbD -4,j2%2V%>!4b 9tCWT+ڊJ؅X T ZDjL`iX dO]qN:eZփ$%+V$Y:zÀR$Wu % ъ/+r2.B$R`ƆD$CgDF.*pKDF%Q^obC''%2 gM 4L$)R M$("/t Oi*p,v9I5}F+.A$ècI ƭm~aUdA,iTT*oZ+*bj҈PȢJlH4D$DhZqFs0P,J˲#ӻT ;?C/Q'=z;!jQw9%㓭>f 뭩ڧdA#p(%A"p}|U =בЏHfamܓ>A(k䟬R7Z>/ +  O܂#c %NZ&B /LMb(cFD>e.B^LNh%ğ:\\bRM1eZsy&Hzw<}+DYީijI y;oqKf#9tH ^Ar<(D9VC"TWb"jhN!GEH\3B~<1D'=C&L$-;V[a`{ZJH&c(˩ J %:A_=! 2 ^ ˩֊LyȄƪw>cE,bFهv^ER t+lckr1 C6<3NʙF{^d)8)븓uԾfRT#$[),WW &VTBR!">ȤSO :58 (·C$G7bV2 DnPl(j,s&C M-I=\j^mYdԭpK `wT70 ͗6(\8f'4ȴUQ(%K]@=}iBO*UJ]!t6PQT4瞩ҔϹ^|z(zQKHtҬq έaG!$dJYXIO#,B#4U$^+B\B@H舸 `}li\p\\[0aB+BIg@ CMB  ɓĖV HX\X|]^a0'(l䙟)s䰍'tF,iu]o؆,`ͥflIt)Q(hD'tBݑ|E OWVZ(4Az)#Y`P^' U~_Ϊ+4DEB BE Aց#L‹Ki;ژ OąQədp>*fpB.S$d|B.`IrS+삚 0'V b$Bxuq}N-Ba(-T%Q҉ Ǖ$N4|buyZ~Ģ(K(}~^!0PP1z( XR7%DCA lC\OA蠸ȔJU/: $Dl˸ TQѓP &MZbdI\+P(T+).8I-00,hBBšmH= I>H/ʩYPBEH\ J%$T'@ E#mTif4jN3 *>ZXeyYGTܚW*c~,ܢ1 0`8z" 6%PP%(5DYC4 @0p$b9U/#M菑˼khz SjBH/LXŨŕ͙PWp i9_~g0aơ((P,5(DTN@TA#&@&Dz!ļ܎zҨLZ%@p!4A4_<%HOD ȏ1) 5eQոI嘐E.x삤lܖ(EœPl m+,<'4O hMnU_2TAѦ;NqBJ87mudF#=|҉C RJE40fjR\N%yXNةڧuȁA-aTR%K+T%KK+q %듧OI0Y^Όy)]hiDi#?AvTbOFg&L8b:t((j|EX_Tad1Jr$YR*8HN U*Kf Jv᪤Z*Q.ނ&`c@,#M$͗^ 3*h/:L$tJ;c^XD?Q³b@ 8@ =Y +8N'`88Iف(D,P ,`/B8d]r٥M*fjFWPE \pq%Ll>+-Y,]^ G#.`PBkFB$!zQlUPub6l6d4G8%q4QAmHLWBF(d 2~ b䢰a :6P $@DH8QB:I$鴼F6j$@6 1đDM$?>~V )sĠN.OA'S3tR%\NU&85VQ~DP uQ+T` CxPN@w?Q.t pހ QA ʐp!y@0|_ ;Ac'qb]e ? DQG|?r#/+_ 5 D,B`bh%7P|K(*|#,Ċp"ւ-,# eTKjpE,`1}B %AXNh)}+ CYN K(襁2Fv]N1IʥVEb,AP'ql8R$45B$H'`(j&`8PtLȢ 8A? &0z-0 m'!;b 쀅9̡n4<ezӆIӉ!$AF2DE .|fǯ4][jOa~IJ0 P $/0>Aľ\x")PTC0GhG@Z`Lh'f;zB+"H1\&mKB A K%P$$SprKPIy #YMG0J喍0TXGŊPCns&INx)~* 7l2,u%(  PhA zE(w@^6zڐe+``$LV uEXz|! 8\@&iz^1_YH,µā9K\B6PT^ԗd*KYDt%HB8>+(%hZ`K_AX&gMmE&ȆE%ZQ4YNX)FDD¸] 30.W(ă&yZ%l[ UT$[,$b i_D >T51K_E,pl&$GOHâ"CZ Gdbrr¤2@ x(Anpoa yK:K& h5̒X#،YG,- I b_T H_).Oh|h@-'+,2  P$ @ ft hCx(VW6 w&UI,HmdHbJQ,ў`R+ OR$ e3"D/t[L&h"oaFݺ@Mn'.aßE$x1XxB0/Qq_tOP.QBJ$jlc6p }$AIC>`0yD@&Z4a A @,K~`|a{>%b+$$aLQ"a8vFB*FA&$cTD*/j e4b&Lhfaf(M\!x!O,!tBhKDނ(Ab(L,H¼KȤK(Af(NA%4Z9d4k҇.t`VF"H43xʟ`@"mapn^$r(*zM"Ɵ*j)zG`OJ-/#*/AJ|jja-> Q,̷ '=TEGH-la(rt(]h 2,\ EDZh3i.ܶc#"ap0z!ʠr ʀ/!b$XH H!qfV`I! DK dKdaFfh!کNx!ET*Rn=0#\aDnD "K T֤ €0Ƞ2=K0/KF`4\, ! paߔ/8/H-t$3FC#h5bE9웜*%3(AE# "!Y^ j aS l 1-DNa`la4+>d~``X^HAM ^@> JOgalda8s('u&v&%@>%q$,[$~ kGu"/^bS&| K> oHĆ V:E3!iHF(F` H0O>Ao*^1HGyzNB8AU Qr, Qh4r:-$(C`ֈ.T j3-dKk).8|5ёA6P$qMavZFV$d;=aON}F*>2BbIDJKf!Za|Gj5gdz("L $#v ea(\L -LvOb4N~satd q!1#p","4Kf(L:b es&/L=vJ#$#y}2#]* NZ "@`` h`A0b&70aIϓVNĽfpIW' 23 YLl;BJFDnQb4Ѓ/JcbF7CtAet!na,*T Ov σί%EtDZJ0#!(/  ƀ+@`lf"Jy !s0#X- @ TJGA%hWA>"$ 8`Θ5KOBgrB+@s8CȦckwere e`C 1USh}#bKh"gmleb&!#;PrVuZ|hg|5Da Bap]lT I~`E\՝AR'>~**e0G?So]0k&dbF"OƆk(, dkHQc(,(Oeka\00`#}*URACK%~8h#P#?GB,u,HO#*\tIMTk'a.j^02Qd)!r)!Lx 5\m +T( W-PZ"J rEA+8bH|ci'Nj I%N\%ϨO.yʥ`ūV-6%D`x*TMdd%@]"U]<%ը<!EK*dtm`MdT}TP: C0|#:JHAmVFeh OjFQ Z!1-(b.Y P gTLE`/bթȋwl22i$0?TRb G M>eT\nN*3$ xHȟ}08!#JZK2U50 p'"+^(8a5ۀ+@xU }Hg\EJ/W ASyӘ>`"A+d!P_ht XK.>`IJP/|aZ,>:hkuGO@%?Qˇ$->J"W-ILh9Er1L (cT?T"lCLɄV%~q Cy,M.}/>>nKK=;QQYp*߿^c ~e`x 00)me +ŕ? @5?a4 P ۷X!!Nׯ?0|6?~ xo&$  `VIIQ9..B0@ .. --4 X@l 0@1"_Nl`W߁~ ??`0?`z0b@y|XﺺNJʰ7,`q!#@9Y3f at2H߿62 A^ @(061+0m$sF7@ ٢,ˠNkdeeſ@X&8@ 'a` c8z<4]y v˗ blIENDB`sonic-visualiser-2.3~repack1.orig/icons/fileopensession.png0000644000175000017500000000125712252354725022765 0ustar miramiraPNG  IHDRabKGD pHYs  d_OIDATxڍ;hTAd`X1*LD,ll`aP++Q SX Z bIb%j!$6E"FUX};s7l\ׁ̜ϙw3|4R(Bzύ"o2Y<..jtea@|0} ]Gr^g)VP!z8/"hR\-u7ULjGZJìiBPJcGһwddp 7דNN l.,L}.4}p4Vzɿ?]n%$VN gKJqm䱪ԦxE}&&40B4p4`jIENDB`sonic-visualiser-2.3~repack1.orig/icons/sv-16x16.png0000644000175000017500000000100512252354725020762 0ustar miramiraPNG  IHDRasBIT|d pHYs33HtEXtSoftwarewww.inkscape.org<IDAT8j@oӄjZ%Vb =>xP%PA<z*@'Djjۤe+1m53ˆjYM<wk&N<iTTbl&ƨ|lZ3Q.Gq3060A4S]1ь1671 .:PhR%%DãD0wۯ]{5V 9'6.Xxjv cYbO6¹RhT6c|ɽF7 :S[Ƞܘ򌸁z$ߟpg\ij% y-]"a%C˨ ƸtmC/ B[>S6ʦ?OޚWIENDB`sonic-visualiser-2.3~repack1.orig/icons/spectrogram-22x22.png0000644000175000017500000000245212252354725022661 0ustar miramiraPNG  IHDRĴl;bKGD pHYs 7˭tIME  ,P4xRҐߑ|x |$-JW-) m *aDT-1qmg»m4[L /nz`"?YN*Fz%EOA@1щwBQƿ.ǿݠ)A3qTsNL"j,b{ `Y[˯6.8$PaĹqyF>#qJd{BU#m4& DvoXħ[a:$Hq;}G#{!+\=E TޓM۽Ў<H~kRRшd`Ƣ~y5E=;+$q#=z[&,Y@zH&qR=BYu ܽ"yuC=R 5%&;[0]xg=2[lsNv\c: J 1"AXj6^;'k>?X?< .#$9@Bfh#s?" 6g5fe_rcF V/ HPq MFE iQqy9oU&P7l0h`UanA AC%pUte Z÷5ְꄶh#I= o^L@_ ro6IENDB`sonic-visualiser-2.3~repack1.orig/icons/emptypage.png0000644000175000017500000000170612252354725021552 0ustar miramiraPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_F [ܣc '%R;1@8XXae$ a%@8˗/ ,,,,mn!C0@(2ϟp  X Ă |Rb< ËW`2 Ő]PJ',]D v!@Q5@A |}}@1A]^R@Tw QQQY~ό3W >@?~֖d> &P/pЃj A h 5=@QDgO__VA PJdCXI _f[v ).=߿SX(NܵkW(=@,=Vj嵄,IENDB`sonic-visualiser-2.3~repack1.orig/icons/measure.png0000644000175000017500000000113512252354725021214 0ustar miramiraPNG  IHDRĴl;bKGDIDATxMHTadF}b1mt!!Q>@iaD!ABlѦUI[AڷiE.dmމAMgс {syϕ@O؇][e5:<aFuE}=}]< WPT%=t |y"@m9K F0f^'õMMh v$wj LOODc%ĉQ333ECLFwEq.+W8;!NdOgMNN7A cVU,..Nc 'q'LFvf2y|ssµqaH{9Ehb\ȡPJ) ƅi_DS/'.7:oGA:̍Al 2=ge)x r,M^^i|q;wugo=YaO4FhIENDB`sonic-visualiser-2.3~repack1.orig/icons/playloop.png0000644000175000017500000000022112252354725021405 0ustar miramiraPNG  IHDRaXIDAT8A0ї׋Md+M@0I0+V$:AǜZ,[Gԃ*z:bDϿrSIHNIENDB`sonic-visualiser-2.3~repack1.orig/icons/measure1mask.xbm0000644000175000017500000000161412252354725022155 0ustar miramira#define measure1mask_width 32 #define measure1mask_height 32 static unsigned char measure1mask_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xde, 0x01, 0x00, 0x00, 0xcf, 0x01, 0x00, 0x80, 0xc7, 0x01, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; sonic-visualiser-2.3~repack1.orig/icons/normalise.png0000644000175000017500000000020212252354725021536 0ustar miramiraPNG  IHDR Vu\IIDAT(c` 0BĪi` iŊ82ˆ2a|IQN$&l44 >:݃IENDB`sonic-visualiser-2.3~repack1.orig/icons/filenew.png0000644000175000017500000000132512252354725021205 0ustar miramiraPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<gIDATxb3? Ǐ fx#ӟŃ [73j[SM ?uO egg? FFFE L$$EuEUwC8 Xgb663zl>~X߿"t?H-@auL@WMb?}ˇ6:L@oAOW VV6S'v/ 2| h?1 `a`ff /`XXYlFZ073)gX؀t+ԓ@,0Bc h;?&f X44F  b 60Y003"rȃ(-&3Pbb{j;3  fLrBJai?$@,09nVDnbp 0M0Y 9O_:'abbZ@'361#0Z|f@Iۀ6ƩIENDB`sonic-visualiser-2.3~repack1.orig/icons/text.png0000644000175000017500000000103312252354725020534 0ustar miramiraPNG  IHDRĴl;bKGDIDATxջjTAHbIc#l|NS DMbB" !Fssg,2 pfoY2_RXKJp:<r/_Z^j5iOדZI<{r;E<|p+`WazME"fQA_2D^ ҥ˸DAnW#c= aߖao._}0O_,` ׇ4gfo>JqWϐgʨ, \e8nGөK<w cl5q>kNȱy,S8fΕ'IUV/4o'abOs%3-p1yRµp}6\2&۵u+?{ióV(ocq$:QU? Va\7 #:ǿ n"IENDB`sonic-visualiser-2.3~repack1.orig/icons/qm-logo-larger.png0000644000175000017500000001127112252354725022402 0ustar miramiraPNG  IHDRJ`KbKGD pHYs  tIME  ,FIDATx]u; +0 p*XRq VI+jmo=o)DSRj QDWE7g.gDԩ9Tl "nҴ$J8XKF`$Q "/MKDA*Ҵ$J&-4-% zJR Sd%{f4%Jtt4RAWx*Q0.YRLT%JD$qqhs0`0% 7C-u䬞U9^Gu #?4^Qy@i?ԿU/Qfj7++wjﴭ_oq.R|עW_qpڰ]㷷f<9y23f_YĔzՂnXQvH]07ƍʯ Z[#>my+X2hd|814Ga\ڠ{K& :)"k}2!wf=?P_*C}y"ُ 0$xT01"gKbǡAGS4qN97EEfv 0\z!9g"^X@UzG¬.в| HV01]veeZpiaPzaXģޕE`g"^wĭ c^M۝KTzG;~Xh %v8f#BZfK4!UM]fXAw$Ny62붵;ϟB1lL7rRqɜU{إPP1QbZIXTrԘ<+Zh.qSmnW"`ywK~n z I]GS֔?4/U/O`l'\=$HL*%d7؝&}I+HfzV#l6wP,st Z羭xDaIepu~xgʾ D?ylaKHUHHZ Rj.6!klpި:0NfY[&>eAAEwPىIJ)d}ۊG3x>s}`7 h."WxF/bf E O`VN_.|!3ߔlߘ e8PJUdR98U៿\Lj,V"uMRLsqh7E2Eiu`X9Is g0’TJ3n;ԿI`[jssMqsLkуMƭŧ~<#'LO3XQ&,IְsIǸucx(0mG*ZƸl.bb$AHuhw1opg}0F#Z'_ejpcahL}vBg >I3XP:xĴH%`D 0Nt1Ɣ 0eYs`k2 hXYuLuD5A[ِ]G)6TxWTVKque3i3*K;<Ÿ{.sd)yY pE֔6`-m<:i`NoО-D?Phe `Bs^v۸+d8ҧsRv(g6sO@XˡuX@pïT_O5]ЦA<]*|w0 0n`q B?cޜD6Ny +6 P҉;,/m{oo<L3YC% SLD.x9<-D'<sR>3RDg@c.sWW08i&JAgsj3n2%Q L q~[݋a 0 <70[.3&$ j:1sӥ*z%:,LsH1o%@7,7%1Q3`2b&!NL4` 02Cx{vk\֙#;s鰸@ICkbo32꜒r8}:&=MwsB1m#vJ"}JCpyrҦ ٵUsQ `6TWXŸ,xDM366G%_gόk>-'Ntx) )b`Ntē``.BKzv4}k)Bu]aT3'zpзXXMgίu_$[^"ENs5SϽ.Y >KO,{KW"r8RNKZvKZ0S+'KPįxs0_c9O"Ru·OXThS[dso z31'o8 `M9y|2pFk]fVM ]_6U՚RiĐ:!P!}0b 3wzDTs[2SBc)cX~m4k%ITC-2EsW36m;oZ6_ |3χ{].sZ⑶|PJUwnB3KԊm|zJ Luu~rz/dcR2q/oX+mOϸ,'ҪxɹGj?緿zW$N/\ۻ>32k `,7<==ְ ]pcg#^2 cl(ӥdtksίuO$&.XORKEL,zfgqw+V\)/I'!Yi[*fM&bŸ{_M$wAF)92]/{XB戸RJ}㲂y|G=N]0'ٟ9NdJאڙ Y^Nǔ(L+vZwnrHԞ)QLZ.BIENDB`sonic-visualiser-2.3~repack1.orig/icons/ffwd.png0000644000175000017500000000053012252354725020477 0ustar miramiraPNG  IHDRĴl;bKGD pHYs  tIMEϴtEXtCommentCreated with The GIMPd%nIDAT81 A E y ؉[y;/ lkXXYظI&~#dhtxw'3J`dd '`d`L1@,Ky̝ -NhݬUz [{wgCag LÝĺ -YaTX ;՘%GCCo9IENDB`sonic-visualiser-2.3~repack1.orig/icons/annotation.png0000644000175000017500000000147312252354725021732 0ustar miramiraPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd@<( @ߡ@78 @202} 302d3300g`d28 O Zp@L 5jg`baPs#ji6l Ff@ v@w~_h0/+r"@vG6 a@88A^:_P o%u@А@I!dhc$P9@Eu@ ̠a<4فx80]Űa( 6q5@o&FfV  *:Ȗ`ϸ( R@LИ(Já ,@1Nff0SO@. 47 x (O 5|@C>#x%P5@! XB?o&O !@ @I]`@*b`+O:XYZrrJt PP Z[d*4I? | J< i&g͜@EM@/@m( x#@`I\7.@C6X~| { G ]2R_?gl` d٬Ă'! I 0ʿ8 $ΥDIENDB`sonic-visualiser-2.3~repack1.orig/icons/lines.png0000644000175000017500000000027412252354725020670 0ustar miramiraPNG  IHDR sRGBbKGD pHYs  tIMEQUtEXtCommentCreated with GIMPWIDATc` 'DAxp IENDB`sonic-visualiser-2.3~repack1.orig/icons/draw.png0000644000175000017500000000104512252354725020510 0ustar miramiraPNG  IHDRĴl; pHYs  IDAT8Ka?;hEq Lb/B]n%`ѭ{` OQdnŊzۭB]Q\Qcf|9yF@hGZ,R2HI9Dy-`y.L-J/b jq jM> +=+xZX nm %RSsm1_ `e;Qm>`tkat0pfGY6]F䗍UW}IENDB`sonic-visualiser-2.3~repack1.orig/icons/playselection.png0000644000175000017500000000022112252354725022421 0ustar miramiraPNG  IHDRaXIDAT8͐ ǬCĝ(J/?. ̺uߙ}Ng6,~AI7Ѷ`J, %~# "{NIENDB`sonic-visualiser-2.3~repack1.orig/icons/README0000644000175000017500000000032612252354725017726 0ustar miramiraIcons are from various GPL'd sources, including the GIMP image editor, KDE crystalsvg icon set, Rosegarden audio and MIDI sequencer, and Hydrogen drum machine. Some modifications and new drawings by Chris Cannam. sonic-visualiser-2.3~repack1.orig/icons/mono.png0000644000175000017500000000025012252354725020520 0ustar miramiraPNG  IHDRkFI bKGD X pHYsHHFk>HIDAT8c`t)Hc KZHXB\Z> Nlńpjr@|"4pIENDB`sonic-visualiser-2.3~repack1.orig/icons/measure2mask.xbm0000644000175000017500000000161412252354725022156 0ustar miramira#define measure2mask_width 32 #define measure2mask_height 32 static unsigned char measure2mask_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x80, 0xe3, 0x01, 0x00, 0x80, 0xf3, 0x00, 0x00, 0x80, 0x7b, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; sonic-visualiser-2.3~repack1.orig/icons/editpaste.png0000644000175000017500000000172312252354725021540 0ustar miramiraPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<eIDATxb|քO'&ƿ o0L~,ŗl3oݡ qzO@1I؍6FMW$Mɰz^/Cr.n;^n;_  6~7&(n v|drA53pr30(>f` ?30  w@3&ρ/^KO1MC^ 00W/d*ùwF m0HP ~i 67k+^l@L @~_20a`xu/ 2 ffVbxf w>;7Эľ@Cؙο_ɰ//\  @W 0?`Y@ J,YY?e`X o/2C@LL`~20|ջ~ @@g@db A+~J dd r@A h_?@뀱 / ֟AB F_DAn` 4}@+#w`@,W*AB 趿 . _@CJ>=*F#@1B<ʠ Ē 7=e3ïoL 耕/ɾ6bJyhJ`i^bAA"o %'@=DIENDB`sonic-visualiser-2.3~repack1.orig/icons/playpause-orig.png0000644000175000017500000000037212252354725022516 0ustar miramiraPNG  IHDR$z5 pHYs  IDATH; 1EFt%ظ 6,݂+k;AmfA2_sHBG5[٥Y=]p 7.{_ 9`&&mE*rĢMBEI(ozb4mgI\'bY3M赕dBe$(o%INH ڍJ!IENDB`sonic-visualiser-2.3~repack1.orig/icons/sv-24x24.png0000644000175000017500000000136112252354725020765 0ustar miramiraPNG  IHDRw=sBIT|d pHYs M MέNtEXtSoftwarewww.inkscape.org<nIDATHKTQ?GgtriL_f?PQPˠiݺ}iQA!ZB J+migF}Oq=,>.BgzcetCb@hPRxڏ@{UD D$h=@v5V?v߭~XVfi6a z!"w*\E$b 4K@t7ɖKs{\Nz IӸ)tTv6"C-DV0No\ _|N=_sBN_9ˁYˬz`M-OiƇgYZY%9z:K$p#ɏ.pwSbw3VW yU\583xbՔ>a^OIڜ|6P (X*;7"@3@_Nx@;j> RTuu^liNU*dL@@=AAD?p[bٮ ,8C>C6yDm LK\]R&V2!x oa?w!rlnAteֶ)ڴj3a#rC`fT0> 2]`9dQ2]au ?wyn%Su cG%ո^2ϭ=K c΃`KS6`Tum...̾ݺ2ϭ=m+{N(Y~T'@Su ?wyn%Su cG%ո^$ S% 1;J96&.^ S6`fT [.@S6`=',~? Su  |~d䍺 Su cG%ո^$ S% 1;J96&.^ rC`fT0> 2ϭ=m+ (PN ht2ϭ=0@@@ ;֏́Q$&2ϭ=0@@_#Wzx $@2ϭ=K c@yA 0%k$6иS6`fT Z?pqqa-}F 2ϭ=m+@=',~? ht2ϭ=0@ ;֏́Q 2ϭ=0@ P8Ë^$@2ϭ=K c@;J96&.^6и2ϭ=m*©@0> 2ϭ=m+@=',~? ht2ϭ=0@ ;֏́Q 2ϭ=0@ P8Ë^$@2ϭ=K c@yA 0%klq2S6`fT\\\}K@c2ϭ=m+@@Gu 2Su (G@ި[pD%2Cau cJ,G%ո^*8?X&rCA% 1b ccb5@ DLNrC`fT"Y@jŅٷ]@P4u BC6`eHEPJ=',~?X7: rCau ҡY@ `u+1 x? 2Cau cJ!] @ @tj\/z j% rCA% 1b (%%st lT@:@ArC`fT,  [. hBC6`bA)(PN@H8+ rCau ҡY@`u+1 / Cu cJ!] @ @tj\/z@(L<(<rCA% 1Y"ccb5xDL6(2S6`fTT:d1@0> P2S6`.{N(Y~T' /$Pxot&rCau ҡY@ `u+1 x? 2Cau c*"@_#Wzx l_T0rCA% 1Y"ccb5 @<(C6`fT"Y@0> H :2C`b (% }`@ H !w&&rCau ҡY@?w7G@ި[O P8rCau c*"(@tj\/zx~6SiGsonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/12000-6-16.aiff0000644000175000017500000106246612252354725026273 0ustar miramiraFORMe.AIFFCOMM]@ SSNDe 3 'D 3 K< 3 g 3 y 3 U 3 y 3 g 3 K<"" 3 '&f 3 * 3 r. 3 33 3 s7w 3 E; 3 @ 3 EDD 3 sH 3 L 3 rQ 3 UU 3 'Y 3 K<] 3 gb! 3 yff 3 j 3 yn 3 gs2 3 K 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 D 3 s 3 3 q 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 s 3 D 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 q 3 3 s 3 D 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 s 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 D 3 s 3 3 q 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 D 3 s 3 3 q 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 s 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 s 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 s 3 D 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 q 3 3 s 3 D 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 s 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 D 3 s 3 3 q 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 s 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 s 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 q 3 3 s 3 D 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 s 3 D 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K;x 3 g3 3 y 3  3 yg 3 g" 3 K< 3 'ٚ 3 V 3 q 3 3 sȉ 3 DE 3  3 E 3 rx 3 ij4 3 q 3 3 'g 3 K;# 3 g 3 y 3 V 3 y 3 g 3 K; 3 'E 3  3 qE 3 ň 3 r 3 E 3 V 3 E 3 s 3 Ţ# 3 qg 3 3 ' 3 K<4 3 gx 3 y 3  3 yE 3 gȉ 3 K; 3 ' 3 V 3 tٚ 3 3 r" 3 Eg 3  3 D 3 s3 3 x 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 s 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 E 3 s 3 3 q 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 E 3 t 3 3 s 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 t 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3  3 r 3 3 s 3 D 3  3 E 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 q 3 3 s 3 E 3  3 E 3 r 3 3 q 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 q 3 3 r 3 E 3  3 D 3 s 3 3 q 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 E 3  3 D 3 s 3 3 r 3  3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 s 3 3 t 3 E 3  3 D 3 s 3 3 s 3  3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3  3 s 3 3 t 3 E 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 u 3 E 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 s 3 D 3  3 D 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 D 3  3 D 3 s 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 u 3 E 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 r 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 s 3 D 3  3 D 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 E 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 F 3  3 E 3 s 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 r 3 3 u 3 E 3  3 E 3 u 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 u 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 s 3 E 3  3 F 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 s 3 D 3  3 D 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 E 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 D 3  3 D 3 s 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 u 3 E 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 s 3 D 3  3 D 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 D 3  3 D 3 s 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 u 3 E 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 r 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 s 3 D 3  3 C 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 E 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 F 3  3 E 3 s 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 u 3 E 3  3 E 3 u 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 u 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 s 3 E 3  3 F 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 s 3 D 3  3 D 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 E 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 D 3  3 D 3 s 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 'D 3 K= 3 g 3 y 3 U 3 y 3 g 3 K9"" 3 '&f 3 * 3 r. 3 33 3 q7w 3 F; 3 @ 3 EDD 3 tH 3 L 3 pQ 3 UU 3 'Y 3 K>] 3 gb! 3 yff 3 j 3 yn 3 gs2 3 K9ww 3 '{ 3  3 r{ 3 ww 3 us2 3 En 3 j 3 Eff 3 tb! 3 ] 3 pY 3 UU 3 'Q 3 K>L 3 gH 3 yDD 3 @ 3 y; 3 g7w 3 K?33 3 '. 3 * 3 q&f 3 "" 3 u 3 E 3 U 3 E 3 u 3  3 qD 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 u 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 s 3 D 3  3 D 3 r 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 u 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 E 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 r 3 D 3  3 D 3 s 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3  3 s 3 3 q 3 F 3  3 E 3 t 3 3 o 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 q 3 F 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3  3 r 3 3 u 3 E 3  3 E 3 t 3 3 p 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 q 3 3 u 3 E 3  3 E 3 u 3 3 q 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 r 3  3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 p 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 o 3 3 t 3 E 3  3 F 3 q 3 3 s 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 t 3  3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 D 3  3 D 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3  3 t 3 3 r 3 D 3  3 D 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 C 3  3 G 3 t 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 C 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 x 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 o 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 E 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 u 3 3 z 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 w 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 r 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 E 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 x 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 l 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 u 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 E 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 u 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 s 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 x 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 E 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 w 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 z 3 3 u 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 E 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 o 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 x 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 C 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 C 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 x 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 o 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 E 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 u 3 3 z 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 w 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 E 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 x 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 l 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 u 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 u 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 s 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 x 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 E 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 w 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K=x 3 g3 3 y 3  3 yg 3 g" 3 K@ 3 'ٚ 3 V 3 k 3 3 vȉ 3 CE 3  3 G 3 tx 3 4 3 w 3 3 'g 3 K=# 3 g 3 y 3 V 3 y 3 g 3 K@ 3 'E 3  3 kE 3 È 3 v 3 C 3 V 3 B 3 t 3 # 3 wg 3 3 ' 3 K=4 3 gx 3 y 3  3 yE 3 gȉ 3 K? 3 ' 3 V 3 zٚ 3 3 u" 3 Cg 3  3 B 3 t3 3 x 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 E 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 o 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 x 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 C 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 C 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 x 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 o 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 E 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 u 3 3 z 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 w 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 E 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 x 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 u 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 u 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 x 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 E 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 w 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 z 3 3 u 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 E 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 o 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 x 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 C 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 C 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 x 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 o 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 E 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 u 3 3 z 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 w 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 E 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 x 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 s 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 u 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 z 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 y 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 B 3  3 C 3 u 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 l 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 F 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 x 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 r 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 p 3 3 p 3 E 3  3 E 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 o 3 3 o 3 D 3  3 F 3 r 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 n 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 n 3 3 w 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K< 3 g 3 y 3  3 y 3 g 3 KA 3 ' 3  3 l 3 3 v 3 D 3  3 G 3 s 3 3 v 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 G 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K@ 3 ' 3  3 k 3 3 v 3 C 3  3 B 3 t 3 3 w 3 3 ' 3 K= 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 z 3 3 u 3 C 3  3 B 3 t 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3  3 y 3 3 u 3 C 3  3 C 3 u 3 3 x 3 3 ' 3 K> 3 g 3 y 3  3 y 3 g 3 K? 3 ' 3 3 x 3 3 u 3 C 3  3 C 3 u 3 3 y 3 3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 x 3 3 t 3 C 3  3 C 3 u 3 3 y 3  3 ' 3 K? 3 g 3 y 3  3 y 3 g 3 K> 3 ' 3 3 w 3 3 t 3 B 3  3 C 3 v 3 3 z 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 w 3 3 t 3 G 3  3 C 3 v 3 3 k 3  3 ' 3 K@ 3 g 3 y 3  3 y 3 g 3 K= 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 v 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 v 3 3 s 3 G 3  3 D 3 w 3 3 l 3  3 ' 3 KA 3 g 3 y 3  3 y 3 g 3 K< 3 ' 3 3 u 3 3 s 3 G 3  3 D 3 w 3 3 m 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 u 3 3 r 3 F 3  3 D 3 w 3 3 n 3  3 ' 3 KB 3 g 3 y 3  3 y 3 g 3 K; 3 ' 3 3 t 3 3 r 3 F 3  3 D 3 n 3 3 n 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 r 3 F 3  3 D 3 o 3 3 o 3  3 ' 3 K6 3 g 3 y 3  3 y 3 g 3 K: 3 ' 3 3 s 3 3 q 3 F 3  3 E 3 o 3 3 o 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 F 3  3 E 3 o 3 3 p 3  3 ' 3 K7 3 g 3 y 3  3 y 3 g 3 K9 3 ' 3 3 r 3 3 q 3 E 3  3 E 3 p 3 3 p 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3 3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3  3 ' 3 K8 3 g 3 y 3  3 y 3 g 3 K8 3 ' 3  3 q 3 3 p 3 E 3  3 E 3 p 3 3 q 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 p 3 E 3  3 F 3 q 3 3 r 3 3 ' 3 K9 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 p 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K7 3 ' 3  3 o 3 3 o 3 E 3  3 F 3 q 3 3 s 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 o 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K: 3 g 3 y 3  3 y 3 g 3 K6 3 ' 3  3 n 3 3 x 3 D 3  3 F 3 r 3 3 t 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 F 3 r 3 3 u 3 3 ' 3 K; 3 g 3 y 3  3 y 3 g 3 KB 3 ' 3  3 m 3 3 w 3 D 3  3 G 3 s 3 3 u 3 sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/8000-1-8.wav0000644000175000017500000003725412252354725026020 0ustar miramiraRIFF>WAVEfmt @@data>ڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fڧl55l纀F&Y˔Y&Fsonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/8000-2-16.wav0000644000175000017500000017505412252354725026101 0ustar miramiraRIFF$WAVEfmt @}data:fg l~3yZ 'f&,Ĵ339@fFĴL3S'YZ_yffl~lg2s:yřys2slEff~_rؙY3SKs}Es:gl~yZ'ôô'Zyl~g:sE}t:K r rKs}Es:gl~yZ'ôô'Zyl~g:sE}t:K r rKs}Es:gl~yZ'ôô'Zyl~g:sE}t:K r rKq~Eu:gk~yZ'Ǵ´'Zyl~g:tFs:K r r=K o}Eq:gk~yZ'ƴĴ'Zyl~g:sDt;K r r;Ku{Ds:gl~yZ'ĴŴ'Zyk~g:rD|vK r r?KqEu:gl~yZ'´'Zyl~g:tEr9K r r>K p}Eq:gk~yZ'ƴô'Zyl~g:sDs:K r rK r r>Kq~Eu:gl~yZ'´'Zyl~g:tFr9K r r=K o}Eq:gk~yZ'ƴĴ'Zyl~g:sDt;K r rK r r9KrEt:gl~yZ'´'Zyl~g:uEq?K r r>K p~Eq:gk~yZ'Ǵô'Zyl~g:tFs:K r rK r r?Kq~Eu:gl~yZ'´'Zyl~g:tFr9K r r=K o}Eq:gk~yZ'ƴô'Zyl~g:sDt;K r rKp~Eq:gk~yZ'Ǵô'Zyl~g:tFs:K r r=Kv|Dr:gk~yZ'ŴĴ'Zyl~g:sDu;K r r;KuDs:gl~yZ'ĴŴ'Zyk~g:rD}v=K r r:KsFt:gl~yZ'ôǴ'Zyk~g:qE~p>K r r?Kq~Eu:gl~yZ'´'Zyl~g:tFr9K r r=K p}Eq:gk~yZ'ƴô'Zyl~g:sDt:K r rKp~Eu:gk~yZ'Ǵ´'Zyl~g:tFs:K r r=Ko}Er:gk~yZ'ƴĴ'Zyl~g:sDt;K r r;KuDs:gl~yZ'ĴŴ'Zyk~g:rD|vK r r?KqEu:gl~yZ'´'Zyl~g:tEr9K r r>K p}Eq:gk~yZ'ƴô'Zyl~g:sDs:K r rKq~Eu:gl~yZ'Ǵ´'Zyl~g:tFr9K r r=K o}Eq:gk~yZ'ƴĴ'Zyl~g:sDt;K r rK r r9KrEt:gl~yZ'´'Zyl~g:uEr?K r r>K p~Eq:gk~yZ'Ǵô'Zyl~g:tFs:K r rK r r?Kq~Eu:gl~yZ'´'Zyl~g:tFr9K r r=K o}Eq:gk~yZ'ƴô'Zyl~g:sDt;K r rK r r9KrFt:gl~yZ'´'Zyl~g:uE~q?K r r>Kp~Eq:gk~yZ'Ǵô'Zyl~g:tFs:K r r=Kv|Dr:gk~yZ'ŴĴ'Zyl~g:sDu;K r r;KtDs:gl~yZ'Ĵƴ'Zyk~g:rD}o=K r r:KsFt:gl~yZ'ôǴ'Zyk~g:uE~p>K r r?Kq~Eu:gl~yZ'´'Zyl~g:tFr9K r r=K o}Eq:gk~yZ'ƴô'Zyl~g:sDt:K r rKp~Eu:gk~yZ'Ǵô'Zyl~g:tFs:K r r=Ko}Dr:gk~yZ'ƴĴ'Zyl~g:sDt;K r r;KuDs:gl~yZ'ĴŴ'Zyk~g:rD|v=K r r:KsFt:gl~yZ'ôǴ'Zyk~g:qE~p>K r r?KqEu:gl~yZ'´'Zyl~g:tEr9K r r>K p}Eq:gk~yZ'ƴô'Zyl~g:sDs:K r rKq~Eu:gl~yZ'Ǵ´'Zyl~g:tFs:K r r=K o}Eq:gk~yZ'ƴĴ'Zyl~g:sDt;K r rK r r9KrEu:gl~yZ'´´'Zyl~g:uEr?K r r>K p}Eq:gk~yZ'Ǵô'Zyl~g:sFs:K r rK r r?Kq~Eu:gl~yZ'´'Zyl~g:tFr9K r r=K o}Eq:gk~yZ'ƴĴ'Zyl~g:sDt;K r rK r r9KrEt:gl~yZ'´'Zyl~g:uEq?K r r>Kp~Eq:gk~yZ'Ǵô'Zyl~g:tFs:K r r=Kv|Dr:gk~yZ'ŴĴ'Zyl~g:sDu;K r r;KtDs:gl~yZ'Ĵƴ'Zyk~g:rD}o=K r r:KsFt:fg l~3yZ 'f&,ô339@fFǴL3S'YZ_yffk~lg2s:yřyu2slEff~_pؙY3S>KL rfF@ r9?K33,qf&~ E3u f:gl~yZ'´'Zyl~g:tFr9K r r=K o}Eq:gk~yZ'ƴô'Zyl~g:sDt;K r rKp~Eu:gk~yZ'Ǵô'Zyl~g:tFs:K r r=Ko}Dr:gk~yZ'ƴĴ'Zyl~g:sDt;K r r;KuDs:gl~yZ'ĴŴ'Zyk~g:rD|v=K r r:KsFt:gl~yZ'ôǴ'Zyk~g:qE~p>K r r?KqEu:gl~yZ'´'Zyl~g:tEr9K r r>K p}Eq:gk~yZ'ƴô'Zyl~g:sDt:K r rKq~Eu:gl~yZ'Ǵ´'Zyl~g:tFs:K r r=K o}Eq:gk~yZ'ƴĴ'Zyl~g:sDt;K r rK r r?K yyCu:gk~y|Z'´'|Zyk~g:tCyy ?K r r>K wBv:gk~yZ'ô'~Zyk~g:sCzl AKr rK r r?K yyCt:gk~y|Z'´'|Zyk~g:uCyy ?K r r>K xBu:gk~yZ'ô'}Zyk~g:tCzk @K r r=KvGv:gk~yZ'Ĵ'Zym~g:sD{mBKr r;KtFw:gl~yZ'ʴƴ'Zyl~g:rE}o6Kr r:KsFo :gl~yZ'ɴǴ'Zyl~g":qE~p8K r r8Kq~Ep":gl~yZ'ȴȴ'Zyl~g!:oFr9K rr7Ko}Eq:gl~yZ'ƴʴ'Zyl~g:nFt;K rrBKn|Dr:gm~yZ'Ŵ'Zyk~g:wGuK xCu:gk~yZ'ô'}Zyk~g:tCzk @K r r=KvGv:gk~yZ'Ĵ'~Zym~g:sD{mBKr r;KuFw:gl~yZ'Ŵ'Zym~g:rD|o6Kr r:KsFo :gl~yZ'ɴǴ'Zyl~g#:qE~p8Kr r8Kq~Ep":gl~yZ'ȴȴ'Zyl~g!:pFr9K rr7Kp}Eq:gl~yZ'ƴʴ'Zyl~g:oFt:K rr6Kn|Dr:gm~yZ'Ŵ'Zyk~g:wGuK xCu:gk~yZ'´'}Zyk~g:tCzk @K r r=K wGv:gk~yZ'Ĵ'~Zyj~g:sD{mAKr r;KuFw:gl~yZ'Ŵ'Zym~g:rD|n6Kr r:KsFo :gl~yZ'ɴǴ'Zyl~g#:qE~p7Kr r9KrEp!:gl~yZ'ȴȴ'Zyl~g!:pEr9K rr7Kp}Eq#:gl~yZ'Ǵɴ'Zyl~g :oFs:K rr6Kn|Dr:gm~yZ'Ŵ'Zyk~g:wGuK r r?K xCu:gk~yZ'´'}Zyk~g:tCzz @K r r=K wGv:gk~yZ'Ĵ'~Zyj~g:sD{lAKr rK r r?K yyCu:gk~yZ'´'}Zyk~g:tCyz @K r r=K wGv:gk~yZ'ô'~Zyj~g:sD{lAKr rK r r?K yyCu:gk~yZ'´'}Zyk~g:tCyz ?K r r=K wBv:gk~yZ'ô'~Zyj~g:sD{l AKr rK r r?K yyCu:gk~y|Z'´'|Zyk~g:tCyy ?K r r>K wBv:gk~yZ'ô'~Zyj~g:sDzl AKr rK r r?K yyCt:gk~y|Z'´'|Zyk~g:uCyy ?K r r>K xBu:gk~yZ'ô'}Zyk~g:tCzl AK r rK xCu:gk~yZ'ô'}Zyk~g:tCzk @K r r=KvGv:gk~yZ'Ĵ'Zym~g:sD{mBKr r;KuFw:gl~yZ'ʴŴ'Zym~g:rD}o6Kr r:KsFo :gl~yZ'ɴǴ'Zyl~g":qE~p8Kr r8Kq~Ep":gl~yZ'ȴȴ'Zyl~g!:pFr9K rr7Kp}Eq:gl~yZ'ƴʴ'Zyl~g:oFt:K rr6Kn|Dr:gm~yZ'Ŵ'Zyk~g:wGuK xCu:gk~yZ'´'}Zyk~g:tCzk @K r r=KvGv:gk~yZ'Ĵ'~Zym~g:sD{mBKr r;KuFw:gl~yZ'Ŵ'Zym~g:rD|n6Kr r:KsFo :gl~yZ'ɴǴ'Zyl~g#:qE~p7Kr r9KqEp!:gl~yZ'ȴȴ'Zyl~g!:pEr9K rr7Kp}Eq#:gl~yZ'ƴʴ'Zyl~g :oFs:K rr6Kn|Dr:gm~yZ'Ŵ'Zyk~g:wGuK xCu:gk~yZ'´'}Zyk~g:tCzk @K r r=K wGv:gk~yZ'Ĵ'~Zyj~g:sD{mAKr rK r r?K yCu:gk~yZ'´'}Zyk~g:tCzz @K r r=K wGv:gk~yZ'Ĵ'~Zyj~g:sD{lAKr rK r r?K yyCu:gk~yZ'´'}Zyk~g:tCyz @K r r=K wGv:gk~yZ'ô'~Zyj~g:sD{lAKr rK r r?K yyCu:gk~yZ'´'|Zyk~g:tCyy ?K r r>K wBv:gk~yZ'ô'~Zyj~g:sDzl AKr rK r r?K yyCu:gk~y|Z'´´'|Zyk~g:uCyy ?K r r>K xBv:gk~yZ'ô'~Zyk~g:sCzl AKr rK r r?K yyCt:gk~y|Z'´'Zyk~g:uCyy ?K r r>K xBu:gk~yZ'ô'}Zyk~g:tCzk @K r r=KvGv:gk~yZ'Ĵ'Zym~g:sD{mBKr r;KtFw:gl~yZ'ʴƴ'Zym~g:rD}o6Kr r:KsFo :gl~yZ'ɴǴ'Zyl~g":qE~p8K r r8Kq~Ep":gl~yZ'ȴȴ'Zyl~g!:pFr9K rr7Ko}Eq:gl~yZ'ƴʴ'Zyl~g:nFt;K rrBKn|Dr:gm~yZ'Ŵ'Zyk~g:wGuK xCu:gk~yZ'ô'}Zyk~g:tCzk @K r r=KvGv:gk~yZ'Ĵ'~Zym~g:sD{mBKr r;KuFw:gl~yZ'Ŵ'Zym~g:rD|o6Kr r:KsFo :gl~yZ'ɴǴ'Zyl~g#:qE~p8Kr r8Kq~Ep":gl~yZ'ȴȴ'Zyl~g!:pFr9K rr7Kp}Eq:gl~yZ'ƴʴ'Zyl~g:oFt:K rr6Kn|Dr:gm~yZ'Ŵ'Zyk~g:wGuK xCu:gk~yZ'´'}Zyk~g:tCzk @K r r=K wGv:gk~yZ'Ĵ'~Zyj~g:sD{mAKr rK r r?K xCu:gk~yZ'´'}Zyk~g:tCzz @K r r=K wGv:gk~yZ'Ĵ'~Zyj~g:sD{lAKr rK 3  3 s 3 } 3 E 3 3 s 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ô 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 s 3 3 E 3 } 3 t 3  3 :K 3 r 3  3 r 3 K 3  3 s 3 } 3 E 3 3 s 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ô 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 s 3 3 E 3 } 3 t 3  3 :K 3 r 3  3 r 3 K 3  3 s 3 } 3 E 3 3 s 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ô 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 s 3 3 E 3 } 3 t 3  3 :K 3 r 3  3 r 3 K 3  3 q 3 ~ 3 E 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 s 3  3 :K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 ;K 3  3 u 3 { 3 D 3 3 s 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ĵ 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 r 3 3 D 3 | 3 v 3  3 K 3 r 3  3 r 3 ?K 3  3 q 3  3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 E 3  3 r 3  3 9K 3 r 3  3 r 3 >K 3  3 p 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 s 3  3 :K 3 r 3  3 r 3 K 3 r 3  3 r 3 >K 3  3 q 3 ~ 3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 K 3 r 3  3 r 3 9K 3  3 r 3  3 E 3 3 t 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ´ 3 3  3 3 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 u 3 3 E 3  3 q 3  3 ?K 3 r 3  3 r 3 >K 3  3 p 3 ~ 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 q 3 ~ 3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 K 3  3 p 3 ~ 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 =K 3  3 v 3 | 3 D 3 3 r 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 u 3  3 ;K 3 r 3  3 r 3 ;K 3  3 u 3 3 D 3 3 s 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ĵ 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 r 3 3 D 3 } 3 v 3  3 =K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 t 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ô 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 q 3 3 E 3 ~ 3 p 3  3 >K 3 r 3  3 r 3 ?K 3  3 q 3 ~ 3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 =K 3  3 p 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 :K 3 r 3  3 r 3 K 3  3 p 3 ~ 3 E 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 r 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 ;K 3  3 u 3 3 D 3 3 s 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ĵ 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 r 3 3 D 3 | 3 v 3  3 K 3 r 3  3 r 3 ?K 3  3 q 3  3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 E 3  3 r 3  3 9K 3 r 3  3 r 3 >K 3  3 p 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 s 3  3 :K 3 r 3  3 r 3 K 3  3 q 3 ~ 3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 K 3 r 3  3 r 3 9K 3  3 r 3  3 E 3 3 t 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ´ 3 3  3 3 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 u 3 3 E 3  3 r 3  3 ?K 3 r 3  3 r 3 >K 3  3 p 3 ~ 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 q 3 ~ 3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 K 3 r 3  3 r 3 9K 3  3 r 3  3 F 3 3 t 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ´ 3 3  3 3 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 u 3 3 E 3 ~ 3 q 3  3 ?K 3 r 3  3 r 3 >K 3  3 p 3 ~ 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 =K 3  3 v 3 | 3 D 3 3 r 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 u 3  3 ;K 3 r 3  3 r 3 ;K 3  3 t 3 3 D 3 3 s 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ĵ 3 3  3 3 ƴ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 r 3 3 D 3 } 3 o 3  3 =K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 t 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ô 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 u 3 3 E 3 ~ 3 p 3  3 >K 3 r 3  3 r 3 ?K 3  3 q 3 ~ 3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 :K 3 r 3  3 r 3 K 3  3 p 3 ~ 3 E 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 =K 3  3 o 3 } 3 D 3 3 r 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 ;K 3  3 u 3 3 D 3 3 s 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ĵ 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 r 3 3 D 3 | 3 v 3  3 =K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 t 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ô 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 q 3 3 E 3 ~ 3 p 3  3 >K 3 r 3  3 r 3 ?K 3  3 q 3  3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 E 3  3 r 3  3 9K 3 r 3  3 r 3 >K 3  3 p 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 s 3  3 :K 3 r 3  3 r 3 K 3  3 q 3 ~ 3 E 3 3 u 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 s 3  3 :K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 K 3 r 3  3 r 3 9K 3  3 r 3  3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ´ 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 u 3 3 E 3  3 r 3  3 ?K 3 r 3  3 r 3 >K 3  3 p 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 q 3 ~ 3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 K 3 r 3  3 r 3 9K 3  3 r 3  3 E 3 3 t 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ´ 3 3  3 3 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 u 3 3 E 3  3 q 3  3 ?K 3 r 3  3 r 3 >K 3  3 p 3 ~ 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 =K 3  3 v 3 | 3 D 3 3 r 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 u 3  3 ;K 3 r 3  3 r 3 ;K 3  3 t 3 3 D 3 3 s 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ĵ 3 3  3 3 ƴ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 r 3 3 D 3 } 3 o 3  3 =K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 t 3 3 3 :f 3 g 3 l~3 3 y 3 Z 3 'f& 3 , 3 ô33 3 9 3 @ 3 fF 3 ǴL 3 3S 3 'Y 3 Z_ 3 yff 3 k~l 3 g2s 3 :y 3  3 řy 3 u2s 3 l 3 Eff 3 ~_ 3 pؙY 3 3S 3 >KL 3 rfF 3 @ 3 r9 3 ?K33 3 , 3 qf& 3 ~ 3 E 3 3 3 u 3 f 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 K 3  3 p 3 ~ 3 E 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 =K 3  3 o 3 } 3 D 3 3 r 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 ;K 3  3 u 3 3 D 3 3 s 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ĵ 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 r 3 3 D 3 | 3 v 3  3 =K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 t 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ô 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 q 3 3 E 3 ~ 3 p 3  3 >K 3 r 3  3 r 3 ?K 3  3 q 3  3 E 3 3 u 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 E 3  3 r 3  3 9K 3 r 3  3 r 3 >K 3  3 p 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ô 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 :K 3 r 3  3 r 3 K 3  3 q 3 ~ 3 E 3 3 u 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ´ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 t 3 3 F 3  3 s 3  3 :K 3 r 3  3 r 3 =K 3  3 o 3 } 3 E 3 3 q 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 s 3 3 D 3 3 t 3  3 ;K 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 |Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 |Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 y 3 y 3  3 ?K 3 r 3  3 r 3 >K 3  3 w 3 3 B 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 ~Z 3 y 3 k~ 3 g 3 : 3 3 3 s 3 3 C 3 z 3 l 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 t 3 3 3 : 3 g 3 k~ 3 y 3 |Z 3 ' 3 3 ´ 3 3  3 3 3 3 ' 3 |Z 3 y 3 k~ 3 g 3 : 3 3 3 u 3 3 C 3 y 3 y 3  3 ?K 3 r 3  3 r 3 >K 3  3 x 3 3 B 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 k 3  3 @K 3 r 3  3 r 3 =K 3  3 v 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 m~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 m 3  3 BK 3 r 3  3 r 3 ;K 3  3 t 3 3 F 3 3 w 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ʴ 3 3  3 3 ƴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3 3 3 r 3 3 E 3 } 3 o 3  3 6K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 o 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ɴ 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 ": 3 3 3 q 3 3 E 3 ~ 3 p 3  3 8K 3 r 3  3 r 3 8K 3  3 q 3 ~ 3 E 3 3 p 3 3 3 ": 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ȴ 3 3  3 3 ȴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 !: 3  3 3 o 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 7K 3  3 o 3 } 3 E 3 3 q 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ʴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 n 3 3 F 3 3 t 3  3 ;K 3 r 3  3 r 3 BK 3  3 n 3 | 3 D 3 3 r 3 3 3 : 3 g 3 m~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 3  3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 w 3 3 G 3 3 u 3  3 K 3  3 x 3 3 C 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 k 3  3 @K 3 r 3  3 r 3 =K 3  3 v 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 ~Z 3 y 3 m~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 m 3  3 BK 3 r 3  3 r 3 ;K 3  3 u 3 3 F 3 3 w 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3  3 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 m~ 3 g 3 : 3 3 3 r 3 3 D 3 | 3 o 3  3 6K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 o 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ɴ 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 #: 3 3 3 q 3 3 E 3 ~ 3 p 3  3 8K 3 r 3  3 r 3 8K 3  3 q 3 ~ 3 E 3 3 p 3 3  3 ": 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ȴ 3 3  3 3 ȴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 !: 3  3 3 p 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 7K 3  3 p 3 } 3 E 3 3 q 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ʴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 o 3 3 F 3 3 t 3  3 :K 3 r 3  3 r 3 6K 3  3 n 3 | 3 D 3 3 r 3 3 3 : 3 g 3 m~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 3  3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 w 3 3 G 3 3 u 3  3 K 3  3 x 3 3 C 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 k 3  3 @K 3 r 3  3 r 3 =K 3  3 w 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 m 3  3 AK 3 r 3  3 r 3 ;K 3  3 u 3 3 F 3 3 w 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3  3 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 m~ 3 g 3 : 3 3 3 r 3 3 D 3 | 3 n 3  3 6K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 o 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ɴ 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 #: 3 3 3 q 3 3 E 3 ~ 3 p 3  3 7K 3 r 3  3 r 3 9K 3  3 r 3  3 E 3 3 p 3 3  3 !: 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ȴ 3 3  3 3 ȴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 !: 3  3 3 p 3 3 E 3  3 r 3  3 9K 3 r 3  3 r 3 7K 3  3 p 3 } 3 E 3 3 q 3 3 3 #: 3 g 3 l~ 3 y 3 Z 3 ' 3 3 Ǵ 3 3  3 3 ɴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 o 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 6K 3  3 n 3 | 3 D 3 3 r 3 3 3 : 3 g 3 m~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 3  3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 w 3 3 G 3 3 u 3  3 K 3 r 3  3 r 3 ?K 3  3 x 3 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 z 3  3 @K 3 r 3  3 r 3 =K 3  3 w 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 l 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 y 3 z 3  3 @K 3 r 3  3 r 3 =K 3  3 w 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 l 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 y 3 z 3  3 ?K 3 r 3  3 r 3 =K 3  3 w 3 3 B 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 l 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 |Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 |Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 y 3 y 3  3 ?K 3 r 3  3 r 3 >K 3  3 w 3 3 B 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 z 3 l 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 t 3 3 3 : 3 g 3 k~ 3 y 3 |Z 3 ' 3 3 ´ 3 3  3 3 3 3 ' 3 |Z 3 y 3 k~ 3 g 3 : 3 3 3 u 3 3 C 3 y 3 y 3  3 ?K 3 r 3  3 r 3 >K 3  3 x 3 3 B 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 l 3  3 AK 3 r 3  3 r 3 K 3  3 x 3 3 C 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 k 3  3 @K 3 r 3  3 r 3 =K 3  3 v 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 m~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 m 3  3 BK 3 r 3  3 r 3 ;K 3  3 u 3 3 F 3 3 w 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ʴ 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 m~ 3 g 3 : 3 3 3 r 3 3 D 3 } 3 o 3  3 6K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 o 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ɴ 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 ": 3 3 3 q 3 3 E 3 ~ 3 p 3  3 8K 3 r 3  3 r 3 8K 3  3 q 3 ~ 3 E 3 3 p 3 3  3 ": 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ȴ 3 3  3 3 ȴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 !: 3  3 3 p 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 7K 3  3 p 3 } 3 E 3 3 q 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ʴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 o 3 3 F 3 3 t 3  3 :K 3 r 3  3 r 3 6K 3  3 n 3 | 3 D 3 3 r 3 3 3 : 3 g 3 m~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 3  3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 w 3 3 G 3 3 u 3  3 K 3  3 x 3 3 C 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 k 3  3 @K 3 r 3  3 r 3 =K 3  3 v 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 ~Z 3 y 3 m~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 m 3  3 BK 3 r 3  3 r 3 ;K 3  3 u 3 3 F 3 3 w 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3  3 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 m~ 3 g 3 : 3 3 3 r 3 3 D 3 | 3 n 3  3 6K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 o 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ɴ 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 #: 3 3 3 q 3 3 E 3 ~ 3 p 3  3 7K 3 r 3  3 r 3 9K 3  3 q 3  3 E 3 3 p 3 3  3 !: 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ȴ 3 3  3 3 ȴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 !: 3  3 3 p 3 3 E 3  3 r 3  3 9K 3 r 3  3 r 3 7K 3  3 p 3 } 3 E 3 3 q 3 3 3 #: 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ʴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 o 3 3 F 3 3 s 3  3 :K 3 r 3  3 r 3 6K 3  3 n 3 | 3 D 3 3 r 3 3 3 : 3 g 3 m~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 3  3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 w 3 3 G 3 3 u 3  3 K 3  3 x 3 3 C 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 k 3  3 @K 3 r 3  3 r 3 =K 3  3 w 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 m 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 z 3  3 @K 3 r 3  3 r 3 =K 3  3 w 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 l 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 y 3 z 3  3 @K 3 r 3  3 r 3 =K 3  3 w 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 l 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 |Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 y 3 y 3  3 ?K 3 r 3  3 r 3 >K 3  3 w 3 3 B 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 z 3 l 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 |Z 3 ' 3 3 ´ 3 3  3 3 ´ 3 3 ' 3 |Z 3 y 3 k~ 3 g 3 : 3 3 3 u 3 3 C 3 y 3 y 3  3 ?K 3 r 3  3 r 3 >K 3  3 x 3 3 B 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 ~Z 3 y 3 k~ 3 g 3 : 3 3 3 s 3 3 C 3 z 3 l 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 y 3 y 3 C 3 3 t 3 3 3 : 3 g 3 k~ 3 y 3 |Z 3 ' 3 3 ´ 3 3  3 3 3 3 ' 3 Z 3 y 3 k~ 3 g 3 : 3 3 3 u 3 3 C 3 y 3 y 3  3 ?K 3 r 3  3 r 3 >K 3  3 x 3 3 B 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 k 3  3 @K 3 r 3  3 r 3 =K 3  3 v 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 Z 3 y 3 m~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 m 3  3 BK 3 r 3  3 r 3 ;K 3  3 t 3 3 F 3 3 w 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ʴ 3 3  3 3 ƴ 3 3 ' 3 Z 3 y 3 m~ 3 g 3 : 3 3 3 r 3 3 D 3 } 3 o 3  3 6K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 o 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ɴ 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 ": 3 3 3 q 3 3 E 3 ~ 3 p 3  3 8K 3 r 3  3 r 3 8K 3  3 q 3 ~ 3 E 3 3 p 3 3 3 ": 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ȴ 3 3  3 3 ȴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 !: 3  3 3 p 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 7K 3  3 o 3 } 3 E 3 3 q 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ʴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 n 3 3 F 3 3 t 3  3 ;K 3 r 3  3 r 3 BK 3  3 n 3 | 3 D 3 3 r 3 3 3 : 3 g 3 m~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 3  3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 w 3 3 G 3 3 u 3  3 K 3  3 x 3 3 C 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ô 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 k 3  3 @K 3 r 3  3 r 3 =K 3  3 v 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 ~Z 3 y 3 m~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 m 3  3 BK 3 r 3  3 r 3 ;K 3  3 u 3 3 F 3 3 w 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3  3 3 3  3 3 Ŵ 3 3 ' 3 Z 3 y 3 m~ 3 g 3 : 3 3 3 r 3 3 D 3 | 3 o 3  3 6K 3 r 3  3 r 3 :K 3  3 s 3 3 F 3 3 o 3 3  3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ɴ 3 3  3 3 Ǵ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 #: 3 3 3 q 3 3 E 3 ~ 3 p 3  3 8K 3 r 3  3 r 3 8K 3  3 q 3 ~ 3 E 3 3 p 3 3  3 ": 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ȴ 3 3  3 3 ȴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 !: 3  3 3 p 3 3 F 3  3 r 3  3 9K 3 r 3  3 r 3 7K 3  3 p 3 } 3 E 3 3 q 3 3 3 : 3 g 3 l~ 3 y 3 Z 3 ' 3 3 ƴ 3 3  3 3 ʴ 3 3 ' 3 Z 3 y 3 l~ 3 g 3 : 3  3 3 o 3 3 F 3 3 t 3  3 :K 3 r 3  3 r 3 6K 3  3 n 3 | 3 D 3 3 r 3 3 3 : 3 g 3 m~ 3 y 3 Z 3 ' 3 3 Ŵ 3 3  3 3 3  3 ' 3 Z 3 y 3 k~ 3 g 3 : 3  3 3 w 3 3 G 3 3 u 3  3 K 3  3 x 3 3 C 3 3 u 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 k 3  3 @K 3 r 3  3 r 3 =K 3  3 w 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 m 3  3 AK 3 r 3  3 r 3 K 3 r 3  3 r 3 ?K 3  3 x 3 3 C 3 3 u 3 3 3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 ´ 3 3 ' 3 }Z 3 y 3 k~ 3 g 3 : 3 3 3 t 3 3 C 3 z 3 z 3  3 @K 3 r 3  3 r 3 =K 3  3 w 3 3 G 3 3 v 3 3  3 : 3 g 3 k~ 3 y 3 Z 3 ' 3 3 3 3  3 3 Ĵ 3 3 ' 3 ~Z 3 y 3 j~ 3 g 3 : 3 3 3 s 3 3 D 3 { 3 l 3  3 AK 3 r 3  3 r 3 >CCGGLPPUUYY^bbggkkpttyy}}9LAME3.99rq.0$@"00𶋴8 8CNU8 WEt,eZb!罟v{&mu`@0(@4`!bLJ>OA (8 ˫dԡfHfPi1B@bC/"|rOh‰oa$G"1.LPTDTA_ *C^р8-zс\Y I@D9fcyh ^㉺bN26Y< كIvj>tfZ{%Gwd6 %3j# tkCgpd(Q_;c#bD N&2k`a`uc3@t>,~cah8-A`*saF|(`q(?lӷ{O@4g%`Յaba agVNjbx jf cqaÀ p2-?d`@# 2C#Mk:o,Es @Ks p3,eQ}$'b34# s#D+v 50y8,ɸ- aAxK; L%eE x2j:1{L6f=Nn5ˠbƦoE}>?*d6 %3j# tkCgpd(Q_;c#bP !8ɬf)0C1NQ y8:-FAԘ@ bJDW_}u/8 ,cAf~PrPf XXF xpP&uo1'-`7f@<8(GELZΛ\\ |pI!lIش"1šH10|@ ❿DB8J- 5P4,*c)L+bӘQ!<blݒObޘ?`t#@Bj1"!PeSMhw%;BJa?12\36;o1?(9(3,# aP`z`Sp{x$-8 $ie0(40c0!00qŕ4{6GS0ւ*0U 0-=Ndcn͙1^)8Ĕ h]<)S3O#KBdp(x<vƍ3{x~*&    P!I{?2T@qᙵG Q538By(`/]8p>Xh4?> )\ &(8Ĩ ~9A\SF q銆*]800`6uz׿w@0AA5aaXmBwôտX`!d+ k`cRhCVt`af,@ffp`a+:`*`Ɖgal aw``N8Ļ 6#~kU"*~4wowe g& شHO#XdإF$`7j0"Ep `ȤOGd6 %3j# tkCgpd(Q_,p1(|. _8̓+#NSAԘ @ Ld3_! '( Tf}XJ/8 ,cAf~PrPf XXF xpP&uo1&Y -fԄpd,WZg8ʌ PAԘ#4S#4,Es @Ks p3,eQ}$'b34# s#D+v07A-֟0,0e(L|0R0i0C1G68z5zń 08}[:uW}_51}޳oyj/80ff XXF xpP&uo1'-`7f@<8(7to8 -l$iG20 Fh Fh f0XfX棇I gOŦfiFA- F!& W2s ?mA@l#c L0>A0cu01CE669E1L0A 0Qdp5\ApSzZ_X8]ưbAԙ__N*M` 8pڣ(Ù!Y <`.  r@8  BE~?GGj2Ä  !G%cHGCu_nqD N&2k`a`uc3@t>,~cal`*6Fg€t׺%J!Z?{8  #Ԙ]chH3,# ń 08ok[g ĿZIձ:mnί߷t]E/8 ,cAf~PrPf XXF xpP&uo1&Y -fԄpd,c'8  P~ ?wwW"tPa!8Ph+'`LJaVBa6`*hozmaT``Z0(mځ.0c2EZ?߷{}u8{uj6{Q-ճ2O^( JB!yAUzaҶ(1PB8 ѝ8]ݰAԘ4]G_OC%IP.Tx1[0Zs>Ä  !G#cHGC6Mu-?,ơ8 RApT&LrOv`@Ǧ*W`$nځ0 8K *aИ~cfsd=@`Lu ` $j(>̞zLavO7( 2$U+C9?QO_o'g*m"k\3“C8csbKS@S*zAD? 01p *8KU#n*KvWWGz--JN0G 8``p`O ``alh7mG{l Xfc\b0 ]=}6m_'G m>J^ %3j# tkCgpd(Q_,p18LaU#.A!P(|. +oԿ?!ޗ+&\ &(\SF q銆* {@6@@q:my_KE"삅@`a5afa foi>aP`z`Sp{x8 U#.*P$-8 $RW_8bj?Ո.aaI1SI)z)=ɠ"x|I cqx8 @`5u?e=o**(YJB!yAzaҶ(1PB88݂ -*m ѝ4]_}og__ ?& ŀ#5j #CRc ec2=@F a pXX꯫uRmI9aJ(yRApT&LrOv`@Ǧ*W`$nځ8LaU ~}e0  =A>7+@%"`$`,``a%Va@ drg[ yDa E^ӺO?Mok4 xgp"k\3“C8csbKS@S*zAD? 01p *8 U#.H%ИK>o_DGH.U*A :V&a&Jlƣ`@ `v6$l/Xl6qêQ? #8&fxFυӛnbBpPX-8LU#.A{*PosDp-$;ILHs OL-+(q 90@р9@8UG9_&H e{?%$N0@0O0FA0u002y3?`< O0ؐ@V"ioN/8߂KU".m*ewn_PHc`&0 0l)1 t376*i44E24OO)038 n/¡00( __n??yA JB!yAUzaҶ(1PB8  0Mۿg8 UU%*И9{?FD"Cjŀ#5j #CRc ec2=@F a pXX}#ݽO57 \-Jd z,@i-Mc &C`4`1 D 0lpR杽~e3o8pgj5iBB#\˜ *=la4QV0)ym6؅8LUU!-~ѿИ{z{Wo/+Ɍ=L ,"0 "J qI+ Jᕌ|@X(ab-ϯ/o;_fIt^ !@6UBbaDBa(K _@@Ac}Bw8LW!zY7W_OTB&`4a aOan beVhb Za%<`&`G<:,1 uu9} 4@B6:4\SЌ'l7aP \__8MU/Jw*И1閿erRD p/0\1ұ3Q5l:V3ev5C00H@~0'Cp#azf)unηo?_%Qd6 %3j# tkCgpd(Q_,p1(|4_}uR__i/߲/8 mU)H*ѯИ7Lw?i^?JJ (` FX `-@H@ `yPCp…ڷ?tqlN// M- @T_ 0&F :PP5ffO=W&u'gA*^![8L W#{*eQ@E~ ,6@]!,oۘ0 SALu ս hA\BZ"b}zbnAȇ.pCo^ew܇)7+ݽJ#+ԍ%%'3O}sun8YUP`i2XF_倰\N7iORLYT/NnM1Pfr5fXGJ٩i_44Q"wy]UښBf1ZܿE41YT4$8LAME3.99.58 1U!ꂶ궹8e4sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/32000-1.m4a0000644000175000017500000002356312252354725025612 0ustar miramiraT@libfaac 1.283"0 :yU].I$I$E$/.f9i3tN>Icؚ[C|C|_.?(QE.1EQEQEEQDQECVZZj5jըjժV@իTVP Zj Zը Z5jV5@ ZTժիUCTիVիP5j Z@5իTT@?(("*&H"3;~8.]/.VH}G19?/(EQEQEQQQQD"Q QDCT5@$ ZjE Eu+ T@RB (@@QP@@(T@0hZ ! W^u.\$. 7{^q>-uyyc1xk׬y5^^=sHs'XJdi LK2ȐI9F@,I0 PH$$8T@0 ID$B{ KBL3S/} znSPߡJqMMMEQEQE((E 6QAٲ%͛"d}qlEb;#bB6#VlBbX0XXT@&(""A&"3;ww..ZTUkpݷ ~yyuO:S8y߿y~~Pݾy\_@p\hBrA@@ P8T@2 DCGj/Wz$-#%[O;ٳf͛>Hu1ld/?(~Jo+>Pw?>\TC_yPz9Ԧ퓝@e.QP  XT@?(("*%B#3;~8.5*]8t}G19?/(EQEQEQQQQD""իQVVB(H( EMPT*| +UAuEHP@   DX(T@?0hZ '0L#%U{_םK%iuQ2]޺`=kۏ.n|[<<<y<Ǟx<׮Sk׬ׯXׯ^\%=d1rHӂba9E``( "@ T@0 JG*n<𻻹%TKZoXkݻv Snnj(((QEQE(QBͳfƒ6͑[-#ek .ޥ$(DX "LR&IDT@_&(""A' L#C;ww-ĭH'S6L Ou= @RӨ\`(̥H(\]@( T* 8T@(("*&Hb#.L7ߎ8rMW ㆹ:{3#2QEQEQEEEECQVDEDQ "j+Gx BTT@B $@ \(P,` TT@0hZ !! #%U{_םK-rH%M3qs׵{[WhH|[-מyyy<<=3<0KYׯ\k׭2R)Mrz`; ) p R`XgT@?0 H~<.-$+]Wx5nݻwEMCw~)U7U7U5QEQEPj(5(ٱE,QE 6Z+ٰlYvXQ؊( DQ kH X Hv T@?&(""A' L#C;wr\z3wݷ ~yyuO:SΣO8S:zT\K (.\ AE ( , aP T@?2 FBD$!ʪ75ZHyJgN76>[6lٳg-_(G_0{˛'A Ar.B(ˌ@  * *P T@(("*&H"3.L7ߎ8K.KT߶/0q}?@{ QEQEQDQDQDQEB(HUIQUBT@@@0a@ @ b`T@0hZ ! #%T^u.ܴ&k9㾼{e~}q{^׵o]_٠]#n^yyy<ya\((((((ˆE E V<իT5*VԄ BR񆠩HI{;T@0hZ "! #%U{_םKw$S\g{^q>-uyyc1y焵ky^y,f$׮O=r8a9k&<@L!! R@N@dB@0pZT@0 Jx椖i"q߾~^۷tT7wRuSuSuSQEQEQE(QAQE6͑dGfEm Y؈ceFvhD$fH E`\(\T@&(""A& L##;ww.\Nǟל_?hlSO<<[6lٳg-_%|wq&8tϚnook/PPQ ATTJ@((P\*$T@(("*%H"!0;o.RK_:^_~}uϯoGGNC.QEQEQEEEEQ !V(|D@VQjB P! P$@ Tl 8T@0hZ " W^u.Kk4z뿌{^q>-uyyc1 k-s< Jr枽r׭'4 sfJl $%!IaP$,`\LLT@?0 IGJn\:Cg1>SPݽD)Ba}8/ET "!ATJ\@@((P\**T@?(("*%"S0L7ߎ8I.W7ן^?_q}?@{ QEQEQDQEQEQ !VVF_@GŻn<ԺOP)  0@w* @@*P)P *rT@_(("*&HB% Ba&w}]ܸL}|>a\((($EH(D"+DDHB3AC"`ҐdR !@ $!` La`T@0hZ ! "U{5Rk^k%~/{q{^q>-uyyc1yyz%\JSkDZӜE7!$$(H@,0 ^T@0 IDf Z{ rH*|zo#>|^۷tT7wRuSuSuSQEQEQEQB袁EQdbahl6z:e!!d'`#V.JDxHw@ HPaP T@&(""A&H"C33y_/Wwr~O׏y3svS׊Kj6~yyy<:pyVR|'7ﺋ{JR;ʂ@=aEDR@ AA` !P LP@T@_2 FAd!!Da3|_]˸J:߿f͛6|@b_(~P.aw|C̣=S۾͊D@^) Wv-K DP(@@,,0 N@T@(("*%H"d&w}]ޥܹw|L??Stl}G19?/(EQEQEQQEEQ"jDQԫV$8DP%.wI "ICh(@*,0  T@_0hZ ! Df f}w.\˩y~y.Wۏϰ=kۏ.n|[<<<y<ǞcKׯX^c*C^xIdZs'A0`%Jd(*Dx L@T@0 KD&Bax]֒4o_znSPߡJqMMMEQEQEEP( E։ٲֳeY#a ,%Fi "$@;XP ((L`T@&(""A' "03y_/Ww5%^gro|k?hlSO<<Pv>\>JP#wF7Sk'H\@<@ `TR(P $X LP@T@(("*%HB" Bb&w}]ޮ\lW _n<~~GNC.QEQEQEQD jE"$EUAR"(<@3z0RJ3Z P HX(P8T@?0hZ !0"U{5R]ˑqyyw_5ko<~~??>{^׵}uftwŻyyyyy众yφܖ9ZRpI0NS($@R $ H L`T@0 JDf Z{ -qrU9:n?Oׯv5 TTTQEQEQAPj(QE c[mzlDٱgE$V0$h$DFKDxHw@HPAP T@&(""A%H" DaFw+ܗ5SΫ99n)%5{?TS<<ZyiΣWވ B"$@Q XJP8T@2BFD Fa3|_jj\Z@˯>Gf͛6l#<űP++>Se9~(x~~}sk}wź<<1y^Nzǝy,Mk6Lf4R &I1U H@J`P8T@0 IDF FaEn Q;@ B@&iTT@_&("*& T&!wz%/wy~2q}?@{ QEQEQEH((((VEuj5jX WT AрY3R P J (P8T@?0hZ !0"U{5R]ˑwR/]?{k8|q|~~}sk}wź<<1yj5뙮r,:Ҟ]@2ĒLD"B & XT@0 KD&Bax\\ǿ?W7nݻB㪛(((5 E (QE6c/dG;Mٱb+;D a - t*P)` Xu T@&(""A%HFdg{\^]˼Ԝ;^?hlSO<<[6lٳg-_%7|/GWȇʥPy2.fB ;( Q$ X DL`(T@$Y$TA@$! PaFoӛ|z]ޤw%jg~U{o|Wٿ5sd}I3}OI?;CfKf?Ƃ4 HA4)8PgJJ$!@ $A0 LT@L *ܛZԸ oCpC)[G?4яqHx^h^p(aO`P?|?<< ?XT@6ӂU@;[W9^+r?W@t ??sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/44100-2.mp30000644000175000017500000010067612252354725025636 0ustar miramiraID3@;  8} hTALBAlbum Full Of Test TracksTIT2 Test TrackTRCK5COMMNone worth speaking ofTPE1 Test ArtistTYER2013TDRC2013TCONTop 40InfoN  $$'*-1147;;>ADHHKNRRUX[__beiilorvvy|9LAME3.99r$8Fã2Re 8  UY76 Ss$,sh+fxSv&D Nhѣna@ħGp !߁=`AG'L)q}|qI>;?"P1P A`E kvb4\BX 0(Hm9C5$Tdɑxw˦E(QT- g0 bAX  Lqባ])O.Dg.Ļ(% e>JcbHQňjJɉq@[~UH*@[Kdiϕ9J0<0̚ $ot L 1lhx1 6|A;p10LVKb< ꒑kxS>lϰN uyT\cPjo 8дXa"筦&cOgYdCho,mJ3-.kxٶ[hjf-DQ d4Ud`B ۘTIPقTRIMP0qr V̉r)vá<0 !/|t&P ql/ $Q    ð2(Ÿps`ayWRYz{革q:^"j_$T dŬe &aL^1JZ&HN H5e!3 ,@`N L(Z 5vcW͘.)mߧ Lo%ȆiMUtǫsuyANR q.( F+]4tL YЀN|#4Ä8E) P[k`<1>ÄV{ a2s"o&`P,J{4 fDn"4 HfRJjJtct`x"1i"5H&rdf%<$wN[ƂOJ"IEb4PH$7(C$EHPŸk߄fU vD֙ PD 14j)S_%k2.] C PCph#3 8҄ +| > 4bb7ݪ7P?t-h7]߷3D W8 )%'@\pـXmÎhx+ʼn5u,G%n+J9M\aETTP$P6 IG2j|[Bzu) -Ԫ@@$L%@1q`AjIU$ vD ^5} 3A@32 Q@  NIN[gH  ̯;hip3 ;3 W+7擶7+y)zdſZ)ğmg- u$9 <`Pf0nf|4l`I2zzf79naܚh)"Fղg Nÿ6x;;^+ւk=O1zD)tTZ,x̕MIϪ ]lMpauz  8r1H}m ĩL$ 5P49S{IEZ ?h0 #` @NH@v,J5($jk[]{-&ѮmL HIBNe:'߭+=3mH#M=0OB*<躂AXհfܯoסZm:@x1 7AW?\W1$2ʢP9slU.mZUږi[Mc8 .]" QUnu;dֱxɐ= #,DH %OAi@p:H 7.Eȥ REN;QͿ~ tY` i1&B smd*RN=cJ|ŭZ?/J@y.BA`%z[P\n*:Bv:`G0!SH #6 S0j>c UE0Iu g!T-1K)?fZKܠcY(,AyHAz!mL[Z@Qax=`lb b $1Ťz.jxsr[pZYML>}r$ @bh3n<$;5"!C<4I;0j+zF"Ҥr klِqvXw` Pc|# 8q+xG4COF$ lHy9x`Xʒ='&`C3`QeS I5W~(|BEpsů4[ &OSkGE b~ ULh$c0*';,`@@\X|P$)+WS.qa XqĊ#m /%dXsjp𯜒7Ǭ;Z_Bt*?d!:gC/f~ЄQZ&@zg Y`谄4X5zq/)SX}v04P @#kNe$-@n4n7%B;^*deoҾzV۫O,~pμ.!O+e9a&hË"86Ò9pXN0'Tq*v2djyRbIAb2a@PɒJ#R|(RivbD ]dh]50xՈ&WY^RCq@/j۴syYrDg,'MGt3NE C ,K0j"1Z ryݧW+Թ׍nn=R!A S8HB$Mm0}خMaTŘ2X``!Rg(\P$Yn"w"_c>J l$,iAjȐ\]2zZKr4 k^9%\D} tAA$͏z*C EnFXRoXɛvTd:;G q:iBFaa'j}F@jHIxFN& ؈xvD1L fWTj\R]CwwF2 s_#[T&dAntĴDlAYÃ* )OzfOܧP. :t^B* S1G( # wSeG`ˎO b3Pqjjw.PPHp3ōu-Gt FS 4:U\Z{`RUnLf<nrfRE\Ȕlws>M@,(eIe 8PL' RɚʘoN(CX@/434 bvZjt Bۺ"iS|IGE " 8O0j>#`0Y2+0H,LGZBps0&X8fE!cC''h 5j ' 0<K)UŐ5-CVt` 5Qx kFAc4txB1a4Ѻ ӡX@v/.鱕ILS^Ye 0Z Qd5 vI ΘP``c``Ff_$ZLvԦј8TِJSVUO4^ր1J cJ M0lqm"0 ֱA'L]M ƂlaC)l!W|,U1i`xx0"^,X$t"lÀ2Ҷ>>;w{oҀ6V!cpsPP *1  1XT&*7mT$p(P,v_曺<]Fɱ&X&.¢S1K:PGA"TB5~\0:,+&РL cʆjJR<)4q9yqHLWRi*Y[$ed栔sr,C^9I!7%d@~aXDYxURKmsɋյnsEĦa eT]oaпE(>JKnaUHME/4_ d] #l evw*Y7 q2B8 mY癘#mO@@:lZt499D_Vb  %9ՍeyA@hLĢ-c0DQ踊RDžN<侁X\\Ka!z0k~`T(#V +xe_3 ux6.ԬR۫E"LlnZf:nU_P:ۓcPҔޟSe@ q*6yj2q*Fyr۷mW_0 kBi 44Ȉ " KFcOEL9( @t(7x+'wEw(m/xJMs4r.t,0L Np;9aA-y$< ! B%ټ i "PpZ6>$N5P(BQ\/9brcLHLTgޫN[ RHmZ&`fΰmr bc8&jTa(XW*3-;ռ\t J]s1wq L,\% #\Mx+eAs 9Xa;EFiM6 B\`Uphp)d$-/ךM? Ʀ P̚SS2'fflGb"T G U-&ZŘZuNI=x5zDpX)Atk<2ضL"@l"r"H $SKߦ*Em iKZ? Q4(0-#)͡UGc (X%c ,@S-(=+ YJp\ 9 A!Mk24Wh j @4op, h,*]pL&6M{WF C` 1x1c`3 1,PD '(Z9*va$'{ɮpD0%?/ F6:YgY}Xe k*˗ Ȋ.%,|Ӑ` ܉&4#m#d8rT(3&P6`xG")*y}(Li eIVdQd*sHq1ԑPF*S/0h̕τv(Pp HatN %<-qPxGYHaU8%jE,]060B0$p0Ef` sbͤ pIjN6e l߆`r```-azt`U(U?kTJ{2 Yxj MՀ1'#V0 p", :$| ː"VݵbT; ˤ[ sR,0fYXeM/+)]({1Yrϡu, 7YDLn˥$D̨7urb* ɔLb\70 2SSp9r4` sK3q^z~xuK #}DaTi>g_v1`ɝ)vW4>^St/VHjvH% +T^f -`Lo w?9Z.ѭ<9SOkc`H-0`P` `oNa``_6a 8kNjr:cJsgtaZN}ΨY<9I7;C6`W,``2`_B` M((\G\JÄۈAؒeF1KHfmMhYb'Kotd*ԱSOS7uMեyĒfϛPO uynLHpf@#D!]j\K_fJ@XBlSvkJDY|9&F;HMVS[.FY Xڷ)ok*IʒƩ,DU4?(ʱ_wwwWp:ʾ *[mq0#8yUTI0m/8˩#2L9?FҶAK(*ǜLMgP2G 4<HqA˭L( Y]j'*MUȣn ȒLpD1-ClȌYH'_G( =qM 4 )9Ngja$m .Z晙LJ/0h"9iP?b!2x@QFVa:A72A@őXm\ Sr ^N7!gFx1\<{T4pP pqP]6 8K(` xyf;B@U`tLXK/v>Ga"+e:^Z뵖R[FqهtSZ${* *2**<(qA$N  0`nuf-6P%3BZG syM  " >Tj܄rjUd mk+{A{ @ <;R[M È =iLc pEļCy8񅛝'P9fOU^}ҫ}wQ**/4ɰ8Dk__ZVj S8}K$&^v硿-1ѵНJIeRP05L2!^Db&LBQQgqKTz _}Qބ&kd`26u(f:&uebӷiùw8ϩBa"Mf4!=} S/8Q Tm:KF7[h`A oL)t>MZs' ˃3aEKSi0l`xataơ.5@ze@vPcF$' !d+^HUץhbV|]D.41!?ϐ@u!I8cW/V+yrwfMmB;ᇴG $.z`BZ@ER& ŋ kiHp/C|KX z TM1 #(>3u7.m E/ 7¡FB S)75,LJEբM4\i-ib5Ҧ22/C`5i[bK:F#'fcZ? ȍ.@p\$68.uZK:.J#ڔ%&Oɪ@wY#i촩 @^Ld&6H9E`Q,VE[wHrs*+ڰE,S 0 sXlhiB6DjKbVP& rਹyQPE$OZiě2 l[#/c1`UD lcS!nN+0l_I}&PyRs(mprm/*I# TQ q##`0w;\{Z8:8vܞLXWo)PM!6 HDQ"iu1 *0к$زVdaU-] мOM m,EA?0P@3UbS8NOYb:-}Ø=m+>snw &4eC(Z4U07 ( ŕȄNA%"2»-{X̥}>e6H%iAiPWׯB, i01/X_^HXuu f-b[|pOH^|RT {UMR'@Z(,O[babaRUɡ(mǭۋA޽ T8zg l*$V&.u0k\\F Cd O *05Vo 8PS*d 4wё1D!Oޟl:z{ G[wlԌeiI@Jf۷]t- 1&EU]f00Yњt}g^xi§eZ`\m:.zֽɠg܎fF\QZ@cA1p4IUn1)ۢ2:\̉e36n)ڷC v'X T-Y F(DV 0%$DFƬ>`(Mō&K ^fv,W!D'h m IOa$w3KJ0d4p#%ALc;J-aa/TN #` EQ"`sdrS5KN$ ]LBClMjdi?S3LjǴ]D"(KaDJ!L-?[!le^FF_@(^błf`xVSE}#n4+,̠#oa=\p~70l5`0np`P &ѱ.i/~ooT~fy?!׉tNzc:H$ MsHբCw;PY 'aDwƋul1|Ԅl"$]~֠8&j& $mQT^(؋m"v_t":"ErkL(t ];>u`nI/CIÊ pKsqv!ba +p2cEP]ezhg[n.{Vυc"6HEXPT&CiPd :5gD0qzUzZ#h3+k쪠P pt)T-'t‰j5 kR UVj0V, ^zbKzaBKi}\s5CŠK̠ XQ}(HvH"fD@1+3,%`{˄NBE ζiOF٬40-lbeHYY\|23`Dpm$Сg=8>Kdm/7ѥ FOFrQޅ%? Zע kI6_|]v,=ӳVPjԼs.,'Yc 0d9R1Sk[Xx \ K l *a(L*GPw]B}.w !n5RQZ d2`C/źbC|\S`M!. wk7옲DnN0nTG0LH35əf!4xp 0rӥJp~{nM8b%c^/SkC]ȵ xLM1 bc 'gh@44ԛ2KeAƲ?^oÇէoO .)rӶiE=Ϻ߇6ɿwRmreop As ]mc¾ 6ѐ*i>:CW)E'|"p. ھG}K3v ,p6'`|!ViZҒ`W;d((XFfn##*3k\!sTpeQ3%p,! PD/xT`Mtw*:#硠nR*"kgNbraº`  :XEej\@ z*ѣz%+.`e1ǧȳKْ53FZ)MDq"d:(`M- CcpxLI$%Z^@WBϟނ;jCdw?k!" lP|혉\QQ*pU9|Y7# ~bҾ:Q+Rq4GVvZp &g s y NbqΆ$b+$G*~ ZX1jd)WYVD(P2$ȚA#O@gXg^nI܋rUڋUrm䳥 A~e"`l)F`` \UƱ8li#/AP`G ^ -yAW#`0gD9 2g̢ޥׯ7_w훢F_" UlK[[- ՘@[s`bIdӨ-g)8',1U0Cc4|(#Xdxj]̴QXS|o#Et⇂ 񅡘yف8"@-*LuCzVSUURSF*%o]d EdQ#S0 {[jUb3(BǢ0fzɝBT#s d8Bؗ'zeˉMބ˒%P-,-$Nt@V8dXp1BH #Cy0;ۈ{/Mk>1TO8f,@$n0) 8)8v-`H<`a[` 4@ H..1DOB3G*3ki(>̪[3լ`4oa' o qX% "pzòH2 X"Uf\+|ADc1NidbޝOJVCru ?S3l6yW%m/TpFՉ@ކ &̫_P 4:3c0 rLT&Du9'cH0>J |,1R 5!F?b)]i8"̂=h Ҩ0x =48(8P|,_t]TRIzz{ePpD_zB4nqEH. b-PR<= el(+kdCՌhh 3L[F%hq雷>+R^PX0^&du XG0d5 $ isGv5 }Kf6fπ+1QkAHe(c @;y1#P0@.=\dxpH H-x"e%Xl~>VQ#IaX[!L;gRPUF0F!D-c( H[RjGw 䚍}h1f 5 F$F 5-f,?8'f>?&PxxF&f8r%Պ wɤ!8԰Q6!yhm{m匌Nݯq)looÎ{?eW:j#V0@Š\UbQQ8Y00*,tLE* EX@$ *;Sq I$8 m9&f=IL4x ppI&%ZR(j;``4.wb^>@bCș2PU?-o 9ImcYҡwۗK$2r9wt G I1"4W :#iLZa0rcm%xtc1aa2OzOT,6cy2:f=Rՙ"Y24)i 2 DhŴH{4ǧ@9u3:V $cHŮP!CO?qDPH(O t"+Y&V]XɓUK#jg0+vϵWt5/Pu TKOO:`1mj:K3f?RL˶~;GUl֠LB[Jı+[ ȃ];fLŰ݇Uad c-żbhZSxqJ`͑ \`J/qr15ӍsOMv2XFf/B }H5Ȭ¨c',h'PëaS\HH=.gYLW#);#oXT̫ہD2P&MHD*bmvB \l24'h""PMbSĩO;z"0v лՙ݉]HnQNx}&EM*;QvCZEA*j:nhs~HRT{|G8Cr ̽E*#d3*)BG ,S)k{@74<`čl2 'P#v9wN H|YB3@qqQ &Aj\Nioh 묭Y3ʿU`9pg0LUvcQmˢEiN!r_zn2isOsMdʼLb\+]ԩ1Y%^iMI.5(2TCcV#㴿GlfG !h*XV;^OCYs5?xrgsϿ9ᙄ#:ʹ.6IQ-7t:& hF!jydM*qr ¬20r%pAOG.}6nȪԧNքCFZXu?;RDLMh^ LK  },G\XAA(PpʩCA22sW1,JN",cl@^.+MUd+aېB&xTR` {+S!D;7lT(:Usɭs`̶w],,&B!uF.*Q@RԬZ\XQ`6!Eglh h\0:19fJfKRO0_ZD2Еk̯L6(0IltBƊy"Ex'4܂QI^>LV앿_^sMS-w1|vT3908焴c;d, &LYvQ,\}t]X{$=S+JCH C` I= *`3 v9Q <0*`2Qd tg\zD] =0cGlU S qTv٭M~^AgeJRr f#)̽yR&Hf[dYXhPG#*m$aCZB&Z@nX(Rͩkzl# hiᒦB R;| (j\PYdM ER:P'(  E"d3 Jd]+W՜a | $WWkǯWre_@˽?_s{@4#jTa{u l {ꪻ8xW'"~%BI>Os $)QuƐCB=Z [Dջ>-=4ȁL, NKPAU'+.*ߥ`5""D S7bFU7 õzh( ".04$1'1SŮc={,[tUdݭ6#nö.]Ͷ%0( P?d~Pyrx Y_u/RkBF #` I&{ƛ(Ы"R=JR3 "!>( ̘']M&J%#sW,EƏ4ҷY-=Zn#b,!^ltx/Y2ڃgO0dhN1&8h&paRR0)Iu'PNj+P~ m-0݁-$WޛUR*\Qu//,ʴU[$Z$yۈU7+ !h"ZruP'@O[Ito>YmWBv 1G%$|_e ,  9zRڬvg۶kk\wz`*[^="JjZw;EVW~mǤ_Nm}/kBL # G C#`3  DL9"5P0yGJfrqOMZdpp5aЬ;]Jʩk9t]`%;2J6:=Y Q(aϵ TD+e ~8a!pPQ Ł dW?C/Uyʈ۶uD{|b2UϰtҬg^F2{L0$"]DA ((3PdZB!30撑,&%rďD $XH6DX0j% ښ ]lUhr44z<]`9QgUvCkk^lhԖgwu)yZ3/c$/rӵMxWED{Clb^LGkw0KK(}} eNH9̖Ԡőr6e@$ ,8訟evu {}XTEK<-% V\6&fRUA#b^0ȕIZ`őIXb*O4r#?(ϡdUh;Wkd ݭeۀ 2fٸF& ,?<|~c"ynV֗[ lvfOUP腡ʻ'`)Vs ES|XGH. 5ihw"3 L>\^vQg!ٲ|[|bo" 0ጚ'2)XH8ABd( ED Pa]Ρ݊PͶAͮĀiF&cAc3GQZ Jh c1}\E/^j^kgk UM/Uf.\FA)A %%g{@f$f6fC97%(WܟA%0U .R q?%mAn+D],:0S=nz bȌ@ H KGs޹H EbOerRnE=:EQIRtwL^US=SB^x\ G1Q#d UENin*͕*5$JmP,7)J[{&}OHʢLk``tQHjJ{WII #Kp`.`@ dhwxr^n?PuMV^qΘF>B ՜-j99KԴoNnLVyǪ2L4Sl6*ջW2*F)S@!HزƤ=Gc(C_:0C1ә/7oDksFN x44$_8 0hv Dk@3Who}?(=dtg}4GT{o]{anej2` )!RdB  2҈Rr>$ ]KG=׌{u-F>Y)lD+.j몣FVڊqzBrP66J1"„yHF4GYK+ bF#Cc=5.D2  r;9ڏfGI ٘tYͲw$ј-wۙo2 ] A8 [yD]]ē݂fR~@򈠈@aIܨxNx!0Paar#惆"\@X(*$mG Q$Q5 P{a0s#$n`f`- nA1]j2ڊX|fǥu乬6:n슓EPClY È EqJc3n̩Ecvv>~TDTe:wY@8#|Ee2l/Wnj-F%׌*1=Y'9<e>JbH"C 8OĢ$P[}qW}2\N{ShSD@!IBͥk}ko!I5gf55Ȗ5F1Z:Tڊb;5M-"nnv'#1aʓb]Ppt-{Jf-Noea2X HQՌR`&PNJ#&C]? vd 0P1 o#0Q 3s!pؕ۷nʵS!yZS߮XEMk>Y4Q&H X 1KK##``v3(P{ '(XȢCEɆC!4cτL"*H-B#6X:\Y$9ȈԱ]&H&L/ta}ݺ^{Ȓav"mnV}}{NFnJ`V"(E1*:䰑?Lwrugb&:gPK'l\X0Fg XJLBU!bۀqI&{JlVh sΗ+B &IФ PrJ\r{ [!կp&=d-=UY怓Dk-UEH b~ HE %c`0cfX?;ceilE\ៜȷ,U!Q,VT^APфY93ſJx'rz$`{iairgZ; MmUSDlpHg!3a F Xbb6.}m 5BbsʙIs ‚08 GK1ܭ.1̱4}8IVjRc$)Vz)/YJkk"ɼփ?]%mNL z­- #AJr! sPɥE\eo#i"N*ƌs/ n1>rVM%!!0 A l0`E}cKVjwhk>[ sؒAu/`h ϏH<">>ENaϨ%S &3G xc0u7D8=C|k?kp3 c03 0 &GQK DY hhJY( xM:XgPBYBLhg<k:ԚƆNִЩe ttΦTY5g?lRӲ4Z@ٞi3$_Vw8E0=q:1 UhB;&.6% 0 uu_`-H 6Ncb8pDUC}eA0lq1≍-&40a' Pu0]J+j;5tYYD*UZc31RZNcJ GO c hAHRb/.qSs('βVNR?uݹH,wBSS?D@+MeOklb}IZ # sRweCHq6X|#W01M N(5i[oy1b @4Ezv 5d]+i P񹧢,/D10tx-(JiVƹ=fյl =.g%?oj0t)g{BܵTڡkW&Hu.*eNT'2"^) F5݋] wKD?1g1YE  M$"`Ӌ02$*W*2dΟ;})rvF|o=]@S;cirC;qnb碄t<\c~^;FM 3(TW(FtA~;rw::ux\^jmW 4V}+о@ IАkyY l߭0x ҚU z?wO2!JĴ;-XՀ`Neif>#Z-rE6@@hwD0G@^tQ(kE>r*d $&;밻FcF   k/3P&4ꠛǛNvkGةP^r*mM\ #/P;\J&. 4Q% 2_Ktˀ`FYwt>YG3!GG ٧{7cnR]!UQS起n-&E4"G3AVr3oXL U]V=VYNv6@ d `8 ] _fU4dcK`.-05Qv T)%>6O<˄]nR j@̥U%p )1bEtb\Vz,zmܦT3LC sվޣ]~muDk '3@=0'[0Y",Qpi}.Ds1O$ƕcսVΌO\ÕNw8]Zϱꨔd C uVVYY'gмh!ERk:^Ü O4Q12#0@JJH"I˘.I48>=p7LQI(_SFoSE&@&E!&*g GR[>UqN1w~Iɭ@^65 GىFPK*wb66 ~zi/}Q]jnRlg %Y##ek=^֓2(ʕn#930Yڨ-V8Waf^!ÈtaO 1GM.,c1±\b\P}q31U!B]TKJ.Y:{*~\Dk:dIa !UIc4 pfA 0e;%ds !B~`;vW0$Q9̘P}he陵2И !]H`oEv/(Sk f{$zA(J#M3  hf4 !=7u5|ٹlǕrP$?WnQ7s]}Hҥk) %``@Қ"K Sg,5^$PٖZ*wQ豰dB ^&m襉GX@mi(kqmr˙a0XI:|#tk/9ӞC;oW98lއNs_{f{&.0<dO2D%$-j_^@V#h,Tp%Y6ـ@ s%0ͧ߷*E_Oyr'yh E@HҤ]Xpy:J׃2zOBRFJ=*=Rk^ظ$&KK1 ,4ȈZ{sikT FNkѤF(惚&e{-I r"E9w+mNqg2tyLTQrû5}Hߏ8d-7;-6y--M u"D5S0@`nfema`.9 ,J^γ~9<4ASvWc4D(f*7|PfeJ0P󗵗m)[-?O;jp'x൝J5:-:LT;pd Eq*UTVFKi}-O@{K$i4;ȀS @CUBv2lA X"T>ǹ.Ơkjkr]hZvvټQpvZԏ&CHm|Uy"#PU:?2?̈MEZsVӌEFyIJ(@T\0TqtZJI=Q;P]ZV[D"DMl\ ,#:T77_a{&N:+IңsbaoG:Kzm눃lsn80n4*w6gVd ]l.oa܉f1A-R[-k;y >)Y!/]FWꀓDZ Wfh " Ae8#`0ϱ|^Owsݯ 1"͸n<(PV CЍCcrp5p.;>WhÞfh:kH;U@nl\q 0r{[A2^F"LWX0BY}- 4YHd*r;M&"ЧY.o۪+qUUl=|{j>"&W?=uʒ6VYLL4DɩeeXZ7S=CęXyh*=`,cEˆ[eEG}UܸVR Vm)Z ^`|2nf! A``CDF~6/4Ӝ[)B4zBKXΰU/֥+Yk|ERkClJf C IMi##3 (uDܡkG*k*浩9Һ'-# CaQFi/kt?*YQ/رΘNjLYEik ,'Hq@ނH-A̒u[Q:l HJm^@it$a DfY9 wR-rͦ٫j7Wb%Oo]nqjD\k4XSD EOpu>_#3RlvPn6ƮD;T\ Eq'*L<-٥Quy__,Q Fm@ꚅY5" HEz3uPF# !D`͊M:&HT@D-0*W>] MĀmR `Xdj``4)7FX?XH_ӽkeiHWK~t U{6a1ʷ8َ h4 Gtn>/W5#eJ81uĜD2iٓ0)h0 `O^-$E۬2YXq*H!+Nu|瀳DClV8 cL G#T0IZ6}@IҞd3jq .-֐ڸ(1$($1тI8%*ءR<5'#28aPafƤ28DJipj\7Z$,o: Guw &(r*$u\ZEG 2-4Xx$艺@1 IhAXX4 p  [ti/ h!ĥvv.Å K7O, ꥍ),s:z|RK)9%Ϻ~yT@@h 0?8s:>`w$SSO{L#fDqjԡj@LD Z [9 :e(O/_ EѢ )2GaRk*Xh CbY1080=}629 Y0 *0 0 @ :`P2ɀ aE"7Ф,@7OXD@&Lգ  QKbI#蘡_ˇ"A֒̔?K T@Qf ]t"+Aq hΎVlB 2Lva"@sGP-U+׫qI?PAR &Z' ܿpVeP0'iE" BR,-|)?`#^$"HrFgZ MTlf3#<]/HiWĚ3'jLAME3.99.5ĀhKzD 4sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/48000-1-16.wav0000644000175000017500000056705412252354725026171 0ustar miramiraRIFF$WAVEfmt wdata '0:BK!SZUag#m r@vyv|k~l~v|yAv r#mgTaZSKB:0' s!Ĵ}tݒEffDݒs߬ô r '0:B=K SZTag#m rAvyu|l~l~u|y@v r#mgUaZ S=KB:0' s ô}tݒEffEݒt}ô s '0:B=K SZUag#m r@vyu|l~l~u|yAv r#mgTaZ S=KB:0' r ô߬sݒDffEݒt}Ĵ!t '0:B:K!SZUag!m r@vyv|k~l~v|yAv r#mgTaZSK!SZUag$m r@vyv|k~l~v|yAv r#mgTaZSKB:0' s!Ĵ}tݒEffDݒs߬ô r '0:B=K SZTag#m rAvyu|l~l~u|y@v r#mgUaZ S=KB:0' s ô}tݒEffEݒt}ô s '0:B=K SZUag#m r@vyu|l~l~u|yAv r#mgTaZ S=KB:0' r ô߬sݒDffEݒt}Ĵ!t '0:B:K!SZUag!m r@vyv|k~l~v|yAv r#mgTaZSKB:0' s!Ĵ}tݒEffDݒs߬ô r '0:B=K SZTag#m rAvyu|l~l~u|y@v r#mgUaZ S=KB:0' s ô}tݒEffEݒt}ô s '0:B=K SZUag#m r@vyu|l~l~u|yAv r#mgTaZ S=KB:0' r ô߬sݒDffEݒt}Ĵ!s '0:B>K!SZUag!m r@vyv|k~l~v|yAv r#mgTaZSKB:0' s!Ĵ}tݒEffDݒsô r '0:B=K SZTag#m rAvyu|l~l~u|y@v r#mgUaZ S=KB:0' s ô଀tݒEffEݒt}ô s '0:B=K SZUag#m r@vyu|l~l~u|yAv r#mgTaZ S=KB:0' r ô߬sݒDffEݒt}Ĵ!t '0:B:K!SZUag!m r@vyv|k~l~v|yAv r#mgTaZSK!SZUag#m r@vyv|l~l~v|yAv r#mgTaZSKB:0' s!Ĵ}tݒEffDݒs߬ô r '0:B=K SZTag#m rAvyu|l~l~u|y@v r#mgUaZ S=KB:0' s ô}tݒEffEݒt}ô s '0:B=K SZUag#m r@vyu|l~l~u|yAv r#mgTaZ S=KB:0' r ô߬sݒDffEݒt}Ĵ!t '0:B:K!SZUag!m r@vyv|k~l~v|yAv r#mgTaZSKSZUag"m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´uޒ􍾉EffEޒt~p '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´r  '0:B?KSZVag"m r@vyv|k~l~v|yBv r"mgUaZS>KB:0'  pǴ}tݒEffFߒq´ r! '0:B9K SZWag#m r@vyv|k~l~v|yBv r!mgUaZS=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yBv r!mgTaZ#S=KB:0'  oƴ}tݒEffFߒqݬô!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~l~v|y@v r"mgVaZS?KB:0'  q´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffEޒu´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r!mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZWag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' oƴ}sݒDffDߒrݬĴ!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag!m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´qޒ􍾉FffEޒt~p '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffFޒq´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r!mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' vƴ߬|sݒDffDߒrݬĴ!t" '0:B:K!SZRag$m r@vyw|k~l~u|yAv r mgTaZ"SKSZUag!m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´uޒ􍾉EffEޒt~p '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´q  '0:B?KSZVag"m r@vyv|l~l~v|yBv r"mgUaZS>KB:0'  pǴ~tݒEffFߒq´ r! '0:B9K SZWag#m r@vyv|k~l~v|yBv r!mgUaZS=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yBv r!mgTaZ#S=KB:0'  oƴ}tݒEffFߒqݬô!s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~k~v|y@v r"mgVaZS?KB:0'  r´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q~uޒEffEޒu~´q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' p~tޒEffEޒu´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r"mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZWag#m r@vyv|k~l~u|yBv r!mgUaZS=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' oƴ}sݒDffDߒrݬô!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0'  q´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffEޒq´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r!mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' vƴ߬|sݒDffDߒrݬĴ!s" '0:B:K!SZRag$m r@vyv|k~l~u|yAv r!mgTaZ"SKSZUag!m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´qޒ􍾉EffEޒt~p '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0'  pǴ~tݒEffFޒq´ r! '0:B9K SZWag#m r@vyv|k~l~v|yBv r!mgUaZS=KB:0'  pǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô!s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~k~v|y@v r"mgVaZS?KB:0'  r´uޒ􍾉EffEޒu~p '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~´q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' p~uޒEffEޒu´r  '0:B?KSZVag"m r@vyv|k~l~v|yBv r"mgUaZS>KB:0'  pǴ}tݒEffFߒq´ r! '0:B9K SZWag#m r@vyv|k~l~u|yBv r!mgUaZS=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' oƴ}sݒEffFߒrݬô!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0'  q´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffEޒq´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r!mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZWag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' oƴ}sݒDffDߒrݬĴ!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag!m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´qޒ􍾉EffEޒt~p '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' pǴ~tޒEffFޒq´r  '0:B9K SZWag#m r@vyv|k~l~v|yBv r!mgUaZS=KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' vƴ߬|sݒDffDߒrݬĴ!t" '0:B:K!SZRag$m r@vyw|k~l~u|yAv r mgTaZ"SKSZUag"m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´uޒ􍾉EffEޒt~p '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´r  '0:B?KSZVag"m r@vyv|l~l~v|yBv r"mgUaZS>KB:0'  pǴ~tݒEffFߒq´ r! '0:B9K SZWag#m r@vyv|k~l~v|yBv r!mgUaZS=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yBv r!mgTaZ#S=KB:0'  oƴ}tݒEffFߒqݬô!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~l~v|y@v r"mgVaZS?KB:0'  q´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffEޒu´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r"mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZWag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' oƴ}sݒDffDߒrݬô!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag!m rBvyv|l~k~v|y@v r#mgWaZS9KB:0'  r´qޒ􍾉FffEޒt~Ǵp '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffFޒq´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r!mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' vƴ߬|sݒDffDߒrݬĴ!t" '0:B:K!SZRag$m r@vyw|k~l~u|yAv r mgTaZ"SKSZUag!m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´uޒ􍾉EffEޒt~p '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0'  pǴ~tݒEffFߒq´ r! '0:B9K SZWag#m r@vyv|k~l~v|yBv r!mgUaZS=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yBv r!mgTaZ#S=KB:0'  oƴ}tݒEffFߒqݬô!s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~k~v|y@v r"mgVaZS?KB:0'  r´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q~uޒEffEޒu~´q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' p~tޒEffEޒu´r  '0:B9KSZVag"m r@vyv|k~l~v|yBv r"mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZWag#m r@vyv|k~l~u|yBv r!mgUaZS=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' oƴ}sݒDffCߒrݬô!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0'  q´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffEޒq´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r!mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' vƴ߬|sݒDffDߒrݬĴ!s" '0:B:K!SZRag$m r@vyv|k~l~u|yAv r!mgTaZ"SKSZUag!m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´qޒ􍾉EffEޒt~p '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0'  pǴ~tݒEffFޒq´ r! '0:B9K SZWag#m r@vyv|k~l~v|yBv r!mgUaZS=KB:0'  pǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô!s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' vƴ߬|sݒDffDߒrݬĴ!t" '0:B:K!SZSag$m r@vyw|k~l~u|yAv r mgTaZ"SKSZUag"m rBvyv|l~k~v|y@v r"mgVaZS9KB:0'  r´uޒ􍾉EffEޒu~p '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~´q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' p~uޒEffEޒu´r  '0:B?KSZVag"m r@vyv|k~l~v|yBv r"mgUaZS>KB:0'  pǴ}tݒEffFߒq´ r! '0:B9K SZWag#m r@vyv|k~l~u|yBv r!mgUaZS=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yBv r!mgTaZ#S=KB:0'  oƴ}sݒEffFߒrݬô!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0'  q´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffEޒu´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r!mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZWag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' oƴ}sݒDffDߒrݬĴ!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag!m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´qޒ􍾉EffEޒt~p '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m rBvyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' pǴ~tޒEffFޒq´r  '0:B9KSZWag#m r@vyv|k~l~v|yBv r!mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' vƴ߬|sݒDffDߒrݬĴ!t" '0:B:K!SZRag$m r@vyw|k~l~u|yAv r mgTaZ"SKSZUag"m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´uޒ􍾉EffEޒt~p '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´r  '0:B?KSZVag"m r@vyv|l~l~v|yBv r"mgUaZS>KB:0'  pǴ~tݒEffFߒq´ r! '0:B9K SZWag#m r@vyv|k~l~v|yBv r!mgUaZS=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yBv r!mgTaZ#S=KB:0'  oƴ}tݒEffFߒqݬô!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag"m rBvyv|l~l~v|y@v r"mgVaZS?KB:0'  q´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffEޒu´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r"mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZWag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' oƴ}sݒDffDߒrݬô!s" '0:B:K!SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SKSZUag!m rBvyv|l~k~v|y@v r#mgWaZS9KB:0'  r´qޒ􍾉FffEޒt~Ǵp '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´uޒ􍾉EffEޒu~q '0:B>KSZVag"m rBvyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu~´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0' p~tޒEffEޒq´r  '0:B9KSZVag#m r@vyv|k~l~v|yBv r!mgUaZS>KB:0'  pǴ}tݒEffFߒqô r! '0:B9K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#S=KB:0' vƴ߬|sݒDffDߒrݬĴ!t" '0:B:K!SZRag$m r@vyw|k~l~u|yAv r!mgTaZ"SKSZUag!m rBvyv|l~k~v|y@v r#mgVaZS9KB:0'  r´uޒ􍾉EffEޒt~p '0:B>KSZUag"m rBvyv|l~l~v|y?v r"mgVaZS?KB:0' q´~uޒ􍾉EffEޒu~q '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgVaZS>KB:0' q~uޒEffEޒu´q  '0:B?KSZVag"m r?vyv|l~l~v|yBv r"mgUaZS>KB:0'  pǴ~tݒEffFߒq´ r! '0:B9K SZWag#m r@vyv|k~l~v|yBv r!mgUaZS=KB:0'  pǴ}tݒEffFߒqݬô s! '0:B:K SZRag#m r@vyv|k~l~u|yBv r!mgUaZ#S=KB:0'  oƴ}tݒEffFߒqݬô!s" '0:B:K SZRag#m r@vyv|k~l~u|yAv r!mgTaZ#SK$SZPag"m rBvyw|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y۬yuޒ􍾉CffCޒuy۬´y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬tޒ󍽉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~w|yBv r"mgPaZ$S>KB:0'  &wڬtݒ󍽉BffCߒvyܬ´ z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~k~w|yAv r!mgOaZ#S=KB:0' %vڬsݒ󍽉GffCߒvzݬô! l '0:BAKS~ZRag#mrCvyu|k~j~w|yAv r!mgYaZ#Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDx|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S:KB:1' "tʴ㬀rے‰FfgDo|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB:1' !sɴqےFfeEo}Ǵ$p '0 :B7KSZUag&mr?vyv|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEp~Ǵ%p '0!:B7KSZUag&mr?vyv|l~l~v|y?v r'mgVaZS9KB":1' q&ȴpڒEffEڒp~ȴ%q '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '0":B8KSZVag&m r?vyv|l~l~v|y?vr&mgUaZS8KB!:0' p%Ǵ~pْEffEڒqɴr  '1":B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p$Ǵ}oEefFےqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$ƴ}oEefF‰ےqʴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o#ƴ߬|oDgfF‰ےrʴs" '1:B:K!SZXagm r@vyv|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|nDgfF‰ےr䬾t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgTaZSBKB:0' n"Ŵ߬|wDgfF‰ܒr䬾u# '1:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ŵެ{wDffGܒs嬿u$ '0:BK$SZPag!m rBvyw|k~k~t|yCv r#mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒt۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y ´۬yuޒ􍾉CffCޒu۬x '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ%S>KB:0'  x۬uޒ􍾉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  &x۬tݒ󍽉BffCޒuyܬ´ z '0:B?K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉BffCߒvzݬô k '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô! k '0:B@K'S~ZRag#m rCvyu|k~j~w|yAv r!mgYaZ#S=KB:0' %v嬂sݒ򍽉GffDߒv{ݬĴ! l '0:BAKS~ZRag$mrCvyu|k~j~w|yAv r mgYaZ"Svyu|k~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDw|߬Ŵ"n '0:BBKSZTag%mr>vyu|l~m~w|y@v r mgXaZ!S;KB:1' "tʴ䬀rے‰FfgDn|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ!S:KB:1' "sʴ㬀rے‰FfeEo}ƴ#o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴ㬀qےFfeEo}Ǵ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEo}Ǵ$p '0!:B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB":1' r&ȴqڒEffEْp~Ǵ%p '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q&ȴ~pڒEffEڒp~ȴ%q  '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' q%ȴ~pڒEffEڒpȴ&r  '1":B9KSZVag'm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p%Ǵ}oEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o$ƴ}oEefF‰ےrʴs" '1:B:K!SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|nDgfF‰ےrʴt" '1:B;K!SZXagm r@vyw|m~l~u|y>vr%mgTaZSBKB:0' n#Ŵ߬|xDgfF‰ܒr䬾t# '1:B;K!SZXag m rAvyw|m~k~u|y>vr$mgSaZSBKB:0' m"Ŵެ{wDgfFܒs嬾u$ '0:BK$SZPag"m rBvyt|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K%SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y۬uޒ􍾉CffCޒuy۬´ y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬tޒ󍽉CffCޒuyܬ´ y '0:B?K%S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S>KB:0'  &wڬtݒ󍽉BffCߒvzܬô z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgPaZ#S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~j~w|yAv r!mgOaZ#S=KB:0' %v٬sݒ󍽉GffDߒvzݬĴ! l '0:BAKS~ZRag#mrCvyu|k~j~w|yAv r!mgYaZ#Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t䬁rے‰FfgDn|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S:KB:1' "tʴ㬀rے‰FfgDo|߬ƴ#o '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB:1' !rɴqےFfeEo}Ǵ$p '0 :B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB#:1' rɴqڒEffEp~Ǵ%p '0!:B8KSZUag&mr?vyv|l~l~v|y?v r&mgVaZS8KB":0' q&ȴ~pڒEffEڒp~ȴ%q '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' q%ȴ~pڒEffEڒpȴ&q  '1":B8KSZVag'm r?vyv|l~l~v|y?vr&mgUaZS8KB!:0' p%Ǵ~pEffFڒqɴr  '1#:B9KSZWagm r@vyv|l~l~v|y?vr&mgUaZS7KB :0' p$Ǵ}oEefFےqɴr! '1:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' o#ƴ߬|oDgfF‰ےrʴt" '1:B:K!SZXagm r@vyw|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|nDgfF‰ےr䬾t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgSaZSBKB:0' m"Ŵ߬|wDgfF‰ܒr䬾u# '0:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ĵެ{wDffGܒs嬿u$ '0:BK$SZPag"m rBvyw|k~k~t|yCv r#mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒt۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y´۬yuޒ􍾉CffCޒu۬y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ%S>KB:0'  x۬uޒ󍾉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~x|yBv r"mgPaZ$S>KB:0'  &x۬tݒ󍽉BffCߒuyܬ´ z '0:B@K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô! l '0:BAKS~ZRag#m rCvyu|k~j~w|yAv r!mgYaZ#Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDx|߬Ŵ#n '0:BBKSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S;KB:1' "tʴ䬀rے‰FfgDn|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ!S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴqےFfeEo}Ǵ$o '0 :B7KSZUag%mr?vyv|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEp~Ǵ%p '0!:B7KSZUag&mr?vyv|l~l~v|y@v r'mgVaZS9KB":1' r&ȴpڒEffEڒp~ȴ%q '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgUaZS8KB!:0' p%Ǵ~pْEffEڒqɴ&r  '1":B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p$Ǵ}oEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o#ƴ}oDgfF‰ےrʴs" '1:B:K!SZWagm r@vyv|m~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|nDgfF‰ےrʴt# '1:B;K!SZXag m r@vyw|m~l~u|y>vr$mgTaZSBKB:0' n"Ŵ߬|wDgfF‰ܒr䬾t# '1:B;K"SZXag m rAvyw|m~k~u|y>vr$mgSaZSBKB:0' m "Ŵެ{wDgfGܒs嬾u$ '0:BK$SZPag!m rBvyw|k~k~t|yCv r#mgQa}Z&S?KB:0'  z ´ܬyuޒ􍾉CffBޒt۬x '0:B>K$SZPag"m rBvyt|k~k~t|yCv r"mgQa|Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K%SZQag"m rBvyt|k~k~t|yBv r"mgQaZ%S?KB:0'  x۬uޒ􍾉CffCޒuyܬ´ y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬tޒ󍽉CffCޒuyܬ´ y '0:B?K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S>KB:0'  &wڬtݒ󍽉BffCߒvzܬô z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~j~w|yAv r!mgOaZ#S=KB:0' %v欂sݒ󍽉GffDߒvzݬĴ! l '0:BAKS~ZRag$mrCvyu|k~j~w|yAv r!mgYaZ"Svyu|k~m~w|yAv r mgXaZ"S;KB:1' #u䬁rܒ‰FfgDw|߬Ŵ"n '0:BBKSZTag$mr>vyu|l~m~w|yAv r mgXaZ!S;KB:1' #tʴ䬀rے‰FfgDn|߬ƴ#n '0:B6KSZTag%mr>vyu|l~m~v|y@v rmgXaZ!S:KB:1' "sʴ㬀rے‰FfgDo}ƴ#o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEo}Ǵ$p '0!:B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB":1' rɴqڒEffEْp~Ǵ%p '0!:B8KSZUag&mr?vyv|l~l~v|y?v r&mgVaZS8KB":0' q&ȴ~pڒEffEڒp~ȴ%q '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' q%ȴ~pڒEffEڒpȴ&q  '1":B9KSZVag'm r?vyv|l~l~v|y?vr&mgUaZS7KB!:0' p%Ǵ~pEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~v|y?vr&mgUaZS7KB :0' p$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgUaZS6KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|oDgfF‰ےrʴt" '1:B:K!SZXagm r@vyw|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|xDgfF‰ܒr䬾t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgSaZSBKB:0' m"Ŵެ|wDgfF‰ܒr䬾u# '0:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ĵެ{wDffGܒs嬿u$ '0:BK$SZPag"m rBvyw|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y´۬yuޒ􍾉CffCޒuy۬´y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬uޒ󍽉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~w|yBv r"mgPaZ$S>KB:0'  &xڬtݒ󍽉BffCߒvyܬ´ z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~k~w|yAv r!mgOaZ#S=KB:0' %vڬsݒ󍽉GffCߒvzݬô! l '0:BAKS~ZRag#mrCvyu|k~j~w|yAv r!mgYaZ#Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDx|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S:KB:1' "tʴ㬀rے‰FfgDo|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴqےFfeEo}Ǵ$p '0 :B7KSZUag&mr?vyv|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEp~Ǵ%p '0!:B7KSZUag&mr?vyv|l~l~v|y?v r'mgVaZS9KB":1' q&ȴpڒEffEڒp~ȴ%q '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '0":B8KSZVag&m r?vyv|l~l~v|y?vr&mgUaZS8KB!:0' p%Ǵ~pْEffEڒqɴr  '1":B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p$Ǵ}oEefFےqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$ƴ}oEefF‰ےqʴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o#ƴ߬|oDgfF‰ےrʴs" '1:B:K!SZXagm r@vyv|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|nDgfF‰ےr˴t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgTaZSBKB:0' n"Ŵ߬|wDgfF‰ܒr䬾u# '1:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ŵެ{wDffGܒs嬿u$ '0:BK$SZPag!m rBvyw|k~k~t|yCv r#mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒt۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ%S>KB:0'  x۬uޒ􍾉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  &x۬tݒ󍽉BffCޒuyܬ´ z '0:B?K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉BffCߒvzݬô k '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyu|k~j~w|yAv r!mgYaZ#S=KB:0' %v嬂sݒ򍽉GffDߒv{ݬĴ! l '0:BAKS~ZRag$mrCvyu|k~j~w|yAv r mgYaZ"Svyu|k~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDw|߬Ŵ"n '0:BBKSZTag$mr>vyu|l~m~w|y@v r mgXaZ!S;KB:1' "tʴ䬀rے‰FfgDn|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ!S:KB:1' "sʴ㬀rے‰FfeDo}ƴ#o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴ㬀qےFfeEo}Ǵ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEo}Ǵ$p '0!:B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB":1' r&ɴqڒEffEْp~Ǵ%p '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q&ȴ~pڒEffEڒp~ȴ%q  '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' q%ȴ~pڒEffEڒpȴ&r  '1":B9KSZVag'm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p%Ǵ}oEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o$ƴ}oEefF‰ےrʴs" '1:B:K!SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|nDgfF‰ےrʴt" '1:B;K!SZXagm r@vyw|m~l~u|y>vr%mgTaZSBKB:0' n#Ŵ߬|xDgfF‰ܒr䬾t# '1:B;K!SZXag m rAvyw|m~k~u|y>vr$mgSaZSBKB:0' m"Ŵެ{wDgfFܒs䬾u$ '0:BK$SZPag"m rBvyt|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K%SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y۬uޒ􍾉CffCޒuy۬´ y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬tޒ󍽉CffCޒuyܬ´ y '0:B?K%S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S>KB:0'  &wڬtݒ󍽉BffCߒvzܬô z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgPaZ#S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~j~w|yAv r!mgOaZ#S=KB:0' %v٬sݒ󍽉GffDߒvzݬĴ! l '0:BAKS~ZRag#mrCvyu|k~j~w|yAv r!mgYaZ#Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t䬁rے‰FfgDn|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S:KB:1' "tʴ㬀rے‰FfgDo|߬ƴ#o '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB:1' !rɴqےFfeEo}Ǵ$p '0 :B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB#:1' rɴqڒFffEp~Ǵ%p '0!:B8KSZUag&mr?vyv|l~l~v|y?v r&mgVaZS8KB":1' q&ȴ~pڒEffEڒp~ȴ%q '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '1":B8KSZVag'm r?vyv|l~l~v|y?vr&mgUaZS8KB!:0' p%Ǵ~pEffFڒqɴr  '1#:B9KSZWagm r@vyv|l~l~v|y?vr&mgUaZS7KB :0' p$Ǵ}oEefFےqɴr! '1:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' o#ƴ߬|oDgfF‰ےrʴt" '1:B:K!SZXagm r@vyw|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|nDgfF‰ےr䬾t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgSaZSBKB:0' m"Ŵ߬|wDgfF‰ܒr䬾u# '1:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ĵެ{wDffGܒs嬿u$ '0:BK$SZPag"m rBvyw|k~k~t|yCv r#mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒt۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y ´۬yuޒ􍾉CffCޒu۬y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ%S>KB:0'  x۬uޒ󍾉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  &x۬tݒ󍽉BffCߒuyܬ´ z '0:B@K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô! l '0:BAKS~ZRag#m rCvyu|k~j~w|yAv r!mgYaZ#Svyu|k~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDx|߬Ŵ#n '0:BBKSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S;KB:1' "tʴ䬀rے‰FfgDn|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ!S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴqےFfeEo}Ǵ$o '0 :B7KSZUag%mr?vyv|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEp~Ǵ%p '0!:B7KSZUag&mr?vyv|l~l~v|y@v r'mgVaZS9KB":1' r&ȴpڒEffEڒp~ȴ%q '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' p%Ǵ~pْEffEڒqɴ&r  '1":B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p$Ǵ}oEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o#ƴ}oDefF‰ےrʴs" '1:B:K!SZWagm r@vyv|m~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|nDgfF‰ےrʴt" '1:B;K!SZXag m r@vyw|m~l~u|y>vr$mgTaZSBKB:0' n"Ŵ߬|wDgfF‰ܒr䬾t# '1:B;K"SZXag m rAvyw|m~k~u|y>vr$mgSaZSBKB:0' m "Ŵެ{wDgfGܒs嬾u$ '0:BK$SZPag"m rBvyt|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K%SZQag"m rBvyt|k~k~t|yBv r"mgQaZ%S?KB:0'  x۬uޒ􍾉CffCޒuyܬ´ y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬tޒ󍽉CffCޒuyܬ´ y '0:B?K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S>KB:0'  &wڬtݒ󍽉BffCߒvzܬô z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~j~w|yAv r!mgOaZ#S=KB:0' %v欂sݒ󍽉GffDߒvzݬĴ! l '0:BAKS~ZRag$mrCvyu|k~j~w|yAv r!mgYaZ"Svyu|k~m~w|yAv r mgXaZ"S;KB:1' #u䬁rܒ‰FfgDw|߬Ŵ"n '0:BBKSZTag$mr>vyu|l~m~w|yAv r mgXaZ!S;KB:1' #tʴ䬀rے‰FfgDn|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~v|y@v rmgXaZ!S:KB:1' "sʴ㬀rے‰FfgDo}ƴ#o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqےFfeEo}Ǵ$p '0!:B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB":1' rɴqڒEffEْp~Ǵ%p '0!:B8KSZUag&mr?vyv|l~l~v|y?v r&mgVaZS8KB":0' q&ȴ~pڒEffEڒp~ȴ%q '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' q%ȴ~pڒEffEڒpȴ&q  '1":B9KSZVag'm r?vyv|l~l~v|y?vr&mgUaZS7KB!:0' p%Ǵ~pEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~v|y?vr&mgUaZS7KB :0' p$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgUaZS6KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|oDgfF‰ےrʴt" '1:B:K!SZXagm r@vyw|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|xDgfF‰ܒr䬾t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgSaZSBKB:0' m"Ŵެ|wDgfF‰ܒr䬾u# '0:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ĵެ{wDffGܒs嬿u$ '0:BK$SZPag"m rBvyw|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y´۬yuޒ􍾉CffCޒuy۬´y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬uޒ󍽉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~w|yBv r"mgPaZ$S>KB:0'  &xڬtݒ󍽉BffCߒvyܬ´ z '0:B@K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~k~w|yAv r!mgOaZ#S=KB:0' %vڬsݒ󍽉GffCߒvzݬô! l '0:BAKS~ZRag#mrCvyu|k~j~w|yAv r!mgYaZ#Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDx|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S:KB:1' "tʴ䬀rے‰FfgDo|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B6KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴqےFfeEo}Ǵ$p '0 :B7KSZUag&mr?vyv|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEp~Ǵ%p '0!:B7KSZUag&mr?vyv|l~l~v|y?v r'mgVaZS9KB":1' q&ȴpڒEffEڒp~ȴ%q '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '0":B8KSZVag&m r?vyv|l~l~v|y?vr&mgUaZS8KB!:0' p%Ǵ~pْEffEڒqɴr  '1":B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p$Ǵ}oEefFےqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$ƴ}oEefF‰ےqʴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o#ƴ}oDgfF‰ےrʴs" '1:B:K!SZXagm r@vyv|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|nDgfF‰ےr˴t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgTaZSBKB:0' n"Ŵ߬|wDgfF‰ܒr䬾u# '1:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ŵެ{wDffGܒs嬿u$ '0:BK$SZPag!m rBvyw|k~k~t|yCv r#mgQa}Z&S?KB:0'  y ´ܬyuޒ􍾉CffCޒt۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B?K%SZQag"m rBvyt|k~k~t|yBv r"mgQaZ%S>KB:0'  x۬uޒ􍾉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  &x۬tݒ󍽉BffCޒuyܬ´ z '0:B?K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉BffCߒvzܬô k '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyu|k~j~w|yAv r!mgYaZ#S=KB:0' %v嬂sݒ򍽉GffDߒv{ݬĴ! l '0:BAKS~ZRag$mrCvyu|k~j~w|yAv r mgYaZ"Svyu|k~m~w|yAv r mgXaZ"S;KB:1' #t䬁rܒ‰FfgDw|߬Ŵ"n '0:BBKSZTag$mr>vyu|l~m~w|y@v r mgXaZ!S;KB:1' "tʴ䬀rے‰FfgDn|߬ƴ#n '0:B6KSZTag%mr>vyu|l~m~v|y@v rmgWaZ!S:KB:1' "sʴ㬀rے‰FfeDo}ƴ#o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴ㬀qےFfeEo}Ǵ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEo}Ǵ$p '0!:B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB":1' r&ɴqڒEffEْp~Ǵ%p '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q&ȴ~pڒEffEڒp~ȴ%q  '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' q%ȴ~pڒEffEڒpȴ&r  '1":B9KSZVag'm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p%Ǵ}pEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K!SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|nDgfF‰ےrʴt" '1:B;K!SZXagm r@vyw|m~l~u|y>vr%mgTaZSBKB:0' n#Ŵ߬|xDgfF‰ܒr䬾t# '1:B;K!SZXag m rAvyw|m~k~u|y>vr$mgSaZSBKB:0' m"Ŵެ{wDgfFܒs䬾u$ '0:BK$SZPag"m rBvyt|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K%SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y۬uޒ􍾉CffCޒuy۬´ y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬tޒ󍽉CffCޒuyܬ´ y '0:B?K%S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S>KB:0'  &wڬtݒ󍽉BffCߒvzܬô z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgPaZ#S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~j~w|yAv r!mgOaZ#S=KB:0' %v٬sݒ󍽉GffDߒvzݬĴ! l '0:BAKS~ZRag#mrCvyu|k~j~w|yAv r!mgYaZ#Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t䬁rے‰FfgDn|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S:KB:1' "tʴ㬀rے‰FfgDo|߬ƴ#o '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB:1' !rɴqےFfeEo}Ǵ$p '0 :B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB#:1' rɴqڒFffEp~Ǵ%p '0!:B8KSZUag&mr?vyv|l~l~v|y?v r&mgVaZS8KB":1' q&ȴ~pڒEffEڒp~ȴ%q '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '1":B8KSZVag'm r?vyv|l~l~v|y?vr&mgUaZS8KB!:0' p%Ǵ~pEffFڒqɴr  '1#:B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB :0' p$Ǵ}oEefFےqɴr! '1:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' o#ƴ߬|oDgfF‰ےrʴt" '1:B:K!SZXagm r@vyw|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|nDgfF‰ےr䬾t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgSaZSBKB:0' m"Ŵ߬|wDgfF‰ܒr䬾u# '1:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ĵެ{wDffGܒs嬿u$ '0:BK$SZPag!m rBvyw|k~k~t|yCv r#mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒt۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y ´۬yuޒ􍾉CffCޒu۬y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ%S>KB:0'  x۬uޒ󍾉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  &x۬tݒ󍽉BffCߒuyܬ´ z '0:B@K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô! l '0:BAKS~ZRag#m rCvyu|k~j~w|yAv r!mgYaZ#Svyu|k~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDx|߬Ŵ#n '0:BBKSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S;KB:1' "tʴ䬀rے‰FfgDn|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ!S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴqےFfeEo}Ǵ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEp}Ǵ%p '0!:B7KSZUag&mr?vyv|l~l~v|y@v r'mgVaZS9KB":1' r&ȴpڒEffEڒp~ȴ%q '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' p%Ǵ~pْEffEڒqɴ&r  '1":B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p$Ǵ}oEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o#ƴ}oDefF‰ےrʴs" '1:B:K!SZWagm r@vyv|m~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|nDgfF‰ےrʴt" '1:B;K!SZXag m r@vyw|m~l~u|y>vr$mgTaZSBKB:0' n"Ŵ߬|wDgfF‰ܒr䬾t# '1:B;K"SZXag m rAvyw|m~k~u|y>vr$mgSaZSBKB:0' m "Ŵެ{wDgfGܒs嬾u$ '0:BK$SZPag"m rBvyt|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K%SZQag"m rBvyt|k~k~t|yBv r"mgQaZ%S?KB:0'  x۬uޒ􍾉CffCޒuyܬ´ y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬tޒ󍽉CffCޒuyܬ´ y '0:B?K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S>KB:0'  &wڬtݒ󍽉BffCߒvzܬô z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~j~w|yAv r!mgOaZ#S=KB:0' %v欂sݒ󍽉GffDߒvzݬĴ! l '0:BAKS~ZRag$mrCvyu|k~j~w|yAv r!mgYaZ"Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t˴䬀rے‰FfgDn|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~v|y@v rmgXaZ!S:KB:1' "sʴ㬀rے‰FfgDo}ƴ#o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqےFfeEo}Ǵ$p '0!:B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB":1' rɴqڒEffEْp~Ǵ%p '0!:B8KSZUag&mr?vyv|l~l~v|y?v r&mgVaZS8KB":0' q&ȴ~pڒEffEڒp~ȴ%q '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' q%ȴ~pڒEffEڒpȴ&q  '1":B9KSZVag'm r?vyv|l~l~v|y?vr&mgUaZS7KB!:0' p%Ǵ~pEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~v|y?vr&mgUaZS7KB :0' p$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y?vr%mgUaZS6KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|oDgfF‰ےrʴt" '1:B:K!SZXagm r@vyw|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|xDgfF‰ܒr䬾t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgSaZSBKB:0' m"Ŵެ|wDgfF‰ܒr䬾u# '0:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ĵެ{wDffGܒs嬿u$ '0:BK$SZPag"m rBvyw|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y´۬yuޒ􍾉CffCޒuy۬´y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬uޒ󍾉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~w|yBv r"mgPaZ$S>KB:0'  &xڬtݒ󍽉BffCߒvyܬ´ z '0:B@K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~k~w|yAv r!mgOaZ#S=KB:0' %vڬsݒ󍽉GffCߒvzݬô! l '0:BAKS~ZRag#mrCvyu|k~j~w|yAv r!mgYaZ#Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDx|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S:KB:1' "tʴ䬀rے‰FfgDo|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B6KSZUag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴqےFfeEo}Ǵ$p '0 :B7KSZUag&mr?vyv|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEp~Ǵ%p '0!:B7KSZUag&mr?vyv|l~l~v|y?v r'mgVaZS9KB":1' q&ȴpڒEffEڒp~ȴ%q '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '0":B8KSZVag&m r?vyv|l~l~v|y?vr&mgUaZS8KB!:0' p%Ǵ~pْEffEڒqɴr  '1":B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p$Ǵ}oEefFےqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$ƴ}oEefF‰ےqʴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o#ƴ}oDgfF‰ےrʴs" '1:B:K!SZXagm r@vyv|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|nDgfF‰ےrʴt# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgTaZSBKB:0' n"Ŵ߬|wDgfF‰ܒr䬾u# '1:B;K"SZXag m rAvyw|m~k~u|y>vr$mgSaZSBKB:0' m "Ŵެ{wDffGܒs嬾u$ '0:BK$SZPag!m rBvyw|k~k~t|yCv r#mgQa}Z&S?KB:0'  y ´ܬyuޒ􍾉CffCޒt۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B?K%SZQag"m rBvyt|k~k~t|yBv r"mgQaZ%S>KB:0'  x۬uޒ􍾉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  &x۬tޒ󍽉BffCޒuyܬ´ z '0:B?K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉BffCߒvzܬô k '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyu|k~j~w|yAv r!mgYaZ#S=KB:0' %v嬂sݒ򍽉GffDߒv{ݬĴ! l '0:BAKS~ZRag$mrCvyu|k~j~w|yAv r mgYaZ"Svyu|k~m~w|yAv r mgXaZ"S;KB:1' #t䬁rܒ‰FfgDw|߬Ŵ"n '0:BBKSZTag$mr>vyu|l~m~w|y@v r mgXaZ!S;KB:1' "tʴ䬀rے‰FfgDn|߬ƴ#n '0:B6KSZTag%mr>vyu|l~m~v|y@v rmgWaZ!S:KB:1' "sʴ㬀rے‰FfeDo}ƴ#o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴ㬀qےFfeEo}Ǵ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEo}Ǵ$p '0!:B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB":1' r&ɴqڒEffEْp~Ǵ%p '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q&ȴ~pڒEffEڒp~ȴ%q  '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' q%ȴ~pڒEffEڒpȴ&r  '1":B9KSZVag'm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p%Ǵ~pEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~v|y?vr%mgUaZS7KB :0' o$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K!SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|nDgfF‰ےrʴt" '1:B;K!SZXagm r@vyw|m~l~u|y>vr%mgTaZSBKB:0' n#Ŵ߬|xDgfF‰ܒr䬾t# '1:B;K!SZXag m rAvyw|m~k~u|y>vr$mgSaZSBKB:0' m"Ŵެ{wDgfFܒs䬾u$ '0:B;K"SZYag m rAvyw|m~k~u|yDvr$mgSaZSAKB:0' m "Ĵެ{wDffGܒs嬿u$ '0:BK$SZPag"m rBvyt|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K%SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y۬uޒ􍾉CffCޒuy۬´ y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬tޒ󍽉CffCޒuyܬ´ y '0:B?K%S}ZQag#m rCvyt|k~k~w|yBv r"mgPaZ$S>KB:0'  &wڬtݒ󍽉BffCߒvzܬô z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgPaZ#S=KB:0'  &wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~j~w|yAv r!mgOaZ#S=KB:0' %v٬sݒ󍽉GffDߒvzݬô! l '0:BAKS~ZRag#mrCvyu|k~j~w|yAv r!mgYaZ#Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t䬁rے‰FfgDn|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S:KB:1' "tʴ㬀rے‰FfgDo|߬ƴ#o '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' "sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB:1' !rɴqےFfeEo}Ǵ$p '0 :B7KSZUag&mr?vyv|l~l~v|y@v rmgWaZS9KB#:1' rɴqڒFffEp~Ǵ%p '0!:B8KSZUag&mr?vyv|l~l~v|y?v r'mgVaZS8KB":1' q&ȴ~pڒEffEڒp~ȴ%q '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '1":B8KSZVag&m r?vyv|l~l~v|y?vr&mgUaZS8KB!:0' p%Ǵ~pEffFڒqɴr  '1#:B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB :0' p$Ǵ}oEefFےqɴr! '1:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' o#ƴ߬|oDgfF‰ےrʴt" '1:B:K!SZXagm r@vyw|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|nDgfF‰ےr䬾t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgSaZSBKB:0' m"Ŵ߬|wDgfF‰ܒr䬾u# '1:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ĵެ{wDffGܒs嬿u$ '0:BK$SZPag!m rBvyw|k~k~t|yCv r#mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒt۬x '0:B>K$SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  y ´۬yuޒ􍾉CffCޒu۬y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ%S>KB:0'  x۬uޒ󍾉CffCޒuyܬ´ y '0:B?K%S}ZQag"m rCvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  &x۬tݒ󍽉BffCߒuyܬ´ z '0:B@K&S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S=KB:0'  &wڬtݒ󍽉BffCߒvzݬô k '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô! l '0:B@KS~ZRag#m rCvyu|k~j~w|yAv r!mgYaZ#Svyu|k~m~w|yAv r mgXaZ!S;KB:1' #t䬁rܒ‰FfgDx|߬Ŵ#n '0:BBKSZTag%mr>vyu|l~m~w|y@v rmgXaZ!S;KB:1' "tʴ䬀rے‰FfgDn|߬ƴ#n '0:B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ!S:KB:1' "sʴ㬀rے‰FfeEo}ƴ$o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sɴqےFfeEo}Ǵ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqڒFfeEo}Ǵ%p '0!:B7KSZUag&mr?vyv|l~l~v|y@v r'mgVaZS9KB":1' r&ȴpڒEffEڒp~ȴ%q '0!:B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB":0' q%ȴ~pڒEffEڒp~ȴ&q  '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' p%Ǵ~pْEffEڒqɴ&r  '1":B9KSZVagm r@vyv|l~l~v|y?vr&mgUaZS7KB!:0' p$Ǵ}oEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB :0' o#ƴ}oDefF‰ےrʴs" '1:B:K!SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|nDgfF‰ےrʴt" '1:B;K!SZXag m r@vyw|m~l~u|y>vr$mgTaZSBKB:0' n"Ŵ߬|wDgfF‰ܒr䬾t# '1:B;K!SZXag m rAvyw|m~k~u|y>vr$mgSaZSBKB:0' m "Ŵެ{wDgfGܒs嬾u$ '0:BK$SZPag"m rBvyt|k~k~t|yCv r"mgQa}Z%S?KB:0'  y ´ܬyuޒ􍾉CffCޒu۬x '0:B>K%SZPag"m rBvyt|k~k~t|yBv r"mgQa|Z%S?KB:0'  x۬uޒ􍾉CffCޒuyܬ´ y '0:B?K%S|ZQag"m rBvyt|k~k~t|yBv r"mgPaZ$S>KB:0'  x۬tޒ󍽉CffCޒuyܬ´ y '0:B?K%S}ZQag#m rCvyt|k~k~w|yBv r!mgPaZ$S>KB:0'  &wڬtݒ󍽉BffCߒvzܬô z '0:B@K&S}ZRag#m rCvyt|k~k~w|yBv r!mgOaZ#S=KB:0'  %wڬtݒ󍽉GffCߒvzݬô k '0:B@K&S~ZRag#m rCvyt|k~j~w|yAv r!mgOaZ#S=KB:0' %v欂sݒ󍽉GffDߒvzݬĴ! l '0:BAKS~ZRag$mrCvyu|k~j~w|yAv r!mgYaZ"Svyu|l~m~w|yAv r mgXaZ!S;KB:1' #t˴䬀rے‰FfgDn|߬Ŵ#n '0:B6KSZTag%mr>vyu|l~m~v|y@v rmgXaZ!S:KB:1' "sʴ㬀rے‰FfgDo|ƴ#o '0 :B6KSZTag%mr>vyu|l~l~v|y@v rmgWaZ S:KB:1' !sʴ㬀qے‰FfeEo}ƴ$o '0 :B7KSZUag%mr?vyu|l~l~v|y@v rmgWaZ S9KB#:1' !rɴqےFfeEo}Ǵ$p '0!:B7KSZUag&mr?vyv|l~l~v|y@v rmgVaZS9KB":1' rɴqڒEffEْp~Ǵ%p '0!:B8KSZUag&mr?vyv|l~l~v|y?v r&mgVaZS8KB":0' q&ȴ~pڒEffEڒp~ȴ%q '0":B8KSZVag&m r?vyv|l~l~v|y?v r&mgVaZS8KB!:0' q%ȴ~pڒEffEڒpȴ&q  '1":B9KSZVag'm r?vyv|l~l~v|y?vr&mgUaZS7KB!:0' p%Ǵ~pEefFڒqɴr! '1#:B9K SZWagm r@vyv|l~l~v|y?vr&mgUaZS7KB :0' p$Ǵ}oEefFےqɴs! '1:B:K SZWagm r@vyv|l~l~u|y?vr%mgUaZS7KB :0' o$ƴ}oEefF‰ےqʴs" '1:B:K SZWagm r@vyv|l~l~u|y>vr%mgTaZS6KB:0' n#ƴ߬|oDgfF‰ےrʴt" '1:B:K!SZXagm r@vyw|m~l~u|y>vr%mgTaZS6KB:0' n#Ŵ߬|xDgfF‰ܒr䬾t# '1:B;K!SZXag m rAvyw|m~l~u|y>vr$mgSaZSBKB:0' m"Ŵެ|wDgfF‰ܒr䬾u# '0:B;K"SZXag m rAvyw|m~k~u|yDvr$mgSaZSBKB:0' m "Ĵެ{wDffGܒs嬿u$sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/48000-1-24.aiff0000644000175000017500000106246612252354725026276 0ustar miramiraFORMe.AIFFCOMMw@SSNDe  '0:\B;K:X0' hr*<㝽{}r&ܰ|WCʃbmeep`CljSܫr! }ܴt3r"~ '0:PB6K:X0' hr*;㝽Ҵ{}r&ܰ|WCʃbmeep`CljSܫr! }ݴt4r" '0:PB7K \'0:eB/K v'0:B1KS!QK hrC}O4r󇉾0C܃YeevKCɉ{lИq잫 }ڬɴír , bK'0^:VBK<_S!BZ1aTgm#8r vAy;|v~l~l~|vy vAr rm#gaTZS Krǽû֥}1qٍtCσOyee}UC׉)r)}CϽr2W u'-0:|BKK<[B:Q0Y'F] 'r㳽zéť}֞ q͍jyCȃJvdeZC݉2r7}SrG m #'B0:BKZyS KS!#ZaTgm#"r vAy.|v~l~l|vy,vAr m#gaTZS!K<8Be:+0'3 W}q㍽0Æޥ}rgܷVhC|ode_dC뉾B܃r,S}q54'rp3 N'x0:BK%r}'CՃT|eezQCщ"wܘq}5۴r D yb'0t:kBK٬}Lr󅉾.CeeOLCˉ|Mq}ݬߏs1 jP' 0O:>BK:0' )LgqlH aށ|➫vrKܟACqhddfoC>ܛrGq|ݬ|ZAeq`E! }'0:B7KgaT^ZS!LK0:BK=US ZRaUg8m"r drlv@@T}ޘq/󿉾^C:ee .CLq}.J>rE3 g'0:BK;S ZaUSgkm"r cvAyd|v~ly~l|vyEvAr 5m#g0aUZHS K=IB:s0}'1e Nr)uǬ}<|r{%C|eeSQC҉Xq}ߠq0G f'0c:BKܓ7CldddjtDHܦrT|ތlUyqv[8 '0:BJKCeeIBCmВ7qמ}p_rc A('0):BK'i0:BK;S ZraU8gRm"r PvAyX|v~lr~lp|vyRvAr Hm"gHaU-ZeS K;B:0'X ,w rP}Yr󎉾5CeeLHCʼnuڒCq䞫}Ϭ߁ҽrry W='0=:-BK:6BpK=S eZaTgm#r vA~y0|v~l~l|vpyyvAr m#gfaUZS!K<3B: 0'/ Qwr}ㇽP²b}q̒.ȉfC>ee *CD q}v 9-rv2! T'~0:BK;S ZaUGg`m"r ZvAy^|v~lv~ll|vyKvAr >m"g;aUZVS K=YB:0'Cw ar;׬}Jr󄉾-CeePMC̉~Nq}߬ߒs4 mS' 0R:yBKCeǒ-q̞}a°O|ruP .'0:BK<2S!ZaU~gem#r vAyy|vp~l~l|vy1vA~r m#g aTZS fK=Bq:80?'$A f q}<Ñޯ} roܾ] Dqdd]aC找"{r#J~N) qo% @'^0:BK~ =rpC\ZddtDfɘr{}޿âNq { U8'0R:JBK=$S vZ(aTgm#r !vAy7|v~l~l|vkysvAr xm#gYaUqZS!KQ}ۘq.󾉾]C9ee /CMq}1MArH7 j'0:BK;S ZaUUgmm"r dvAye|v~ly~l|vyDvAr 4m#g.aUZFS K=GB:p0z'-a Kr&sŬ}:zrz$C{eeSRCӉZq!}ߣq3K i'!0f:BK|v~l~l||vfylvAr nm#gLaUbZS K<B:0' $K\rT_*,@}͘q"󳉾UC4e e 4CU#qΥ}B-,aVr]M& '0:BaK<S ZaUdgMm#r nvAyl|vf~l}~l|vy>vAr *m#g!aUZ6S K=5B:]0e'Lj 5rڽ`óϥ}*lrԍpC}xeeVWCډfr /}.qHa ~'60{:BKg~;oM3VqP5 m'0:B)K~?q]w -'L0:BKq g C%'0A:9BsK=S gZaTg m#r vAy1|v~l~l|voyxvAr m#gdaU}ZS!K<1B:0', NtrzㄽN¯`}qʒ,ƉeC>ee +CF q}x"  <0ry5$ W'0:BK;S ZaUIgam"r \vAy_|v~lv~ll|vyJvAr =m"g9aUZSS K=VB:0'@t ^r8Ԭ}Gr󂉾+C~eePNC͉Pq}ߔs8 pV'0U:{BKr vAy|v~l~l|vyvAer m#gaTZS!K bq{:Ïޭ} rmܽ[ D ~qdd]bC牾$}r%L~P, qr( D'a0:BK '0:BOK"q>" Z'v0:BK}˘q 󲉾TC3e e 5CW%qХ}D0/dYraP) '0:BcK<S ZaUfgOm#r pvAym|vg~l}~l|vy=vAr (m#gaTZ4S K=2B:Z0b'If 2r׽]ð̥}(jrҍnC|wedWXCۉgr 1~1 qKd '90~:BKq}j+rg# D'o0:BK;S ZvaUm"r )vAy|v~lm~lu|vyvAr @m"g]aSZ~S"XK;B:0'` Q-p(ݗ}rq 򵉾BD:)dd聓@DXhK<7SZaT6gm#r vAy|v~l~l^|vyvA|r m"gaV/ZS!K;pBl:09'+: _sxÌ0}q>ܻB D pe%d􁓮bCJ%݊r'~ RͽH qu  G'}0:BK' 01:PBK=)S {ZaTgm#r #vBMy9|v?~l~l|viyqvA r um$gUaUmZAS!K=Bm:0%' 4TyrmšM|5טr󻉽CAe e =Crמĥ| 6‚Snr\7 q'0 :BSK=S Z,aUYgCm$r gv@yg|vb~l~l|vFyBvBXr 1m#gaU ZS K=AB:k0M''[ Er m!ۥ~vrэwC*eeTˆCՉō]s/%|ߧ Rs Q a''0:ZBK>S!^ZaUgm$Vr vA7y|v~lB~l|wyvBr m#|gaTZBS K!B:a0'/h Ys'߽ Y߭|*s3aȆC׃́Uee)Cs͘rq~մgr= xT' 0F:dBK=;S ZaUgm#r .vBUy@|vE~l~l|vdyjvAr km$ gHaU^Z1S K=BZ:0' x>druZڴˆ<|%ɘrے󱉽C>e e @Cr䞪ҥ|/G”grrM-  '0:BfK=S ZB:M0'S{ Bs˽ Fߜ|s&VꉽCЃȁRee,C}ؘr~-zr.S i'50Z:xBK=MS ZaUgm#r 8vB^yG|vJ~l~l|v_ycv@r am$g;aUPZ"S K=BG:0' b(NrFǴv+~鞪rΒ󦉿C:e eDC&r|?X¦zrcC "'02:ByK=S!ZKaUvg^m$ r {vAyu|vm~l~l|vr m#gaTZ|S _K= Bߴ:/0'> \qt⭽4ި~pKriۮX̆Cm}de^C鉽ލ܀pP|ڴ1"6s_. H߾'g0:B K;S!ZaUgm"br vAQy|v~lL ~l|wyvBr m#YgaTZSK։CƒKee3Cr~ɬQrX! 5'`0:B K=qS ZaU2g m#r LvBoyU|vT~l~l|vTyUvBor Lm#g!aU3ZS K=rB!:0'a 6#rYR ~ʞr󒉾C3eeKC‰֒>s |_zʽ ro N&'0\:%BK=S!0ZkaUgxm$7r vA y|vw~l~l|v2y'vB6r m#gaTZlS NKaSg(m"r vAy|v~lg!~l{|vyvAr Rm"gsaTZS"uK<B :0' wARpK"$ݴ}qljQDF2dd偓7DMYВ(q!}Ĵ542_pgV0 '0:$BK<S"ZaTgm# r [vAy|v~l~#~ld|vyvAr m"gaSZ/S"K;B:0\'Q` *s䚽ëM}#qUύTDve(d񁓨ZC>vr~5Į&qQl !'Y0:BKy-|v6~l~l|vry|vAr m$,gkaUZ\S! K=B:0H'9 Zzr㏽ ¹j|Pr3̉CGee7Cr~٬c1rm7 K'u0:B3K=S ZaU@g-m#r Vv@y\|vY~l~l|vOyNvBgr Bm#gaU$ZS K=`B:0p'L k rD @~r󈉾C0eeN†CɉIs |nߊܽ 2r+ d<'0p:8BK=S!AZ{aUgm$Br vA(y|v|~l~l|v,y vB-r m#gaTZ]S =KS!RZaUgm$Nr vA1y|v~l~l|v'yvB%r m#g aTZMS ,Km"gYaSZzS"SK;B:0'Z J'p"ݒ}mq򲉾@D8'dd聓ADZj?qӞ>}YZYp\ 4"'0#:KBCK<x hs6 f߹|4s=jΆC܃сXee&CzݍlĘrg~ɴYr - hD'07:VBK=.S ZaTgm#r &vBOy;|vA~l~l|vhyovAr rm$gQaUhZCr۞ȥ|$;‡Xtrb= w'0:BYK=S Z0aU]gGm$ r jvAyi|vd~l~l|vEy@vBVr .m#gaUZS K=rh֥~rr͍tC)eeU͆C׉Ǎas3)|߬ Xs&W g'-0:`BK> S!cZaUgm$Zr vA9y|v~lC~l|wyvBr m#xgaTZ=S KB:[0'(b Rs!ٽ Tߨ|&s/^ņCՃˁTee*CvИru~ڴ lrC ~Z'&0L:jBK=@S ZaU gm#r 0vBWyB|vF~l~l|vcyhv@r hm$ gDaUZZ-S K=BT:0 ' r8]roTԴƒ7|!Řrؒ󮉿C=e e ACr螪ץ|4L™lrxS3 '0$:BlK=S!Z@aUlgTm$r tvA yp|vi~l~l|v@y:vBMr $m#gaTZS |K=*B:Q02' ?c (rϽU ť~drjۆCy%deX҆CމЍls@8|߽ ks; m "ߙ'C0:tBK:S!tZaUgm"Nr vABy|v~lF~l|w y vBr m#mgaTZ-S K}/Ëws^ 9*'08:BkK;oS!ZaV.gm"r vA{y|v~l]~l|vyvAr m#gaT7ZSK<8B?:G0'/ W}pUVU};qВ=≾hDY@dd)D:Bq}qݖ'p, P'_0:BK;S"WZ}aSg\m"r @vAy|v~lu~lm|vyvAr )m"g?aSZZS"1K;B:0'0 fpZнִܬp}N٘qx򞉾/D+d܀d쁓KC,{Wq힩¥}۬}q0 `M'0L:sBiK B:H0'Lt <s Ž Aߗ|{s"R牽C΃ƁQee-Cܘr~2r4Z p';0`:}BK=RS ZaUg m#r ;vB`yI|vK~l~l|v]yav@r ^m#g7aULZS K=BA:0' \"Hr~ @q&~垪r˒󤉿 C9e eECĒ*r|D]«riI ('08:BK=S!ZPaUzgam$#r ~vAyw|vn~l~l|v:y3vBDr m#gaTZS kK=B:=0'*M lq⻽B޴~{Urs۶`҆Cr"de\׆C䉽؍xsMF|δ$'sP 9߯'X0:BK;S!ZaUgm"Zr vAKy|v~lJ~l|wyvB r m#agaTZSK˘qke&D$|e+dQC3bqХ}ďq-F vc'40a:B|K'0M:BK=S!$Z`aUgnm$/r vAy~|vs~l~l|v5y,vBm Qq7Ę!}טrhC6Sde*zD "`ݘqeĥ}7bt E {k'0v:BK;S"ZCaSg+m"r vAy|v~lh ~lz|vyvAr Om"goaT ZS"pK<B: 0'~ p;LpEݯ}qĉODD0dd偓8DO\Ӓ+q%}ɴ::7epm\6 '0:)B#K<S"ZaT!gm# r ^vAy|v~l#~lc|vyvAr m"gaVCZ+S!K;B:0V'JZ #s䔽æH}qQ̍QD ue'd񁓩[C@yr~ :ij,qWr ''_0:BK;~r󅉾C/eeOĆCˉMs|sߏ 7s1 jB' 0v:>BK>S!FZaUgm$Fr vA+y|v~~l~l|v+yvB+r m#gaTZXS 8KS!ZaVgm"}r vAdy|v~lT ~l|vyvAr m#>gaT^ZSK^rv¢T|<ݘr$󿉽CCee ;C rў~/{JerS- g'0:BKK=S Z%aUSg>m$r cv@yd|v`~l~l|vIyEvB\r 5m#gaUZS K=IB:s0V'0d Nr)u)~|r֍{C+eeSɆC҉Xs)|ߠ JsG X'0:RBK>S!WZaUgm$Qr vA3y|v~l~l|wyvB"r m#gaTZHS 'Kݟ7CVlde"jD1ܦq'|laUzsva8 '0:BJK;PS!ZaVgm"r vAmy|v~lW~l|vyvAr m#3gaTPZSKD6&d߀d道CD\mCqמB}^`_pc ;('0):QBIKgm#%r vAy|v~l~l\|vyvAwr m"gaV&Z S!K;eBa:0-'. R{slwÂ&|q7ܴ=Dne$deCN+ݑr/ ~)\׽Tq * T'0:BKr m"HgaUZS!kK>)B:j0'8q bs0 a ߴ|0s9fˆCڃρWee'C|ߍoȘrk~δ^r4 oK'0=:[BK=4S ZaUgm#r )vBQy=|vB~l~l|vfymvAr om$gNaUdZ8S K=Bb:0' (Hmr~bC|,Ϙr󵉽C?e e ?Crޞ̥|)@^zriC# ~'0:B^K=S Z5aUbgKm$r mvAyk|ve~l~l|vCy>vBSr +m#gaUZS K=7B:_0A'Os 8rݽbѥ~nrʍqC~(eeVΆCىʍds6-|߱ ]s,^ m'30:fBK>%S!hZaUgm"Fr vA'0=:eB\KB:V0'"\ Lsӽ Nߤ|"s,[ÆCӃʁSee+CyӘrz~ߴ&qr%J `',0R:oBK=FS ZaUgm#r 3vBZyD|vH~l~l|vayfv@r em$g@aUVZ(S K=BO:0' l2WriNϴ~2~rԒ 󫉿Cy8vBKr !m#gaTZS wK=%B:K0,'9] |"qɽO~_r|۾g؆Cw$deYӆCҍpsC<|´ psAt )ߟ'I0:zBK:S!yZaUgm"Rr vADy|v~lG~l|w y vBr m#igaTZ)S K:BpK;tS!ZaV2gm"r vA~y|v~l^~l|vyvAr m#gaT3ZS"K<3B::A0') Qwp}OPPݥ}6q̒9߉fDW>ddၓ*DB:B0z' Fn 6s ;ߓ|vsO䉽C̃ŁPee.Cߘr~8r:` v'A0f:BK=XS ZaUg m#r =vBbyK|vM~l~l|v\y_v@r [m#g3aUGZS K=B<:0' UBrw:l!~rǒ󡉿 C8e eFCǒ-r|Ha± roP .'0>:BK=S!ZTaU~gem$&r vAyy|vp~l~l|v9y1vBBr m#gaTZS fK=B߼:80'#G f q}⵽<ޯ~wQro۳]ІCp!de]؆C扽ۍ {pJ|Ӵ) -sV% ?ߵ'^0:BK; S!ZaUgm"]r vAMy|v~lK ~l|wyvB r m#^gaTZSK~ r|CB\de't DOɘqN}Eâs{ VF'0R:BK;S!Z(aVAgm"r vAy|v~lb#~l|vyvAr `m#gaT$ZS"K̥}(q.Չ]DP9dd⁓/DCM’q }ݬApH7 l'z0:BK;S"mZaT gmm"r MvAy|v~ly ~li|vyvAr m"g.aSZFS"K;B:0z'o Ip?䶽Ŭe}:ǘqgߍb$D"{e*dRC5fqԥ}Ĕ q3L }i':0g:BKL|ОfqܑCdeduCcJݴrV5~Yޏ Vq^; '0:BߘKqh I%'0:9B߾K=S gZaTgm#r vBCy1|v9~l~l|voyxvAr m$%gdaU}ZSS!K=B:0<', Nmrㄽ ¯`|Gr,ƉCEee 9C rȞ~#n< ryD X'0:B>K=S ZaUIg5m#r \v@y`|v\~l~l|vLyJvBbr S!KZaUgm$Ir vA-y|v~l~l|v)yvB(r m#gaTZTS 3KC[ode!gC)ܞqv|`SGksfQ( '0:B=K;CS!ZaV gm"r vAgy|v~lU~l|vyvAr m#;gaTZZSKS!\ZaUgm$Ur vA6y|v~l~l|wyvB r m#}gaTZDS "K  '0:BOK;US!ZaVgm"r vAoy|v~lX~l|vyvAr m#/gaTKZSK px݈}dq򭉾;D4$d߀d道DD^oFq۞F}Ĭceepi A.'0/:WBNK$B:d0'1k \s* \߰|,s5cɆC؃΁Vee(C~r˘ro~Ӵdr: uQ'0C:aBK=9S ZaUgm#r ,vBTy?|vD~l~l|veykvAr lm$gJaU`Z3S K=B\:0' {!Agrx\ܴ‹>|'˘rݒ󲉽C>e e @Cr➪Х|-D’droJ*  '0:BdK=S Z9aUfgOm$r pvAym|vg~l~l|vByy|v~lE~l|wyvBr m#rgaTZ4S Kܵq8}(Äyns}U 0!'0/:BbK;gS!Z aV(gm"r vAxy|v~l\~l|vyvAr m#$gaT=ZSK<@BG:O0''&9 ap]^]}Aq֒B找lD\Bdd߁&D7>q}jݏp# F'V0:BK;S"PZwaSgVm"r rm2q F8 p'0:BKB:P0'V~ Esν Iߟ|s(W쉽CуȁRee,C|טr~~+wr+P f'20X:uBK=KS ZaUgm#r 6vB\yF|vI~l~l|v`ydv@r bm$g=aURZ$S K=BI:0' e +QrcHɴy-~잪rВ 󨉿C;e eCC%rߥ|=U¤xr`@ '00:BwK=S! ZIaUtg\m$r zvAyt|vl~l~l|v=y6vBHr m#gaTZS rK= B:F0''3W uqýJ޻~[rxۻdֆCu#deZՆCችՍssG@|Ǵ vsGz /ߥ'O0:BK;S!}ZaUgm"Ur vAGy|v~lH~l|w yvBr m#fgaTZ$S KʴìJ~r ݄ CG`de&r DHqE}9Ösk F7'0D:BuK;yS!ZaV6g m"r vAy|v~l_~l|vyvAr gm#gaT.ZS"K<.B4:;0'# JppwIKKإ}2qɒ6܉cDU=ddၓ,D>Gq}zݠ 3p9' \'k0:BK;S"aZaSgcm"r FvAy|v~lw~lk|vyvAr #m"g7aSZQS"(K;B:0'# YpNĽ˴Ҭf}Eјqq򘉾*D'}e,d큓NC0]qʥ}ćq$< mY'+0X:~BtKB:<0t'@h /s㺽 6ߎ|rsL≽CʃÁOee/Cr~=r@ f |'H0l:B K=]S ZaU"gm#r @vBeyM|vN~l~l|vZy]v@r Xm#g0aUCZS K=B6:0'y O;rq5g~ܞrÒ󞉿C7eeGCʒ0r|Mf¶ ovV  (*'0:~BK=SZYaUgm"r vBy?|vq~l~l |w'y/v@r m#gaW{Z~S aK9B :20`'A _ q@7ᵥ~rMpƍZED} eMeC艿e=sT|شk o+ E ߻'d0:B K>OSZaUgm"ar vBym|v~l~k|wyv@~r m#ZgaWZSK9XB:0'* "pqU;廽uC~ tmx D|[ eAe(ՃD͘s} Jkop) hL'0 :BK>SZ,aVEgm"r vCy|v~m~m|vyv@Er ]m# g(aVZS~K?XB!:'0L' 4Nkp68ҥ}t*҉ӆDN8e6e3탉1DE׍Œtw}໴pN0 o'00: BK?@SgZaVgm"r Pv@:y|v~m~m|vyvCr m"gaVXZAS K>B:0&'i Fp9䰽`}5*s܍򎉿D ڀe*e?TDs it\٥}-]q9S o'0:BK?SZaWgnm#Kr v@sy|v~k~l|vyvvBr m"pg,aUZSK>gB":0' c &Ho+9ƃ|˞ɘsf܎JpCeeKvD:Lݷp:~]៴ֽ%q qqA #'0E:BK9S JZiaWhgm#r v@y&|w ~l ~l|vxyHvBr m""gaUZnS)K=B:0'F E tov㦽 }|bs@7CÃρed3DωspX~ǬO3rU!} 5'+0:BK:2S ZaRgm#rv@yT|wB~l D~l|vUyvBpr Nm!g|aU5ZS#K=uB#:0'd޵ 9&n!:ő {9rÉCԀedJDԒSp1mȽ 0r!l K#'0Y:"BK:S!.Z=aRgvm$5r vAy|we~l89~l|v2ydvB7r m!g%aTZS#[Km$gaSZS"K;B&:0_'+7c -s !îEqVںUB܃wd؀dHC=]r{/3ī"$uf h'V0:6B1Kgm!r UvBvy|vY~lF~l|w?yOv@rm#gaRZS K:&By:0' &n rG&杽C~pO󊉽mD˃0de҆Cȉ= Hsq|l߈o++  TU'0:BK=S4ZxaUgm"*r vByL|v|~l~l|wy!v@r m#gaW^Z_S ?K9B: 07' 3b bqʬᓥ~S0oݯF4DseJeCvQܖsnҥ|֬ƏF8oW5 r '0:*B/K>sSZaVg5m"xr vBy{|v~l~m/|vyv@mr m#CgfaVZSK?B{:0'a Dq+哽Q"}鞩ϘtSaDnPe>e+܃D$sƞ3}@kpGU x'03:BK>SZLaVbgm"r vC"y|v~m ~m|vyv@4r Im"gaVZS\K?4B:0#'r `"@pجథ}ns򾉿҆D@-e2e7;DSٍْ2t}ݴECpy\C ( '0Y:5B.K?dSZaVg1m#r dv@Ky|v~m!~m|vyvC r m"gaV;Z"SK>B|:{0'>Z rpa䉽_>} sōzD Ӏe&eB ^D݀tv~OHqc  1'90:BK9dSZaW$gm#br v@y|w~k~l|vyhvBr m"YgaUZSxK>BB:0r'V߭ 6o_ͥ|sKw6_C䃈灓eeN"DKaΘpW~}CMq n O,'0n:?B-K9S lZaWgm#r v@y3|w*~l~l|vny:vBr }m" gaUyZNS$K=B}:p0'  GgnM~[|B}r)&CŁed:D݉pr~s]r!-1 a'U0:BK:VS ZaRg8m#r0v@yb|wM~l'A~l|vKy vB_r :m!gbaUZS#K=QB:0^'9ފ Tndm{ٞrۍPC̀edŁQdžBjpʞP܎ B7s!> wN'G0:IB,K:S!PZ\aSgm$Lr vA0y|wp~l?5~l|v(yVvB&r m!og aTZ{S#9KɉzC+:dd܁ B0p٘qyۥ$r޽!AAt*h q'd0:TBXK;S"3Z0aSg@m$r YvAy|u~lm~lu|uyvAr nm%g[aSZS"UK;B:|0' MFtU%j!hݔDq􅉾ABdd聓/Ci'qўSVZaUgm"Ar vByZ|v~l~l|wyv@r m#zgaWAZ?S K9B:0'd ^6 7qsq~3oݒݘ1#DieFe# Deܭs|:l`7oaE -'0:RBUK>SZaVgm"r vBy|v~l~m)|vyv@\r ym#,gKaVZSK?BU:]0'5U qqkk-}ʞt9JDaFe:e.ド#D2sP}_pq 3'G0]:BK?S9ZkaVgm"r 4vC3y|v~m~m|vyvC3r 5m"gaVZlS:K?B:0^'H 4pr}`Qs򪉿D2#e/e:ED`It8}ɬ,kjpp T4'0:\BTK?SZaVgKm#+r xv@\y|v~m(~l|vyvBr m"gaVZSK>BV:S0'. Fbo8al;|sܮfD e#eFhD#1ݗoܞ~3qrq 65 ]'c0 :BK9S Z?aWAgm#yr v@y|w~k~l|vyZvBr m"BgaUZSWK>B:0I'+߁ XoVܽ;߫|s1`"NCփ݁eeR)D\up4s~iur @ {W'0:gBSK:S ZaRpgm#rv@yA|w4~lI~l|vcy,vBr im!gaU\Z/S#K=BW:I0' u;`n$Wn¬9|#`rْމCހe dAD뉽4pե?—r!Y]0 '0!:BK:zS!ZaRgSm$rDvAyo|wW~l.=~l|v@yvBNr %m!gHaTZS#K=-B:05'_Z (uѽIǥ{rÍ<܆CzƀedȁXцB΍ނp䞫6pܰ h^s8!j "z'r0:qBRK:S!qZ|aS2gm$dr vAAy|wz~lF2~l|vyIvBr m!WgaTZ\S#KuGLoЬV{Or*uCKtddԁoBΉ@ڢq<٬"É s[ 6 '05:BK;lS!ZaSgm$r *vAzy|u~l]&~l|uyvAr m%7gaT9ZS"K<;B:0!'2 Ztǽ!Wz枬=qҒ'iC0ddBAqCݔ!gi$tTE L'0:{B~K;S"UZaSgZm%r nvAy|u~lt~ln|uyvAr Zm$g@aSZ0S"4K;BY:U0'er !it+B!Bެr$ۘqzٍq0B d܀d쁓:C+zȒ>q랬Y{{!t) ].'0I:BK<^S"ZaTUgm%Nr vAy(|v~l)~lV|uyvAir m$gaSwZS!K;IB:0 ' /Y"Qsrཽ ôfzq"޹-BꁓidрdCY یrC{nws8uqh? w'0:B}KBSxZaUgm"Xr vByh|v~l~k|wyv@r m#cgaW$Z SK9eB:0': 2 qdIɽŴO~tw݁D^ eCe&Ӄ DzĘs }=^ap q Y='0:zB{K>SZ!aV:gm"r vC y|v~m~m"|vyv@Kr dm#g1aVZSK?eB/:60Z' ) D]zpDE ޥ}t3ىنDS;e7e2ꃉ-D@эsm}௴׽ p?! `'q0":BK?4S[ZaVg m"r Iv@4y|v~m~m |vyvC"r !m"gaVbZLSK>B:04'y VpH侽ƴl}@4sǒ򖉿D%܀e+e>PDnatRΥ}!Pq*C `'0:BzK?SZaVgem#Cr v@my|v~m/~l|vy{vBr m"xg5aVZSK>sB0:+0' s6Xo9FƐ|מӘsoܖRvCeeIsD4Eݯo/~Rᒴɽq aa2 '06: BK9S >Z^aW^gm#r v@y!|w~l~l|v|yMvBr m"*gaUZyS5K=B:0 'V U ,o,㴽Ǵ߉|mrsH=CȃӁed0DʉmpN~B%rF m %'0:ByK:%S ZaRgm#rv@yO|w?~lF~l|vYyvBvr Um!gaU?ZS#K=B1:!0's I5n/HŞ|CrʉC׀edHD͒Kp%`» "r!] ;'0J:BK:S!"Z2aRgmm$-r vAy}|wb~l5:~l|v6yivB=r m!g.aTZS#gK= B߱:0 '3. Y{uq⪽ȴ%ަ{rg۬(ˆCldd́_ۆBߍޙpSҴ4 9sb" O'0:BxK;S!ZaSOgm${r vARy|w~lM .~l|vy;vBr m!@gaT}ZHdd؁vB܉UڹqVDí! s, b6'*0^:B%K;S"ZaSgm$r >vAy|u~ld"~l~|uy vAr m% g~aTZS"K<B޳:0' .Tt]៽!3¥zƞ qXC%ddこ!C Rqzݵ&!MtqC y'0:BޤK< S"wZaTgtm%r vAy|u~l{!~lg|uyvAr Fm$g&aSZS"K;B3:-0n':Gs =t!úQq`\B჊ydـdDC8ܒUrv{$'ğ" u V Y'G0r:(B$KfSZaUg+m"pr vByv|v~l~k|vyv@tr m#KgoaWZSK?B:0'p Tq: 塽^.}٘t\i DsTe?e*ڃDܘs)}4_p8E h' 0%:BK>S ZAaVWgm"r vCy|v~m~m|vyv@:r Pm"gaVZShK?AB :01' p1Op༥}xtʼn؆DE1e3e57DNӍҒ*t}Ѵ75pjM3 '0K:'B K?XS}ZaVg'm# r ]v@Ey|v~m~m|vyvCr m"gaVEZ-SK>B:0 'Mi *pp䗽lJ}!s͍򁉿DՀe(eAZD| xtm~Ct:qTo !'*0:BK9XSZaWgm#Zr v@~y|w~k~l|vymvBr m"agaUZSK>OB :0'e߼ F ,o!l٥|sU=eC郈끓eeM }DEYƘpL~rᴴ6?q ^ @'0_:1BK9S `Z~aW{gm#r v@y.|w&~l ~l|vqy?vBr m"gaUZZSK=B:~0'+ ) Wwo\㌽g|Nr1,Cȁed7D؉~pi~۬fNrp!! Q'F0:BK:IS ZaRg/m#r(v@y]|wI~l%B~l|vNyvBer Am!glaU"ZS#K=]B :0m'Hޙ d ns"z{䞭&r񶉾CЀedāOÆBbpE܂߽ 5)r!. g?'80s:;BK:S!DZQaS gm$Dr vA*y|wl~l<6~l|v,y[vB,r m!wgaTZS#EKn :t!Ĉ{dqGЉC0>ddہ} Bꉾ*iИqpѥfѽ!43t X b'U0:FBKK;S"'Z$aSg7m$r RvAy|u~lk~lw|uyvAr um% gdaSZS"bK;Bލ:0' ](Vtd4x!vݠOq􌉾GCdd灓,CcqȞ2zڬ״J!vtoI "'0:BK<-S"ZaT.gm%.r vAy|u~l%~l`|uyvAr 1m$g aSZS!K;zB :0E'G ls Ö/垫qFګHBԃrdՀd󁓬OCFlr {DIý`=u7- :ݽ'q0:PBJKm!r vBHyr|v<~l<~l1|w[ytvArKm$g\aRZS! K:B:00' Am!ir ¥Kߘp|bDƒ,eSeنCщHWs'|ߞ-oFH  pq'0::BK>SJZaUgm"9r vByU|v~l~l|wyv@r m#gaWLZKS )K9B:0's nF Fq}~>oݠ9)DleGe" C^ܥs|Ʀ^R)osR5 '0:DBGK>SZaVgm"r vBy|v~l~m+|vyv@br m#4gUaVZSK?Bb:k0'Ee 'qyy: }՞tBRDeIe<e-჉D-sמF}Tpbr #'80N:BK?S-Z`aVtgm"r -vC,y|v~m~m|vyv@)r Bc:a0'"= VroGozH(}sܶmD ΀e$eEeD*ݏoӞ~'ecq~ '& M'T0:BK9|S Z3aW6gm#qr v@y|w~k~l|vy_vBr m"JgaUZScK>+B:0X':ߑ hoeH߷|s;h)TCۃၓeeP'DVnݘp+i~ִ\gr 1 lH'0:YBEK9S ZaRegm#r v@y<|w1~lJ~l|vgy1vBr pm!gaUfZ:S$K=Bd:W0' +Kpn3e{ϬE|.jr剿Ce d>D扽+pʥ~3Šwr!IM ~'p0:BK:nS ZaRgIm$ r=vAyj|wT~l,?~l|vDyvBTr -m!gQaUZS#K=9B:0D'ni 8uVӥ{Ğ r̍CCɀedǁV͆Bȍyp۞+dܤ [Ps)![ j'c0:cBDK:S!eZqaS(gm$[r vA;y|wv~lC3~l|v!yNvBr m!`gaTZgS##KrlѴ€*~Øp|%󬉽D⃉n{V6   '0:aBoK=S$ZBaUngm"r vvBy5|vj~lK~l|w.y9v@r m#gaWZS yK9B;:N0}'<` % r\Rͥ~ap$׍hQD%ePeC߉Y/nsB|Qop t & ߜ'F0c:BK>5SlZaUgm"Pr vByc|v~l~k|w y v@r m#kgaW/Z+S K9rB:0'I B qsX׽Ҵ\~o̒݉$DbeDe%ЃD rܼs} 1RzRo~ a I.'0:lBmK>SZaV0gm"r vCy|v~l~m$|vyv@Qr lm#g;aVZSK?rB<:D0i'9 TmpRS}t(;ቼ߆DX?e8e1胉)D;ˍ sc}sࣴʽp/ P'b0:BK?'SOZaVgm"r Av@.y|v~m~m |vyvC(r (m"gaVmZXS$K>B:0C', fpWͽӴx}L>sВ򝉿D*߀e,eB=:90' )FgoGTƝ|➨ݘsxܟY|Ce!eHoD.>ݦo힪%~Gᆴ q RR" z'~0':BK9S 2ZSaWSgm#r v@y|w~l~l|vyRvBr m"3gaUZSAK>B:0/'e e <o;½մ$ߕ|x|s QCC̓ցeeT.DƉgpE~5r7 ] s' 0:BkK:S ZaRg m#r v@yJ|w;~lG~l|v]y#vB|r \m!gaUIZS#K=B>:/0' YDn =Uū#|Mrɒщ Cـe dED􉽠ƒCpT® r!uyM +'0;:BK:S!Z&aRgcm$%r vAyx|w^~l3;~l|v:ynvBCr m!g7aTZS#sK=B߿:0'C= i u⸽ִ2޲{rq۴/цCq€ddˁ\؆Bٍ ޑpHƴ' x*sS"  ?'0:BjK; S!ZaSDgm$sr vALy|w~lJ/~l|vy@vB r m!HgaTZGS#Kdtkᮽ!@Υzў*q^C)dd⁓CLq Wݩ!?tpa4 i'0:BޗK;S"kZaTgkm%r {vAy|u~ly ~li|uyvAr Mm$g0aSZS"K;BA:;0|'IV Lt(!*Ǭ]ɘqiʍc%B惊{dڀd@C4ՒMqk{Ē!tF zJ'70d:BKgaSZIS!;K:B:10h'-3[ }"!r +լy=p\܉EMdÀeуCr.{ń,n~p (ޥ'T0x:BK=gS#ZaU*grm!r FvBjy|vQ~lC~l#|wFyYv@r#m#g(aRZS K:@B:0'; E!reC溽\~Ӟpb󘉽zDՃ5de郈ˆC17s|Vpgo c  56'0:BK=SZbaUgm"r vByC|vt~l~l |w$y+v@r m#gaWsZuS WK9B:&0T'4 R q4,᫥~iEp T@DzeLeC쉿jC܅s\|u+o8 R 'p0:BK>YSZaUg"m"gr vByq|v~l~k|wyv@zr m#TgxaWZ SK?B:0' cqI/寽k:}tfrDxXe@e)׃DӘs})Sv{p)5 uY'0:BK>SZ5aVMgm"r vCy|v~m~m|vyv@@r Wm#g aVZStK?NB:0@' 'A_p*-ȥ}t$̉ΆDJ5e5e44DI͍˒!t }Ŵ)'p[=# | '0<:BK?KSqZaVgm#r Vv@?y|v~m~m|vyvCr m"gaVPZ8SK>B:0']y 9p-䥽yV},!sՍ򉉿D؀e)e@WDwptc}7g+qE_ {'0:BK?SZ aWgvm#Rr v@xy|w~k~l|vyrvBr m"ig%aUZSK>\B:0't VS>ZaUgm"0r vByP|v~l~l|wyv@r m#gaWVZVS 5K9B:0+' ~&V Vq ብ~J(oݨ@/DpeIe C{Wܝsvۥ|߬ƚQDocB%  '0:6B:K>}SZaV gm"r vBy|v~l~m-|vyv@ir m#S!ZUaVjgm"r &vC&y|v~m ~m|vyv@/r Cm"gaVZSRK?*B:0'f T3pάথ}ves 򸉿͆D<*e1e8>DVލߒ9t&}ONpiP 5'0e:@B9K?oSZaVg8m#r jv@Py|v~m#~l|vyvCr m"gaV3ZSK>Bq:o0'1M e pV}U4} sܾtDрe%eC aD#݇oʞ~XTqo  >'E0:BK9oS Z(aW,gm#ir v@y |w ~k~l|vydvBr m"Rg aUZSoK>8B:0g'Jߠ *xotUå|sDp0ZC䁓eeO$DPf՘p"_~ʴNYq !{ \8'0y:KB8K9S vZaWgm#r v@y7|w-~lL~l|vky6vBr xm"gaUqZES$K=Br:e0' :ZnAsܬQ|9tr"퉿!Ced'"R zt!ݴqzQq8ÉuC'7dd݁B5vߘq㥀-{!LLt6'u -}'p0:_BcK;S"=Z9aSgGm$r _vAy|u~lo~lr|uyvAr hm$gSaSZGS"LK;Bt:q0' A :tI^!]݋;q'0,:BK~l,|wUylvAr>m$gLaRZ S K:qB:0't $Q!Mr{ߴ6~͘p-󳉽D烉?de ߃Crg|+B̽xa/nlG' '0:SBaK=S$Z7aUdgm!r ovBy0|vf~lJ~l|w2y=v@r m#gaRhZS K9BI:\0'Kp 5 rj_٥~lp-ߍoXD'eQeCډS'fs8|ߴEoad  ߍ'70T:BK>(S`ZaUgm"Hr vBy^|v~l~k|wyv@r m#sgaW9Z6S K9B:0'X Q* +qgh~* oՒݑ,DfeEe$Dkܴs|%EwlConQ 9'0:]B`K>SZ aV&gm"r vBy|v~l~m'|vyv@Wr sm#%gDaVZSK?BJ:R0x')H d }p``#}t1C艼D]Ce9e0僉&D6ōs螩Y}hp}  @'S0h:BK?SCZtaVgm"r :v@(y|v~m~m|vyvC.r /m"gaVwZcS0K?B:0R'; 'vpf۽}WIsْ򤉿D. e.e;HDdPt@}Ҭ 7uvq #| aA'0:hB_K?SZaVgRm#2r ~v@ay|v~m*~l|vyvBr m"gaVZSK>BK:H0'! 9Vwo-Vbƪ|힨sܧ`D e"eGkD(7ݞo䞪~B:0>'u t LoJн1ߡ|s*YIC҃ځeeS+Da{p<|~(tr( M c'0:rB^K: S ZaRxgm#rv@yE|w7~lH~l|v`y(vBr cm!gaUTZ&S#K=BL:=0' h.TnKcŸ/|WrҒ ؉C܀e dCD:pݥH¡r!ei= '0-:BK:S! ZaRgZm$rJvA ys|wZ~l0<~l|v=ysvBIr m!g@aTZS#K="B:0)'RM xuƽ?޾{rz۽6׆CvĀddɁZԆBӍވp랫>yܺ sjsD!w /'~0:}B\K:S!{ZaS:gm$jr vAFy|w}~lH1~l|vyEvBr m!QgaTZRS# K1u;AdƬL{Fr"o򉾞CHPddՁqB҉ FڨqC,Ó s h C' 0A:B K;wS!ZaSg m$r 0vAy|u~l_%~l|uyvAr m%1gaT0ZS"K<0B:0'& NstzἽ!Mڥzݞ4qʒ dC-ddၓCFqLݝ !rt0taR$ Y'0:BމK;S"^ZaSgbm%r svAy|u~lv~ll|uyvAr Tm$g9aSZ'S"*K;BN:I0'Xf \t7!7ԬiӘqrҍk+B냊 ~dۀd큓=C/ΒEqa{ą!t6 j:'(0U: B K|vp~l~l|w'y0v@r m#gaW}ZS cK9B#:50c' D b qC9ᷥ~tOpȍ[FD~ eMeC牿d<}sR|ִio) B ߸'a0}:BK>LSZaUgm"_r vByl|v~l~k|wyv@r m#\gaWZSK9[B:0'- %sqX>彽wF~ toz D}[ eBe'Ճ D˘s}Gilp&~ eI'0:BK>SZ*aVCgm"r vCy|v~m~m |vyv@Fr _m#g*aVZSK?[B$:*0O' 7Qnp8:ԥ}t,ԉԆDO8e6e3색0DD֍Òtu}๴pK- l'}0-: BK?>SeZaVgm"r Nv@9y|v~m~m|vyvCr m"gaVZZCSK>B:0)'l Ip<䳽b}7,sލ򐉿D!ڀe*e?SDrgtZץ}+[q6P l' 0:BK?SZaWgmm#Ir v@ry|v~m1~l|vywvBr m"rg.aUZSK>iB%: 0' f *Ko.<Ɔ|Ξ˘sgܐLqCeeJvD9Kݵo8~[᜴ӽ#q nn>  '0B:BK9S HZgaWfgm#r v@y%|w~l~l|vyyIvBr m"$gaUZpS+K=B:0'I H woy㩽 |dsB8CăЁed2DΉrpV~ŬL1rR z 2'(0:BK:0S ZaRgm#rv@yS|wB~l E~l|vVyvBqr Om!g~aU7ZS#K=wB&:0'g޸ <)n$=Ŕ {;rĉCՀedJDӒRp.jŽ -r!i H '0V:BK:S!+Z;aRgtm$4r vAy|we~l79~l|v3yevB8r m!g&aTZS#]K Eso"") \'0:BK;"S!ZaSWgm$r vAWy|w~lO -~l|vy7vAr m!9gaTuZ3S"Kr vBy:|v~l. ~lM|wyvASr m$}gaSQZS!K;B{:0' S "sf= 7եUqޛB܁`d̀dCkɍ&۪reߥ{ޢ"muwU */'0:B߮K=S#dZaTg+m!r vBpSZaUg3m"vr vByz|v~l~m0|vyv@or m#EggaVZSK?B}:0'd Gq.喽S$}랩јtUcDoQe>e+܃D#sĞ1}>ipDR u'01:BK>SZJaV`gm"r vC y|v~m ~m|vyv@5r Jm"gaVZS^K?7B:0%'u d %Cp۬ಥ}ps򿉿ӆDA.e2e6:DR׍ؒ0t}۴B@pvY@ %'0W:2B+K?bSZaVg/m#r cv@Jy|v~m!~m|vyvC r m"gaV=Z$SK>B~:}0'A] upd䋽bA}sƍ{D Ӏe'eB ]Dtt~LFq` | .'60:BK9bSZaW"gm#ar v@y|w~k~l|vyivBr m"ZgaUZS{K>EB:0u'Y߰ : obϥ|sMx8`C僈聓eeN"DJ_͘pU~{ᾴAJq k L)'0k:5~l|v)yWvB'r m!pg aTZ}S#;Kt'e n'a0:QBVK;S"1Z-aSg>m$r XvAy|u~lm~lu|uyvAr om%g\aSZS"XK;Bނ:0' QItX(l!kݗFq􆉾BBdd聓/Ch%qϞ:zT!t|V .'0:BK<8S"ZaT6gm%5r vAy|u~l&~l^|uyvA|r ,m$gaSZS!K;oB:09': _s Ì%ܞq>ڤB BЃpdԀd􁓮RCJsr'{MSͽkI uC: G'}0:[BUKSSZaUgm"?r vByY|v~l~l|wyv@r m#|gaWCZBS K9B:0'g a 9 :qut~5oߒݙ3$DieFe# Ddܫs|Ʊi]5o^B *'0:OBRK>SZaVgm"r vBy|v~l~m)|vyv@^r zm#-gMaVZSK?BW:`0'8X tqnn/}̞t;KDbFe;e.ド"D1sߞN}]pn~ 0'D0Z:BK? S7ZiaV}gm"r 3vC1y|v~m~m|vyvC4r 6m"gaVZnSBX:V0'1 Ieo;do>|sܯgD e#eFhD"0ݖo۞~0noq 32 Z'`0 :BK9S Z=aW?gm#xr v@y|w~k~l|vy[vBr m"CgaUZSYK>!B:0L'.߄ [oY߽>߭|s3a#OC׃ށeeQ)D[sp2q~grr = xT'0:dBPK9S ZaRngm#r v@y@|w4~lI~l|vdy-vBr km!gaU^Z1S#K=BY:K0' x>cn'YpŬ;|%brےCހe d@Dꉽ2pӥ<”r!VZ-  '|0:BK:xS ZaRgQm$rBvAyn|wW~l.>~l|vAyvBOr 'm!gJaTZS#K=/B:08'b] +uԽLʥ{rō>݆C{ǀedȁXІB͍ހp➫4mܮ f\ s5!g w'o0:nBOK:S!oZzaS0gm$br vA@y|wy~lE2~l|vyJvBr m!YgaTZ^S#K?SuZaUgm"Wr vByg|v~l~k|wyv@r m#dgaW&Z"SK9hB:0'< 5 qgL̽ǴR~tx݂D_ eCe&҃ DxØs };\^p n V:'0:wBxK>SZaV8gm"r vC y|v~m~m"|vyv@Mr fm#g3aVZSK?hB1:80]' , G`}pFH }t 4ۉچDTB:07' | YpKɴn}C6sɒ򗉿D&݀e+e=ODm_tQ̥}Nq'@ }]'0:BwK?SZaVgcm#Ar v@ly|v~m/~l|vy|vBr m"zg7aVZSK>vB2:.0' v9[o<Iƒ|ٞ՘sqܘSxCe eIrD3Dݭo-~Pᐴǽ q ^^/ '03:BK9S CɃӁed0DʉlpM~@"rC j "'0:BvK:#S ZaRgm#rv@yN|w>~lF~l|vZyvBwr Vm!gaUAZS#K=B4:$0'v L8n2Jš|ErˉC׀edGD̒Ip#^¸ r!Y 8'0G:BK:S!Z/aRgkm$+r vAy||wa~l5:~l|v7yjvB>r m!g0aTZS#iK= Bߴ:0'61 \~ut⬽˴(ި{riۮ)̆Cmdd́^ۆBލޗpQд1 6s_" L'0:BuK;S!ZaSMgm$yr vAQy|w~lL .~l|vyS"Ks |_zsop  AC'0:BK=S&ZkaUgm" r vByF|vw~l~l |w!y'v@r m#gaWkZlS MK9B :0H'' Fu uq)!٬ᢥ~`cSZaUg*m"nr vByu|v~l~k|vyv@ur m#MgqaW ZSK?B:0's Wq=#夽`0}ۘt^k DtUe?e*كDژs'}2]p5B e' 0":BK>S Z>aVUgm"r vCy|v~m~m|vyv@;r Rm"gaVZSjK?DB :04' s4Rp"ྥ}ztljنDF2e4e57DMэВ(t}ϴ42pgJ0 '0H:$BK?US{ZaVg&m# r [v@Dy|v~m~m|vyvCr m"gaVGZ/SK>B:0'Pl -p s䚽nM}#sύ򃉿Dրe(eAZD{ vtk~@r7qQl ''0:BK9USZaWg}m#Xr v@}y|w~k~l|vynvBr m"cgaUZSK>RB :0'h߿ I /o#nۥ|sW܁?fCꃈ쁓eeM|DDXĘpJ~oᲴ3<q [ ='0\:.BK9S ^Z{aWygm#r v@y-|w&~l ~l|vry@vBr m"gaUZ\SK=B:0'. , Zzo_㏽i|Pr3-CɁed7D׉}pg~٬dKrn! N'C0:BK:GS ZaRg-m#r'v@y\|wH~l$B~l|vOyvBfr Bm!gmaU$ZS#K=`B:0p'Kޜ g nv $}{枭(r񷉾CЀedÁN†Bap C܀ܽ 2&r!+ d<'50p:9BK:S!AZOaS gm$Cr vA)y|wk~l<7~l|v,y\vB-r m!xgaTZS#GKE x'0:BK;9S!ZaSjgm$r vAby|u~lS +~l|v y.vAr m%XgaTbZS"Kddہ}B鉾)gϘqnϥcν!10tU _'R0:CBHK;S"$Z"aSg5m$r QvAy|u~lj~lw|uyvAr wm% gfaTZS"dK;Bޏ:0' `+Ytg6z!xݣQq􍉾HCdd灓+Cbqƞ0zجմG!ttlF '0:BK<+S"ZaT,gm%-r vAy|u~l$~l`|uyvAr 3m$gaSZS!K;|B:0G'J os Ù1瞫qGڬIBՃsdրd򁓬NCEkr{AG^;u4* 7ݺ'n0:MBGK‰D񃉳Dde ڃC ՒrΞS|*Ų]EnM' a'0:7BFK=S#Z!aUOgm!r `vBy&|v_~lH~l|w9yGv@r m#gaR}ZS K:Bd:y0'j  T r/懽z.ܥ~p@~dDÃ,eSe؆CЉGUs&|~ߜ+oCE  mn'07:BK>SGZaUgm"7r vByT|v~l~l|wyv@r m#gaWNZMS ,K9B:0'v qI Iqဥ~Aoݢ:*DmeHe! C]ܣs}| Ƥ[O&opO2 '0:ABEK>SZaVgm"r vBy|v~l~m+|vyv@dr m#6gWaVZSK?Be:n0'Hh *q|{<}מtDTDfJe<e-D,s՞D}Rp_o '50K:BK?S+Z^aVrgm"r ,vC+y|v~m~m|vyv@*r =m"gaVZySHK? B:0o'Z G'pì}m]s򲉿ȆD8'e0e9ADZ?t-}ZZpv] A"'0q:LBDK?ySZaVg@m#!r pv@Uy|v~m%~l|vyvCr m"gaV*ZSK>Bf:d0'%@ YuoJr}J+}sܷnD πe$eDdD(ݍoў~%b`q| $# J'Q0:BK9yS Z1aW4gm#pr v@y |w ~k~l|vy`vBr m"KgaUZSeK>.B:0['=ߔ kohJ߹|sD剽*pȥ~0ˆtr!FJ {'m0:BK:kS ZaRgGm$ r;vAyi|wS~l+?~l|vEyvBUr .m!gSaUZS#K=S"BK;Bi:f0'w 4|-t= S!R݁2qy7Bdހdꁓ5C%s4qMzk!ts K' 08:BK:Q0'?c ( r_T Х~cp&ٍjSD%ePeCމX-ls@|߽Oom q # ߙ'C0`:BK>2SiZaUgm"Nr vByb|v~l~k|w y v@r m#mgaW1Z-S K9uB:0'L E qv[ڽմ^~!oΒ݋&DceDe%ЃD qܺs}/OwOoz^ F+'0:iBkK>SZaV.gm"r vCy|v~l~m%|vyv@Sr mm#gB:0F'/ ipZϽִ{}N@sҒ򞉿D*߀e-eB@:<0' ,Ijo!JWƟ |䞨ߘszܠZ~Ce!eHnD-=ݥo랪#~Eᄴq OO w'{0$:BK9S 0ZQaWQgm#r v@y|w~l~l|vyRvBr m"4gaUZSCK> B:02'h h ?o>Ž״&ߗ|z~s"RDC΃ׁeeT-DʼnfpC~3r4 Z p' 0:~BiK:S ZaRg m#r v@yI|w:~lG~l|v]y$vB~r ^m!gaUKZS#K=BA:20' \"Gn @Xŭ&|OrʒӉ Cڀe dED󉽟ĒApR¬r!rvJ ('09:BK:S!Z$aRgbm$#rOvAyw|w]~l2;~l|v:yovBDr m!g9aTZS#uK=B:0'F@ lu⻽ش4޴{rs۶0҆Cr€ddʁ\׆B؍ޏpFĴ% ~u(sP"  <'0:BgK;S!ZaSBgm$qr vAKy|w~lJ0~l|vyAvB r m!JgaTZIS#K0'LY Ot+!,ʬ_˘qk̍e&B烊|dڀd@C3ԒKqi{ď!tC wG'50a:BK I!rhF漽_ ~՞pc󙉽{Dփ6de胈ʆC/6s|Tndo `  23'0:BK=SZ`aUgm"r vByB|vs~l~l |w$y,v@r m#gaWuZwS ZK9B:)0W'7 U q7.ᮥ~kGp UBD{eLeC뉿iA܄sZ|ߴs(o5 O 'm0: BK>VSZaUg m"fr vByp|v~l~k|wyv@{r m#UgzaWZSK9QB:0'! fqL2岽m<~thsDyXeAe(׃DҘs}'Qsxp&2 rV'0:BK>SZ3aVKgm"r vCy|v~m~m|vyv@Br Ym#g"aVZSvK?PB:0C' *Dbp-0ʥ}t%ΉφDK5e5e43DHˍɒ t ~}ô'$pX: y'09:BK?HSnZaVgm#r Tv@>y|v~m~m|vyvCr m"gaVRZ:SK>B:0'`| <p0䨽{Y}.#s׍򊉿D؀e)e@VDv ntbߥ}4e(qB\ y'0:BK?SZaW gtm#Pr v@wy|v~k~l|vysvBr m"kg&aUZSK>_B:0'w Y?o"1{|ޘs`܉FmCeeKyD>Qݼp@~dᦴ޽&.q z{K - '0N: BK9S RZpaWngm#r v@y)|w"~l ~l|vvyEvBr m"gaUZgS!K=B:0 '= < jom㝽u|[s;3Ćed4D҉w p]~άW'40:BK::S ZaRg$m#r v@yW|wE~l"D~l|vSyvBmr Im!gwaU.ZS#K=mB: 0~'Zެ /wn2ʼn{2r񾉾CӀedLEْXp8tн %r!v T-'&0b:*BK:S!5ZDaRg|m$:r vA"y|wh~l98~l|v0yavB3r m!gaTZS#SKP Mu"Ę {prQ؉C6BddځzB䉾"`Ƙqeĥ W!$"t E {O'C0v:5B;K;S"ZaSg+m$r JvAy|u~lh ~lz|uyvAr ~m%goaT ZS"pK<Bޝ:0' p;htvEች!ݯzqOCdd偓'C\q%z̬ɴ:!et]7 '0:B޺K<S"ZaT"gm%%r vAy|u~l#~lc|uyvAr :m$gaSZS!K;B:0V'".Y #s!æ=󞫮qQڴQBكud׀d񁓩JC@cr{6;ij"",u%o 'ݪ'_0:?B:K|v~l/ ~lK|wyvAOr m$vgaSIZS!K;Bp:0' F" sZ1~ -˥Mpޔ ܆Bف^dˀdCo΍,۱rm{ެ,yua 6<'0:B߹K=S#mZaTg3m!r vB@yl|v8~l;~l4|w`yzvAr m$(ghaRZ+S!K:B: 0B' 2 T!|r ´ZpFɉDFde ؃CΒrĞI| ťO7n> Q'{0:)B8K=S#ZaUEgm!r YvBzy!|v[~lF~l|w=yLv@rm#gaRZS K:Bq:0'z d r>敽;~pI󅉽jDȃ/deՆCˉ@Msx|sߐo45  ^^' 0(:BK>S;ZaUgm"/r vByO|v~~l~l|wyv@r m#gaWXZXS 8K9B:0.' )Y Yq¬ጥ~L*oݪA1DqeIe CzVܛst٥|ݬƗNAo`?" { '0:3B7K>zSZaVgm"}r vBy~|v~l~m.|vyv@jr m#>g`aVZSK?Br:|0'Ww :q! 劽I}➩ɘtM\DkNe=e,ރD's̞:}GspP_ '&0<:BK>SZSaVhgm"r %vC%y|v~m ~m|vyv@0r Em"gaVZSTK?,B:0'i W6p Ьਥ}xgs򺉿ΆD=+e1e8=DV܍ݒ7t$}MKpfM 2'0b:=B6K?lSZaVg6m#r hv@Oy|v~m#~l|vyvCr m"gaV5ZSK>Bs:r0'4P hpX䀽W7}svDрe&eC `D!݅t|~VQqm  :'B0:BK9lS Z&aW*gm#gr v@y|w ~k~l|vyevBr m"Tg aUZSqK>;B:0i'Lߣ -{ow Wť|sFr2[C჈偓eeO$DOeӘp ]~ȴLVq x Y5'0w:HB5K9S tZaWgm#r v@y6|w,~lL~l|vky7vBr ym"gaUsZHS$K=Bu:h0'  >]nDvެT|;vr$"Ced;D!px~${fr!7: k'^0:BK:^S ZaRg>m$r4v@ye|wO~l)@~l|vIy vB[r 5m!g\aUZS#K=IB:0U'0ހ| Kn[ e{ҞrՍLC̀edƁSɆBppϞWܖ K?s!H X'Q0:RB4K:S!WZcaSgm$Rr vA4y|wr~l@4~l|v&ySvB"r m!igaTZtS#1KۇCV}ddсjBĉ1޾q'm zs"Za8 '0:BK;PS!ZaS|gm$r vAmy|u~lX)~l|vy%vAr m%IgaTOZ S"K~l-|wUymvAr@m$gMaRZ S K:sB:0'w 'T!Pr~8Ϙp/󵉽D胉?de ߃Crߞe|)@ɽu^,niD# ~'0:PB^K=S$Z5aUbgm!r mvBy/|ve~lJ~l|w2y>v@r m#gaRjZS K9BK:_0'Ns 8 rmbܥ~np/qYD(eQe߆CىR&ds6|߱Bo^a  ߊ'40Q:BK>&S]ZaUgm"Fr vBy]|v~l~k|wyv@r m#ugaW;Z8S K9B:0'[ T- .qjj~, oגݓ- DfeEe$Djܲs|#Bti@okN 6'0:[B]K>SZaV$gm"r vBy|v~l~m'|vyv@Yr tm#'gFaVZSK?BL:U0z',K gpcc%}Þt3E鉼D^Ce:e/僉%D5čs枩W}fp{ ='P0f:BK?SAZraVgm"r 9vC6y|v~m~m|vyvC/r 0m"gaVyZeS2K?B:0U'> *y piݽ}YKsے򥉿D/!e.e;HDcNt>}Ь4ssq  y ^>'0:eB\K?SZaVgQm#0r }v@`y|v~m*~l|vyvBr m"gaVZSK>BM:J0' $ B:0@'"x w OoMӽ3ߣ|s,ZJCӃہeeR+D`yp:z~&r~r% J `'0:oB[K: S ZaRvgm#rv@yD|w7~lH~l|vay)vBr em!gaUVZ(S#K=BO:@0' k1WnNeź2|YrԒ ډC܀e dBD9pۥ FŸr!bf: '0*:BK:S!ZaRgXm$rHvA yr|wZ~l0=~l|v>ytvBJr !m!gBaTZS#K=%B:0,'UP |uɽA{r|۾8؆CwŀddɁZӆBҍއpꞫ<wܸ qgsA!t ,'{0:zBZK:S!yZaS8gm$ir vAEy|w|~lG1~l|vyFvBr m!RgaTZUS#KDfȬN{Ir$p􉾟CHPddՁqBщ EڧqA)Ñ s e @' 0>:BK;tS!ZaSgm$r .vA~y|u~l^%~l|uyvAr m%2gaT2ZS"K<3B:0') Qvt}᾽!Oݥzߞ6q̒"fC-ddၓCEqJݛ !oq-t^O! V'0:BއK;S"\ZaSg`m%r rvAy|u~lv~ll|uyvAr Um$g;aSZ)S",K;BQ:L0'[h _t"9!:׬k՘qtԍl,B샊 ~d܀d쁓vBcy|vM~lB~l&|wKy_v@r,m#g3aRZS K:OB:0'M X(!%rwU˽l~pm󡉽Dڃ8de惈džC)-r|HbUnpP  "$'0:xBK=S$#ZUaUgm"r vBy=|vp~l~l|w(y1v@r m#gaWZS fK9B%:70f'#G e qE<ấ~wQpʍ]HD!eNeC承c:{sQ|Ӵf o& ? ߵ'^0{:BK>JSZaUgm"]r vByk|v~l~k|wyv@r m#^gaWZSK9]B:0'0 (v q[@zH~ tq|D~\ eBe'ԃ D~ɘs}Efjp"{ bF'0:BK>SZ(aVAgm"r vCy|v~m~m |vyv@Hr `m#g,aVZSK?]B&:-0Q' :Tqp;=֥}t-ՉՆDP9e6e3색/DCՍ’tt}෴߽pH* i'z0+:BK?;SbZaVgm"r Mv@8y|v~m~m |vyvCr m"gaV\ZFSK>B:0+'o Lp?䶽e}9.sߍ򑉿D"ۀe*e>RDqftXե}(Xq3M i'0:BK?SZaWgkm#Hr v@qy|v~m1~l|vyxvBr m"sg0aUZSK>kB':#0' i-No1>ƈ|О͘siܑMsCeeJuD8Jݴo6~Yᚴѽ q kk; '0?:BK9S FZeaWdgm#r v@y$|w~l~l|vzyJvBr m"%gaUZrS-K=B:0'L K z"o"|㫽߁|fsC 9CŃЁed2D͉qpT~ìJ.rO w /'%0:BK:-S ZaRgm#rv@yR|wA~lE~l|vWyvBsr Qm!gaU9Z S#K=zB):0'j޻ ?,n&?Ŗ{=rƉCՀedIDђPp,hý *r! f E'0S:BK:S!)Z8aRgrm$2r vAy|wd~l79~l|v4yfvB9r m!g(aTZS#_K=Bߩ:0'*$ Oruh⡽ޞ{ۘrbۧ#džCidd́aކBޞqYڴ< Bsl"& Y'0:BK;S!ZaSUgm$r vAVy|w~lN -~l|vy8vBr m!;gaTwZ5S"K{ŘB)n. B޾'l0:B+K=|S#Z aU:gm!r RvBty|vW~lE~l|w@yQv@rm#gaRZS K:+B:0'" ,t rM+棽H~pS󌉽pD̓1de탈цCƉ: Esm|h߃o%%}  NO'0:BK=S/ZtaUgm"'r vByJ|vz~l~l|wy#v@r m#gaWbZcS DK9B:0<' 9h hqϬᘥ~W4oݲH7DteJeCtNܓskΥ|ҬƊ@3 oQ/ l '0:%B*K>nSZaUg1m"ur vByy|v~l~m0|vyv@pr m#FgiaWZSK?B:0'f Jq1嘽V&}힩ӘtWdDpRe>e+ۃD"sÞ/};gpAO r'0.:BK>SZGaV^gm"r vCy|v~m ~m|vyv@7r Lm"gaVZS`K?9B:0('x g(Fpݬ൥}rsԆDB/e3e6:DQ֍֒/t}ش?=ptV= "'0T:/B)K?_SZaVg-m#r av@Iy|v~m ~m|vyvC r m"gaV?Z&SK>B:0'D` x pg䎽dC}sȍ}D Ԁe'eB ]D}tr~J|Cq] y +'30:BK9_SZaW gm#_r v@y|w~k~l|vyjvBr m"\gaUZS}K>GB:0x'\߲ =#o dѥ|sOz9bC惈道eeN!DI^˘pS~xἴ>Hq h I&'0h::B(K9S hZaWgm#r v@y1|w)~l~l|voy6~l|v)yXvB(r m!rgaTZS#=KSQZaUgm">r vByX|v~l~l|wyv@r m#}gaWEZDS "K9B:0'j d < =qxv~8oݛ4&DjeGe" Dcܪs|Ʈf[2o|[? ' '0:MBPK>SZaVgm"r vBy|v~l~m)|vyv@_r {m#/gOaVZSK?BZ:c0';[ wqqq2}ΞtB[:X0'4 Lho>fr@!|sܱiD e#eEgD!.ݔoٞ~.llq 0/ W']0:BK9S Z:aW=gm#vr v@y|w~k~l|vy\vBr m"EgaUZS[K>#B:0O'1߇ ^o\@߯|s5c%QC؃ށeeQ(DZrp1o~޴dor : uQ'0:aBMK9S ZaRlgm#r v@y?|w3~lJ~l|vey.vBr lm!gaU`Z3S#K=B\:N0' {!Afn*\sǬ>|'drݒቿCހe d@D鉽0pѥ:’r!SW*  'y0:BK:uS ZaRgOm$rAvAym|wV~l->~l|vByvBQr (m!gLaTZS#K=2B:0;'d` .u׽N̥{rǍ?ކC|ǀedȁWІB̍p2kܬ cY s2!d t'l0:lBLK:S!mZwaS.gm$ar vA?y|wy~lE2~l|vyKvBr m!ZgaTZ`S#Kڟq8լÄ s~U 0'0/:BK;gS!ZaSgm$r 'vAxy|u~l\&~l|uyvAr m%:gaT=ZS"K<@B:0'' 8 `tͽ!Ǵ\zꞬ@qՒ*lC1dd߁B>q?ݏ!bctO? F'0:vByK;S"PZKaSgVm$r kvAy|u~ls~ln|uyvAr ]m$gDaSZ5S"8K;B^:Z0'jx 'o!t1G!Gw)ߘq~܍s2Bd݀d끓8C)xŒ;q螬U{v!t# W('0D:BK=SsZaUgm"Ur vByf|v~l~k|w yv@r m#fgaW(Z$S K9jB:0'? 8 qjOνʴT~tz݄ D` eCe&҃ Dws}9Y[pk S7'0:tBvK>SZaV6gm"r vCy|v~m~m#|vyv@Nr gm#g5aVZSK?jB4:;0`'/ JcpIK}t"6܉ۆDU=e7e2郉,D>ύsi}z૴ҽ p9 Y'k0:BK?/SVZaVg m"r Fv@2y|v~m~m |vyvC$r #m"gaVfZQSK>B:0:'# \pNĽ˴q}E8sʒ򘉿D'݀e,e=NDl]tOʥ}K q$= zZ'0:BuK?SZaVgbm#?r v@ky|v~m.~l|vy}vBr m"|gaVZSK>xB5:10' y<^o?Lƕ|۞טssܚTyCe eIqD2Bݫo+~NᎴĽ q [[+ '00:BK9S :ZZaWZgm#r v@y|w~l~l|v}yOvBr m"-gaUZ}S9K=B:0&'\ [ 2o1㺽̴ߍ|qvsK?Cʃԁed/DɉkpK~=r@ g |'0:BsK: S ZaRgm#rv@yM|w=~lF~l|vZy vByr Xm!gaUCZS#K=B6:&0'y O;n4Mţ|GrÒ͉C؀edGDʒHp!\¶ r!~V 5'0D:BK:S!Z-aRgim$*r vAy{|w`~l4:~l|v7ykvB?r m!g1aTZS#kK=B߷:0'94 _uw⯽ʹ*ު{rkۯ+͆Cnddˁ^چBݍޖpOʹ/ 3s]" I'0:BrK;S!ZaSKgm$xr vAPy|w~lL /~l|vy=vBr m!CgaTZ@S"KaZglm!r vB4yb|x~ki~l9|uy vD1rbm$9gzaRZ~SKA*B :(0_'$b 8 tkN (6 "άry3uhW׉BeceӃF r44v#$ 2v'0: BK=oS#ZaOgm!r KvBny|x1~k~l!|ufyvCrm#g"aRZ~0S&K@B:0' 5 Bj 汽Uy$Ҙu 󓉽vBYteWeꃊF:%'O0:BK=S$9ZaP_gm"r vBy|xT~k~l |uCyvCr m#gaR:Z}S&eK@8B :0K'@  Ixyj ,#ܬۏxptݻP=B+]eKeΆAw^G܊saoԴ3%w@& 9 \ '01:BK>aS$Z{aPgtm"lr vBy|xw~k~k|u yrvCr m#OgsaQZ}\S%K?B:0'y= }  Zx姽cxQt`m A4Fe@e)AؘsWجE}w ?  e*'l0:BK>S%ZaQ!gm"r vCy|t~k~k|tyDvCLr Sm#gaQxZ|S%K?FB:07' vQxM!%ګw瞮tȉʆA΃.e4e51AӉЍϒ'twڷ2/x\`-  '0E:!BK?SS%Z|aQg$m# r ZvCRyI|u~k~k|tyvCr m"gaQZS%K>B:0'] V 0wv䜽q:ΞMsЍ򄉼Ae(eAH7B utix\)ox.i  L'0:BK?S%Z}gaQg|m#Wr vCyw|u$~k~k|xtyvBr m"dgkaPZpS$K>TB: 0#' L)%w1&ȥdsX܂@XArˁeeL_B/CWØtzxŬۚ1: "yxX  O'0Y:,BK@DS&qZ}aRDgm#r vCy|uG~l ~k|xQyvBr m"gaPUZS$-K=B:0'x / ]%hvb㒽Vs4F5eeXwB]|uܥy/ a jQ E '0:BK@S&Z~;aRg+m#r&vCy|uj~l$~k~|x.yvBhr Dm!gaOZS#K=bB:0'g "q$v '奁*r񹉻FрeedBޒ_uq٥y~ڽ 0D 7k](  Hr'20n:6BKA6S)Z~aSgm$ArivD7y|u~l;~kf|x y]vB.r m!zgcaYZ3S#IK|u~lS ~m|wy/vAr m!,g aYZS"Ky|u~l$s~m|wyvAr 4m g\aXZS!K;B:1'!M r"s)#IꞫqIڮ ENsdրekoCDߗvО]{?Dľ"-Ym'| .ݷ'k0:KBK6(SZKaTgm%yryv>y|v~l0g~m|wyvAJr m BgkaXsZS!K;Bݓ:e1$'# 9"sN%sɛץDp`eE ց\dʀeCsӍ2m{޶7"!n$n \H'0 :BK6SbZaTg;m%rv?6y|v;~l<[~mr|w]yvvAr mgaXZ"S!K:B:1'& GZ!or*"ep"D򃉴DddiC v4n|(Ű#,cnJ$ d'0: UBK7SZaUMgm&rv?oy%|v^~lG~m[|w:yHv@r hmgaWZS K:Bܔ:Z1'm Q r2iȪ~pBÍ!uDă-ddu؆CωEnp||ߙ(#ܧ5o@; k'04: BK7SEZaUgm&dr v?yS|v~lS~mC|wyv@r %mWgdaWPZOS .K9B:#1'y z3 Lq+1Ⴅ~C!ou݉;DnddȃCИnȞ| ơ$+,omK/ '0:!_BpK8 SZaVgBm&r Ev?y|v~l_z~m,|vyv@er m'eg aVZSK9"Bە:"0'Kk 'q^%PǸ}ٞo'DgKddD+A˜o B}P}$ݱIp\e $'20H:!BK8S(Z\aVpgm'r v@y|v~mjn~m|vyv@,r m'gaVZ|SKK8B:" 0r'] P *psٽ$Ѵ?}o_o:ٍVɆD9(dd@DYox}Ǔ%*6psZ >'0:"jBoK8SZaVgm'Nr v@Ty|v~m%vb~l|vyv?r Ym&g\aV,ZSK80Bږ:!0'(C \xoT$QƬ-}n؋D πddcD*ɒ^oϞ~#` ޻]qy ! N'N1\:"BK9wS Z/aW2gJm@r v@y |w ~m<W~l|vyav?r m&{gaUZSgK7B:!0^'@ߗ &hok^Ͻ#ҴM߻|nΉWC݃⁒dxd&Dc ٬p'e~Ҵȅ@r $ fB'1:#tBnK9S }ZaWgmr Tv@y:|w/~mTK~l|vhy3v?rm&-gaUjZ>SK7>B<: }0' 1Qvnꋽ#SԬJ|2nOJ"Ӵ[إ{ɞۘmےFCedǁŬE֍QHpמ'`⵴wKs#![  d'1:=BmK:S!aZlaXVgQm *r vA8y|wu~md3~l|v#yv? rm%gaTZkSK6LB=:s0' [)Sm遽"Tf{_zm߯CRzredҁlEAږq/ʬ's"fUE  '1:BK;ZS!ZaXgAm xr vAry|w~mo(~l|vyv>rIm%CgaTGZSKBB:05'Qa pm26!ԴizvarC$W[edށEoHْq饀3㘴wUt?" 7'1:GBlK;S"DZ@aYgm r dvAy|w~m{~lq|uyzvDrm$gMaSZS/KBLB>:h0'y 10l tv!U݃zv;z9B4Cedꁓ5Eb2qߞK t#|p H'0:BKS#Z}aOgm!r /vBVy~|x#~kv~l+|utyvDr:m$ gFaRZ~[S'K@B:0 '  rG|j ִ….yOu3(󯉽Bkˁ~e\e ჊F(r枭nڬ4[j8vx%=i0  'M0o:\BiK=S$ ZaP8gm!r svBy|xF~k~l|uQyvCr m#gaRbZ}S&K@iB@:T0'A{ M +y LbW ۽x垯tےڍkTB=fePeAdG,ks>ϥD٦Խw%n  ^'0:BK>0S$|ZPaPgQm"Mr vBy|xi~k~k|u.yvCr m#ngaRZ}S&!K?B:0' H ZyܽشKx{7t݌'BOeDe%Apܹs0MtLw[  *'20:fBhK>S$ZaPgm"r vCy|t~k~k|u yWvCcr nm# g>aQZ}S%K?wBA:I0o'% % Zx8WX٥x՘t,>㉼A჋8e9e0'AsډŽx#b$ J '0 :BK?"S%`Z|aQ[gm"r ?vC;y6|t~k~k|ty)vC*r +m"gaQ>ZS%>K>B:0'U l7wҽٴhtsԒ򟉼A e-e<>)AUtFx1>~`x-  Q'O0:qBgK?S%Z}=aQgXm#7r vCtyd|u~k~k|tyvBr m"gaPZS$K>BC:?0Z' /e&5wj$MY)s|ܢ\oAف e!eHVB+;ݣtSxly?L t '0":BK@S&CZ}aRgm#r vCy|u9~l~k|x_yvBr m"6g7aP|Z1S$[K> B:0'z3 k B%vȽڴل%s$T6AVeeSmBKety޴0} ujW   xڥ'k0:{BfK@S&Z~aR~gm#r vCy|u[~l~k|x%vNCZ7Qr̒ԉFڀe e_ֆByÒ?uMynP© k$sG  7'06:BKAS'&Z~zaRg`m$!rNvD y|u~~l2~kp|xypvBFr m!gaZZ]S#wK=B:0'C o$u⽽۴̥Qrt۸񐉻ĆE샊pÀdekB׍ލuy׬" | k9 3 '0:BeKA~SmZ~aSAgm$prvDYy+|u~lI~kX|wyBvB r m!Kg/aYZS#KCI*vUԥzݥ!z l[. ]'0:BdKBpSPZaTggm% rv>y|u~lxx~m|wyvAr Pm gaXZ S""K;BF: 1'\ Y"t.]Sw͘qm͍ʼn7Ea|dۀeaaC2Ғxv5{č!#_m\@ |'20^:BKBSZ!aTdgm%Zr]v>y|v ~l+l~m|wyvAar m agaXZS!K;7B:1\'] v)";s]੽ݴ̬lqE3偓edπeyC`Ƙm{~ވ"ym~U2 ! '0:BcK6pS4ZaTgm%rv?y|v-~l7`~m{|wkyvA(r m g7aX9ZMS!?K:BG:1'9a /!r#^SⓥA p1=ņENdÀddCZm{"-snxj (ޟ'N0r: BK6SZaU&gom%rv?Xy|vP~lC~md|wHy[v@r mgaWZS K:EB:1H'@ L!rkIߞ޴ڬ"~מpeDփ6ddpʆC.bnMY|Rk#xo|] H0'0: BaK7bSZ^aUgm&Drv?yA|vs~lN~mM|w%y-v@r @mwgaWwZzS \K9BH:#M1': Xn q_aᰥ~mIp ٕSD|dd|Cꉿgఘn|ݴq#o2 R'j0:!)BK7SZaUgm&r )v?yo|v~lZ~~m5|wyv@|r m)g0aWZSK9SB:"14'$ "cqO5ޔ%>~oGDzYddփD&آn}%O$w{p#) oS'0:!BڼK8TSZ1aVIgvm&r mv@y|v~mfs~m|vyv@Cr m'7gaVZSyK8BI:"B0' .Gdp%pͥ}o^qDL6dd2DGڍjoT|}b$pU7 |'0:"4B;K8SlZaVgm'.r v@oݥ}2۽%vކ&q?S v'1%:"BۻK9FSZaW g&m'|r v@vy|v~m3}[~l|vytv?r 1m&g(aUZSK7B:!80'z c Bo$~|ǞĘnํ鉿nCd}dxDLٌp>~bᤴTQ q w^H *'1:#>B:K9S OZnaWlg~mnr 9v@y(|w!~mJP~l|vwyFv?rm&LgaUZiS$K7oBo: 0 '@X mo #x|]cnVk4Ćdqd4Dщۘp\~̬ͽߐ:r\! } ;'119:BܺK:8S ZaWgmr }v@yV|wD~mbD~l|vTyv?^rm%gxaU0ZSK6B: .0']ޯ 9zn<#Ō{mbCdfdKE6)p5⇴FPr!s Q*'1:B9K:S!3ZAaX.g.m r vA!y|wg~my_8~l|v1yv?%rm%g!aTZS@K6}Bp:0'1 Bem鷽"ޔ{m΍†Ce{ed΁cE.ywq aɿNsx"+ e'M1M:BݹK;*S!ZaXgm Yr vA[y|w~mk,~l|vyv>rem%bgaTnZ,SKBB:#0m'A݌ Pmln1"Ě#{ @v߀ډC7ededفzE\1Řqc¥ jFOt"I xL'1:B8K;S"ZaXgvm r HvAy|w~mv!~lz|uyv>r!m%gqaT ZS]KB}Br:0' m>kl謽!!ݱzߘv^2PC BMed偓'EKq#rܴbt#N@3  'j0:B޷K<S"ZaYRgm r vAy|w~m~lc|uy_vDrm$gaSZYSKBB:0Y'%iv &lO "'! è?zM~vRBڃ5exd񁓩IEEarܬN8N*u"#s $o'0#:B7Kw[&%U x '0K:0B5K>xS$ZaPgm"{r vBy|t~k~k|uyivC{r m#@gbaQZ}HS%K?Bu:0'^! a =xp卽LxS%2ZaQ4gm"r #vC$y$|t~k~k|ty;vCAr Fm"g aQfZ|S%lK?/B:0' Z4rx2 Ӭږ#s򻉼AŃ *e2e75A܉ۍܒ6t"˥xʹJI)xw|J  '0`:;B4K?jS%Z}aQg5m#r gvC]yR|u~k~k|ty vCr m"gaQZS$K>Bv:u0'B : lw[䃽Z$;swA灔e&eCL>B  ݄tz,xp?yJ 7 '0:BK?S&Z}|aQgm#fr vCy|u*~k~k|xmyvBr m"UgZaPZ[S$K>=B:0'm 0~ %w ٲP٘sHs3MAiāeeOdB8NdҘtҞx٬۰IS =yu  =k'10t:EB2K@\S&Z}aRWgm#r vCy|uM~l~k|xJyvBr zm"gaPBZS$K=Bw:j0~']  Az%MvGxhA枭xr%F-eeZ{džBf u*yC"x jm7 a '0:BK@S&Z~OaRgy|u~l&q~m|wyvAxr 'm gKaXZS!K;hB:1'1 Ue"vs޽ 3՞q8ڟEFndԀeovCMߦmyo{SZս"FrmC J'0:dB/K6?SZ`aTgm%rv?y|v~l2e~m|wyyvA?r m 3g[aX`ZxS!mK:Bz:K1 't k!s3 YɄl2pQX܆EЁWdȀeC{ލ?mўХ{̴N";n?. xd'0::BK6SxZaTgKm%rv?@y|vB~l>~mn|wVynvAr mgaWZS K:vB:1'z *>!SrԽ PјpD郉@ddkCCn)1|'=ǽ#E}nfA  '0: nB.K71SZ3aU`gm&$r v?zy.|ve~lJ~mV|w3y?v@r [mgaWZS K9B|:A1'Qv 4 rOȒޥ~pp1ٵjD(ddwކC؉Pƒn|߯@#Oo[X ߇'10O: BK7S[ZaUgm&sr v?y\|v~lU~m?|wyv@r mHgSaW=Z;S K9B:"1l'^ ^ 1qlʽl~/oْfЉ0Dgdd̓D ߘnٞ|!ƹ$DEohK 3'0:!yBڈK8#SZaV"gSm&r Rv?y|v~law~m'|vyv@Zr m'VgaVZSK9 B}:"x0'/N j pE%8Ǡ}ŞoD_Ddd䃉$D4ÍNјo1U}d2$dpx @'M0c:!BK8S>ZpaVgm'r v@%y|v~mml~m|vyv@!r m'gaV{ZgS5K8B:!0W'A 4uplXݿ$(}[Mo)ʍID0!ddGDbo}άǪ%CPqv [;'0:"BۇK9SZaVgm']r v@_y|v~m)x`~l|vyv?r Lm&gLaVZSK8B~:!n0' ' ?\}o:$9Ư|nҒ؍DˀddjD5֒mo~7v#xq =# j'i1w:#BK9S "ZCaWEgZmOr v@y|w~mAT~l|vyXv?r m&lgaUZSQK7B: 0C'%{  KoPDܵ#6ߦ|nzLCԃہdvd*Dnٻp8x~ȜZr" A ]'1:LB܆K:S ZaWgmr av@yC|w6~mXI~l|vby*v?urm&gaUXZ*SK7'B#: c0' u4Znr#:Ž4|)n"<}CdjdBD p٥ Yr!_J7 '1:BK:S!ZaXg mr vA yq|wY~mp=~l|v?yv?!w )'1:VB݅K:S!wZaXhgbm 9r vACy|w|~mf1~l|vyv?rm%gaTZWSK65B$:Y0'{ > 7mg";ˬQ{KgmrߠCIsmedՁpEIڥq@ެ<s"q b ='1:BK;rS!ZaXgRm r -vA}y|w~mr%~l|uyv>ruw$6_" }'L0u:kB߃K|uyvD=rqm$IgaSZ~S6KACB':D0}'Bہ X 8km FR =܊yuzg扽B灔eee΃Fߍޘrشv$` W'0:BK=US#ZaOgm!r GS$ZdaPgam"\r vBy|xp~k~k|u(y|vCr m#_gaQZ}sS& K?B:0' +y>xý|5xg$ts}B;JeBe'A}ȘsC¬-dgwx  F 'M0:BK>S%ZaQ gm"r vC y|t~k~k|uyNvCXr am#g-aQZ} S%K?`B):00T'  =pxk>@åwØt/։ֆA؃3e6e3, Aɉčs,ڟݽx>~A f '0(:BK?9S%uZ|aQngm"r LvCFy?|t~k~k|ty vCr m"gaQ,ZS%(K>B:0'{9 v Ow乽R䞮bsÒ򒉼Ae+e>C0AdtVxEV{xI  m-'j0:BK?S%Z}QaQgim#Fr vCym|u~k~k|x{yvBr m"ug~aPZS$K>nB*:%0@' lI&wO 3AूzskܓOdA|ҁeeJZB&6HݲtfxۂϽ yZh8  0'0<:BK@+S&YZ}aR0gm#r vCy|u?~l~k|xXyvBr m"'g&aPjZS$EK=B:0'_ N }%%v㮽osE +F?eeVrBTpuǥyG j2s % '0:B~K@S&Z~$aRgm#rvCy|ub~l~k|x5yvBtr Rm!gaP ZS#K=|B+:0,' B"$v3)B >rljFՀeea܆BВNu^(yf ( k?c  (S'0P:BKASZ~aRgqm$0r[vD+y|u~l6~kk|xygvB;r m!gvaZ ZIS#bK=B߬:0'z' R$euk⤽´䶥=ݘrc۩񃉻EナidemBޜu%y״9 kU# O '0:B}KASZ~aSSgm$~rvDdy4|u~lN ~kT|wy9vBr m!y|u~l|"u~m|wyvAr Cm gnaXZ S" K;B-:1'@l <"sDy|v~l-j~m|wyvAVr m Rg~aXZS!K; Bݮ:1B'A Y "slBŴɵYqptE*ށad̀e}CiǍ#՘m{ޞ"nqO =)'0:B{K6SJZaTg(m%rv?)y|v4~l9^~mw|wdyvAr m g&aX&Z9S!)K:B/:1'E gy!r E<~-p"0DIddgCg#n {Ŗ#Gn+ E޻'i0: 9BK7SZaU9gm&rv?cy|vW~lE~m`|wAyRv@r wmgaWZS K:.Bܯ:w1-'% /q rP.߅ƴì ~ÞpTԍD΃2ddrІCʼn9qn]k|f߁#܊o"y dL'0: BzK7yS-ZraUgm&Srv?yJ|vy~lQ~mH|wy$v@r 3mhgwaWdZeS FK9B0:#31' F o'0+:!BK8kSZEaV\gm&r zv@y|v~m hp~m|vyv@8r m'(gaVZScK8B1:")0'{ p+Ip$X෥}toMdՆDC/dd9DPwoe}ִz%pqS: '0:"MBTK8SZaVgm'=r v@Gy|v~m te~m|vyv?r gm&goaVAZ(SK8JBڱ:!0'Gc {pp$m߬E}n؜ D Ԁdd \D~Mo~ H%ޟ@q[ p .'01?:"BK9]SZaWg7m/r v@y|w~m7Y~l|vykv?r $m&gaUZSK7B:!0{'^ߵ F&o|#gԥ|nઍ܉cC烈ꁒd{d!DWٛpQ~vṴki$q {e F#'1:#XBSK9S eZaWgm}r Fv@y0|w(~mOM~l|vpy=v?rm&>gaUZUSK7XBW: 0'$< Ppnꧽ#nb|IQnE\*Cǁdod8Dډpl~+ߩTrw!% X'L1S:BK:OS ZaWgmr v@y_|wK~mfB~l|vMyv?Srm%ghaUZSK6B: 0g'Bޓ ^nmh""u{ߞmUCedāPņEʍC8pĞJ❴]h/s!; mE'1: BRK:S!IZVaXAg>m r vA,y|wn~m}a6~l|v*yv?rm%gaTZS*K6fBX:0' z%Irm靽"o{um߿C\wedЁgE7چqtֽhs"G6% 'i1g:BK;AS!ZaXg/m hr vAey|w~mm*~l|vyv>rXm%SgaT\ZSKBB: 0S'&p 4mPS!ă { -vq͉~C.^`ed܁~ Ee<ʒԘqtե〴]g9t!"e h'1:+BPK;S",Z)aYgm r UvAy|w~my~lv|uyv>rm%g`aSZSGKBfBY:0' P!Ol 蓽!p ݛz̘vN#􉉾EC;Hed灓-EV"q̞6ֽ}t#j]P ('0:BK<3S"ZaYdgm!r vAy|w~m~l_|uyVvDrm$gaSZDSKAB:0>' MY e l4  Ñ*z8kuՍE B҃1evd󁓭PERpr$cOfCu>## A'0>:5BOKS$dZ9aPg>m"S$ZaPgm"r vBy|t~k~k|uyavCpr }m#1gQaQZ}4S%K?B\:e0'C E z!xUts4x(t>OA냋&=e;e."As۞|qxCx * a'0:BK?S%GZ aQFgm"r 0vC/y,|t~k~k|ty2vC6r 9m"gaQSZS%VK?B:0't =Vxڀs򮉼A%e/e::"A剼Dt3ޥx%cbCx f  2'00z:TBLK?S%Z}&aQgFm#'r tvChy[|u~k~k|tyvBr m"gaPZS$K>B^:[0x'&  OwAitC(sܲj{Ae$eEQB-ݓt?xTy!f, T '0:BK?S&+Z}aR gm#ur vCy|u1~k~k|xfyvBr m"FgIaPZGS$sK>&B:0'R b%vʬٜ;ǘs7d&BA`eeQhBAYqt㞯xƴbm Wy7  Yڇ'M0:_BKK@sS&Z}aRjgm#r vCy|uT~l~k|xCyvBr mm!gaP0ZS$K=B_:Q0d'B ~$]%1vl-_uQ+Ҟfrߒ≼ F$߀e e]ΆBo/u;yW8 kS' ~ '0:BK@S'Z~caRgMm$r@vDy|uw~l-~ku|x yzvBRr *m!gaOZtS#K=4B:0'/c 7$uڽج䥁hrȍ񟉻ІExȀeehBˍ}uyܩ `w lka  ۩'i0:iBJKAeSUZ~aS,gm$_rvDMy"|u~lD~k]|wyLvBr m!\gBaYZ S#Ky~|u~lsz~m|wyvAr ^m gaYZ7S";K;Ba:<1' { *x"t4Jxm㏥+qލӉDEkd݀e]ZC(wĒgv!zs!Bm> } n]'0A:BKBSZ aTOgm%IrOv>y|v~l)n~m|wyvAmr m rg:aXZS!K;PB:1y'{ 9I"ZszŽq(ڐ E=쁓jdрet|CVߵm{hp"^m_6 g'0:~BGK6WSZtaTgm%rv?y|v&~l4c~m|wryvA4r m $gJaXNZcS!WK:Bb:21'X N!s@ym⫥WpВBKцEɁSdƀeCLm➧{Ѭe"VnZJ  ހ'00U: BK6SZaUg\m%rv?Ky |vH~l@~mi|wOyev@r mgaWZS K:_B:1e'_ k!!7rf߻:~pxD;ddn†C"Rn:D|;S޽#]n]= ('0: BFK7HSZGaUrgm&3rv?y7|vk~lL~mR|w,y6v@r NmgaWZS tK9Bc:#i1'6Y x q5z{ȥ~]p ٦_D$ddyCቿ[Ӓ࠘n|ŴW#jowt 3ߣ'L0i:! BK7SqZaUg m&r v?ye|v~lX~m:|w yv@r m9gBaW*Z&S K9mB:"1Q'B A qmRްV~oȒWÉ%D` ddуDؒnꞩ}7н$\_p h P4'0:!BڡK8:SZaV4gdm&r _v?y|v~lcu~m#|vyv@Or m'GgaVZSK8Bd:"_0'2 Mfp+% lj}op DV=dd郉+D=΍[oAg}x਴I$~p6 ]'h0}:"B K8STZaVgm'r v@0y|v~moi~m |vyv@r m&gaVhZSSK8{B:!0='& YpQ>ݦ$s}G:oػnX#"Ŧ| n-pCdhdFD'po,5r!{fS 2 '1:BK:S!Z+aXgmr vAyz|w`~mt\;~l|v8yv?1rm%g3aTZSXK6B:0'<P bnӽ"-ޭ{mߍ,ΆCoedˁ^نE$kfpMɥ~1sZ" F'/10:pBݝK;S!ZaX{gsm Hr vANy|w~mh/~l|vyv>rsm%sgaTZCSK6B :@0'_ݫ "pmN"#Ĵ;{6Uvɒߑ艾CAliedׁuER%ڴqQR-4s")~ Y-'1:BK;S!ZaXgcm r :vAy|w~mt#~l|uyv>r/m%%gaT"ZSuKBB:0') 7]lȽ!;ɥz͞vqC\CIRedこE^q\ĴEtv#/! p'K0|:zBޜK<S"pZhaY=gm r ~vAy|w~m~lh|uyhvDrm$g,aSZoSKBB :50v'C܈ Fln ?C!$¬Xzcv`#B䃈&:e{dBEx6PrpƬ63 u#S P'0:BK<{S"ZaYgm!2r vAy3|w~m ~lQ|uy:vDkrm$gaS`ZSKAB:0' b 6gk 羽 Iy2uާBeodeE݉z۞rXѥ/䧴Yu$R{? 'h0:BߛKB+]eLeΆAv]F܉s`mҴ0"w=&6 Y '0.:BK>^S$ZxaPgrm"kr vBy|xv~k~k|u!ysvCr m#PgtaQZ}_S%K?B:0'|@ ]"x婽exStbn A4Fe@e)AטsU֬C{w<  b''i0:BK>S%ZaQgm"r vCy|t~k~k|tyEvCNr Tm#gaQzZ|S%K?IB:0:' y!TxP$'ڮw鞮t ɉˆAσ/e4e50A҉ύΒ%twڵ/, xY]*  '0B:BK?PS%Z|aQg"m#r YvCQyH|u~k~k|tyvCr m"gaQZS%K>B:0'` Y 3wy䟽s<ОOsҍ򅉼Ae(eAG6BstgxY&mx+f  I'0:BK?S%Z}eaQgzm#Ur vCyv|u#~k~k|xtyvBr m"fgmaPZrS$K>WB: 0%' O,%w4(ʥfsZ܄BYAśeeL_B.AUtxxìۘ.7 yuU  L'0W:)BK@BS&nZ}aRCgm#r vCy|uF~l ~k|xQyvBr m"gaPWZS$/K=B:0'D 2 ` %kvd㕽Ys6 F6eeXvB]{uڥy- _ jN B '0:BK@S&Z~9aRg*m#r$vCy|ui~l#~k~|x/yvBir Em!gaOZS#K=eB:0'j %t$v) 祁,r񺉻FрeedBݒ]uoץy{ؽ -A 4kZ%  Eo'00k:3BKA4S'Z~aSgm$?rhvD6y|u~l;~kg|x y^vB0r m!|geaYZ5S#LKy|u~l$s~m|wyvAr 6m g^aXZS!K;B:1'$P u "s,%K잫qKگ"EOsdրejnCCߖvΞ[{=BĻ"+Vm$y +ݴ'h0:HBK6&SZIaTgm%xrwv>y|v~l0g~m|wyvAKr m CgmaXuZS!K;Bݖ:g1''& <"sQ(vɞ٥FpagE!ׁ\dˀeCrҍ0m{޴4"n!k YE'0:BK6S_ZaTg9m%rv?4y|v:~l;\~ms|w]ywvAr mgaXZ$S!K:B:1') J]!rr-%hp#D󃉴EddiC t2n|%ŭ#*`nG! a'0: RBK7SZaUKgm&rv?ny$|v]~lG~m[|w:yIv@r jmgaWZS K:Bܗ:]1' p T r4kȬ~pDō߉vDŃ-ddu׆CΉDnn~|zߗ&#ܤ2o=8 h'01: BK7SCZaUgm&brv?yR|v~lS~mD|wyv@r &mYgfaWRZQS 0K9B:#1'| }6 Oq.3ᄥ~E#ow߉=DnddȃC}Θnƞߥ| Ɵ$))ojH, '0:!]BmK8 SZaV g@m&r Cv?y|v~l^z~m,|vyv@fr m'ggaVZSK9%Bۘ:"0'Nn *qa%SǺ}۞˜o)DhLdd߃D*@o@}Mz$ݮFpYb  '/0E:!BK8S&ZZaVngm&r v@y|v~m jn~m|vyv@-r m'gaVZ~SMK8B:"0u'_ S-puܽ$ԴAࡥ}rao<ۍWʆD:)dd@DYov}Ǒ%'3ppW ;'0:"gBlK8SZaVgm'Lr v@Ry|v~m$vb~l|vyv?r Zm&g^aV.ZSK83Bڙ:!0'+F _{oW$TȬ/}n؍D ЀddcD)Ȓ\oΞ~!^ ޹Zqv  J'K1Z:"BK9tS Z-aW0gHm>r v@y |w ~m<W~l|vybv?r m&}gaUZSjK7B:!0`'Cߚ )k onaѽ#մO߾|nωXCރげdyd%Db ٪p%c~ϴȃ>r ! c?'1:#qBkK9S {ZaWgmr Sv@y9|w/~mSK~l|viy4v?rm&/gaUlZASK7AB>: 0' 4Tynꎽ#U֬L|5>n4MCdmd=D p}ĥ~Aor!@+ u'g1n:BK:fS ZaWgmr v@yh|wQ~mk?~l|vFyv?Hrm%gWaU ZSK6B:0L''w AnQM "ִ]ڥ{˞ݘmݒGCedǁTˆEՍPGp՞%^⳴uHs !X  a'1::BjK:S!^ZjaXTgOm (r vA7y|wt~mc4~l|v#yv?rm%gaTZmSK6OB?:u0' ^ ,Vm都"Vi{a|m߰CSzredҁkE@ڕq-Ȭ$s"cRB '1:BK;XS!ZaXg@m wr vApy|w~mo(~l|vyv>rKm%DgaTIZSKBB:08' Td sm59!״lzvbsC%W[edށEnGגq祀1㖴uR t=" 4'1 :DBiK;S"BZ=aYgm r bvAy|w~m{~lq|uy{vDrm$gOaSZS1KBOBA:k0'| 43l wy!W݅zv=|:B5Dedꁓ4Ea1qݞIt#ym E'0:BKgePeAcF*is<ͥB٤ѽw%k  ['0:BK>-S$zZNaPgOm"Kr vBy|xh~k~k|u/yvCr m#pgaRZ}S&$K?B:0' K#]y߽ڴMx}9tݎ)BOeEe$Anܷs.J|qIwX  ''/0:cBfK>S$ZaPgm"r vCy|t~k~k|u yXvCer pm#"g@aQZ} S%K?yBD:L0q'' ) ]x;Z[ܥxטt-@剼A⃋8e9e0'As잮ڇýx _! G }'0 :BK?S%]Z|aQYgm"r =vC:y5|t~k~k|ty*vC+r ,m"gaQ@ZS%@K?B:0'X !o:wս۴jvs֒򡉼A!e-e<>(AStDx/<{|^x*  N'L0:nBdK?S%Z}:aQgVm#6r vCsyc|u~k~k|tyvBr m"gaPZS$K>BE:B0]'   2h&8wm&P\+s~ܣ]pAځ e!eHUB*:ݢtQxjy<I q '0:BK@S&@Z}aRgm#r vCy|u8~l~k|x`yvBr m"7g8aP~Z3S$]K>B:0'}6 n E%vʽܴه's&U7AWeeSmBJd~t󞯲yܴ.z rjT  uڢ'h0:xBcK@S&Z~aR|gm#r vCy|u[~l~k|x=yvBr `m!gaPZS#K=BF:70I'& bA%vQE]:SrΒՉFڀe e_ՆBx’>uKylM§ k!pD  4'03:BKAS'$Z~xaRg^m$ rMvDy|u~~l1~kp|xyqvBGr m!gaZ Z`S#zK=B:0'F r$u޴ΥTrv۹񒉻ņE탊qÀdekB֍ތuyլܿ y k6~ 0 '0:BbKA|SkZ~aS?gm$nrvDXy*|u~lI~kY|wyCvBr m!Mg1aYZS#Ky|u~lwx~m|wyvAr Qm gaXZ"S"%K;BH:"1'_ \"t1_VyϘqoύƉ9Eb}dۀea`C1ђvv3{Ċ! \mY= y'/0[:BKBSZaTbgm%Xr\v>y|v ~l+l~m|wyvAbr m cgaXZS!K;9B:1_'` y,">s`૽ϬnqځE4偓fdπexC_Ęm{|ކ"wm{R/  '0:B`K6nS1ZaTgm%rv?y|v,~l7`~m||wkyvA)r m g9aX;ZOS!AK:BJ:1'<d 2!r&`V▥C p3>ƆENdĀddCYm{|"*pnv g %ޜ'K0o: BK6SZaU$gmm%rv?Vy|vO~lB~me|wIy\v@r mgaWZS K:GB:1K'C O!rnLߡݬ$~ٞpgD׃7ddpɆC-anKW|Oi#voyZ E-'0: B_K7`SZ[aUgm&Brv?y@|vr~lN~mM|w&y.v@r AmxgaWyZ|S ^K9BK:#O1'= [q qbdᲥ~pKpٗTD}dd|C鉿f௘n|۴n#o/  O߿'g0:!'BK7SZaUgm&r (v?yn|v~lZ~m6|wyv@}r m*g1aWZSK9UB:"17'' %fqR7ޗ%A~oHD{ZddփD$ءn}#L$uxp & lP'0:!BڹK8QSZ/aVGgum&r lv@y|v~mes~m|vyv@Dr m'8gaVZS{K8BL:"E0' 1Jgp%rϥ}o_rDM7dd탉2DFٍhoRz}ྴ`$pR4 y'0:"1B9K8SjZaVgm'-r v@;y|v~mqg~m|vyv@ r vm&gaVVZ?S K8dB:!0"' f <p5#݌$]}3'oج/DـddTDt=oۥ}0ٽ%sރ#q<P s'1":"B۸K9CSZaW g$m'{r v@uy|v~m2}\~l|vyuv?r 2m&g*aUZSK7B:!;0'} f#Eo$ƀ|ɞƘnຍ뉿oC€d}dwDKًp<~`ᡴRNq t[E ''1:#;B8K9S MZlaWjg|mmr 7v@y'|w ~mJP~l|vwyGv?rm&NgaUZkS&K7rBr: 0'C[ poĽ#z|_enXl6Cƒ΁drd3DЉ٘pZ~ʬ˽ߍ7rY!z 8'.16:BܷK:5S ZaWgmr {v@yU|wC~maD~l|vTyv?_rm&gzaU2ZSK6B: 00'`޲ <}"n># Ŏ{ncCdfdKD4'p3ⅴDMr!p N''1:B6K:S!0Z?aX,g,m r vA y|wf~mx_8~l|v1yv?&rm%g"aTZSCK6Bs:0' 4 Ehm鹽"ޗ{mЍÆCf|ed́bE-xuq _ɽKsu"( b'J1J:BݶK;'S!ZaXgm Wr vAYy|w~mj-~l|vyv>rfm%dgaTpZ.SKBB:&0p'Dݏ Smoq4" Ĝ%{"Bv߂ۉC8ededفyE[0ØqahDLt"F uI'1:B5K;S"ZaXgtm r GvAy|w~mv!~l{|uyv>r"m%gsaTZS_KBBt:0' pAnl诽!$ݳzv`4QC CMed偓&EJq!pڴ_t#K=0  'g0:B޵K<S"Z|aYPgm r vAy|w~m~ld|uy`vDrm$gaSZ[SKBB:0\'(ly )lR %*! ëBzOvSBۃ 6exd񁓨IED_rڬK6K'u#p !l'0 :B4Kyj|x~km~l5|uyvD'rWm$,gkaRZ~S KAB:0H' J  Zk6  ¹^y{"uYỈBځeae׃F˒rE'J1v<$+ K'04:#B3K=S#ZaPgm!r VvBwy|x7~k~l|u`yvCrm#gaRZ~S&K@Bv:0'}ڸ j)j 暽@yu󈉽lBQpeUeAP.Jsvv%/  X 'h0:BK=S$LZ#aPpg+m",r vBy|xZ~k~l|u=yvCr m#gaR*Z}S&RK@#B:03'' /_yQǬ{x`tݭD3B#YeIe ԆAhSܘsqI<wX&"R u '0I:.B2K>vS$ZaPgm"zr vBy|t~k~k|uyjvC|r m#AgdaQZ}JS%K?Bx:0'a$ d @xr吽N x>tQ_A.Be>e+AsȞhYw$Y  C'0:BK>S%/ZaQ2gm"r "vC#y#|t~k~k|tyBy:w0'E = ow^䅽\&=sÍxA联e&eCL=B ݂tx*xn<yG 4 '0:BK?S&Z}yaQgm#dr vCy|u*~k~k|xnyvBr m"Wg\aPZ^S$K>@B:0 'p 3%wٵRۘsIu5NAjŁeeOcB7LbИtОx׬ۮGP :yr  :h'.0q:BB0K@YS&Z}aRUgm#r vCy|uM~l~k|xKyvBr |m" gaPDZS$K=Bz:m0'`  D}%PvJ{jC螭zr'F.eeZ{džBeu(yA v jj4 ^ '0:BK@S&Z~MaRg:m$r1vDy|up~l(~kz|x(yvB^r 8m!gaOZS#K=NB:0'N W$uѥ~rٍ񭉻܆ÈeefBluyܑ E[ NkuB  aۊ'K0:MB/KAKS=Z~aSgm$NruvDAy|u~l?~kb|xyUvB%r m!mgTaYZ!S#6K'0#:BKBSZaT;gm%9rAv>y|u~l&q~m|wyvAyr (m gMaXZS!K;jB:1'4 Xh"ys5מq:ڠEFodԀeouCLߥmxm{QXҽ"Com@ G'0:aB,K6=SZ]aTgm%rv?y|v~l2e~m|wzyvA@r m 4g\aXbZzS!oK:B}:N1 ' w  n!s6 \ɇĥn4pRZ݆EЁXdȀeCzݍ=mОΥ{ɴK"8n<+ ua'08:BK6SuZaTgJm%rv??y|vA~l>~mn|wWynvAr mgaXZS K:xB:1'} -A!Vr׽RӘpDꃉ@ddkCAn'/|%;Ľ#Bznc> ~ '0: lB+K7/SZ1aU^gm&#r v?yy-|vd~lI~mW|w4y@v@r ]mgaWZS K9B~:D1'Ty 7 rRȕ~rp3ٶkD)ddwކC׉OŒn|߭=#ܽMoXU ߄'.0L: BK7SYZaUgm&qr v?y[|v~lU~m?|wyv@r mJgUaW?Z=S K9B:#1n'` a 4qoͽo~1oےh҉2Dhdd̃D ݘnמ|ƶ$ACoeH 0'0:!vBچK8!SZaV gQm&r Pv?y|v~lax~m(|vyv@[r m'XgaVZSK9 B:"{0'2Q m pG%;ǣ}ǞoD_Edd䃉#D3MϘo/S}b/$apu ='J0`:!BK8S Z'1:IB܄K:S ZaWgmr `v@yB|w5~mXI~l|vby+v?vr m& gaUZZ,SK7*B&: f0' x7]nt#=ſ6| +n$>~CdkdADpץ Wr!\G4 '1:BK:}S!ZaXgmr vA yp|wX~mo=~l|v@yv?=rm%gFaTZSpK6B:02' [o $n63"Fť{ʘm̒:چCyedɁY҆E]Vp枫8rȴɌbs;!t &}'1:TB݂K:S!tZ~aXfg`m 7r vABy|w{~mf1~l|vyv?rm%gaTZYSK68B':\0'} A:mj">ͬS{MimtߢCJtnedԁpEHڤq>ܬ:s"n _ :'1:BK;oS!ZaXgPm r +vA{y|w~mq&~l|uyv>r>m%5gaT6ZSKBB:0'8H W|m!Tz㞧vShCQWedEwRqF㬴l'tX# P'-1':^BށK;S"WZRaY(gm r ovAy|w~m}~lm|uyrvDrm$g>aSZSKB8B(:Q0'aܧ el ]`!?۬pzzv,o/B.?e}d쁓;El(@q[t#3 a1'0:BK|uyvD>rrm$KgaSZ~S8KAFB):G0'Eۄ [ ;ko HU @܌yu|i牽B联efe΃Fލܘrִv$] T'0:BK=SS#ZaOgm!r ;vB`y|x)~kz~l'|unyvDr.m#g7aRZ~HS&K@B:0' X.dj нqy=u$󣉽BcŁzeZe僊F/*r~HoPv%VJ  'f0:sBK=S$ZaPHgm" r vBy|xL~k~l|uKyvCr m#gaRQZ}S&K@TB*:=0k')b 3 ky 4KA۩xӞt͍̒_JB5beNeƆAlQ7xsMߥVٹw% 9 v'0:BK>ES$ZbaPg`m"Zr vBy|xo~k~k|u(y}vCr m#agaQZ}uS&K?B:0' .|Axƽ´7xi&ttBS%ZaQ gm"r vC y|t~k~k|uyOvCZr cm#g/aQZ} S%K?bB,:20W'  @sxn @BƥxŘt1؉؆Aك4e7e2+ AȉÍs*ڝڽx;{> c '0%:BK?6S%sZ|aQlgm"r JvCEy>|t~k~k|ty!vC r m"gaQ.ZS%+K>B:0'~< y Rw份ôT枮dsŒ򔉼Ae+e>C/AbtUxCSxx F  j*'g0:B}K?S%Z}OaQggm#Er vC~yl|u~k~k|tyvBr m"vgaPZS$K>pB-:(0C' oL&wR 6C㥂|smܔPeA}ӁeeJZB%5Gݱtdxۀ̽ yWe5  -'09: BK@(S&VZ}aR.gm#r vCy|u?~l~k|xYyvBr m"(g(aPlZS$GK=B:0'b Q (%v㱽ĴqsF ,F@eeVqBSnuťyE j/p " ھ'0:B|K@S&Z~"aRgm#rvCy|ua~l~k|x6yvBur Sm!gaP ZS#K=B.:0/'  E%$v6,E"@rȉFրeeaۆBϒMu\&yc¾ % k<`  %P'0M:BKASZ~aRgom$/rZvD*y|u~l6~kl|xyhvBg aYZS"Ky|u~l|!v~m|wyvAr Dm gpaXZS"K;B0: 1'Co ?"sG?cq^.EYxdـeegC:ޒ߅vF{'*Ģ":wmuY  ݕ'J0v:,BKBSZ3aTtgm%griv>y|v~l-j~m|wyvAWr m TgaXZS!K;"Bݱ:1D'D \""soEǴɸ[qruE+߁ad̀e}Chƍ"Әm{ޛ"nnL :&'0:BxK6SGZaTg&m%rv?(y|v3~l9^~mw|weyvAr m g(aX(Z;S!,K:B1:1' H j|!r H?‥/p$1DJddfCf!n{ œ#Dn( B޸'f0: 6BK6SZaU7g~m&rv?ay|vV~lE~m`|wBySv@r xmgaWZS K:0Bܲ:y10'( 2t!rS1߈ɴƬ~ŞpV֍Dσ2ddrІCĉ8pn\i|d #܈ov aI'0: BwK7wS+ZpaUgm&Qrv?yI|vy~lP~mI|wy%v@r 4migxaWfZhS HK9B2:#61'! ?U nqIMᝥ~[8oوIDvdd~ÃCq྘nʥ|ͬƅ$ oK) l'0:!@BK7SZaUg.m&r 5v?yw|v~l\|~m1|vyv@rr m'wg!aWZSK9>B۳:"1' l Jq6}%nԬ+}טo:DrSddڃD!1ذo +}7b$ݒ)p;B l'0(:!BK8iSZCaVZgm&r yv@ y|v~mhq~m|vyv@9r m')gaVZSeK8B3:"+0'~ s.Lp$[๥}voOeֆDD0dd8DOuoc}Դw% pnP7 '0:"KBQK8SZaVgm'v?rm&?gaUZWSK7[BY: 0''? Ssnꪽ#pd|KSnG]+Cǁdod8Dىpk~ެ)ߧQrt!" U'I1P:BK:LS ZaWgmr v@y^|wJ~mfB~l|vNyv?Trm%giaU ZSK6B: 0j'Eޖ anpj%"w{ឧmVCdddāOĆEɍA6pÞG⚴[f,s!8 jB'1:BOK:S!FZTaX?g=m r vA+y|wm~m}a6~l|v+yv?rm%gaTZS-K6iB[:0' })Lum頽"qށ{xmC]wedЁgE6ڄqr Խfs"D3" 'f1e:BK;>S!ZaXg-m fr vAdy|w~mm*~l|vyv>rYm%UgaT^ZSKBB: 0U')s 7mSV!ą{/vsΉC/_`edہ~ Ed;ɒҘqrӥ~[e6t"b e'1:(BNK;S"*Z'aYgm r TvAy|w~mx~lv|uyv>rm%gbaSZSIKBiB\:0' S$Rl 蕽!r ݞzΘvO%􊉾FC'0;:2BMKn8  '0c:GBKK>S$ZaPgm"r vBy|t~k~k|uyavCqr ~m#2gSaQZ}6S%K?B_:h0'F  H }$xXvv7x*t@PA샋'=e;e."Asٞzox@u ' ^'0:BK?S%EZ aQDgm"r /vC.y+|t~k~k|ty3vC8r :m"gaQUZS%XK?B:0'w @Yxڂs򯉼A&e0e99!A䉼Ct1ܥx"``@x c  /'-0w:RBIK?S%Z}$aQgDm#%r svCgyZ|u ~k~k|tyvBr m"gaPZS$K>B`:^0{') ! RwDlwE*sܴk|Aၔe$eEPB+ݑt=xRyc) Q '0:BK?S&(Z}aRgm#sr vCy|u0~k~k|xgyvBr m"HgKaPZIS$uK>(B:0'U e%v̬ٟ=ɘs8f(CAaeeQhB@WoߘtឯxĴ_j Uy4  Vڄ'J0:\BHK@pS&Z}aRhgm#r vCy|uS~l~k|xDyvBr om!gaP2ZS$K=Ba:S0f'E '`%4vo/bxS-Ԟhr䉼 F%߀e e]͆Bn-u9yU5 kP$ { '0:BK@S' Z~aaRgKm$r>vDy|uv~l,~ku|x!y{vBSr +m!gaOZvS#K=7B:0'2f ;$uܽڬ楁jrʍ񠉻цExȀeehBʍ{uyܧ ^t ik^  }ۦ'f0:fBGKAbSSZ~aS*gm$]rvDLy!|u~lD~k^|wyLvBr m!^gCaYZ S# K gs#tҽDqْ._E2deE6B<v@z݊!] }l9  :'0:qBFKBTS6ZaSgSm$r v>y}|u~lrz~m|wyvAr _m gaYZ9S"=K;Bd:?1' ~ -|"t7Mzp㑥-qߍԉEEld݀e\YC'uÒfvzq!?m;z kZ'0>:BKBSZaTMgm%HrNv>y|v~l(o~m|wyvAnr m sg큓jdҀes|CUߴm{fn"\m\3 d'0:{BEK6TSZraTgm%rv?y|v%~l4c~m|wsyvA5r m %gLaXPZfS!ZK:Be:41'[ R!sB{o⮥Y!pђCM҆EʁSdƀeCJm{Ϭߴc"SnWG }'-0R: BK6SZaUgZm%rv?Jy|vH~l@~mj|wPyfv@r mgaWZS K:aB:1h'b n$!:ri߽<~pz D჉dd胉*D<͍Zޘo@e}v঴F${p3 Z'e0z:"BK8SRZaVgm'r v@/y|v~moj~m |vyv@r m&gaVjZUS!K8}B:!0@') \pSAݩ$u}IK7B: 0,' bz 2o7,ܞ#!ߒ|vznk}BC̃ցdtd.DljxȘpG~ȱqr: Z v'1:cBܜK:S ZaWgmr mv@yK|w<~m\G~l|v\y"v?krm&gaUGZSK7B : M0'~ [An[#$Ũ | n/q CdhdFD&pm*2r!xcP /'1:BK:S!Z)aXgmr vAyy|w_~mt\;~l|v9yv?2rm%g5aTZS[K6B:0'?S enֽ"/ޯ{m-φCpedˁ]نE#jepK޴ɣ{.sW" C',1-:mBݛK; S!ZaXygqm Fr vAMy|w~mh/~l|vyv>rtm%tgaTZESK6!B:B0'bݮ %smP"%Ķ={9Wv˒ߓꉾCAmiedׁtEQ$ڳqOP*1s"&{ V*'1:BK;S!ZaXgam r 8vAy|w~mt#~l|uyv>r1m%&gaT$ZSwKBB:0', :`l˽!=̥zϞvsD]CJRed⁓E]q Z´Bts#, m'H0y:wBޚK;S"mZfaY;gm r |vAy|w~m~lh|uyivDrm$g-aSZqSKB!B:80y'F܋ Ilp BF!&ĬZzevb$B僈';e{dAEw5OqnĬ30 u#P }M'0:BK zkT .< (Ҭwy7ukZډBၔece҃F r0촿/v$ z ,p'0:BK=jS#ZaOgm!r HvBky|x0~k~l"|ugyvCr!m#g&aRZ~4S&K@B:0' <Hj 涽Zy(՘u 󖉽xB[ueXe郊F8"9s^jv%rg  8'I0:BK=S$4Z aP[gm"r vBy|xS~k~l |uDyvCr m#gaR>Z}S&jK@=B:#0Q' F  O~yo 1)ۓxttݾR?B,^eLe͆Au\D܇s^jϴ.w:&3 V '0+:BK>\S$ZvaPgpm"ir vBy|xv~k~k|u"ytvCr m#RgvaQZ}aS%K?B:0'C `%x嬽h"xUtdpA5Fe@e)A՘sSԬAx~w9  _$'f0:BK>S%ZaQgm"r vCy|t~k~k|tyFvCOr Vm#gaQ|Z|S%K?KB:0=' }$WxS'*ڰw랮t "ˉ͆AЃ/e4e50Aщ΍̒#twڲ-* xVZ'  '0?:BK?NS%Z|aQ~g m#r WvCPyG|t~k~k|tyvCr m"gaQZS%K>B:0'c! \ 6w{䢽v>ҞQsԍ򇉼Ae)e@G6AqtexW$jx(c  F'0:BK?S%Z}caQgxm#Sr vCyu|u"~k~k|xuyvBr m"hgoaPZtS$K>YB:0(' S0&w7+ͥhs\܅CZAt́eeL^B-@Ttvxۖ+4 yrR  I'0T:&BK@?S&lZ}aRAgm#r vCy|uE~l ~k|xRyvBr m"gaPYZ S$1K=B:0'F 5 c %nvg㗽[s7!F7eeXvB\yuإy+\ jK ? '0:BK@S&Z~6aRg(m#r#vCy|uh~l#~k~|x/yvBjr Fm!gaOZS#K=gB:0'm (w$v, 饁.r񻉻F рeedBܒ\umեyyս *> 1kW"}  Bl'-0h:0BKA1S%Z~aSgm$>rgvD5y|u~l:~kg|x y_vB1r m!}ggaYZ7S#NKy|u~l$s~m|wyvAr 7m g_aXZS!K;B:1''S x#"s.(MqMڱ#EPtdրejnCBߔv͞Y{;@Ĺ"(Sm!v (ݱ'e0:EBK6#SZGaTgm%vrvv>y|v~l/h~m|wyvALr m EgoaXwZS!K; Bݘ:j1*') ?"sT+xɠܥHpchE"؁]dˀeCqэ/m{ޱ2"n h VB'0:BK6S]ZaTg7m%rv?3y|v:~l;\~ms|w^yxvAr mgaXZ'S!K:B:1', M`!ur0'jp$D􃉵EddiC s0n|#ū#'^nD ^'0: OBK7SZaUIgm&rv?ly#|v\~lG~m\|w;yJv@r kmgaWZS K:Bܙ:`1' s W r7nȮ~pEǍwDƃ.ddtֆC͉Cnm||xߕ$#ܡ/o:5 }e'0.: BK7S@ZaUgm&`rv?yQ|v~lS~mD|wyv@r 'mZghaWTZSS 3K9B:#1' "9 Rq16ᇥ~G%oy>DoddǃC|͘nĞݥ|Ɯ$&&ogE) '0:!ZBkK8SZaV g>m&r Bv?y|v~l^z~m-|vyv@gr m'hgaVZSK9'Bۚ:"1'Qq -qd%Vǽ}ݞĘo+DiLdd߃D)>ؿo>}Kx$ݬCpW_ ',0C:!BK8S$ZWaVlgm&r v@y|v~m jn~m|vyv@.r m'gaVZSOK8B:"0w'b V0px޽$ִDࣥ}tco>܍XˆD;)dd?DX ot}ǎ%%1pmT 8'0:"dBjK8SZaVgm'Kr v@Qy|v~m$vc~l|vyv?r \m&g`aV0ZSK85Bڛ:!0'.I b~oY$Wˬ2} n؎D Ѐdd bD(ƒ[o̞~[޶Xqs  G'H1W:"BK9rS Z+aW.gFmm ur vAoy|w~mo(~l|vyv>rLm%FgaTKZSKBB:0;' Wg vm8<!ٴnzvdtC&X\edށEmF֒q奀/㔴r}P t:" 0'1 :BBfK;S"?Z;aYgm r avAy|w~m{~lr|uy|vDrm$gQaSZS4KBQBC:n0' 76l z|!Z݈zv>};B5Ded道3E`/q۞Gt#vj B'0:BK i5'0:BK=9S#ZxaOgm!r ,vBTy||x"~kv~l,|uvyvDr=m$gIaRZ~_S' K@B:0' x!Mj ܴŠ3ySu7,󲉽Bḿe\e F& r㞭j֬0V{d2vr%7c* 'H0i:VBdK=S$ZaP4gm!r pvBy|xE~k~l|uSyvCr m#gaRfZ}S&K@nBF:Y0'Gڀ S 1y Rg\x鞯tߒݍnVB?geQeAbD)hs:˥@١Ͻw%h  X'0:BK>+S$xZLaPgMm"Jr vBy|xh~k~k|u0yvCr m#qgaRZ}S&&K?B:0' N&`yݴPx;tݏ*BPeEe$A~mܶs,HzoGwU  $',0~:aBcK>S$ZaPgm"r vCy|t~k~k|u yYvCfr qm##gBaQZ}"S%K?|BG:O0t'* , `x=]] ޥx٘t/A扼Aニ 9e9e0&AsꞮڅx\ D z'0:BK?S%[ZaQWgm"r (A퉼RtBx,9yy[x'  K 'I0:kBbK?S%Z}8aQgUm#4r vCryb|u~k~k|tyvBr m"gaPZS$K>BH:D0`'  5k&;wp)R^.sܥ^qAځ e"eGUB)8ݠtOxhy9F n '0:BK@S&>Z}aRgm#r vCy|u7~l~k|x`yvBr m"9g:aPZ5S$_K>B:0'9 q H%vͽߴى)s(W8AXeeSlBIb|t򞯰yٴ+w ojQ  rڟ'e0:uBaK@S&Z~ aRzgm#rvCy|uZ~l~k|x=yvBr bm!gaPZS#K=BI::0L') e D%vTH`<UrВ ׉Fۀe e_ԆBwaJ_재r mOEOdev2BӉHؘuoz=.Ö  l:k `T'0D:BKASZIaSg m$rvDyX|u~l`~m|wyvAr m!gaY`ZS"K<.B:0'" JW#dtwḽᴽѬ2qȒ TE,deI=CG'vQХzݠ!u lU( W'0:B^KBkSLZaSgdm%rv>y|u~lwx~m|wyvAr Rm gaXZ%S"'K;BK:%1'b _"t3bX{јqpЍlj:Ec }dۀea`C0Вuv2{Ĉ!YmV: v',0X:BKBSZaT`gm%Wr[v>y|v ~l+l~m|wyvAcr m dg+aXZS!K;rgm%egaTrZ0SKBB:)0s'Gݒ Vmrt7" ğ'{$Dv߄݉C9feedفyEZ/˜q`fAJt"C rF'1: B3K;S"ZaXgrm r EvAy|w~mv!~l{|uyv>r$m%gtaTZSbKBBw:0' sDql貽!&ݶzvb5RC CNed偓%EIqn״\t#H:- 'd0:B޲K<S"ZzaYNgm r vAy |w~m~ld|uyavDrm$gaSZ]SKB B:0_'+o| ,lU (,!íDzQv UB܃ 6exdHEB^rجI3H$u#m i'0:B2KyvCr m#gaR,Z}S&TK@&B: 06'* 2byTɬ~xbtݯE4B$YeJeԆA~fQܖsoF9wU&O r '0F:+B/K>sS$ZaPgm"xr vBy|t~k~k|uykvC}r m#CgeaQZ}LS%K?Bz:0'd' g C xu哽Q xAtSaA.Be>e+AsǞfWw!V  |@'0:BK>S%-ZaQ0gm"r vC"y"|t~k~k|ty=vCDr Im"g aQjZ|S%qK?4B:0"' `:xx8 جښ's򾉼†Aǃ +e2e74Aډٍْ2tǥxȴ EC#xqvD  '0Z:5B.K?eS%Z}aQg1m#r dvC[yP|u~k~k|tyvC r m"gaQ ZS$K>B{:z0'G @ rwa䈽_)>sōzA联e&eCKBB:0's 6%wٷTݘsKv6OAkƁeeNcB6KaϘtΞxլ۬DN 7yo  7e',0n:@B-K@WS&Z}aRSgm#r vCy|uL~l~k|xKyvBr }m" gaPFZS$K=B|:p0'c  G%SvM~mEꞭ|r(F/eeZzƆBdu&y?s jg1 [ '0:BK@S&Z~KaRg9m#r0vDy|uo~l'~kz|x)yvB_r 9m!gaOZS#K=PB:0'Q Z$uԥrڍ񮉻݆F̀eefBku~y܏ CX Kks?  ^ۇ'H0:JB,KAHS;Z~aSgm$MrtvD@y|u~l?~kc|xyVvB&r m!ngVaYZ#S#8K'kE:de}@/B0pv.z|r޽!Bb `li ܪ'd0:TB+KB:SZaSg@m$rvDys|u~lm}~m|wyvAr nm gaY&ZOS"UK;B:[1$'* M# tU$i㩥CqQEvdeWQCiUv zW!!mZ K;'0!:BKBSZaT9gm%7r?v>y|u~l&q~m|wyvAzr *m gNaXZS!K;mB:1' 7 [k"|s8ڞq<ڢEGodԀentCKߣmvk{OUн"Amm= D'0:_B*K6:SZ[aTgm%rv?y|v~l2e~m|wzyvAAr m 6g^aXdZ|S!rK:B݀:Q1'z #q!s8_ɉƥp6pT[ކEсXdȀeCz܍y|v@~l=~mo|wWyovAr mgaXZS!K:{B:1' 0D!YrڽT՘pD냉AddkC?n&-|#9½#?wn`: {'0: iB)K7,SZ/aU\gm&!r v?wy,|vc~lI~mW|w4yAv@r ^mgaWZS K:B܁:F1'W| ; rTȗ~tp4ٸlD)ddw݆C։NĒn}|ߪ;#ܻJoVR ߁'+0I: BK7SVZaUgm&or v?yZ|v~lU~m@|wyv@r mKgWaWAZ?S K9B:#1q'c d 6qrϽq~3oݒjӉ3Dhdd̃Dܘn՞|ƴ$>@obE -'0:!sBڃK8SZaVgOm&r Ov?y|v~l`x~m(|vyv@\r m'YgaVZSK9Bۂ:"~0'5T pqJ%=ǥ}ɞoD`Fddド#D2KΘo-Q}`-$^pr| :'G0]:!BK8S:ZlaVgm' r v@#y|v~mll~m|vyv@#r m' gaVZlS9K8B:!0]'G :{pr^Ž$,}_Qo-΍KD2#ddFD`o}ɬǦ%=Jqp U5'0:"~BۂK9SZaVgm'Zr v@\y|v~m(x`~l|vyv?r Om&gOaVZSK8Bڃ:!s0'- Ebo@$>ƴ|nՒ܍D̀ddiD3Ӓjoݞ~3qrq 7 d'd1q:#BK9S Z?aWAgWmKr v@y|w~m@U~l|vyZv?r m&ogaUZSVK7B: 0I'+߁ QoUJܻ#;ߪ|n}ĉNCփ݁dwd)Dlٸp5t~ȗUr ; |X'1:FB܁K:S ZaWgmr ^v@yA|w5~mWI~l|vcy,v?wr m&!gaU\Z/SK7,B): i0' {:`nw#?¬9|"-n%?CdkdADpեTr!YD1 '1:BK:{S!ZaXgmr vAyo|wW~mo=~l|v@yv?>rm%gHaTZSsK6B:05'^r 'n96"Iǥ{̘mΒ<܆CyedɁXцEߍ[Tp䞫6pƴɉ_s9!q #z'1:QB݀K:S!rZ|aXdg^m 6r vAAy|wz~me2~l|vyv?rm%gaTZ[SK6:B*:_0' D=mm"@ЬU{OkmvߣCKtnedԁoEGڢq<ڬ8s"|k\ 7 '1:BK;mS!ZaXgOm r *vAzy|w~mq&~l|uyv>r?m%7gaT8ZSKBB:0 ';K Zm!!Wz垧 vUiCQWedEvQqC㩴i%tU# M'*1$:[BK;S"UZOaY&gm r nvAy|w~m}~lm|uysvDrm$g@aSZSKB:B+:T0'dܪ hl _b!Bެrz|v.p0B/@e}d쁓:Ek'>q재Yt#0 ^.'0:BK<^S"ZaYgm! r vAy(|w~m~lV|uyEvDyrm$gaSvZSKAB:0 ' /Xl ݽ ´ezHu֒޹,B eqd]E҉kیrD䍴{t9uq$0X w'G0p:fB~Kkr KX C܏yu~k鉽B達efe̓FݍژrԴu$Z Q'0:BK=PS#ZaOgm!r 9vB_y|x)~kz~l'|uoyvDr0m#g9aRZ~KS&K@B:0' [1fj ӽôsy?u&󥉽BdƁzeZe䃊F/(r|Em~Mv%SG  'c0:pB}K=S$ZaPFgm" r }vBy|xK~k~l|uLyvCr m#gaRSZ}S&K@WB-:?0n'+e 6 ny 7ND۫x՞tΒ΍aKB6ceNeƆAkO6wsKޥTٷw% 6 t'0:BK>BS$Z`aPg^m"Yr vBy|xn~k~k|u)y~vCr m#bgaQZ}wS&K?B:0' 1 DxȽĴ:xk(tv݀BS$ZaQ gm"r vC y|t~k~k|uyPvC[r dm#g1aQZ} S%K?eB.:50Z'  Cvxq#CEȥxǘt2ىنAڃ4e7e2+ Aljs'ښؽ x8x; ` '0":BK?4S%qZ|aQjgm"r IvCDy=|t~k~k|ty"vC"r m"gaQ0ZS%-K>B:0'? | U!w侽ŴW螮fsƒ򕉼Ae+e>B.AatSxA Qux C  g('d0:BzK?S%Z}MaQgem#Cr vC}yk|u~k~k|tyvBr m"xgaPZS$K>sB/:+0F' rO&wU9F奂soܖQfA~ԁeeJYB$4Eݯtbx~ʽyTb2  *'06: BK@&S&TZ}aR,gm#r vCy|u>~l~k|xZyvBr m"*g)aPnZ!S$JK=B:0'e T +%v㴽ǴssH-FAeeUqBRmuåyB j,m  ڻ'0:ByK@S&Z~ aRgm#rvCy|ua~l~k|x7yvBvr Um!gaP ZS#K=B0: 01' H($v9.G%BrʉFրeeaۆB͒KuZ$y~a» " k9]  "M'0K:BKAS Z~aRgmm$-rXvD(y|u~l5~kl|xyivB=r m!gzaZZMS#fK=B߱:0'- X$kup⩽ȴ以Arg۬񆉻E僊kdemBޙu!yӴ4 kO I '0:BxKAS~Z~aSOgm${rvDby2|u~lM ~kU|wy;vBr m!@g"aYZS"Ky|u~l{!v~m|wyvAr Em graXZS"K;B3: 1'Fr B"tIAfq_/EZydـeefC9ݒ߄vD{$(ğ" 7tmrV ݒ'G0s:)BKBSZ1aTrgm%frhv>y|v~l-j~m|wyvAXr m UgaXZS!K;$Bݳ:1G'G _"%srHʴɺ]qswE,߁bd̀e|Cgč!Ҙm{ޙ"nkH 7#'0:BvK6SEZaTg$m%rv?'y|v2~l9^~mx|weyvAr m g*aX*Z=S!.K:B4:1'#K m!rKA₥1p%3DJd€dfCd n{ ő# An% ?޵'c0: 3BK6SZaU5g|m&rv?`y|vU~lD~ma|wCyTv@r zmgaWZS K:3Bܴ:|13'+ 5w!rV4ߊ˴Ȭ~ǞpX׍Dσ3ddrφCÉ7nnZg|a| #܅os ^F'0: BuK7tS(ZnaUgm&Prv?yH|vx~lP~mI|w y&v@r 6mkgzaWhZjS KK9B5:#81'$ BX qqLO៥~^:pىJDwdd~ƒCp༘nȥ|ˬƃ$ oH& i'0:!>BK7SZaUg,m&r 3v?yv|v~l\}~m2|vyv@sr m'yg"aWZSK9AB۵:"1'o  Mq9 ހ%q֬-}٘o;DsTddڃD 0خo )}5`$ݏ&p8? i'0%:!BK8fS ZAaVXgm&r wv@ y|v~mgq~m|vyv@:r m'+gaVZSgK8B6:".0' v1Op$]༥}xoPg׆DE1dd8DNtoa}Ѵu% pkM4 '0:"HBOK8S}ZaVgm':r v@Ey|v~mse~m|vyv@r jm&gsaVEZ-SK8OBڶ:!0 'Mi #p v$rJ} n؟#DՀdd ZD|Jo~C%ޚ:qUi ('*1::"BK9XSZaWg3m,r v@~y|w~m6Y~l|vymv?r &m&gaUZSK7B:!$0'd߻ L ,o#kإ|n୍߉eC郈끒d{d }DU٘pM~rᵴgdq u_ @'1:#RBMK9S aZ~aW{gmzr Cv@y/|w&~mNN~l|vqy?v?rm&AgaUZYSK7]B\: 0'*B Wvoꭽ#sg|MUnI_,Cȁdpd7D؉pi~ܬ&߽ߤOrq! R'F1N:BK:JS ZaWgmr v@y]|wI~meB~l|vNyv?Urm%gkaU"ZSK6B: 0l'Hޙ "d nsm("z{㞧mWCdddāOÆEǍ@4pE☴Xc)r!5 g?'1:BLK:S!DZQaX=g;m r vA*y|wl~m|a6~l|v+yv?rm%gaTZS/K6kB]:0' ,Oxm颽"tރ{zmÍC^xedρfE5ڂqp ѽcs"A0 |'c1b:BK;rZm%VgaT`ZSKBB:0X',v :mVY!Ĉ{1vuЉC0``edہ} Ec:ǒјqpѥ{Yb3t"_ b'1:%BKK;S"'Z%aXgm r RvAy|w~mx~lw|uyv>rm%gdaSZSLKBkB^:0' V'Ul 蘽!uݠzИvQ&􌉾GC=Ied灓,ET qȞ2ѽwt#dWJ "'0:BK<.S"ZaY`gm!r vAy|w~m~l`|uyXvDrm$g aSZISKAB:0D'S_ kl:  Ö.z=ou؍HBӃ2evd󁓬OEOmr _Ja>u8# ;' 08:0BJKS$_Z5aPg:m"9r vBy|x`~k~l|u7yvCr m#gaRZ}S&>K@B:0' mEy9hxOtݠ8)BUeGe" چAq^ܥs._R)wp&;k5  '0`:DBHK>S$ZaPgm"r vBy|t~k~k|uybvCrr m#4gTaQZ}8S%K?Bb:k0'I  K 'x[yx9x,tBRA탋(>e<e-!Asמxlw=r $ ['0:BK?S%CZaQBgm"r -vC-y+|t~k~k|ty4vC9r x`  ,'+0t:OBGK?|S%Z}"aQgBm##r qvCfyY|u ~k~k|tyvCr m"gaPZS$K>Bc:a0}', $ UwFozG,sܶm~A⁔e$eEPB*ݏt;xPy`& N '0:BK?S&&Z}aRgm#qr vCy|u0~k~k|xhyvBr m"JgMaPZKS$wK>+B:0'W h%wϬ١@˘s:g)DAbeeQgB?Vnݘtߞx\g Ry1  Sځ'G0:YBFK@nS&Z}aRfgm#r vCy|uS~l~k|xEyvBr pm!gaP4ZS$K=Bd:V0i'G *c%7vr2d{V0֞jr剼 F&e e\͆Bm,u7yS3‹ kM! x '0:BK@S' Z~_aRgJm$r=vDy|uv~l,~kv|x"y|vBTr ,m!gaOZxS#K=9B:0'5i >$u߽ݬ饁l rˍ񡉻҆EyɀeehBɍzuyܥ [r fk[   zۣ'c0:dBEKA`SPZ~aS(gm$\rvDKy |u~lC~k^|wyMvBr m!_gEaYZS##Ky|v~l(o~m|wyvAor m ug>aXZS!K;UB:1' ?O"`sʽ"Şq+ړ E?큓kdҀes{CT߲m~{ck"YmY0 a'0:xBBK6RSZoaTgm%rv?y|v$~l4c~m|wtyvA6r m 'gMaXRZhS!\K:Bg:71'^ U!sE~rⰥ\#pӒENԆEʁTdƀeCImߞߥ{ͬݴ`" PnTD z'*0O:BK6SZaU gYm%rv?Iy|vG~l@~mj|wQygv@r mgaWZS K:cB:1k'd q'!=rl>~˜p{ D⃉c}tऴD$xp0 W'c0x:"BK8SOZaVgm'r v@.y|v~mnj~m |vyv@r m&gaVlZWS$K8B:!0C', _pVCݫ$x}K>oؿ>D)߀ddLDi+oĥ}ެǽ%Vdq- qQ'1:"BۚK9'SZaVgm'ir v@gy|v~m-z^~l|vyv?r Bm&g>aV ZSK8Bk:!Z0' (Ego&$&Ɯ|➨ݘnĒ͍|CǀddoD>yo%~Gᇴ61q S9" '1:#BK9S 3ZSaWTghmZr 'v@y|w~mDS~l|vyQv?rm&`gaUZS@K7B: 0.'e} 5o:/ܡ##ߔ|x|nl~CC̓ցdtd.DƉwǘpE~ȯnr8 W s' 1:`BܙK:S ZaWgmr kv@yJ|w;~m\G~l|v\y#v?lrm&gaUIZSK7B: O0' ^Dn]#'Ū#|n0s CdidED$pj(0r!u`M ,'1:BK:S!Z'aXgmr vAyx|w^~ms\;~l|v:yv?3rm%g7aTZS]K6B:0'BV h nؽ"2ޱ{m/цCqedˁ]؆E"hcpIܴɠx+sT" @')1*:jBݘK; S!ZaXwgom Er vALy|w~mh/~l|vyv>rvm%vgaTZGSK6#B:E0'eݱ (v!mS"(Ĺ@{;Yv͒ߔ뉾CBnjedցtEP#ڱqMN(.s"#x S''1:BK;S!ZaXg_m r 7vAy|w~ms$~l|uyv>r2m%(gaT&ZSzKBB:0'/ =cmν!@ΥzўvuF^CKSed⁓E\q X㿴?tp#) j'F0v:uBޗK;S"kZdaY9gm r {vAy|w~m~li|uyjvDrm$g/aSZsSKB#B:;0|'I܎ Lls EI!)Ǭ\zgvc%B惈(;e{dAEv4Mql1-t#M zJ'0:BKgaSZ~S%KA1B:00h',k A }"kW 1> *լyyԘum\܉B⁔ece҃F r.괿 ,v$w )m'0:BK=hS#ZaOgm!r FvBjy|x/~k~l#|uhyvCr#m#g(aRZ~6S&K@B:0' ?Kj 湽\y*טu󘉽yB\veXe郊F7!7s[gv%o d  5'G0:BK=S$2Z aPYgm"r vBy|xR~k~l |uEyvCr m#gaR@Z}S&lK@?B:&0T'I  Ryr 4+ۖxvtݿT@B-^eLĕAtZC܆s\hʹ+w7&0 S '0(:BK>YS$ZtaPgom"hr vBy|xu~k~k|u"yuvCr m#SgxaQZ}cS%K?B:0'F c(x寽j$xWteqA6Ge@e)AԘsQҬ?v|w6  \!'c0:BK>S%ZaQgm"r vCy|t~k~k|tyGvCPr Wm#g aQ~Z|S%K?NB:0?' 'ZxV*,ڲw힮t#̉ΆAу0e5e4/AЉ͍˒"t wڰ*'xSW$ } '0=:BK?KS%Z|aQ|gm#r VvCOyF|t~k~k|tyvCr m"gaQZS%K>B:0'f$ _ 9w~䤽xAԞSsՍ򈉼Ae)e@G5AptdxU"hx%`  C'0:BK?S%Z}aaQgvm#Rr vCyt|u"~k~k|xvyvBr m"igpaPZvS$K>\B:0+' V3&w:.ϥjs^܇D[AúeeL^B,?Rݾttxۓ)1 yp~O  F' 0Q:#BK@=S&jZ}aR?gm#r vCy|uE~l ~k|xSyvBr m"gaP[Z S$4K=B:0'I 8 f%qvj㚽]s9"F8eeXuB[x u֥y(Z jH < '0:BK@S&Z~4aRg&m#r!vCy|ug~l"~k|x0yvBkr Hm!gaOZS#K=jB:0'p ,z $v/쥁0r񽉻F ҀeecBڒZuk7ywӽ (< .kTz  ?i'*0e:.BKA/S"Z~aSg~m$y|u~l#t~m|wyvAr 8m gaaXZS!K;B:1'*V {&"s1*P𞫬qOڳ$EQtd׀eimCBߓv˞W{9=Ķ"&Pms %ݮ'b0:BBK6!SZEaTgm%uruv>y|v~l/h~m|wyvAMr m FgqaXyZS!K; Bݛ:m1-', C" sW.{ɣޥJpdjE#ف]dˀeCpύ.m{ޯ/"ne S?'0:BK6S[ZaTg5m%rv?2y|v9~l;\~ms|w_yyvAr mgaXZ)S!K:B:1'/ Pc!xr2*lp&DFddhC q/n| !Ũ#$[nA ['0: MBK7SZaUGgm&rv?ky"|v\~lG~m\|wZaUgm&_rv?yP|v~lR~mE|wyv@r )m\giaWVZUS 5K9B:#1' %< Uq38ብ~I'oz?DpddǃC{˘nÞۥ|߬ƚ$#$odB& '0:!WB K8SZaV g=m&r @v?y|v~l^z~m-|vyv@hr m'jgaVZSK9*B۝:"1'Tt 0qf%Xǿ}Ƙo,DjMddރD(=ؽo<}Iv$ݩApT\ ')0@:!BK8}S!ZUaVjgm&r v@y|v~m jo~m|vyv@/r m'gaVZSRK8B:"0z'e Y3p{$ٴFথ}veo@ލZ͆D<*dd>DW or}nj%".pjP 5'0:"aBgK8SZaVgm'Ir v@Py|v~m$uc~l|vyv?r ]m&gbaV2ZSK88Bڞ:!0'1M ep\$Yͬ4} nؐDрdd aD'ŒYoʞ~Y޳Uqp  D'E1T:"BK9oS Z)aW,gDm;r v@y |w ~m;W~l|vydv?r m&g aUZSnK7B:! 0f'Iߠ /qotg׽#ڴT¥|n҉ZC䁒dyd$D` ٧p"_~˴~}8q { ]9'1:#lBfK9S vZaWgmr Pv@y7|w-~mRL~l|vky6v?rm&2gaUpZESK7FBD: 0'% :Znꓽ#Z۬Q|9Bn8P!Cdmd ڑq)ì }s"]L< '~1|:BK;SS!ZaXgrMm%HgaTMZSKBB:0>'Zj ym;?!ܴqzvfÉuC'Y\ed݁ElEԒq㥀-㑴pzMt7"| -~' 1:?BdK;S"=Z9aYgm r _vAy|w~mz~lr|uy}v>r m$gSaSZS6KBTBF:p0' : 9l }!]݊zv@m$gKaRZ~aS' K@B:0' {$Pk ޴5yUu9-󳉽Bńe\e ߃F% rឭhԬ-Sxb0vo%4`' 'E0g:TBaK=S$ZaP2gm!r ovBy|xD~k~l|uSyvCr m#gaRhZ}S&K@pBH:\0'Jڃ V 4y Tj_ĥx랯tߍoWB@heQeAaC(fs9ɥ>ٟ̽v%e  U'0:BK>(S$uZIaPgKm"Hr vBy|xg~k~k|u0yvCr m#sgaRZ}S&(K?B:0' Q)cyߴRx=tݑ+BPeEe$A|lܴs*EwlDwR  !')0{:^B`K>S$ZaPgm"r vBy|t~k~k|u yZvCgr sm#%gDaQZ}$S%K?~BI:Q0w'- / c x@_`"xۘt1C艼A䃋!9e9e0&As螮ڂxY @ w'0:BK?S%YZaQUgm"r :vC8y3|t~k~k|ty+vC.r /m"gaQDZ S%EK?B:0'^ 'u@xڽozsْ򤉼A"e.e;='A쉼Pt@x*7vvXx$}  H 'F0:hB_K?S%Z}6aQgSm#2r ~vCqyb|u~k~k|tyvBr m"gaPZS$K>BJ:G0c'  8n&>ws,Ua0sܧ`sAہ e"eGTB(7ݞtMxey6|B j  '0:BK@ S&B:0'< t K%vнⴿً+s)Y9AYeeSlBHa{t𞯮x״)u lj N  oڝ'b0:sB^K@S&Z~ aRxgm#rvCy|uY~l~k|x>yvBr cm!gaP!ZS#K=BK:=0O', h G%vWKb>žWrҒ ؉Fۀe e_ӆBv;uHygI¢ kj=  .'0-:BK@S'Z~saRgZm$rJvDy|u|~l0~kq|xysvBIr m!gaZ$ZdS#~K="B:0'L x!$uƽ㴾ƬӥXrzۼ񔉻džErĀdejBԍމu yѬܺ t k0x ) ۿ'~0:}B]KAwSfZ~aS;gm$krvDVy)|u~lH~kZ|wyEvBr m!Pg4aYZS# K #u;@cMar"nPEOdev1BӉ Fטumz;,Ô  l7 h ]Q' 0A:BKASZGaSg m$rvDyW|u~l_~m|wyvAr m!gaYbZS"K<0B:0'% MZ#gtzỽ䴽Ԭ鹿4qʒ UE,deIy|u~lvx~m|wyvAr Tm gaYZ'S")K;BN:(1'e b"t6d[~Әqrҍɉ;Ed ~dۀe`_C/Βsv0{ą!VmS7 s')0V: BKBSZaT^gm%UrYv>y|v~l*m~m|wyvAdr m fg-aXZS!K;>B:1e'e "2"Dse౽Ԭ rqڄE6灓fdЀewC]m{xށ"qmuL) }'0:B[K6iS-ZaTgm%rv?y|v+~l6a~m}|wmyvA+r m g=aX?ZSS!FK:BO:1'Bj 8!s,f[⚥Gp’6AɆEāOdĀddCVm{w"%knpa ޖ'E0j: BK6SZaU gim%rv?Ty|vN~lB~mf|wJy^v@r mgaWZS K:LB:1P'I U !!rtQߧ)~ޞpkDك8ddodžC+]nGS|Kd#pnsT ?''0: BZK7[SZWaUgm&?rv?y>|vq~lN~mN|w'y/v@r Dm|gaW}ZS cK9BP:#U1' C bw q!giᷥ~tNpٚVD~ dd{C艿dޒଘn|ִi#o) I߹'a0~:!!BK7SZaUgm&r %v?yl|v~lY~m7|wyv@r m-g5aWZSK9ZB:"1<'- +lqW=ޜ%E~ oLD}[ ddՃ D"؝n}H$os p  fJ'0:!BڴK8MSZ+aVCgqm&r iv@y|v~mes~m|vyv@Fr m';gaVZSK8BQ:"J0' 7Pmp% wԥ}ocuDO8dd색0DD֍eoOv}๴[$pL. s'~0:",B3K8SeZaVgm')r v@9y|v~mqh~m|vyv@ r ym&gaVZZCSK8iB:!0('l Bp;)ݒ$b}7+o ذ1D ڀddSDr:oץ}+Խ%n}q7J m' 1:"B۳K9>SZaWg!m'wr v@ry|v~m1|\~l|vywv?r 5m&g.aUZSK7B:!@0' l )Ko $ ƅ|͞ʘnྍ퉿qCÀd~dvDIوo8~[᝴MIq nU? !'1:#6B2K9S HZhaWfgymir 4v@y%|w~mIP~l|vyyIv?rm&QgaUZpS+K7wBw: 0'Ia vo܈# |din\o8CăЁdrd2Dω֘pV~Ŭƽ߈1rS!t 2'(10:yBܲK:0S ZaWgmr xv@yS|wB~m`E~l|vVyv?arm&g~aU6ZSK6B: 60'f޸ B(nD#œ {n!fCdfdJD1$p/‴?H r!}j H!'1:B1K:S!,Z;aX(g(m r vAy|we~mx^9~l|v3yv?(rm%g&aTZSGK6Bx:0'&: Knn鿽"ޛ{mӍ"ƆCh}ed́a߆E+urq[ɸEso"" \'E1E:BݱK;"S!ZaXgm Tr vAWy|w~mj-~l|vyv>rim%ggaTtZ3SKBB:+0v'Jݕ  Ymtv:"ġ*{'Fv߅މC:geedفxEY.q^c?Gs"? oC'1: B0K;S"ZaXgpm r DvAy|w~mv!~l||uyv>r%m%gvaTZSdKBBy:0' v Gtl贽!)ݸzvd7SC DNed䁓$EGqlմZt#E7* 'a0:BްK<S"ZxaYLgm r vAy |w~m~ld|uyavDrm$gaSZ_SKB B:!0a'.r /lX */!ðFzSv VB݃!7eydGEA\r ~֬G1F!u#i f'0:B/Kr vBy:|w~kT ~lM|uy3vDcrm$}gaSQZ~SKABz:0' L Qk 窽 7եy鞦#uޛBemdjE䉻۪reߥ?临nu$hU *'}0:B߯K=S#dZKaZgxm!r vByvCr m#gaR.Z}S&VK@(B: 09'- 5eyW ̬ۀxdtݰG5B%ZeJeӆA}ePܕsm}D6 wR&L o '0C:(B-K>qS$ZaPgm"wr vBy|t~k~k|uylvC~r m#DggaQZ}OS%K?B}:0'g* j F xx啽SxCtUbA/Be>e+AsŞdTwS  y='~0:BK>S%+ZaQ.gm"r vC!y!|t~k~k|ty>vCEr Jm"gaQlZ|S%sK?6B:0%' c ={x;ڬڝ)s򿉼ÆAȃ +e2e74Aى؍ؒ1tťxƴBA xosA  ' 0W:3B,K?bS%Z} aQg/m#r cvCZyO|u~k~k|tyvC r m"gaQ ZS%K>B~:}0'J C uwd䋽a+@sƍ{A達e'eBKEB:0'v 9%wٹVߘsMx7QAlƁeeNbB5J_͘t̞xӬ۩AK 4yl  4b')0k:=B+K@TS&Z}aRQgm#r vCy|uK~l~k|xLyvBr m" gaPHZS$K=B:r0'f  J%VvPぽoH잭~r*F/eeZzņBdu$y=q jd. X '0:BK@S&Z~IaRg7m#r.vDy|un~l'~kz|x)yvB`r ;m!gaOZS#K=SB:0'T ]$v֥r܍񰉻ކF̀eefBiu|y܍ @U Ikp<  [ۄ'E0:GB)KAFS8Z~aSgm$KrrvD>y|u~l>~kc|xyWvB'r m!pgXaYZ%S#;Km$rvDyr|u~lm}~m|wyvAr om gaY(ZRS"WK;Bށ:^1&'- P#tX'l㬥EqREwdeWQChSvzU!m}W H8'0:BKBSZaT7gm%5r>v>y|u~l&q~m|wyvA{r +m gPaXZS!K;oB:1': ^ n"s:ܞq>ڤEHpdԀentCJߢmti{MSͽ">jm: A'~0:\B'K68SZYaTgm%rv?y|v~l1f~m|w{yvABr m 7g`aXfZ~S!tK:B݂:S1'} &t!s;aɌȥr8pU]EҁYdɀeCyڍ;m̞ʥ{ŴF"3n6% o[' 02:BK6SqZaTgFm%rv?=y|v@~l=~mo|wXypvA r mgaXZS!K:}B:1' 3G!\rܽWטpD색AddkC~>n$+| 6ſ#=tn]7 x'0: fB&K7*SZ,aUZgm& r v?vy+|vb~lI~mX|w5yBv@r `mgaWZS K:B܃:I1'Z > rWȚ~vp6ٹmD*ddv܆CՉM’n||ߨ8#ܸGoSO  ~'(0F: BK7STZaUgm&nr v?yY|v~lU~m@|wyv@r mMgYaWCZAS K9B:#1t'f g 9quҽ!s~5oޒkՉ4Didd˃DژnӞ|Ʊ$<=o_B *'0:!qBڀK8SZaVgNm&r Mv?y|v~l`x~m)|vyv@]r m'[gaVZSK9Bۄ:"0'8W sqM%@Ǩ}˞oDaFddド"D1J̘o+O}]*$[poy 7'D0Z:!BK8S7ZjaV}gm' r v@"y|v~mll~m|vyv@$r m' gaVZnS~l|vAyv??rm%gIaTZSuK6B:07'au +n<8"ôKɥ{Θmϒ=݆CzedȁXІEݍZRp➫4nĴɇ\s6!n  w' 1 :NB}K:S!pZzaXbg\m 4r vA@y|wz~me2~l|vyv?rm%gaTZ]SK6=B,:a0' G@mo"CҬX{QmmxߥCLuoedԁoEGڠq:ج5s"yhX 4 '1:BK;jS!ZaXgMm r )vAyy|w~mq&~l|uyv>r@m%9gaT:ZSKBB:0#'>N ]m $!ĴYz螧 vWjCRXedEuPqA㧴g"tR# J''1!:XB|K;S"SZMaY$gm r lvAy|w~m}~ln|uytvDrm$gBaSZS KB=B-:W0'gܭ kl be!Dtz~v/r1B/@e}d끓9Ej%=qꞬWt#- [+'0:BK<\S"ZaYgm!r vAy'|w~m~lW|uyFvDzrm$gaSxZ SKAB:0'' 2[l ŴhzJuؒ޺.Bƒ erd\EщiۋrB䊴yq6un$-U t'D0m:cB{K@S$Z^aPg\m"Wr vBy|xn~k~k|u*yvCr m#dgaQZ}yS&K?B:0' 4 Gy˽ǴS$ZaQgm"r vC y|t~k~k|uyQvC\r fm#g3aQZ}S%K?gB1:80]'  Gyxt&FG ʥxɘt 4ډچAۃ5e7e2* AƉs%ژս x5u8 ] '0:BK?2S%nZ|aQhg m"r GvCCy<|t~k~k|ty#vC#r "m"gaQ2ZS%/K>B:0'B  X$wȴYꞮhsȒ򗉼Ae+e>B.A_tQx? Nrx@  d%'a0:BxK?S%Z}JaQgdm#Ar vC|yj|u~k~k|tyvBr m"zgaPZS$K>uB2:-0H' uR&"wX<I祂spܘShAԁe eIYB#3Dݭt`x{ǽyQ_/  ''04:BK@#S&RZ}aR*gm#r vCy|u=~l~k|xZyvBr m",g+aPpZ#S$LK=B:0'h  W .%v㶽ɴvsJ.APeeUpBQluy@ j)j  ڸ'}0:BwK@S&Z~aRgm#rvCy|u`~l~k|x7yvBwr Vm!gaPZS#K=B3:#04' K+$v<1J'DrˉF׀eeaچB̒JuY"y|_¹  k6Z  J' 0H:BKAS Z~aRgkm$,rWvD'y|u~l5~km|xyjvB>r m!g{aZZPS#iK= Bߴ:0'0 [$nus⬽ʴ佥Driۭ񇉻E惊ldemBߍޘuyд2 kL F '0:BuKAS|Z~aSMgm$zrvD`y1|u~lL ~kU|wyy|u~l{!v~m|wyvAr Gm gtaXZS"K;B5:1'Iu E"tLDhqaÍ0E[ydـeefC8ے߂vB{"%ĝ" 4qmoS ݏ'D0p:&BKBSZ.aTpgm%drfv>y|v~l-j~m|wyvAYr m WgaXZS!K;'Bݶ:1J'J b"(suKʹɼ_q uxE-bd̀e|CfÍИm{ޗ"mhE 4 '0:BsK6SCZaTg"m%rv?&y|v1~l8_~mx|wfyvA r m g,aX,Z?S!0K:B6:1'&N p!rMDⅥ3p'4DKd€dfCcn{Ŏ# ?n"} <޲'`0: 0BK6SZaU3gzm&rv?_y|vT~lD~ma|wCyUv@r {mgaWZS K:5Bܷ:16'. 8z!rX7ߍδˬ~ɞpZٍDЃ3ddrΆC‰6lnXe|_z#op [C'0: BrK7rS&ZkaUgm&Nrv?yG|vw~lP~mJ|w y'v@r 7mmg|aWjZlS MK9B7:#;1'' E[ tqNRᡥ~`3p C▴Va&r!2 d<'1:BJK:S!BZOaX;g9m r vA)y|wk~m|`7~l|v,yv?rm%gaTZS1K6nB`:0'  /R{m饽"wކ{|mčC_xedρfE4ځqnϽ`s">, y'`1_:BK;9S!ZaXgm cr vAby|w~ml+~l|v yv>r\m%XgaTbZSKBB:0['/y =mY\ !Ċ{3vvщC1`aedہ}Eb9ƒϘqoϥyV_1t"\ _'1:#BIK;S"%Z#aXgm r QvAy|w~mx~lw|uyv>rm% geaTZSNKBnBa:0' Y+Xl 蛽!xݢzҘvS(􍉾HC=Jed灓+ER qƞ0봽Ͻtt#aTG '|0:BK<+S"ZaY^gm r vAy|w~m~l`|uyYvDrm$gaSZKSKAB:0G'Vb nl=  Ø1z?quڍIBԃ2evd򁓬NENkr\H^;u5# 8' 05:-BHKZ~SkKA|Bb:0' /~6k 琽 yܿy՞uތֆBekdÃqE퉻ō۹rvTδu$r G'0:BK=S#zZ`aZ gm!r vBGyq|x~kp~l1|u~yvDrMm$ g^aRZ~wS'$KAB:03'4 Cpk! §MyluK>BxՁe_e ڃFՒrΞS:]EvQ%A b'&0I:7BFK=S#ZaPgm!r `vBy|x=~k~l|u[yvCr m#gaR|Z~S&K@Bc:x0'hڢ u Tj r憽z.ܥyt~cBJmeSe򃊷AW7Us&'هv%E  n6'}0:BK>S$]Z3aP~g9m"7r vBy|x`~k~l|u8yvCr m#gaRZ}S&@K@B:0' pHy<jxQtݡ:*BUeGe! چAp]ܣs~+\P&wm&8h2  ' 0]:BBEK>S$ZaPgm"r vBy|t~k~k|uycvCsr m#5gVaQZ}:S%K?Bd:n0'K N *x^|{e<e-!As֞vjw:o ! X'0:BK?S%@ZaQAgm"r ,vC,y*|t~k~k|ty5vC:r =m"gaQYZ|S%]K?B:0 '} F!_xìڇs򲉼A'e0e98 A≼@t.إxܴ[Z;x]  )'(0r:LBDK?zS%Z} aQg@m#"r pvCeyX|u ~k~k|tyvCr m"gaPZS$K>Be:c0'/ ' XwIq|J.sܷnA⁔e$eEOB)ݎt9x~My]# K '0:BK?S&$Z}aRgm#pr vCy|u/~k~k|xhyvBr m"KgOaPZNS$zK>-B:0'Z k%wѬ٣B͘sUmܘtݞxۿZd Oy.  P~'D0:VBCK@kS&Z}aRdgm#r vCy|uR~l~k|xEyvBr rm!gaP6ZS$K=Bg:Y0l'J -f%:vu5g}X2؞lr牼 F'e e\~̆Bl*u5yQ1ˆ jJ u '0:BK@S'Z~]aRgHm$ r;vDy|uu~l+~kv|x#y}vBUr .m!gaOZzS#K=;B:0'8l A$u߬륁n r͍񣉻ӆEzɀeehBǍxuyܢ Yo ckX   w۠'`0:aBBKA]SNZ~aS&gm$ZrvDIy|u~lC~k_|xyNvBr m!agGaYZS#%Ky|v~l(o~m|wyvApr m vg?aXZS!K;XB:1' BR"csͽ$Ȟq-ڕE@kdҀerzCS߱m|{ai"VmV- ^'0:uB@K6OSZmaTgm%rv?y|v#~l4c~m|wtyvA7r m (gOaXTZjS!^K:Bj::1'a  X!s Htⲥ^%pՒFPՆEˁTdƀeCHmݞݥ{ˬ۴^" MnRA w''0L:BK6SZaU gWm%rv?Hy|vF~l?~mk|wQygv@r mgaWZS K:fB:1n'g t*!@rnýA~Ęp} Dド=ddmCMn5>|5L׽#UnyT4 '0: B>K7ASZAaUlgm&/rv?y4|vi~lK~mS|w/y9v@r SmgaWZS {K9Bk:#q1'>b ! r>ȃϥ~cp%٪ bD%ddyCމXϒn|߾O#aon k *ߚ'C0a:!BK7SjZaUgm&}r v?yb|v~lW~m<|w y v@r m>gHaW0Z-S K9tB:"1Y'K J qvZ޸ ]~!oΒ\ȉ)DbddЃD ؍n䞩}0Ƚ$TWo{_ G+'0:!BڙK83SZaV/g^m&r Zv?y|v~lbv~m$|vyv@Rr m'LgaVZSK8Bl:"g0'; Vpp3%'Ǒ}ovDY@dd烉)D:ʍWۘorwm%xgaTZISK6&B:H0'hݴ +y$mV"+ĻB{=[vΒߖ쉾CCnjedցsEO"گqKK%,s" u P$'1:BK;S!ZaXg^m r 6vAy|w~ms$~l|uyv>r3m%*gaT(ZS|KBB:0 '"2 @fm ѽ!BХzӞvvH_CKSed⁓E~[q V㽴=< ;:97$6,544=3F2P1[/e.p-{,+*('&%$#"  xmbXND; 2 * "     (!0"8#B$K&U'`(j)u*+,./012356789:;=>?@ABDEFGHIJLMNOPQRTU}VrWhX]YS[I\?]6^._&`acd e fghjklmno prst$u,v4w=yFzP{[|e}p~{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȈЉ؊ޟ֠Ρţ}rh]SI?6.&  $,4=FP[ep{ԅՐ֛إٰںxmbXND;2*"   (08BKU`juրՋԖҠѫеϾ޶ִγŲ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`ju~}{zyxwvtsrqponlkjihgfdcba`_]\[ZYXW}UrThS]RSQIP?N6M.L&KJIH F EDCBA?>=< ;:97$6,544=3F2P1[/e.p-{,+*('&%$#"  xmbXND; 2 * "     (!0"8#B$K&U'`(j)u*+,./012356789:;=>?@ABDEFGHIJLMNOPQRTU}VrWhX]YS[I\?]6^._&`acd e fghjklmno prst$u,v4w=yFzP{[|e}p~{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`juȀЀ؀ހր΀ŀ}rh]SI?6.&  $,4=FP[ep{À̀Ԁ܀ڀҀʀxmbXND;2*"   (08BKU`jusonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/44100-2-16.wav0000644000175000017500000126111412252354725026154 0ustar miramiraRIFFDbWAVEfmt Ddata b )Rx |*5>H PJ Ys ` dg tm r&wAzj^}~8|ayv{qle/^YW N!E"j<#2'%U(P&y'(3)D*Y,G-p.ҙ/w0Ҿ13>4g567'8 :6;_<=>?]A-BڃVCDEϏF{G$IMJvKrL{MNPFDQnRSTxU^W&]NH4MP L YJ`IdgHtmfGr=F&wEzC^}BAo@F?~>|HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q,E??7=0KڈHn"19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0q,E??7=0KڈHn"19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q,E??7=0KڈHn"19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q-E??7=0KڈHn"19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q,E??7=0KڈHn!19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0q,E??7=0KڈHn"19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0q-E??7=0KڈHn"19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q,E??7=0KڈHn!19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{r{Fx^%%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#w 0q,E??7=0KڈGn!19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r|Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q,E??7=0KڈHn"19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃϏ{r{Fx^&% 09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q-E??7=0KڈHn"09 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{r{Fx^%%09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7|-#w 0q,E??7=0KڈGn!19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r|Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q,E??7=0KڈHn"19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃϏ{r{Fx^&% 09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q-E??7=0KڈHn"19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{r{Fx^%%09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7|-#w 0q,E??7=0KڈGn!19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r|Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q,E??7=0KڈHn"19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q-E??7=0KڈHn"19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{r{Fx^%%09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7|-#w 0q,E??7=0KڈGn!19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(3DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0r,E@?6=0KڈHn"09 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0r,E??7=0KڈHn"19 x *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(4DYwӾ']ڃϏ{r{Fx_&%09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q-E??7=0KڈHn"19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2V(3DZwҾ']ڃϏ{r|Ex^&%09CL U\dj0p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q-E??7=0KڈHn!19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃЏ{q|Fx^%% 09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7}-#x 0q-E??7=0KڈGn!19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃϏ{q{Fx^%% 09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0q,E??6=0KڈGn!19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(4CYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0r,E@?7=0KڈHn"09 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0r,E??7=0KڈHn"19 x *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(4DZwӾ']ڃϏ{r{Fx_&%09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q-E??7=0KڈHn"19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2V(3DZwҾ']ڃϏ{r|Ex^&%09CL U\dj0p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q-E??7=0KڈHn!19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃЏ{q|Fx^%% 09CLU\dj1p u y&|[~h}u{xsnhXbZRYJ-A7}-#x 0q-E??6=0KڈGn!19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃϏ{q{Fx^%% 09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0q,E??6=0KڈGn!09 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(4CYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0r,E@?7=0KڈHn"09 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0r,E??7=0KڈHn"19 x *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(4DZwӾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q-E??7=0KڈHn"19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2V(3DZwҾ']ڃϏ{r|Ex^&%09CL U\dj0p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q-E??7=0KڈHn!19 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃЏ{q|Fx^%% 09CLU\dj1p u y&|[~h}u{xsnhXbZRYJ-A7}-#x 0q-E??6=0KڈGn!19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃϏ{q{Fx^%% 09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0q,E??6=0KڈGn!09 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(4CYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0r,E@?7=0KڈHn"09 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ.A7|-#x 0r,E??7=0KڈHn"19 x *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(3DZwӾ']ڃϏ{r{Fx^&%09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q-E??6=0KڈGn!09 x *5>HP Y`dgtmr&wz^}~|yv|qle^WNEj<2U(4DYwҾ']ڃϏ{q|Fx_%%09CL U\dj0p u y&|[~h}t{xsnhWbZRYJ.A7}-#x 0r,E@?7=0LڈHo"18 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3EYxҾ']ڃЏ{r{Fw^&% 09CLU\dj1p u y&|[~h}u{xsnhXbZRXJ.A7|-#w /q-D?@7=0KڈGn!0: x *5>HP Y`cgtmr&wz^}~|yv{qle^WNEj<2T(4DZwӾ']كϏ{q|Gx]%%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E@?6=0KڈHn"19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃЏ{r{Fw^'% 09CL U\dj0p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q,F??7=0KڈHn"0: x *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2V(4CZvӾ']ڃϏ{r|Ey^&%09CLU\dj1p u y'|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E??6=0KڈGn!19 x *5>HP Y`dgtmr&wz^}~|yv|qle^WNEi<2U(2DYwҾ']ڃϏ{q{Fx_%% 09CL U\dj0p u y&|[~h}u{xsnhWbZRYJ.A7}-#x 0q,F??7=0LڈHo"18 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(3CZvҾ']ڃϏzr{Ey^&%09CLU\dj1p u y&|[~h}u{xsnhXbZRXJ.A7|-#w /q-E?>7=0KڈGn!09 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(4DXwѾ']كϏ{q|Gx_%%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7}-#x 0r,E@?6=0KڈHn"19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3EYxҾ&]ڃЏ{r{Fw^&% 09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q,D??7=0KڈGn!0: x *5>HP Y`cgumr&wz^}~|y v{qle^WNEj<2V(4CZwӾ']ڃϏ{r|Ex]&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E@?6=0KڈGn!19 w *5>HP Y`dgtmr&wz^}~|yv|qle^WNEi<2U(3DYwҾ']ڃϏ{q{Fx_%% 09CL U\dj0p u y&|[~g}u{xsnhWbZRYJ.A7}-#y 1q,F??7=0KڈHn"18 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2V(3CZvӾ']ڃϏ{r{Ey^&%09CLU\dj1p u y'|[~h}u{xsnhXbZRXJ/A7|-#w /q-E??6=0KڈGn!09 x *5>HP Y`dgtmr&wz^}~|yv|qle^WNEj<2U(4DYwҾ']ڃϏ{q|Fx_%%09CL U\dj0p u y&|[~h}t{xsnhWbZRYJ.A7}-#x 0r,E@?7=0LڈHo"18 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3EYxҾ']ڃЏ{r{Fw^&% 09CLU\dj1p u y&|[~h}u{xsnhXbZRXJ.A7|-#w /q-D?@7=0KڈGn!0: x *5>HP Y`cgtmr&wz^}~|yv{qle^WNEj<2T(4DZwӾ']كϏ{q|Gx]%%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E@?6=0KڈHn"19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃЏ{r{Fx^%% 09CL U\dj0p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q,F??7=0KڈHn"0: x *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2V(4CZvӾ']ڃϏ{r|Ey^&%09CLU\dj1p u y'|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E??6=0KڈGn!19 x *5>HP Y`dgtmr&wz^}~|yv|qle^WNEi<2U(2DYwҾ']ڃϏ{q{Fx_%% 09CL U\dj0p u y&|[~h}u{xsnhWbZRYJ.A7}-#x 0q,F@?7=0LڈHo"18 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(3CZvҾ']ڃϏzr{Ey^&%09CLU\dj1p u y&|[~h}u{xsnhXbZRXJ.A7|-#w /q-E?>7=0KڈGn!09 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(4DXwѾ']كϏ{q|Gx_%%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7}-#x 0r,E@?6=0KڈHn"19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3EYxҾ&]ڃЏ{r{Fw^&% 09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q,D??7=0KڈGn!0: x *5>HP Y`cgumr&wz^}~|y v{qle^WNEj<2V(4CZwӾ']ڃϏ{r|Ey]&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E@?6=0KڈGn!19 w *5>HP Y`dgtmr&wz^}~|yv|qle^WNEi<2U(3DYwҾ']ڃϏ{q{Fx_%% 09CL U\dj0p u y&|[~g}u{xsnhWbZRYJ.A7}-#y 1q,F??7=0KڈHo"18 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2V(3CZvӾ']ڃϏ{r{Ey^&%09CLU\dj1p u y'|[~h}u{xsnhXbZRXJ/A7|-#w /q-E?>6=0KڈGn!09 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{q|Fx_%%09CL U\dj1p u y&|[~h}t{xsnhWbZRYJ.A7}-#x 0r,E@?7=0LڈHo"19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3EYxҾ']ڃЏ{r{Fw^&% 09CLU\dj1p u y&|[~h}u{xsnhXbZRXJ.A7|-#w /q-D?@7=0KڈGn!0: x *5>HP Y`cgtmr&wz^}~|yv{qle^WNEj<2T(4DZwӾ']كϏ{r|Gx]%%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E@?6=0KڈHn"19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃЏ{r{Fx^%% 09CL U\dj0p u y&|[~h}u{xsnhXbZRXJ.A7}-#w 1q,F??7=0KڈHn"0: w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2V(4CZvӾ']ڃϏ{r|Ey^&%09CLU\dj1p u y'|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E??6=0KڈGn!19 x *5>HP Y`dgtmr&wz^}~|yv|qle^WNEi<2U(2DYwҾ']ڃϏ{q{Fx_%% 09CL U\dj0p u y&|[~h}u{xsnhWbZRYJ.A7}-#x 0p,E@?7=0LڈHo"18 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2U(3CZvҾ']ڃϏzr{Ey^&% 09CLU\dj1p u y&|[~h}u{xsnhXbZRXJ.A7|-#w /q-E?>7=0KڈGn!09 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(4DXwѾ']كϏ{q|Gx_%%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7}-#x 0r,E@?6=0KڈHn"19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3EYxҾ&]ڃЏ{r{Fw^&% 09CL U\dj1p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q,D??7=0KڈGn!0: x *5>HP Y`cgumr&wz^}~|y v{qle^WNEj<2V(4CZwӾ']ڃϏ{r|Ey]&%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E@?6=0KڈGn!19 x *5>HP Y`dgtmr&wz^}~|yv|qle^WNEi<2U(3DYwҾ']ڃϏ{q{Fx_%% 09CL U\dj0p u y&|[~g}u{xsnhWbZRYJ.A7}-#y 1q,F??7=0KڈHo"18 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2V(3CZvӾ']ڃϏzr{Ey^&%09CLU\dj1p u y'|[~h}u{xsnhXbZRXJ/A7|-#w /q-E?>6=0KڈGn!09 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2U(4DYwҾ']ڃϏ{q|Fx_%%09CL U\dj1p u y&|[~h}t{xsnhWbZRYJ.A7}-#x 0r,E@?7=0LڈHo"19 w *5>HP Y`dgumr&wz^}~|yv{qle^WNEi<2U(3EYxҾ']ڃЏ{r{Fw^&% 09CLU\dj1p u y&|[~h}u{xsnhXbZRXJ.A7}-#w /q-D??7=0KڈGn!0: x *5>HP Y`cgtmr&wz^}~|yv{qle^WNEj<2V(4DZwӾ']كϏ{r|Gx]%%09CL U\dj1p u y&|[~h}u{xsnhXbZRYJ-A7|-#x 0r-E@?6=0KڈHn"19 w *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2U(3DYwҾ']ڃЏ{r{Fx^%% 09CL U\dj0p u y&|[~h}u{xsnhXbZRXJ.A7}-#w 1q,F??7=0KڈHn"0: w *5>HP Y`dgumr&wz^}~|yv{qle^WNEj<2V(4CZvӾ']ڃϏ{r|Ew`&% 09CL U\dj1p u y'|[~h}t{xsnhXbZRYJ/A7|-#z 0p-F?@6=0LڈGn#07 x *5>HP Y`cgumr&wz^}~|yv|qle^WNEk<2U(2D[uҾ &]كϏzs{Fx]'%09CLU\dj1p u y'|[~g}u{xsnhWbZRXJ.A7{-#x .r,E??6=0KۈHo 18 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(5CZxѾ(\ڃϏzp|Gy^$% 09CLU\dj0p u y&|[~h}u{xsnhWbZRZJ-A7~-#w 1q+EA>7<0KڈHo!2: v *5>HP Y`dgtmr&wz^}~|y vzqle^WNEh<2V(4FXwӾ']ڃЏ{qzEv_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7}-#v 0p-D@@6=0LڈGn"/; w *5>HP Y`cgumr%wz^}~|yv|qle^WNEk<2U(3E[vҾ&]كϏ|r{Fw\&%09CL U\dj1p u y'|[~h}u{xsnhXbZRXJ.A7{-#y /s,F??6=0KڈHn#08 x *5>HP Y`cgtmr&wz^}~|yv{qle^WNEj<2T(2CZxѾ(]ڃϏzs|Gy]$%09CLU\dj0p u y&|[~g}u{xsnhWbZRWJ-A7~-#x 2r+E>?7<0KوHo!19 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(5BYwԾ']ڃЏ{q}Dz_%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRYJ,A7}-#w 1q.D@>7=0LڈGm"2: w *5>HP Y`egumr%wz^}~|yv|qle^WNEh<2V(3EXvӾ']ڃΏ|r{Ew`&% 09CL U\dj1p u y'|[~h}t{xsnhXbZRXJ/A7|-#y /p-F?@6=0LڈGn#07 x *5>HP Y`cgumr&wz^}~|yv{qle^WNEj<2U(2D[uҾ &]كϏzs|Fx]'%09CLU\dj1p u y&|[~g}u{xsnhWbZRWJ.A7{-#x .r,E??7=0KۈHo 19 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2S(5CYxѾ(]ڃЏ{q}Hy^$% 09CL U\dj0p u y&|[~h}u{xsnhYbZRZJ-A7}-#w 1q+D@>7=0KڈHm!2: v *5>HP Y`egtmr'wz^}~|y vzqle^WNEh<2V(4FXwӾ']ڃЏ{rzEv_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7|-#v 0p-D@@6=0LڈGn"/; w *5>HP Y`cgumr%wz^}~|yv|qle^WNEk<2U(3D[vҾ&]كϏ|r{Fx\'%09CL U\dj1p u y'|[~h}u{xsnhXbZRXJ.A7{-#y /s,F??6=0KۈHn 08 x *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(2CZxѾ(]ڃϏzp|Gy^$%09CLU\dj0p u y&|[~g}u{xsnhWbZRZJ-A7~-#x 1r+E>?7<0KوHo!19 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(4BYwӾ']ڃЏ{qzDz_%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRYJ/A7}-#v 0p.D@>7=0LڈGm"/: w *5>HP Y`egumr%wz^}~|yv|qle^WNEk<2U(3EXvҾ']ڃϏ|r{Ew`&%09CL U\dj1p u y'|[~h}t{xsnhXbZRXJ.A7|-#y /s-F?@6=0LڈGn#08 x * 5>HP Y`cgumr&wz^}~|yv{qle^WNEj<2T(2DZyѾ &]كϏzs|Gx]'%09CLU\dj2p u y&|[~g}u{xsnhWbZRWJ-A7~-#x .r,E>?7=0KۈHo!19 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2W(5CYxԾ']ڃЏ{q}Dy^$% 09CL U\dj0p u y&|[~h}u{xsnhYbZRZJ,A7}-#w 1q.D@>7=0KڈHm!2: v *5>HP Y`egumr'wz^}~|y vzqle^WNEh<2V(4EXvӾ']ڃЏ{rzEw_&% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7|-#v 0p-G@@6=0LڈGn"0; x *5>HP Y`cgumr&wz^}~|yv|qle^WNEk<2U(3D[uҾ &]كϏ|s{Fx]'%09CLU\dj1p u y'|[~g}u{xsnhWbZRXJ.A7{-#y /r,F??6=0KۈHo 18 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(1CZxѾ(\ڃϏzp|Gy^$%09CLU\dj0p u y&|[~h}u{xsnhWbZRZJ-A7~-#w 1q+EA>7<0KڈHo!29 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2V(4BYwӾ']ڃЏ{qzEz_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7}-#v 0p-D@@7=0LڈGm"/; w *5>HP Y`cgumr%wz^}~|yv|qle^WNEk<2U(3EWvҾ']كϏ|r{Fw`&%09CL U\dj1p u y'|[~h}u{xsnhXbZRXJ.A7|-#y /s,F??6=0KڈGn#08 x * 5>HP Y`cgsmr&wz^}~|yv{qle^WNEj<2T(2DZxѾ&]كϏzs|Gx]'%09CLU\dj2p u y&|[~g}u{xsnhWbZRWJ-A7~-#x .r,E>?7<0KوHo!19 y *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(5BYwԾ']ڃЏ{q}Dz^%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRZJ,A7}-#w 1q.D@>7=0KڈGm"2: w *5>HP Y`egumr'wz^}~|yv|qle^WNEh<2V(4EXvӾ']ڃΏ{rzEw`&% 09CL U\dj1p u y'|[~h}t{xsnhXbZRYJ/A7|-#y 0p-F?@6=0LڈGn#07 x *5>HP Y`cgumr&wz^}~|yv|qle^WNEk<2U(2D[uҾ &]كϏzs{Fx]'%09CLU\dj1p u y'|[~g}u{xsnhWbZRXJ.A7{-#x .r,E??6=0KۈHo 18 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2T(5CZxѾ(\ڃЏ{p|Gy^$% 09CLU\dj0p u y&|[~h}u{xsnhYbZRZJ-A7~-#w 1q+EA>7<0KڈHm!2: v *5>HP Y`dgtmr&wz^}~|y vzqle^WNEh<2V(4FXwӾ']ڃЏ{qzEv_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7|-#v 0p-D@@6=0LڈGn"/; w *5>HP Y`cgumr%wz^}~|yv|qle^WNEk<2U(3E[vҾ&]كϏ|r{Fw\&%09CL U\dj1p u y'|[~h}u{xsnhXbZRXJ.A7{-#y /s,F??6=0KڈHn#08 x *5>HP Y`cgtmr&wz^}~|yv{qle^WNEj<2T(2CZxѾ(]ڃϏzs|Gy]$%09CLU\dj0p u y&|[~g}u{xsnhWbZRWJ-A7~-#x 2r+E>?7<0KوHo!19 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(5BYwԾ']ڃЏ{q}Dz_%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRYJ,A7}-#w 0q.D@>7=0LڈGm"2: w *5>HP Y`egumr%wz^}~|yv|qle^WNEh<2V(3EXvӾ']ڃΏ|r{Ew`&%09CL U\dj1p u y'|[~h}t{xsnhXbZRXJ/A7|-#y /s-F?@6=0LڈGn#07 x * 5>HP Y`cgumr&wz^}~|yv{qle^WNEj<2T(2D[uҾ &]كϏzs|Fx]'%09CLU\dj1p u y&|[~g}u{xsnhWbZRWJ.A7{-#x .r,E>?7=0KۈHo 19 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2S(5CYxѾ(]ڃЏ{q}Hy^$% 09CL U\dj0p u y&|[~h}u{xsnhYbZRZJ-A7}-#w 1q+D@>7=0KڈHm!2: v *5>HP Y`egtmr'wz^}~|y vzqle^WNEh<2V(4EXwӾ']ڃЏ{rzEv_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7|-#v 0p-C@@6=0LڈGn"/; w *5>HP Y`cgumr&wz^}~|yv|qle^WNEk<2U(3D[vҾ&]كϏ|r{Fx\'%09CL U\dj1p u y'|[~h}u{xsnhXbZRXJ.A7{-#y /s,F??6=0KۈHn 08 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(2CZxѾ(\ڃϏzp|Gy^$%09CLU\dj0p u y&|[~h}u{xsnhWbZRZJ-A7~-#x 1r+E>?7<0KوHo!19 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(4BYwӾ']ڃЏ{qzDz_%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRYJ/A7}-#v 0p.D@>7=0LڈGm"/: w *5>HP Y`egumr%wz^}~|yv|qle^WNEk<2U(3EXvҾ']ڃϏ|r{Ew`&%09CL U\dj1p u y'|[~h}t{xsnhXbZRXJ.A7|-#y /s-F?@6=0LڈGn#08 x * 5>HP Y`cgumr&wz^}~|yv{qle^WNEj<2T(2DZyѾ &]كϏzs|Gx]'%09CLU\dj2p u y&|[~g}u{xsnhWbZRWJ-A7~-#x .r,E>?7<0KۈHo!19 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2W(5BYxԾ']ڃЏ{q}Dy^%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRZJ,A7}-#w 1q.D@>7=0KڈHm"2: v *5>HP Y`egumr'wz^}~|yvzqle^WNEh<2V(4EXvӾ']ڃЏ{rzEw_&% 09CL U\dj1p u y'|[~h}t{xsnhXbZRYJ/A7|-#z 0p-G?@6=0LڈGn"07 x *5>HP Y`cgumr&wz^}~|yv|qle^WNEk<2U(3D[uҾ &]كϏ|s{Fx]'%09CLU\dj1p u y'|[~g}u{xsnhWbZRXJ.A7{-#x /r,F??6=0KۈHo 18 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(1CZxѾ(\ڃϏzp|Gy^$%09CLU\dj0p u y&|[~h}u{xsnhWbZRZJ-A7~-#w 1q+EA>7<0KڈHo!29 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2V(4BYwӾ']ڃЏ{qzEz_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7}-#v 0p-D@@7=0LڈGm"/; w *5>HP Y`cgumr%wz^}~|yv|qle^WNEk<2U(3EWvҾ']كϏ|r{Fw`&%09CL U\dj1p u y'|[~h}u{xsnhXbZRXJ.A7|-#y /s,F??6=0KڈGn#08 x * 5>HP Y`cgsmr&wz^}~|yv{qle^WNEj<2T(2CZxѾ(]كϏzs|Gx]'%09CLU\dj0p u y&|[~g}u{xsnhWbZRWJ-A7~-#x .r+E>?7<0KوHo!19 y *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(5BYwԾ']ڃЏ{q}Dz^%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRYJ,A7}-#w 1q.D@>7=0KڈGm"2: w *5>HP Y`egumr'wz^}~|yv|qle^WNEh<2V(4EXvӾ']ڃΏ{rzEw`&% 09CL U\dj1p u y'|[~h}t{xsnhXbZRYJ/A7|-#y /p-F?@6=0LڈGn#07 x *5>HP Y`cgumr&wz^}~|yv|qle^WNEj<2U(2D[uҾ &]كϏzs{Fx]'%09CLU\dj1p u y'|[~g}u{xsnhWbZRXJ.A7{-#x .r,E??6=0KۈHo 18 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2T(5CZxѾ(]ڃЏ{p|Gy^$% 09CLU\dj0p u y&|[~h}u{xsnhYbZRZJ-A7~-#w 1q+E@>7<0KڈHm!2: v *5>HP Y`dgtmr&wz^}~|y vzqle^WNEh<2V(4FXwӾ']ڃЏ{qzEv_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7|-#v 0p-D@@6=0LڈGn"/; w *5>HP Y`cgumr%wz^}~|yv|qle^WNEk<2U(3D[vҾ&]كϏ|r{Fw\&%09CL U\dj1p u y'|[~h}u{xsnhXbZRXJ.A7{-#y /s,F??6=0KڈHn#08 x *5>HP Y`cgtmr&wz^}~|yv{qle^WNEj<2T(2CZxѾ(]ڃϏzs|Gy]$%09CLU\dj0p u y&|[~g}u{xsnhWbZRWJ-A7~-#x 2r+E>?7<0KوHo!19 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(5BYwԾ']ڃЏ{q}Dz_%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRYJ,A7}-#w 0q.D@>7=0LڈGm"2: w *5>HP Y`egumr%wz^}~|yv|qle^WNEh<2V(3EXvҾ']ڃΏ|r{Ew`&%09CL U\dj1p u y'|[~h}t{xsnhXbZRXJ/A7|-#y /s-F?@6=0LڈGn#07 x * 5>HP Y`cgumr&wz^}~|yv{qle^WNEj<2T(2DZyѾ &]كϏzs|Fx]'%09CLU\dj2p u y&|[~g}u{xsnhWbZRWJ.A7{-#x .r,E>?7=0KۈHo 19 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2S(5CYxԾ(]ڃЏ{q}Hy^$% 09CL U\dj0p u y&|[~h}u{xsnhYbZRZJ-A7}-#w 1q+D@>7=0KڈHm!2: v *5>HP Y`egtmr'wz^}~|y vzqle^WNEh<2V(4EXwӾ']ڃЏ{rzEv_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7|-#v 0p-C@@6=0LڈGn"/; w *5>HP Y`cgumr&wz^}~|yv|qle^WNEk<2U(3D[vҾ&]كϏ|s{Fx\'%09CL U\dj1p u y'|[~h}u{xsnhWbZRXJ.A7{-#y /s,F??6=0KۈHn 08 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(2CZxѾ(\ڃϏzp|Gy^$%09CLU\dj0p u y&|[~h}u{xsnhWbZRZJ-A7~-#w 1r+E>?7<0KوHo!19 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(4BYwӾ']ڃЏ{qzDz_%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRYJ/A7}-#v 0p.D@>7=0LڈGm"/: w *5>HP Y`egumr%wz^}~|yv|qle^WNEk<2U(3EXvҾ']كϏ|r{Ew`&%09CL U\dj1p u y'|[~h}t{xsnhXbZRXJ.A7|-#y /s-F?@6=0LڈGn#08 x * 5>HP Y`cgumr&wz^}~|yv{qle^WNEj<2T(2DZyѾ &]كϏzs|Gx]'%09CLU\dj2p u y&|[~g}u{xsnhWbZRWJ-A7~-#x .r,E>?7<0KۈHo!19 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2W(5BYxԾ']ڃЏ{q}Dy^%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRZJ,A7}-#w 1q.D@>7=0KڈHm"2: v *5>HP Y`egumr'wz^}~|yvzqle^WNEh<2V(4EXvӾ']ڃЏ{rzEw_&% 09CL U\dj1p u y'|[~h}t{xsnhXbZRYJ/A7|-#z 0p-F?@6=0LڈGn"07 x *5>HP Y`cgumr&wz^}~|yv|qle^WNEk<2U(3D[uҾ &]كϏ|s{Fx]'%09CLU\dj1p u y'|[~g}u{xsnhWbZRXJ.A7{-#x .r,F??6=0KۈHo 18 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEj<2T(5CZxѾ(\ڃϏzp|Gy^$%09CLU\dj0p u y&|[~h}u{xsnhWbZRZJ-A7~-#w 1q+EA>7<0KڈHo!29 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2V(4BXwӾ']ڃЏ{qzEz_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7}-#v 0p-D@@7=0LڈGm"/; w *[52> HP Y`dcg;umr%wz^}mC~|yuvL|q#le^W~ߺNUE,k<܎2U(^35E Wӈܐхgv=ҾΨʩoF'ċx™O&]ӽكXϏ.|ܶr`{7Fڼ䒭i@w`&ħ%0r9ICL U͠\d{jQ1p( u y֙'|[~Z1h}ߒu{xscn:hXbZRXJl.AC7|-#ǃy uK /2\sͅî,ׇF*?S?|Ύ!6J=s0ƕKAڈjGn8#b淋0ݤ08Y իx '*P 5y>H̲P Y`Gcgqsmrù&w캴z^}?h~| y6v_{qle^W-˺NVEj<ΐ2T($N2wCZֆلExnѾܧਝ<e(匄 3蘀\]륁ك+TϏ}z"sK|tƝGBkx]'%09CLU\dj0p u y&|[~g}u{xsnhWbZRWJ-A7~-#x .r+E>?7<0KوHo!19 y *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(5BYwԾ']ڃЏ{q}Dz^%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRYJ,A7}-#w 1q.D@>7=0KڈGm"2: w *5>HP Y`egumr%wz^}~|yv|qle^WNEh<2V(4EXvӾ']ڃΏ{r{Ew`&% 09CL U\dj1p u y'|[~h}t{xsnhXbZRYJ/A7|-#y /p-F?@6=0LڈGn#07 x *5>HP Y`cgumr&wz^}~|yv|qle^WNEj<2U(2D[uҾ &]كϏzs|Fx]'%09CLU\dj1p u y'|[~g}u{xsnhWbZRXJ.A7{-#x .r,E??6=0KۈHo 18 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2S(5CYxѾ(]ڃЏ{q}Gy^$% 09CLU\dj0p u y&|[~h}u{xsnhYbZRZJ-A7~-#w 1q+E@>7<0KڈHm!2: v *5>HP Y`dgtmr&wz^}~|y vzqle^WNEh<2V(4FXwӾ']ڃЏ{qzEv_%% 09CL U\dj1p u y&|[~h}t{xsnhXbZRYJ/A7|-#v 0p-D@@6=0LڈGn"/; w *5>HP Y`cgumr%wz^}~|yv|qle^WNEk<2U(3D[vҾ&]كϏ|r{Fw\&%09CL U\dj1p u y'|[~h}u{xsnhXbZRXJ.A7{-#y /s,F??6=0KڈHn 08 x *5>HP Y`cgtmr&wz^}~|yv{qle^WNEj<2T(2CZxѾ(]ڃϏzp|Gy]$%09CLU\dj0p u y&|[~g}u{xsnhWbZRWJ-A7~-#x 2r+E>?7<0KوHo!19 v *5>HP Y`dgtmr&wz^}~|y v{qle^WNEi<2W(5BYwӾ']ڃЏ{q}Dz_%% 09CL U\dj0p u y&|[~h}u{xsnhYbZRYJ,A7}-#v 0q.D@>7=0LڈGm"2: w *5>HP Y`egumr%wz^}~|yv|qle^WNEh<2V(3EXvҾ']ڃΏ|r{Ew`&%09CL U\dj1p u y'|[~h}t{xsnhXbZRXJ/A7|-#y /s-F?@6=0LڈGn#07 x * 5>HP Y`cgumr&wz^}~|yv{qle^WNEj<2T(2DZyѾ &]كϏzs|Fx]'%09CLU\dj2p u y&|[~g}u{xsnhWbZRWJ.A7{-#x .r,E>?7=0KۈHo!19 y *5>HP Y`dgtmr&wz^}~|yv{qle^WNEi<2S(5CYxԾ(]ڃЏ{q}Hy^$% 09CL U\dj0p u y&|[~h}u{xsnhYbZRZJ-A7}-#w 1q.D@>7=0KڈHm!2: z *5>HPY`egtmr%wz_}~|yvzqle^WNEh<2V(0AXzϾ)]ڃΏyrzIv[)% 09CLU\dj1p u y%|\~h}u{ xsnhXbZRVJ,A7|-#z 0t*C@@6=0LڈGp"/; { *5>HP Y`egumr&wz]}~|y!vzqle^WNEg<2U(7@Wyվ(\ڃϏzs{Bx\#% 09CLU\dj1p u y&|Z~h}u{ xsnhWbZR[J+A7{-#y /s0C??6=0LۈHl#0< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEf<2T(6GVxԾ(\ۃϏzs|Cy^$% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w .q/H>?6<0LۈHm$25 v *5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2S(4F]wӾ ']كЏ{t}Dz_%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRYJ/A7y-#v ,p.G=>6<0JۈIm36 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2R(3E[vҾ ']كЏ|o~F{`&%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o-FB=7<0KوIn 48 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2DZuѾ &]كя|pxGta'%09CL U\dj0p u y'|[~h}t{xsnhZb[RWJ-A7~-#t 2n,EAA7=0KوFo!.9 y *5>HP Y`dgtmr%wz^}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qyHuZ(% 09CL U\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#{ 1u+D@A7=0KڈGp"/: z *5>HPY`egumr%wz_}~|yvzqle^WNEh<2V(0AXzϾ)]ڃΏyrzIw["% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#z 0s*C?@6=0LڈGp"0; t *5>HP Y`egumr&wz]}~|y!vzqle^WNEg<2U(7@Wyվ(\ڃϏzs{Bx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J*A7{-#x .r/B??6=0LۈHl#1< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEf<2T(5GVxԾ(\ۃϏzt|Cy^$%09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w -q.H>>6<0LۈHm$25 v * 5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2S(4F\wӾ ']كЏ{u}Ez_%%09CL U\dj2p u y&|[~g}t{xsnhVbZRYJ/A7y-#v ,p-G=>7<0JۈIm37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Q(3E[vҾ &]كя|o~F{`&%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FB=7=0KوIn 48 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2CZuѾ&]كя|pyGta'%09CL U\dj0p u y'|[~h}t{xsnhYb[RWJ-A7~-#t 2n+EAA7=0KوFo!.9 y *5>HP Y`dgtmr%wz^}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qzHvZ)% 09CL U\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#{ 1t*D@@7=0KڈGp"/: { *5>HPY`egumr%wz_}~|yvzqle^WNEh<2V(0AXzϾ)\ڃΏyr{Iw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#y /s)C?@6=0LڈGq#0; t *5>HP Y`egumr&wz]}~|y!vzqle^WNEg<2U(6@Wyվ(\ڃϏzs|Cx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J1A7{-#x .r/B??6=0LۈHl#1< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEm<2S(5GUxԾ(]كЏ{t}Dy^$%09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w -q.H>>6<0JۈHm$26 v * 5>HP Y`bgvmr'wz^}~|y v|qle^WNEl<2R(4F\wӾ ']كЏ{u~Ez_%%09CL U\dj3p u y&|[~g}t{xsnhVbZRYJ/A7-#v ,p-G=>7<0KوIn37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Y(3D[vҾ &]كя|oF{`'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FB=7=0KوIn 48 x *5>HP Y`dgtmr'wz^}~|yv{qle^ WNEj<2X(2CZuѾ&]ڃя|pyGua(%09CL U\dj0p u y'|[~h}t{xsnhYb[RWJ-A7~-#| 2n+EAA7=0KوFo!.9 z *5>HPY`dgtmr%wz_}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qzHv[)% 09CLU\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#z 0t*D@@7=0LڈGp"/: { *5>HP Y`egumr%wz_}~|yvzqle^WNEh<2V(7AXzϾ)\ڃΏyr{Iw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#y /s)C?@6=0LڈGq#0; t *5>HP Y`fgumr&wz]}~|y vzqle^WNEg<2T(6HVyվ(\ڃϏzs|Cx]#% 09CLU\dj2p u y&|[~g}u{ xsnhWbZR[J1A7{-#x .r/B>?6=0LۈHl$1= u *5>HP Y`bgvmr&wz^}~|y v}qle^WNEm<2S(5GUxԾ']كЏ{t}Dy^$%0:CL U\dj2p u y&|[~g}u{xsnhVbZRZJ0A7z-#w -q.H>>6<0JۈHm%26 v * 5>HP Y`bgrmr'wz^}~|y v|qle^WNEl<2R(4E\wӾ ']كЏ{u~Ez_&%09CL U\dj/p u y&|[~g}t{xsnhVbZRYJ/A7-#v ,p-G=>7<0KوIn37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Y(3D[vҾ &]كя|oF|`'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FA=7=0KوFn 48 y *5>HP Y`dgtmr$wz^}~|yv{qle^ WNEj<2X(2CZtѾ&]ڃ͏}pyGub(%09CL U\dj0p uy'|[~h}t{xsnhYb[RWJ-A7~-#{ 1n+EAA7=0KڈFo!.9 z *5>HPY`dgtmr%wz_}~|yv{qle^WNEi<2V(0BYsо%]ڃΏyqzHv[)% 09CLU\dj0p u y%|[~h}v{xsnhYbZRVJ,A7}-#z 0t*D@@7=0LڈGp"/: { *5>HP Y`egumr%wz]}~|yvzqle^WNEh<2U(7AWzϾ)\ڃϏyr{Iw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR[J+A7|-#y /s)C?@߉6=0LڈGl#0< t *5>HP Y`fgumr&wz]}~|y vzqle^WNEg<2T(6HVyվ(\ڃϏzs|Cx]#% 09CLU\dj2p u y&|[~g}u{xsnhWbZR[J1A7{-#x .r/B>?6<0LۈHl$1= u *5>HP Y`bgvmr&wz^}~|y v}qle^WNEm<2S(5F]wԾ']كЏ{t}Dy^%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRZJ0A7y-#w -q.G>>6<0JۈHm26 w * 5>HP Y`bgsmr'wz^}~|yv|qle^WNEl<2R(4E\vӾ ']كЏ{o~E{_&%09CL U\dj/p u y'|[~g}t{xsnhVbZRYJ/A7-#v 3p-F==7<0KوIn37 x * 5>HP Y`cgsmr'wz^}~|yv|qle^ WNEk<2Y(3D[uҾ &]كя|oxF|a'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#t 2o,FA=7=0KوFo -8 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEj<2W(1CZtѾ&]ڃΏ}pyGub(%09CL U\dj0p uy'|[~h}t{xsnhYb[RWJ-A7~-#{ 1u+EAA7=0KڈFo!.9 z *5>HPY`dgtmr%wz_}~|yv{qle^WNEi<2V(0BXzо%]ڃΏyqzHv[)% 09CLU\dj1p u y%|[~h}v{xsnhXbZRVJ,A7}-#z 0t*D@@6=0LڈGp"/; { *5>HP Y`egumr%wz]}~|yvzqle^WNEg<2U(7AWy־(\ڃϏzr{Jw\"% 09CLU\dj1p u y&|Z~h}u{ xsnhXbZR[J+A7{-#y /s0C??߉6=0LڈGl#0< t *5>HP Y`fgvmr&wz]}~|y vyqle^WNEf<2T(6GVxվ(\ڃϏzs|Cx]$% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ1A7z-#x .r/H>?6<0LۈHl$1= v *5>HP Y`bgvmr&wz^}~|y v}qle^WNEl<2S(5F]wԾ ']كЏ{t}Dz^%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRYJ0A7y-#w -q.G=>6<0JۈIm26 w * 5>HP Y`bgsmr'wz^}~|yv|qle^WNEk<2R(3E\vӾ ']كЏ{o~E{`&%09CL U\dj/p u y'|[~h}t{xsnhUbZRXJ/A7-#u 3p-F==7<0KوIn 37 x * 5>HP Y`cgsmr'wz^}~|yv|qle^ WNEj<2X(2D[uҾ &]كя|pxF|a'%09CL U\dj0p u y'|[~h}t{xsnhZbZRXJ.A7-#t 2o,EA=7=0KوFo -8 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEi<2W(1CYtѾ&]ڃΏ}qyGub(% 09CL U\dj0p uy'|[~h}v{xsnhYbZRWJ-A7}-#{ 1u+D@A7=0KڈGo!.: z *5>HPY`egtmr%wz_}~|yvzqle^WNEh<2V(0BXzо%]ڃΏyqzIv[)% 09CLU\dj1p u y%|[~h}u{ xsnhXbZRVJ,A7|-#z 0t*D@@6=0LڈGp"/; { *5>HP Y`egumr%wz]}~|y!vzqle^WNEg<2U(7@Wyվ(\ڃϏzr{Bw\#% 09CLU\dj1p u y&|Z~h}u{ xsnhXbZR[J+A7{-#y /s0C??߉6=0LڈHl#0< u *5>HP Y`fgvmr&wz]}~|y v}qle^WNEf<2T(6GVxԾ(\ۃϏzs|Cy^$% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#x .r/H>?6<0LۈHm$15 v *5>HP Y`bgvmr&wz^}~|y v}qle^WNEl<2S(4F]wӾ ']كЏ{t}Dz_%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRYJ/A7y-#v ,q.G=>6<0JۈIm26 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2R(3E\vҾ ']كЏ|o~E{`&%09CL U\dj/p u y'|[~h}t{xsnhUbZRXJ.A7-#u 3o-FB=7<0KوIn 37 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2DZuѾ &]كя|pxGta'%09CL U\dj0p u y'|[~h}t{xsnhZbZRWJ-A7~-#t 2n,EAA7=0KوFo!-9 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEi<2W(1CYtо%]ڃΏ}qyHuZ(% 09CL U\dj0p uy'|[~h}v{xsnhYbZRVJ,A7}-#{ 1u+D@A7=0KڈGp!.: z *5>HPY`egumr%wz_}~|yvzqle^WNEh<2V(0AXzϾ)]ڃΏyrzIw[)% 09CLU\dj1p u y&|\~h}u{ xsnhXbZRUJ+A7|-#z 0t*C@@6=0LڈGp"0; { *5>HP Y`egumr&wz]}~|y!vzqle^WNEg<2U(7@Wyվ(\ڃϏzs{Bx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J*A7{-#y /s/B??6=0LۈHl#1< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEf<2T(5GVxԾ(\ۃϏzs|Cy^$% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w -q.H>?6<0LۈHm$25 v *5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2S(4F]wӾ ']كЏ{t}Dz_%%0:CL U\dj2p u y&|[~g}t{xsnhVbZRYJ/A7y-#v ,p.G=>7<0JۈIm37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2R(3E[vҾ ']كя|o~F{`&%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o-FB=7=0KوIn 48 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2DZuѾ&]كя|pxGta'%09CL U\dj0p u y'|[~h}t{xsnhZb[RWJ-A7~-#t 2n,EAA7=0KوFo!.9 y *5>HP Y`dgtmr%wz^}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qyHvZ)% 09CL U\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#{ 1t+D@A7=0KڈGp"/: z *5>HPY`egumr%wz_}~|yvzqle^WNEh<2V(0AXzϾ)]ڃΏyrzIw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#z 0s*C?@6=0LڈGp"0; t *5>HP Y`egumr&wz]}~|y!vzqle^WNEg<2U(6@Wyվ(\ڃϏzs{Bx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J1A7{-#x .r/B??6=0LۈHl#1< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEm<2T(5GVxԾ(\ۃϏzt|Dy^$%09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w -q.H>>6<0LۈHm$26 v * 5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2R(4F\wӾ ']كЏ{u}Ez_%%09CL U\dj3p u y&|[~g}t{xsnhVbZRYJ/A7y-#v ,p-G=>7<0JۈIn37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Q(3E[vҾ &]كя|o~F{`&%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FB=7=0KوIn 48 x *5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2CZuѾ&]ڃя|pyGua(%09CL U\dj0p u y'|[~h}t{xsnhYb[RWJ-A7~-#t 2n+EAA7=0KوFo!.9 y *5>HP Y`dgtmr%wz^}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qzHv[)% 09CLU\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#{ 1t*D@@7=0KڈGp"/: { *5>HP Y`egumr%wz_}~|yvzqle^WNEh<2V(/AXzϾ)\ڃΏyr{Iw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#y /s)C?@6=0LڈGq#0; t *5>HP Y`fgumr&wz]}~|y vzqle^WNEg<2U(6@Wyվ(\ڃϏzs|Cx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J1A7{-#x .r/B??6=0LۈHl$1< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEm<2S(5GUxԾ(]كЏ{t}Dy^$%09CLU\dj2p u y&|[~g}u{xsnhVbZRZJ0A7z-#w -q.H>>6<0JۈHm$26 v * 5>HP Y`bgwmr'wz^}~|y v|qle^WNEl<2R(4F\wӾ ']كЏ{u~Ez_%%09CL U\dj3p u y&|[~g}t{xsnhVbZRYJ/A7-#v ,p-G=>7<0KوIn37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Y(3D[vҾ &]كя|oF|`'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FB=7=0KوFn 48 x *5>HP Y`dgtmr'wz^}~|yv{qle^ WNEj<2X(2CZuѾ&]ڃ͏}pyGua(%09CL U\dj0p u y'|[~h}t{xsnhYb[RWJ-A7~-#{ 1n+EAA7=0KوFo!.9 z *5>HPY`dgtmr%wz_}~|yv{qle^WNEi<2W(0BYtо%]ڃΏyqzHv[)% 09CLU\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#z 0t*D@@7=0LڈGp"/: { *5>HP Y`egumr%wz_}~|yvzqle^WNEh<2U(7AXzϾ)\ڃϏyr{Iw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#y /s)C?@6=0LڈGq#0; t *5>HP Y`fgumr&wz]}~|y vzqle^WNEg<2T(6HVyվ(\ڃϏzs|Cx]#% 09CLU\dj2p u y&|[~g}u{ xsnhWbZR[J1A7{-#x .r/B>?6=0LۈHl$1= u *5>HP Y`bgvmr&wz^}~|y v}qle^WNEm<2S(5G]xԾ']كЏ{t}Dy^$%0:CL U\dj2p u y&|[~g}u{xsnhVbZRZJ0A7z-#w -q.G>>6<0JۈHm%26 v * 5>HP Y`bgrmr'wz^}~|y v|qle^WNEl<2R(4E\wӾ ']كЏ{u~E{_&%09CL U\dj/p u y&|[~g}t{xsnhVbZRYJ/A7-#v 4p-G==7<0KوIn37 x * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Y(3D[uҾ &]كя|oF|a'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 2o,FA=7=0KوFo 48 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEj<2X(1CZtѾ&]ڃ͏}pyGub(%09CL U\dj0p uy'|[~h}t{xsnhYb[RWJ-A7~-#{ 1n+EAA7=0KڈFo!.9 z *5>HPY`dgtmr%wz_}~|yv{qle^WNEi<2V(0BYsо%]ڃΏyqzHv[)% 09CLU\dj1p u y%|[~h}v{xsnhXbZRVJ,A7}-#z 0t*D@@7=0LڈGp"/: { *5>HP Y`egumr%wz]}~|yvzqle^WNEh<2U(7AWzϾ)\ڃϏyr{Iw\"% 09CLU\dj1p u y&|Z~h}u{ xsnhXbZR[J+A7|-#y /s)C??߉6=0LڈGl#0< t *5>HP Y`fgumr&wz]}~|y vyqle^WNEg<2T(6HVxվ(\ڃϏzs|Cx]#% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ1A7z-#x .r/B>?6<0LۈHl$1= u *5>HP Y`bgvmr&wz^}~|y v}qle^WNEm<2S(5F]wԾ']كЏ{t}Dz^%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRZJ0A7y-#w -q.G=>6<0JۈHm26 w * 5>HP Y`bgsmr'wz^}~|yv|qle^WNEl<2R(4E\vӾ ']كЏ{o~E{`&%09CL U\dj/p u y'|[~g}t{xsnhVbZRYJ/A7-#v 3p-F==7<0KوIn37 x * 5>HP Y`cgsmr'wz^}~|yv|qle^ WNEk<2X(2D[uҾ &]كя|pxF|a'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#t 2o,EA=7=0KوFo -8 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEj<2W(1CZtѾ&]ڃΏ}pyGub(% 09CL U\dj0p uy'|[~h}t{xsnhYbZRWJ-A7~-#{ 1u+EAA7=0KڈFo!.: z *5>HPY`dgtmr%wz_}~|yvzqle^WNEh<2V(0BXzо%]ڃΏyqzHv[)% 09CLU\dj1p u y%|[~h}u{xsnhXbZRVJ,A7}-#z 0t*D@@6=0LڈGp"/; { *5>HP Y`egumr%wz]}~|yvzqle^WNEg<2U(7AWy־(\ڃϏzr{Bw\#% 09CLU\dj1p u y&|Z~h}u{ xsnhXbZR[J+A7{-#y /s0C??߉6=0LڈHl#0< t *5>HP Y`fgvmr&wz]}~|y vyqle^WNEf<2T(6GVxվ(\ڃϏzs|Cy]$% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ1A7z-#x .r/H>?6<0LۈHl$1= v *5>HP Y`bgvmr&wz^}~|y v}qle^WNEl<2S(5F]wԾ ']كЏ{t}Dz_%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRYJ0A7y-#w -q.G=>6<0JۈIm26 w * 5>HP Y`bgsmr'wz^}~|yv|qle^WNEk<2R(3E\vӾ ']كЏ|o~E{`&%09CL U\dj/p u y'|[~h}t{xsnhUbZRXJ/A7-#u 3p-FB=7<0KوIn 37 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2D[uҾ &]كя|pxF|a'%09CL U\dj0p u y'|[~h}t{xsnhZbZRWJ.A7-#t 2n,EAA7=0KوFo -9 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEi<2W(1CYtѾ&]ڃΏ}qyHub(% 09CL U\dj0p uy'|[~h}v{xsnhYbZRWJ-A7}-#{ 1u+D@A7=0KڈGp!.: z *5>HPY`egtmr%wz_}~|yvzqle^WNEh<2V(0BXzо%]ڃΏyrzIv[)% 09CLU\dj1p u y%|[~h}u{ xsnhXbZRVJ,A7|-#z 0t*D@@6=0LڈGp"/; { *5>HP Y`egumr%wz]}~|y!vzqle^WNEg<2U(7@Wyվ(\ڃϏzr{Bx\#% 09CLU\dj1p u y&|Z~h}u{ xsnhXbZR[J+A7{-#y /s0C??߉6=0LۈHl#0< u *5>HP Y`fgvmr&wz]}~|y v}qle^WNEf<2T(6GVxԾ(\ۃϏzs|Cy^$% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#x .r/H>?6<0LۈHm$15 v *5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2S(4F]wӾ ']كЏ{t}Dz_%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRYJ/A7y-#v ,p.G=>6<0JۈIm26 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2R(3E\vҾ ']كЏ|o~E{`&%09CL U\dj/p u y'|[~h}t{xsnhUbZRXJ.A7-#u 3o-FB=7<0KوIn 38 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2DZuѾ &]كя|pxGta'%09CL U\dj0p u y'|[~h}t{xsnhZbZRWJ-A7~-#t 2n,EAA7=0KوFo!.9 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEi<2W(1CYtо%]ڃΏ}qyHuZ(% 09CL U\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#{ 1u+D@A7=0KڈGp!/: z *5>HPY`egumr%wz_}~|yvzqle^WNEh<2V(0AXzϾ)]ڃΏyrzIw["% 09CLU\dj1p u y&|\~h}u{ xsnhXbZRUJ+A7|-#z 0t*C@@6=0LڈGp"0; t *5>HP Y`egumr&wz]}~|y!vzqle^WNEg<2U(7@Wyվ(\ڃϏzs{Bx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J*A7{-#y /r/B??6=0LۈHl#1< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEf<2T(5GVxԾ(\ۃϏzt|Cy^$%09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w -q.H>>6<0LۈHm$25 v *5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2S(4F]wӾ ']كЏ{t}Ez_%%0:CL U\dj2p u y&|[~g}t{xsnhVbZRYJ/A7y-#v ,p-G=>7<0JۈIm37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Q(3E[vҾ ']كя|o~F{`&%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FB=7=0KوIn 48 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2DZuѾ&]كя|pxGta'%09CL U\dj0p u y'|[~h}t{xsnhZb[RWJ-A7~-#t 2n,EAA7=0KوFo!.9 y *5>HP Y`dgtmr%wz^}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qyHvZ)% 09CL U\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#{ 1t+D@@7=0KڈGp"/: z *5>HPY`egumr%wz_}~|yvzqle^WNEh<2V(0AXzϾ)\ڃΏyrzIw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#y 0s*C?@6=0LڈGq#0; t *5>HP Y`egumr&wz]}~|y!vzqle^WNEg<2U(6@Wyվ(\ڃϏzs{Bx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J1A7{-#x .r/B??6=0LۈHl#1< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEm<2T(5GVxԾ(\ۃЏ{t|Dy^$%09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w -q.H>>6<0LۈHm$26 v * 5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2R(4F\wӾ ']كЏ{u}Ez_%%09CL U\dj3p u y&|[~g}t{xsnhVbZRYJ/A7-#v ,p-G=>7<0KۈIn37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Y(3E[vҾ &]كя|o~F{`&%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FB=7=0KوIn 48 x *5>HP Y`cgtmr'wz^}~|yv{qle^ WNEj<2X(2CZuѾ&]ڃя|pyGua(%09CL U\dj0p u y'|[~h}t{xsnhYb[RWJ-A7~-#| 2n+EAA7=0KوFo!.9 y *5>HPY`dgtmr%wz_}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qzHv[)% 09CLU\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#z 0t*D@@7=0LڈGp"/: { *5>HP Y`egumr%wz_}~|yvzqle^WNEh<2V(/AXzϾ)\ڃΏyr{Iw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#y /s)C?@6=0LڈGq#0; t *5>HP Y`fgumr&wz]}~|y vzqle^WNEg<2T(6@Wyվ(\ڃϏzs|Cx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J1A7{-#x .r/B>?6=0LۈHl$1< u *5>HP Y`bgvmr&wz^}~|y v}qle^WNEm<2S(5GUxԾ(]كЏ{t}Dy^$%0:CL U\dj2p u y&|[~g}u{xsnhVbZRZJ0A7z-#w -q.H>>6<0JۈHm$26 v * 5>HP Y`bgrmr'wz^}~|y v|qle^WNEl<2R(4E\wӾ ']كЏ{u~Ez_%%09CL U\dj/p u y&|[~g}t{xsnhVbZRYJ/A7-#v ,p-G=>7<0KوIn37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Y(3D[vҾ &]كя|oF|`'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FB=7=0KوFn 48 y *5>HP Y`dgtmr'wz^}~|yv{qle^ WNEj<2X(2CZuѾ&]ڃ͏}pyGub(%09CL U\dj0p u y'|[~h}t{xsnhYb[RWJ-A7~-#{ 1n+EAA7=0KوFo!.9 z *5>HPY`dgtmr%wz_}~|yv{qle^WNEi<2W(0BYsо%]ڃΏyqzHv[)% 09CLU\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#z 0t*D@@7=0LڈGp"/: { *5>HP Y`egumr%wz_}~|yvzqle^WNEh<2U(7AXzϾ)\ڃϏyr{Iw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#y /s)C?@6=0LڈGk#0< t *5>HP Y`fgumr&wz]}~|y vzqle^WNEg<2T(6HVyվ(\ڃϏzs|Cx]#% 09CLU\dj2p u y&|[~g}u{ xsnhWbZR[J1A7{-#x .r/B>?6<0LۈHl$1= u *5>HP Y`bgvmr&wz^}~|y v}qle^WNEm<2S(5F]xԾ']كЏ{t}Dy^%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRZJ0A7z-#w -q.G>>6<0JۈHm%26 v * 5>HP Y`bgrmr'wz^}~|yv|qle^WNEl<2R(4E\vӾ ']كЏ{u~E{_&%09CL U\dj/p u y'|[~g}t{xsnhVbZRYJ/A7-#v 4p-G==7<0KوIn37 x * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Y(3D[uҾ &]كя|oF|a'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 2o,FA=7=0KوFo 48 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEj<2W(1CZtѾ&]ڃΏ}pyGub(%09CL U\dj0p uy'|[~h}t{xsnhYb[RWJ-A7~-#{ 1u+EAA7=0KڈFo!.9 z *5>HPY`dgtmr%wz_}~|yv{qle^WNEi<2V(0BY{о%]ڃΏyqzHv[)% 09CLU\dj1p u y%|[~h}v{xsnhXbZRVJ,A7}-#z 0t*D@@7=0LڈGp"/; { *5>HP Y`egumr%wz]}~|yvzqle^WNEh<2U(7AWyϾ)\ڃϏyr{Iw\"% 09CLU\dj1p u y&|Z~h}u{ xsnhXbZR[J+A7|-#y /s)C??߉6=0LڈGl#0< t *5>HP Y`fgvmr&wz]}~|y vyqle^WNEg<2T(6GVxվ(\ڃϏzs|Cx]$% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ1A7z-#x .r/B>?6<0LۈHl$1= u *5>HP Y`bgvmr&wz^}~|y v}qle^WNEm<2S(5F]wԾ']كЏ{t}Dz^%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRYJ0A7y-#w -q.G=>6<0JۈHm26 w * 5>HP Y`bgsmr'wz^}~|yv|qle^WNEl<2R(4E\vӾ ']كЏ{o~E{`&%09CL U\dj/p u y'|[~h}t{xsnhUbZRYJ/A7-#v 3p-F==7<0KوIn37 x * 5>HP Y`cgsmr'wz^}~|yv|qle^ WNEj<2X(2D[uҾ &]كя|pxF|a'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#t 2o,EA=7=0KوFo -8 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEi<2W(1CZtѾ&]ڃΏ}pyGub(% 09CL U\dj0p uy'|[~h}t{xsnhYbZRWJ-A7~-#{ 1u+E@A7=0KڈFo!.: z *5>HPY`dgtmr%wz_}~|yvzqle^WNEh<2V(0BXzо%]ڃΏyqzIv[)% 09CLU\dj1p u y%|[~h}u{xsnhXbZRVJ,A7|-#z 0t*D@@6=0LڈGp"/; { *5>HP Y`egumr%wz]}~|yvzqle^WNEg<2U(7@Wy־(\ڃϏzr{Bw\#% 09CLU\dj1p u y&|Z~h}u{ xsnhXbZR[J+A7{-#y /s0C??߉6=0LڈHl#0< u *5>HP Y`fgvmr&wz]}~|y vyqle^WNEf<2T(6GVxվ(\ڃϏzs|Cy]$% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ1A7z-#x .r/H>?6<0LۈHl$15 v *5>HP Y`bgvmr&wz^}~|y v}qle^WNEl<2S(5F]wԾ ']كЏ{t}Dz_%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRYJ0A7y-#w -q.G=>6<0JۈIm26 w * 5>HP Y`bgsmr'wz^}~|yv|qle^WNEk<2R(3E\vҾ ']كЏ|o~E{`&%09CL U\dj/p u y'|[~h}t{xsnhUbZRXJ/A7-#u 3p-FB=7<0KوIn 37 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2DZuѾ &]كя|pxF|a'%09CL U\dj0p u y'|[~h}t{xsnhZbZRWJ.A7~-#t 2n,EAA7=0KوFo -9 y *5>HP Y`dgtmr%wz^}~|yv{qle^ WNEi<2W(1CYtо&]ڃΏ}qyHub(% 09CL U\dj0p uy'|[~h}v{xsnhYbZRVJ-A7}-#{ 1u+D@A7=0KڈGp!.: )Rz |*5>H PJ Ys ` eg tm r%wAzj_}~8|ayvzqle/^YW N!E"h<#2'%V(P&y'(0)A*X,G-p.ҙ/z0Ͼ13>4g567)8 :6;_<=>?]A-BڃVCDEΏFyG$IMJvKrLzMNPIDQnRSTvU[W)]NH4MP L YJ`IegHumfGr=F&wEzC]}BAo@F?~>|HP Y`fgvmr&wz^}~|y v}qle^WNEf<2T(6GVxԾ(\ۃϏzs|Cy^$% 09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w .r/H>?6<0LۈHm$15 v *5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2S(4F]wӾ ']كЏ{t}Dz_%%0:CL U\dj2p u y&|[~g}u{xsnhVbZRYJ/A7y-#v ,p.G=>6<0JۈIm36 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2R(3E[vҾ ']كЏ|o~E{`&%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o-FB=7<0KوIn 48 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2DZuѾ &]كя|pxGta'%09CL U\dj0p u y'|[~h}t{xsnhZb[RWJ-A7~-#t 2n,EAA7=0KوFo!.9 y *5>HP Y`dgtmr%wz^}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qyHuZ(% 09CL U\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#{ 1u+D@A7=0KڈGp"/: z *5>HPY`egumr%wz_}~|yvzqle^WNEh<2V(0AXzϾ)]ڃΏyrzIw["% 09CLU\dj1p u y&|\~h}u{ xsnhXbZRUJ+A7|-#z 0s*C?@6=0LڈGp"0; t *5>HP Y`egumr&wz]}~|y!vzqle^WNEg<2U(7@Wyվ(\ڃϏzs{Bx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J*A7{-#x .r/B??6=0LۈHl#1< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEf<2T(5GVxԾ(\ۃϏzt|Cy^$%09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w -q.H>>6<0LۈHm$25 v * 5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2S(4F\wӾ ']كЏ{u}Ez_%%09CL U\dj2p u y&|[~g}t{xsnhVbZRYJ/A7y-#v ,p-G=>7<0JۈIm37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Q(3E[vҾ ']كя|o~F{`&%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FB=7=0KوIn 48 x * 5>HP Y`cgsmr'wz^}~|yv{qle^ WNEj<2X(2CZuѾ&]كя|pyGta'%09CL U\dj0p u y'|[~h}t{xsnhZb[RWJ-A7~-#t 2n+EAA7=0KوFo!.9 y *5>HP Y`dgtmr%wz^}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qzHvZ)% 09CL U\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#{ 1t*D@@7=0KڈGp"/: z *5>HPY`egumr%wz_}~|yvzqle^WNEh<2V(0AXzϾ)\ڃΏyr{Iw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#y /s*C?@6=0LڈGq#0; t *5>HP Y`egumr&wz]}~|y!vzqle^WNEg<2U(6@Wyվ(\ڃϏzs|Bx]#% 09CLU\dj1p u y&|Z~g}u{ xsnhWbZR[J1A7{-#x .r/B??6=0LۈHl#1< u *5>HP Y`fgvmr&wz^}~|y v}qle^WNEm<2S(5GVxԾ(]كЏ{t}Dy^$%09CLU\dj2p u y&|[~g}u{xsnhWbZRZJ0A7z-#w -q.H>>6<0JۈHm$26 v * 5>HP Y`bgvmr&wz^}~|y v|qle^WNEl<2R(4F\wӾ ']كЏ{u}Ez_%%09CL U\dj3p u y&|[~g}t{xsnhVbZRYJ/A7-#v ,p-G=>7<0K܈In37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Y(3D[vҾ &]كя|o~F{`&%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FB=7=0KوIn 48 x *5>HP Y`cgtmr'wz^}~|yv{qle^ WNEj<2X(2CZuѾ&]ڃя|pyGua(%09CL U\dj0p u y'|[~h}t{xsnhYb[RWJ-A7~-#| 2n+EAA7=0KوFo!.9 z *5>HPY`dgtmr%wz_}~|yv{qle^WNEi<2W(1BYtо%]ڃΏ}qzHv[)% 09CLU\dj0p u y'|[~h}v{xsnhYbZRVJ,A7}-#z 0t*D@@7=0LڈGp"/: { *5>HP Y`egumr%wz_}~|yvzqle^WNEh<2V(7AXzϾ)\ڃΏyr{Iw\"% 09CLU\dj1p u y&|\~h}u{ xsnhXbZR\J+A7|-#y /s)C?@6=0LڈGq#0; t *5>HP Y`fgumr&wz]}~|y vzqle^WNEg<2T(6@Vyվ(\ڃϏzs|Cx]#% 09CLU\dj2p u y&|[~g}u{ xsnhWbZR[J1A7{-#x .r/B>?6=0LۈHl$1= u *5>HP Y`bgvmr&wz^}~|y v}qle^WNEm<2S(5GUxԾ']كЏ{t}Dy^$%0:CL U\dj2p u y&|[~g}u{xsnhVbZRZJ0A7z-#w -q.H>>6<0JۈHm%26 v * 5>HP Y`bgrmr'wz^}~|y v|qle^WNEl<2R(4E\wӾ ']كЏ{u~Ez_&%09CL U\dj/p u y&|[~g}t{xsnhVbZRYJ/A7-#v ,p-G=>7<0KوIn37 w * 5>HP Y`cgsmr'wz^}~|yv|qle^WNEk<2Y(3D[vҾ &]كя|oF|`'%09CL U\dj/p u y'|[~h}t{xsnhZbZRXJ.A7-#u 3o,FA=7=0KوFn 48 q *5>HP Y`dgtmr$wz]}~|yv{qle^WNEc<2P(2CZ|ؾ&\܃я}py?}b(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#{ *n+EAA5<0KڈFj'59 r *5>HPY`dgtmr%wz]}~|yv{qle^WNEp<2O(0BY{׾ %\؃ҏ}qzA~c)% 09CLU\dj4p u y'|[~h}v{ xsnhSbZRVJ,A7}-#z (m*D@@5</LڈGk6: s * 5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AWz־ %\؃ҏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7|-#y 7l)C?@8</LڈGl߷7< t * 5>!HPY`fgumr&wz]}~|yvzqle^WNEn<2\( .@Vyվ $\؃ӏs|Cpe+% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7{-#x 6k(B>?8>/LۈHl*= u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( ->UwԾ  #]ك̏t}DqV,% 0:CL U\dj.puy(|\~g}u{xsnh[b[RSJ)A7y-#w 5x'A>>8=0MۈHm+> v * 5>HPY`ggwmr'wz^}~|yvxqle^WNEl<2Z(,=TvӾ  +߇]ك̏w u~EsX%0:CL U\dj/p uy%|\~g}t{xsnh[b[R_J(A7x-#v 3w&@==7=0M܈In,? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEk<2Y(;<SuҾ  *߇]ك͏x!vFtY%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R^J'A7w-#u 2v3?<=7=0M܈Io -@ y *5>HPY`hgxmr'wz^}~|y"vqke^ WNEj<2W(9KRtѾ*]ڃΏxwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R]J4A7v-#s 1u2K;<7=0N܈Jo!.2 z *5>HPY``gxmr(wz_}~|y!v~qle^ WNEi<2V(8J`sо)]ڃΏyxHv[!%09CL U\dj1p u y%|Z~g}s{xsnhXbZR\J3A7u-#r 0t1J:;7=0I݈Kp"/3  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2U(7I_}rϾ(]ڃϏzl Jw\"%09~CL U\dj1p u y&|Z~h}s{xsnhXbZR[J2A7-#q /s0ID;߉6=0J؈Kq#04 | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEf<2T(6G^|qξ(]ڃϏzmu Kx]$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ1A7-"#p .r/HDD߉6<0J؈Dr$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^WNEe<2S(5F]p;']ۃЏ{nvLz^%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ0A7- #~ -q.GCC߉6<0J؈Er%26 ~ *5>HP Y`bgsmr$wz`}~|yv|qle^WNEd<2R(4E\}̾'\ۃЏ{owM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ/A7-#} ,p-FBBމ5<0KوEs&37 p *5>HP Y`cgsmr$wz]}~|yv|qle^WNEc<2Q(2D[|ؾ&\ۃя|px?|a'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#| *o,EAA5<0KوFi'48 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2P(1CY{׾&\؃я}qy@}b(% 09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7}-#{ )m+D@A5<0KڈGj(5: r *5>HPY`dgtmr%wz]}~|yvzqle^WNEo<2O(0BXz־ %\؃ҏ}qzA~c)% 09CLU\dj4p u y'|[~h}u{ xsnhSbZRVJ,A7|-#z (l*D@@8</LڈGk6; s * 5> HPY`egumr%wz]}~|yvzqle^WNEn<2](/@Wyվ $\؃ӏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7{-#y 7k)C??8>/LڈHl7< u * 5>HPY`fgvmr&wz]}~|yvyqle^WNEm<2\( .?VxԾ $\كӏs|Cqe,% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7z-#x 5j(B>?8>0LۈHm*= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(->UwӾ  #߇]ك̏t}DrW-% 0:CL U\dj.puy(|\~g}u{xsnh[b[RSJ)A7y-#v 4x'A=>7=0MۈIm+> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(;=TvҾ  +߇]ك͏w u~EsX%0:CL U\dj/p uy%|\~g}t{xsnhZb[R_J(A7x-#u 3w&@==7=0M܈In ,? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEj<2X(:LRuѾ *߇]ك͏x!vFtY%0:CL U\dj0p uy%|Z~g}t{xsnhZb[R^J4A7w-#t 2v2?<<7=0M܈Jo!-A y *5>HPY`_gxmr(wz^}~|y"vqke^ WNEi<2W(9Katо)]ڃΏxwHuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYbZR]J3A7v-#s 1u1K;<7=0I݈Jp!.2 z *5>HPY``gpmr(wz_}~|y!v~qle^ WNEh<2V(8I`~sϾ)]ڃΏyxIv["%09CL U\dj1p u y&|Z~g}s{xsnhXbZR\J2A7-#r 0t0J:;6=0I׈Kp"/3  { *5>HP Y`agqmr(wz_}~|y!v~qle^ WNEg<2U(7H_}rξ(]ڃϏzl Jx\#%09~CL U\dj1p u y&|Z~h}s{xsnhWbZR[J1A7-"#q /s/ID:߉6=0J؈Dq#14 | *5>HP Y`agrmr#wz_}~|y v}qle^ WNEf<2T(6G^|q;(]ۃϏzmu Ky^$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ0A7-!# -q/HCC߉6<0J؈Er$25 ~ *5>HP Y`bgrmr#wz_}~|y v|qle^WNEe<2S(4F]p̾']ۃЏ{nvLz_%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ/A7- #~ ,p.GCCމ6<0J؈Es%36  *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2R(3E[}˾'\ۃя|owM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o-FBBމ5<0KوFi&48 p *5>HP Y`cgsmr$wz]}~|yv{qle^WNEc<2P(2DZ|ؾ&\ۃя|px?|a'%09CLU\ dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#| *n,EAA5<0KوFj'59 r *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2O(1BY{׾%\؃ҏ}qy@}b(% 09CLU\dj4p u y'|[~h}v{ xsnhTbZRVJ,A7}-#{ )m+D@A5</KڈGj6: s *5>HPY`egumr%wz]}~|yvzqle^WNEo<2N(0AXz־ %\؃ҏ~rzAc*% 09CLU\dj-p u y'|\~h}u{ xsnhSbZRUJ+A7|-#z 7l*C?@8</LڈGk߷7; t * 5> HPY`egumr&wz]}~|yvzqle^WNEn<2\(/@Wyվ $\؃ӏ~s{Be+% 09CLU\dj.pu y(|\~g}u{ xsnh\bZRTJ*A7{-#x 6k)B??8>/LۈHl*< u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?VxԾ $\ك̏t|Cqf,% 09CLU\dj.puy(|\~g}u{xsnh\b[RSJ)A7z-#w 5y(A>>8>0LۈHm+= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(,>TwӾ  #߇]ك̏w u}ErW-% 0:CL U\dj/puy$|\~g}t{xsnh[b[RSJ(A7y-#v 4x'A=>7=0MۈIn,? w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(;=SvҾ  *߇]ك͏w u~FsX%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R_J'A7x-#u 3v3@<=7=0M܈In -@ x *5>HPY`hgxmr'wz^}~|y"vxqle^ WNEj<2X(:KRuѾ*߇]ك͏xvGtY %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R^J4A7w-#t 2u2K<<7=0M܈Jo!.A y *5>HPY`_gxmr(wz^}~|y!v~qke^ WNEi<2W(9Jatо)]ڃΏywHv[!%0:CL U\dj0p u y%|Z~g}t{xsnhYbZR]J3A7v-#s 1t1J;<7=0I݈Jp"/2 { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2V(7I`~sϾ)]ڃΏyk Iw\"%09CL U\dj1p u y&|Z~h}s{xsnhXbZR\J2A7-#r /s0I:;6=0J׈Kq#03  | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEg<2U(6H_}rξ(]ڃϏzlu Jx]#%09~CLU\dj1p u y&|Z~h}s{xsnhWbZR[J1A7-"#p .r/ID:߉6=0J؈Dq$15 } *5>HP Y`agrmr#wz_}~|y v}qle^ WNEf<2S(5G]q;(]ۃЏ{mvKy^$%09CLU\dj2p u y&|[~h}w{xsnhVbZRZJ0A7-!# -q.HCC߉6<0J؈Er$26 ~ *5>HP Y`bgrmr$wz_}~|y v|qle^WNEe<2R(4F\~̾']ۃЏ{nwLz_%%09CLU\dj3p u y&|[~h}w{"xsnhVbZRYJ/A7- #~ ,p-GBBމ6<0KوEs%37  *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3D[}پ&\ۃя|ox>{`'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o,FBBމ5<0KوFi&48 q *5>HP Y`dgtmr$wz]}~|yv{qle^WNEc<2P(2CZ|ؾ&\ۃя}py?}a(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#| *n+EAA5<0KوFj'59 r *5>HPY`dgtmr%wz]}~|yv{qle^WNEp<2O(0BY{׾ %\؃ҏ}qz@~c)% 09CLU\dj4p u y'|[~h}v{ xsnhSbZRVJ,A7}-#z )m*D@@5</LڈGk6: s * 5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AXz־ %\؃ҏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnhSbZRUJ+A7|-#y 7l)C?@8</LڈGk߷7; t * 5>!HPY`fgumr&wz]}~|yvzqle^WNEn<2\( .@Vyվ $\؃ӏ~s|Cpe+% 09CLU\dj.pu y(|\~g}u{ xsnh\bZRTJ*A7{-#x 6k(B>?8>/LۈHl*= u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?UxԾ  #]ك̏t}DqV,% 0:CL U\dj.puy(|\~g}u{xsnh[b[RSJ)A7z-#w 5x'A>>8=0MۈHm+> v * 5>HPY`ggwmr'wz^}~|yvxqle^WNEl<2Z(,=TwӾ  +߇]ك̏w u~EsW-%0:CL U\dj/puy%|\~g}t{xsnh[b[RRJ(A7x-#v 4w&@==7=0M܈In, ? w * 5>HPY`hgwmr'wz^}~|y"vxqle^WNEk<2Y(;<SuҾ  *߇]ك͏x!vFtY%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R^J'A7w-#u 2v3?<=7=0M܈In -@ y *5>HPY`hgxmr'wz^}~|y"vqke^ WNEj<2X(9KRtѾ*]ڃ͏xwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R]J4A7v-#s 1u2K;<7=0N܈Jo!.1 z *5>HPY``gxmr(wz_}~|y!v~qle^ WNEi<2V(8Jasо)]ڃΏyxHv[!%0:CL U\dj0p u y%|Z~g}s{xsnhYbZR\J3A7u-#r 0t1J:;7=0I݈Jp"/3  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2U(7I_~rϾ)]ڃϏyl Iw\"%09CL U\dj1p u y&|Z~h}s{xsnhXbZR[J2A7-#q /s0ID;߉6=0J׈Kq#04 | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEg<2T(6H^}qξ(]ڃϏzmu Kx]#%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ1A7-"#p .r/HDD߉6<0J؈Dr$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^WNEf<2S(5F]p;']ۃЏ{nvLz^%%09CLU\dj2p u y&|[~h}w{xsnhVbZRZJ0A7-!# -q.GCC߉6<0J؈Er%26 ~ *5>HP Y`bgsmr$wz_}~|yv|qle^WNEe<2R(4E\~̾']ۃЏ{owM{`&%09CLU\dj3p u y'|[~h}v{!xsnhVbZRYJ/A7-#} ,p-FBBމ5<0KوEs&37 p *5>HP Y`cgsmr$wz]}~|yv|qle^WNEd<2Q(2D[}پ&\ۃя|ox?|a'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#| +o,FAB5<0KوFi'48 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEq<2P(1CZ{ؾ&\܃я}py@}b(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#{ )n+EAA5<0KڈFj'59 r *5>HPY`dgtmr%wz]}~|yvzqle^WNEp<2O(0BXz׾ %\؃ҏ}qzA~c)% 09CLU\dj4p u y'|[~h}v{ xsnhSbZRVJ,A7}-#z (m*D@@8</LڈGk6; s * 5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AWy־ $\؃ӏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7{-#y 7k)C??8>/LڈGl7< t * 5>HPY`fgvmr&wz]}~|yvyqle^WNEm<2\( .?Vxվ $\كӏs|Cqe+% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7z-#x 6j(B>?8>0LۈHl*= v * 5>HPY`fgvmr&wz^}~|yvyqle^WNEl<2[( ->UwԾ  #]ك̏t}DrW-% 0:CL U\dj.puy(|\~g}u{xsnh[b[RSJ)A7y-#w 4x'A=>7=0MۈIm+> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(+=TvӾ  +߇]ك͏w u~EsX%0:CL U\dj/p uy%|\~g}t{xsnh[b[R_J(A7x-#u 3w&@==7=0M܈In ,? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEj<2X(:<SuҾ *߇]ك͏x!vFtY%0:CL U\dj0p uy%|Z~g}t{xsnhZb[R^J4A7w-#t 2v3?<=7=0M܈Jo -@ y *5>HPY`igxmr(wz^}~|y"vqke^ WNEi<2W(9KQtѾ*]ڃΏxwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYbZR]J3A7v-#s 1u2K;<7=0I݈Jo!.2 z *5>HPY``gymr(wz_}~|y!v~qle^ WNEh<2V(8J`~sо)]ڃΏyxIv["%09CL U\dj1p u y%|Z~g}s{xsnhXbZR\J2A7-#r 0t1J:;6=0I׈Kp"/3  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEg<2U(7H_}rϾ(]ڃϏzl Jx\#%09~CL U\dj1p u y&|Z~h}s{xsnhXbZR[J1A7-"#q /s0ID:߉6=0J؈Dq#04 | *5>HP Y`agrmr)wz_}~|y v}qle^ WNEf<2T(6G^|qξ(]ۃϏzmu Ky^$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ0A7-!# .r/HCC߉6<0J؈Er$15 } *5>HP Y`bgrmr#wz_}~|y v|qle^WNEe<2S(4F]p;']ۃЏ{nvLz_%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ/A7- #~ ,p.GCCމ6<0J؈Es%26  *5>HP Y`cgsmr$wz`}~|yv|qle^WNEd<2R(3E\}̾'\ۃЏ|owM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o-FBBމ5<0KوFs&38 p *5>HP Y`cgsmr$wz]}~|yv{qle^WNEc<2Q(2DZ|ؾ&\ۃя|px?|a'%09CLU\ dj3p u y'|[~h}v{!xsnhUbZRWJ-A7~-#| *n,EAA5<0KوFj'49 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2O(1CY{׾%\؃ҏ}qy@}b(% 09CLU\dj4p u y'|[~h}v{ xsnhTbZRVJ,A7}-#{ )m+D@A5</KڈGj(5: s *5>HPY`egumr%wz]}~|yvzqle^WNEo<2N(0AXz־ %\؃ҏ~rzAc*% 09CLU\dj-p u y'|\~h}u{ xsnhSbZRUJ+A7|-#z 7l*C@@8</LڈGk7; t * 5> HPY`egumr&wz]}~|yvzqle^WNEn<2\(/@Wyվ $\؃ӏ~s{Bd+% 09CLU\dj-pu y(|\~g}u{ xsnh]bZRUJ*A7{-#y 6k)B??8>/LۈHl8< u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?VxԾ $\ك̏t|Cqf,% 09CLU\dj.puy(|\~g}u{xsnh\b[RTJ)A7z-#w 5j(B>>8>0LۈHm+= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(,>UwӾ  #߇]ك̏w t}DrW-% 0:CL U\dj/puy$|\~g}t{xsnh[b[RSJ(A7y-#v 4x'A=>7=0MۈIm,> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(;=SvҾ  +߇]ك͏w u~FsX%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R_J'A7x-#u 3w&@<=7=0M܈In -@ x * 5>HPY`hgxmr'wz^}~|y"vxqle^ WNEj<2X(:LRuѾ*߇]ك͏xvGtY %0:CL U\dj0p uy%|Z~g}t{xsnhZb[R^J4A7w-#t 2v2?<<7=0M܈Jo!.A y *5>HPY`_gxmr(wz^}~|y!v~qke^ WNEi<2W(9Jatо)]ڃΏywHvZ!%0:CL U\dj0p u y%|Z~g}t{xsnhYbZR]J3A7v-#s 1t1J;<7=0I݈Jp"/2 z *5>HPY``gpmr(wz_}~|y!v~qle^ WNEh<2V(8I`~sϾ)]ڃΏykIw\"%09CL U\dj1p u y&|Z~g}s{xsnhXbZR\J2A7-#r 0s0J:;6=0J׈Kp#03  | *5>HP Y`agqmr)wz_}~|y!v}qle^ WNEg<2U(6H_}rξ(]ڃϏzlu Jx]#%09~CL U\dj1p u y&|Z~h}s{xsnhWbZR[J1A7-"#q .r/ID:߉6=0J؈Dq#14 } *5>HP Y`agrmr#wz_}~|y v}qle^ WNEf<2T(5G^q;(]ۃϏzmvKy^$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ0A7-!# -q.HCC߉6<0J؈Er$26 ~ *5>HP Y`bgrmr$wz_}~|y v|qle^WNEe<2R(4F\~̾']ۃЏ{nwLz_%%09CLU\dj3p u y&|[~h}w{xsnhVbZRYJ/A7- #~ ,p-GBCމ6<0KوEs%37  *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3E[}پ&\ۃя|ox>{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o,FBBމ5<0KوFi&48 q *5>HP Y`cgtmr$wz]}~|yv{qle^WNEc<2P(2CZ|ؾ&\ۃя|py?}a(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#| *n+EAA5<0KوFj'59 r *5>HPY`dgtmr%wz]}~|yv{qle^WNEp<2O(1BY{׾%\؃ҏ}qz@~c)% 09CLU\dj4p u y'|[~h}v{ xsnhTbZRVJ,A7}-#z )m*D@@5</LڈGk6: s *5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AXz־ %\؃ҏ~r{Ad*% 09CLU\dj-pu y(|\~h}u{ xsnhSbZRUJ+A7|-#y 7l)C?@8</LڈGk߷7; t * 5>!HPY`fgumr&wz]}~|yvzqle^WNEn<2\( .@Wyվ $\؃ӏ~s|Ce+% 09CLU\dj.pu y(|\~g}u{ xsnh\bZRTJ*A7{-#x 6k(B>?8>/LۈHl*< u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?UxԾ  $]ك̏t}Dqf,% 09CL U\dj.puy(|\~g}u{xsnh\b[RSJ)A7z-#w 5x'A>>8=0LۈHm+> v * 5>HPY`ggwmr'wz^}~|yvyqle^WNEl<2Z(,>TwӾ  #߇]ك̏w u~ErW-% 0:CL U\dj/puy%|\~g}t{xsnh[b[RRJ(A7y-#v 4w&@=>7=0M܈In, ? w * 5>HPY`hgwmr'wz^}~|y"vxqle^WNEk<2Y(;<SvҾ  *߇]ك͏w!vFtX%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R^J'A7x-#u 3v3?<=7=0M܈In -@ x *5>HPY`hgxmr'wz^}~|y"vqke^ WNEj<2X(:KRuѾ*އ]ڃ͏xwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R]J4A7v-#t 1u2K;<7=0M܈Jo!.1 z *5>HPY``gxmr(wz_}~|y!v~qle^ WNEi<2W(8Jasо)]ڃΏyxHv[!%0:CL U\dj0p u y%|Z~g}s{xsnhYbZR\J3A7u-#r 0t1J;;7=0I݈Jp"/2  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2U(7I`~rϾ)]ڃϏyl Iw\"%09CL U\dj1p u y&|Z~h}s{xsnhXbZR\J2A7-#q /s0IE;6=0J׈Kq#04 | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEg<2T(6H^}qξ(]ڃϏzmu Jx]#%09CLU\dj2p u y&|[~h}s{xsnhWbZR[J1A7-"#p .r/HDD߉6=0J؈Dq$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^ WNEf<2S(5G]p;']ۃЏ{nvLy^$%09CLU\dj2p u y&|[~h}w{xsnhVbZRZJ0A7-!# -q.GCC߉6<0J؈Er%26 ~ *5>HP Y`bgrmr$wz_}~|y v|qle^WNEe<2R(4E\~̾']ۃЏ{nwM{_&%09CLU\dj3p u y&|[~h}v{!xsnhVbZRYJ/A7- #~ ,p-GBBމ6<0KوEs&37 p *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3D[}پ&\ۃя|ox>|a'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#| +o,FAB5<0KوFi&48 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEc<2P(1CZ|ؾ&\܃я}py@}b(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#{ *n+EAA5<0KڈFj'59 r *5>HPY`dgtmr%wz]}~|yv{qle^WNEp<2O(0BY{׾ %\؃ҏ}qzA~c)% 09CLU\dj4p u y'|[~h}v{ xsnhSbZRVJ,A7}-#z (m*D@@8</LڈGk6; s * 5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AWy־ %\؃ҏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7|-#y 7l)C??8>/LڈGl7< t * 5>!HPY`fgvmr&wz]}~|yvyqle^WNEn<2\( .@Vxվ $\كӏs|Cpe+% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7z-#x 6j(B>?8>0LۈHl*= u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( ->UwԾ  #]ك̏t}DrV,% 0:CL U\dj.puy(|\~g}u{xsnh[b[RSJ)A7y-#w 5x'A=>8=0MۈHm+> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEl<2Z(,=TvӾ  +߇]ك̏w u~EsX%0:CL U\dj/p uy%|\~g}t{xsnh[b[R_J(A7x-#v 3w&@==7=0M܈In,? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEk<2X(:<SuҾ *߇]ك͏x!vFtY%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R^J5A7w-#t 2v3?<=7=0M܈Jo -@ y *5>HPY`hgxmr(wz^}~|y"vqke^ WNEi<2W(9KRtѾ*]ڃΏxwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYbZR]J4A7v-#s 1u2K;<7=0N݈Jo!.2 z *5>HPY``gymr(wz_}~|y!v~qle^ WNEh<2V(8J`~sо)]ڃΏyxHv[!%09CL U\dj1p u y%|Z~g}s{xsnhXbZR\J3A7-#r 0t1J:;6=0I݈Kp"/3  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEg<2U(7H_}rϾ(]ڃϏzl Jw\#%09~CL U\dj1p u y&|Z~h}s{xsnhXbZR[J2A7-##q /s0ID;߉6=0J؈Kq#04 | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEf<2T(6G^|qξ(]ڃϏzmu Ky]$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ1A7-!# .r/HDD߉6<0J؈Dr$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^WNEe<2S(5F]p;']ۃЏ{nvLz_%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ0A7- #~ -q.GCCމ6<0J؈Er%26 ~ *5>HP Y`bgsmr$wz`}~|yv|qle^WNEd<2R(3E\}̾'\ۃЏ|owM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ/A7-#} +p-FBBމ5<0KوFs&37 p *5>HP Y`cgsmr$wz]}~|yv{qle^WNEc<2Q(2D[|ؾ&\ۃя|px?|a'%09CLU\ dj3p u y'|[~h}v{!xsnhUbZRWJ.A7~-#| *n,EAA5<0KوFj'49 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2P(1CY{׾&\؃ҏ}qy@}b(% 09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7}-#{ )m+D@A5</KڈGj(5: r *5>HPY`egtmr%wz]}~|yvzqle^WNEo<2N(0AXz־ %\؃ҏ}rzA~c)% 09CLU\dj-p u y'|\~h}u{ xsnhSbZRVJ,A7|-#z (l*C@@8</LڈGk6; t * 5> HPY`egumr&wz]}~|yvzqle^WNEn<2](/@Wyվ $\؃ӏ~r{Bd+% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7{-#y 6k)C??8>/LۈHl7< u * 5>HPY`fgvmr&wz]}~|yvyqle^WNEm<2[( .?VxԾ $\كˏs|Cqf,% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7z-#x 5j(B>?8>0LۈHm*= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(,>UwӾ  #߇]ك̏w t}DrW-% 0:CL U\dj/puy(|\~g}u{xsnh[b[RSJ)A7y-#v 4x'A=>7=0MۈIm,> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(;=TvҾ  +߇]ك͏w u~EsX%0:CL U\dj/p uy%|\~g}t{xsnhZb[R_J(A7x-#u 3w&@<=7=0M܈In -? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEj<2X(:LRuѾ *߇]ك͏xvGtY%0:CL U\dj0p uy%|Z~g}t{xsnhZb[R^J4A7w-#t 2v2?<<7=0M܈Jo!.A y *5>HPY`_gxmr(wz^}~|y!vqke^ WNEi<2W(9Jatо)]ڃΏxwHuZ!%0:CL U\dj0p u y%|Z~g}t{xsnhYbZR]J3A7v-#s 1u1K;<7=0I݈Jp"/2 z *5>HPY``gpmr(wz_}~|y!v~qle^ WNEh<2V(8I`~sϾ)]ڃΏyxIw["%09CL U\dj1p u y&|Z~g}s{xsnhXbZR\J2A7-#r 0t0J:;6=0I׈Kp"03  { *5>HP Y`agqmr(wz_}~|y!v}qle^ WNEg<2U(7H_}rξ(]ڃϏzl Jx]#%09~CL U\dj1p u y&|Z~h}s{xsnhWbZR[J1A7-"#q /r/ID:߉6=0J؈Dq#14 } *5>HP Y`agrmr#wz_}~|y v}qle^ WNEf<2T(5G^q;(]ۃϏzmv Ky^$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ0A7-!# -q.HCC߉6<0J؈Er$25 ~ *5>HP Y`bgrmr#wz_}~|y v|qle^WNEe<2S(4F\~̾']ۃЏ{nwLz_%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ/A7- #~ ,p-GCCމ6<0JوEs%37  *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3E[}˾'\ۃя|oxM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o,FBBމ5<0KوFi&48 p *5>HP Y`cgsmr$wz]}~|yv{qle^WNEc<2P(2CZ|ؾ&\ۃя|py?|a'%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#| *n+EAA5<0KوFj'59 r *[52> HP Y`ddg;tmr%wz]}mC~|yuvL{q#le^W~߿NUE,p<܈2O(^15B YӉܐчg{=׾έʥoF%ċx™O&\ӽ؃Xҏ.}ܶq`z7@ڼ䒭i@~b)ħ% 0r9ICLU͠\d{jQ4p( u y֙'|[~Z1h}ߒv{ xscn:hTbZRVJl,AC7}-#ǃ{ uK )2\mͅî+ׇD*@S@|Ύ!5J H̲PY`Gegqumrù%w캴z]}?h~| y6v_zqle^W-˾NVEo<Ε2N($N0wAXֈمEzn־ܬ झ<e%勄 3虀\\뤁؃+Tҏ}~"rKztƝABkd*% 09CLU\dj-p u y(|\~h}u{ xsnhSbZRUJ+A7|-#y 7l*C?@8</LڈGk߷7; t * 5> HPY`egumr&wz]}~|yvzqle^WNEn<2\(.@Wyվ $\؃ӏ~s{Be+% 09CLU\dj.pu y(|\~g}u{ xsnh\bZRTJ*A7{-#x 6k)B??8>/LۈHl*< u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?VxԾ $]ك̏t|Dqf,% 09CLU\dj.puy(|\~g}u{xsnh\b[RSJ)A7z-#w 5y(A>>8=0LۈHm+= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(,>TwӾ  #߇]ك̏w u}ErW-% 0:CL U\dj/puy$|\~g}t{xsnh[b[RRJ(A7y-#v 4w'@=>7=0M܈In, ? w * 5>HPY`hgwmr'wz^}~|yvxqle^WNEk<2Y(;<SvҾ  *߇]ك͏w!v~FsX%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R^J'A7x-#u 3v3@<=7=0M܈In -@ x *5>HPY`hgxmr'wz^}~|y"vxqke^ WNEj<2X(:KRuѾ*߇]ڃ͏xwGuY %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R^J4A7w-#t 2u2K;<7=0M܈Jo!.1 z *5>HPY`_gxmr(wz_}~|y!v~qke^ WNEi<2W(9Jatо)]ڃΏywHv[!%0:CL U\dj0p u y%|Z~g}t{xsnhYbZR]J3A7u-#s 0t1J;<7=0I݈Jp"/2 { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2V(7I`~sϾ)]ڃΏyl Iw\"%09CL U\dj1p u y&|Z~h}s{xsnhXbZR\J2A7-#q /s0IE;6=0J׈Kq#03  | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEg<2T(6H^}rξ(]ڃϏzlu Jx]#%09CLU\dj2p u y&|Z~h}s{xsnhWbZR[J1A7-"#p .r/HDD߉6=0J؈Dq$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^ WNEf<2S(5G]p;(]ۃЏ{mvKy^$%09CLU\dj2p u y&|[~h}w{xsnhVbZRZJ0A7-!# -q.HCC߉6<0J؈Er$26 ~ *5>HP Y`bgrmr$wz_}~|y v|qle^WNEe<2R(4E\~̾']ۃЏ{nwMz_&%09CLU\dj3p u y&|[~h}v{"xsnhVbZRYJ/A7- #~ ,p-GBBމ6<0KوEs%37  *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3D[}پ&\ۃя|ox>|`'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o,FAB5<0KوFi&48 q *5>HP Y`dgtmr$wz]}~|yv{qle^WNEc<2P(2CZ|ؾ&\܃я}py?}b(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#{ *n+EAA5<0KوFj'59 r *5>HPY`dgtmr%wz]}~|yv{qle^WNEp<2O(0BY{׾ %\؃ҏ}qzA~c)% 09CLU\dj4p u y'|[~h}v{ xsnhSbZRVJ,A7}-#z )m*D@@5</LڈGk6: s * 5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AXz־ %\؃ҏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7|-#y 7l)C?@8</LڈGk߷7< t * 5>!HPY`fgumr&wz]}~|yvzqle^WNEn<2\( .@Vyվ $\؃ӏs|Cpe+% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7{-#x 6k(B>?8>/LۈHl*= u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( ->UxԾ  #]ك̏t}DqV,% 0:CL U\dj.puy(|\~g}u{xsnh[b[RSJ)A7y-#w 5x'A>>8=0MۈHm+> v * 5>HPY`ggwmr'wz^}~|yvxqle^WNEl<2Z(,=TvӾ  +߇]ك̏w u~EsW%0:CL U\dj/p uy%|\~g}t{xsnh[b[RRJ(A7x-#v 4w&@==7=0M܈In,? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEk<2Y(;<SuҾ  *߇]ك͏x!vFtY%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R^J'A7w-#u 2v3?<=7=0M܈Io -@ y *5>HPY`hgxmr'wz^}~|y"vqke^ WNEj<2W(9KRtѾ*]ڃΏxwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R]J4A7v-#s 1u2K;<7=0N܈Jo!.2 z *5>HPY``gxmr(wz_}~|y!v~qle^ WNEi<2V(8J`sо)]ڃΏyxHv[!%09CL U\dj1p u y%|Z~g}s{xsnhXbZR\J3A7u-#r 0t1J:;7=0I݈Jp"/3  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2U(7I_~rϾ)]ڃϏzl Iw\"%09~CL U\dj1p u y&|Z~h}s{xsnhXbZR[J2A7-#q /s0ID;߉6=0J׈Kq#04 | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEg<2T(6G^|qξ(]ڃϏzmu Kx]$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ1A7-"#p .r/HDD߉6<0J؈Dr$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^WNEe<2S(5F]p;']ۃЏ{nvLz^%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ0A7- # -q.GCC߉6<0J؈Er%26 ~ *5>HP Y`bgsmr$wz`}~|yv|qle^WNEd<2R(4E\~̾'\ۃЏ{owM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRYJ/A7-#} ,p-FBBމ5<0KوEs&37 p *5>HP Y`cgsmr$wz]}~|yv|qle^WNEc<2Q(2D[|پ&\ۃя|px?|a'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#| *o,EAA5<0KوFi'48 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2P(1CY{ؾ&\؃я}qy@}b(% 09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#{ )n+E@A5<0KڈGj'5: r *5>HPY`dgtmr%wz]}~|yvzqle^WNEo<2O(0BXz־ %\؃ҏ}qzA~c)% 09CLU\dj4p u y'|[~h}u{ xsnhSbZRVJ,A7|-#z (l*D@@8</LڈGk6; s * 5> HPY`egumr%wz]}~|yvzqle^WNEn<2](/@Wyվ $\؃ӏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7{-#y 7k)C??8>/LڈHl7< u * 5>HPY`fgvmr&wz]}~|yvyqle^WNEm<2\( .?VxԾ $\كӏs|Cqe,% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7z-#x 5j(B>?8>0LۈHl*= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(->UwӾ  #߇]ك̏t}DrW-% 0:CL U\dj.puy(|\~g}u{xsnh[b[RSJ)A7y-#v 4x'A=>7=0MۈIm+> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(;=TvҾ  +߇]ك͏w u~EsX%0:CL U\dj/p uy%|\~g}t{xsnhZb[R_J(A7x-#u 3w&@==7=0M܈In ,? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEj<2X(:<SuѾ *߇]ك͏x!vFtY%0:CL U\dj0p uy%|Z~g}t{xsnhZb[R^J4A7w-#t 2v2?<=7=0M܈Jo!-@ y *5>HPY`_gxmr(wz^}~|y"vqke^ WNEi<2W(9KQtо)]ڃΏxwHuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYbZR]J3A7v-#s 1u1K;<7=0I݈Jp!.2 z *5>HPY``gpmr(wz_}~|y!v~qle^ WNEh<2V(8I`~sϾ)]ڃΏyxIv["%09CL U\dj1p u y%|Z~g}s{xsnhXbZR\J2A7-#r 0t0J:;6=0I׈Kp"/3  { *5>HP Y`agqmr(wz_}~|y!v~qle^ WNEg<2U(7H_}rξ(]ڃϏzl Jx\#%09~CL U\dj1p u y&|Z~h}s{xsnhWbZR[J1A7-"#q /s0ID:߉6=0J؈Dq#04 | *5>HP Y`agrmr#wz_}~|y v}qle^ WNEf<2T(6G^|q;(]ۃϏzmu Ky^$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ0A7-!# .q/HCC߉6<0J؈Er$25 ~ *5>HP Y`bgrmr#wz_}~|y v|qle^WNEe<2S(4F]p̾']ۃЏ{nvLz_%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ/A7- #~ ,p.GCCމ6<0J؈Es%36  *5>HP Y`cgsmr$wz`}~|yv|qle^WNEd<2R(3E[}˾'\ۃЏ|owM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o-FBBމ5<0KوFi&48 p *5>HP Y`cgsmr$wz]}~|yv{qle^WNEc<2P(2DZ|ؾ&\ۃя|px?|a'%09CLU\ dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#| *n,EAA5<0KوFj'59 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2O(1BY{׾%\؃ҏ}qy@}b(% 09CLU\dj4p u y'|[~h}v{ xsnhTbZRVJ,A7}-#{ )m+D@A5</KڈGj6: s *5>HPY`egumr%wz]}~|yvzqle^WNEo<2N(0AXz־ %\؃ҏ~rzAc*% 09CLU\dj-p u y'|\~h}u{ xsnhSbZRUJ+A7|-#z 7l*C?@8</LڈGk߷7; t * 5> HPY`egumr&wz]}~|yvzqle^WNEn<2\(/@Wyվ $\؃ӏ~s{Be+% 09CLU\dj.pu y(|\~g}u{ xsnh\bZRTJ*A7{-#x 6k)B??8>/LۈHl8< u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?VxԾ $\ك̏t|Cqf,% 09CLU\dj.puy(|\~g}u{xsnh\b[RSJ)A7z-#w 5y(A>>8>0LۈHm+= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(,>TwӾ  #߇]ك̏w u}ErW-% 0:CL U\dj/puy$|\~g}t{xsnh[b[RSJ(A7y-#v 4x'A=>7=0MۈIm,? w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(;=SvҾ  *߇]ك͏w u~FsX%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R_J'A7x-#u 3w3@<=7=0M܈In -@ x * 5>HPY`hgxmr'wz^}~|y"vxqle^ WNEj<2X(:KRuѾ*߇]ك͏xvGtY %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R^J4A7w-#t 2u2K<<7=0M܈Jo!.A y *5>HPY`_gxmr(wz^}~|y!v~qke^ WNEi<2W(9Jatо)]ڃΏywHv[!%0:CL U\dj0p u y%|Z~g}t{xsnhYbZR]J3A7v-#s 1t1J;<7=0I݈Jp"/2 { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2V(8I`~sϾ)]ڃΏykIw\"%09CL U\dj1p u y&|Z~h}s{xsnhXbZR\J2A7-#r /s0I:;6=0J׈Kq#03  | *5>HP Y`agqmr)wz_}~|y!v}qle^ WNEg<2U(6H_}rξ(]ڃϏzlu Jx]#%09~CLU\dj1p u y&|Z~h}s{xsnhWbZR[J1A7-"#p .r/ID:߉6=0J؈Dq#15 } *5>HP Y`agrmr#wz_}~|y v}qle^ WNEf<2S(5G]q;(]ۃЏ{mvKy^$%09CLU\dj2p u y&|[~h}w{xsnhWbZRZJ0A7-!# -q.HCC߉6<0J؈Er$26 ~ *5>HP Y`bgrmr$wz_}~|y v|qle^WNEe<2R(4F\~̾']ۃЏ{nwLz_%%09CLU\dj3p u y&|[~h}w{"xsnhVbZRYJ/A7- #~ ,p-GBBމ6<0KوEs%37  *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3D[}پ&\ۃя|ox>{`'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o,FBBމ5<0KوFi&48 q *5>HP Y`dgtmr$wz]}~|yv{qle^WNEc<2P(2CZ|ؾ&\ۃя|py?}a(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#| *n+EAA5<0KوFj'59 r *5>HPY`dgtmr%wz]}~|yv{qle^WNEp<2O(1BY{׾ %\؃ҏ}qz@~c)% 09CLU\dj4p u y'|[~h}v{ xsnhTbZRVJ,A7}-#z )m*D@@5</LڈGk6: s *5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AXz־ %\؃ҏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnhSbZRUJ+A7|-#y 7l)C?@8</LڈGk߷7; t * 5>!HPY`fgumr&wz]}~|yvzqle^WNEn<2\( .@Vyվ $\؃ӏ~s|Cpe+% 09CLU\dj.pu y(|\~g}u{ xsnh\bZRTJ*A7{-#x 6k(B>?8>/LۈHl*= u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?UxԾ  #]ك̏t}Dqf,% 0:CL U\dj.puy(|\~g}u{xsnh\b[RSJ)A7z-#w 5x'A>>8=0MۈHm+> v * 5>HPY`ggwmr'wz^}~|yvyqle^WNEl<2Z(,=TwӾ  +߇]ك̏w u~ErW-%0:CL U\dj/puy%|\~g}t{xsnh[b[RRJ(A7y-#v 4w&@=>7=0M܈In, ? w * 5>HPY`hgwmr'wz^}~|y"vxqle^WNEk<2Y(;<SvҾ  *߇]ك͏x!vFtY%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R^J'A7w-#u 3v3?<=7=0M܈In -@ y *5>HPY`hgxmr'wz^}~|y"vqke^ WNEj<2X(9KRtѾ*]ڃ͏xwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R]J4A7v-#t 1u2K;<7=0N܈Jo!.1 z *5>HPY``gxmr(wz_}~|y!v~qle^ WNEi<2V(8Jasо)]ڃΏyxHv[!%0:CL U\dj0p u y%|Z~g}s{xsnhYbZR\J3A7u-#r 0t1J;;7=0I݈Jp"/3  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2U(7I_~rϾ)]ڃϏyl Iw\"%09CL U\dj1p u y&|Z~h}s{xsnhXbZR[J2A7-#q /s0ID;߉6=0J׈Kq#04 | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEg<2T(6H^}qξ(]ڃϏzmu Jx]#%09CLU\dj2p u y&|[~h}s{xsnhWbZR[J1A7-"#p .r/HDD߉6<0J؈Dr$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^WNEf<2S(5F]p;']ۃЏ{nvLy^%%09CLU\dj2p u y&|[~h}w{xsnhVbZRZJ0A7-!# -q.GCC߉6<0J؈Er%26 ~ *5>HP Y`bgsmr$wz_}~|yv|qle^WNEe<2R(4E\~̾']ۃЏ{owM{_&%09CLU\dj3p u y'|[~h}v{!xsnhVbZRYJ/A7-#} ,p-FBBމ5<0KوEs&37 p *5>HP Y`cgsmr$wz]}~|yv|qle^WNEd<2Q(3D[}پ&\ۃя|ox?|a'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#| +o,FAB5<0KوFi&48 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEq<2P(1CZ|ؾ&\܃я}py@}b(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#{ )n+EAA5<0KڈFj'59 r *5>HPY`dgtmr%wz]}~|yv{qle^WNEp<2O(0BXz׾ %\؃ҏ}qzA~c)% 09CLU\dj4p u y'|[~h}v{ xsnhSbZRVJ,A7}-#z (m*D@@8</LڈGk6; s * 5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AWy־ $\؃ӏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7{-#y 7k)C??8>/LڈGl7< t * 5>HPY`fgvmr&wz]}~|yvyqle^WNEn<2\( .?Vxվ $\كӏs|Cpe+% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7z-#x 6j(B>?8>0LۈHl*= v * 5>HPY`fgvmr&wz^}~|yvyqle^WNEl<2[( ->UwԾ  #]ك̏t}DrW-% 0:CL U\dj.puy(|\~g}u{xsnh[b[RSJ)A7y-#w 4x'A=>7=0MۈIm+> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(,=TvӾ  +߇]ك͏w u~EsX%0:CL U\dj/p uy%|\~g}t{xsnh[b[R_J(A7x-#u 3w&@==7=0M܈In ,? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEj<2X(:<SuҾ *߇]ك͏x!vFtY%0:CL U\dj0p uy%|Z~g}t{xsnhZb[R^J5A7w-#t 2v3?<=7=0M܈Jo -@ y *5>HPY`igxmr(wz^}~|y"vqke^ WNEi<2W(9KQtѾ*]ڃΏxwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYbZR]J4A7v-#s 1u2K;<7=0I݈Jo!.2 z *5>HPY``gymr(wz_}~|y!v~qle^ WNEh<2V(8J`~sо)]ڃΏyxIv[!%09CL U\dj1p u y%|Z~g}s{xsnhXbZR\J3A7-#r 0t1J:;6=0I׈Kp"/3  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEg<2U(7H_}rϾ(]ڃϏzl Jw\#%09~CL U\dj1p u y&|Z~h}s{xsnhXbZR[J1A7-"#q /s0ID:߉6=0J؈Dq#04 | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEf<2T(6G^|qξ(]ۃϏzmu Ky^$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ0A7-!# .r/HCC߉6<0J؈Er$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^WNEe<2S(4F]p;']ۃЏ{nvLz_%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ/A7- #~ ,q.GCCމ6<0J؈Es%26  *5>HP Y`cgsmr$wz`}~|yv|qle^WNEd<2R(3E\}̾'\ۃЏ|owM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o-FBBމ5<0KوFs&38 p *5>HP Y`cgsmr$wz]}~|yv{qle^WNEc<2Q(2DZ|ؾ&\ۃя|px?|a'%09CLU\ dj3p u y'|[~h}v{!xsnhUbZRWJ-A7~-#| *n,EAA5<0KوFj'49 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2O(1CY{׾%\؃ҏ}qy@}b(% 09CLU\dj4p u y'|[~h}v{!xsnhTbZRVJ,A7}-#{ )m+D@A5</KڈGj(5: r *5>HPY`egumr%wz]}~|yvzqle^WNEo<2N(0AXz־ %\؃ҏ~rzA~c)% 09CLU\dj-p u y'|\~h}u{ xsnhSbZRUJ+A7|-#z (l*C@@8</LڈGk6; t * 5> HPY`egumr&wz]}~|yvzqle^WNEn<2\(/@Wyվ $\؃ӏ~s{Bd+% 09CLU\dj-pu y(|\~g}u{ xsnh]bZRUJ*A7{-#y 6k)B??8>/LۈHl8< u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?VxԾ $\ك̏s|Cqf,% 09CLU\dj.puy(|\~g}u{xsnh\b[RTJ)A7z-#w 5j(B>?8>0LۈHm+= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(,>UwӾ  #߇]ك̏w t}DrW-% 0:CL U\dj/puy$|\~g}t{xsnh[b[RSJ(A7y-#v 4x'A=>7=0MۈIm,> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(;=SvҾ  +߇]ك͏w u~FsX%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R_J'A7x-#u 3w&@<=7=0M܈In -@ x * 5>HPY`hgxmr'wz^}~|y"vxqle^ WNEj<2X(:LRuѾ*߇]ك͏xvGtY %0:CL U\dj0p uy%|Z~g}t{xsnhZb[R^J4A7w-#t 2v2?<<7=0M܈Jo!.A y *5>HPY`_gxmr(wz^}~|y!vqke^ WNEi<2W(9Jatо)]ڃΏywHvZ!%0:CL U\dj0p u y%|Z~g}t{xsnhYbZR]J3A7v-#s 1t1J;<7=0I݈Jp"/2 z *5>HPY``gpmr(wz_}~|y!v~qle^ WNEh<2V(8I`~sϾ)]ڃΏykIw\"%09CL U\dj1p u y&|Z~g}s{xsnhXbZR\J2A7-#r 0s0J:;6=0J׈Kp"03  | *5>HP Y`agqmr)wz_}~|y!v}qle^ WNEg<2U(6H_}rξ(]ڃϏzlu Jx]#%09~CL U\dj1p u y&|Z~h}s{xsnhWbZR[J1A7-"#q .r/ID:߉6=0J؈Dq#14 } *5>HP Y`agrmr#wz_}~|y v}qle^ WNEf<2T(5G^q;(]ۃϏzmvKy^$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ0A7-!# -q.HCC߉6<0J؈Er$26 ~ *5>HP Y`bgrmr$wz_}~|y v|qle^WNEe<2R(4F\~̾']ۃЏ{nwLz_%%09CLU\dj3p u y&|[~h}w{xsnhVbZRYJ/A7- #~ ,p-GBCމ6<0JوEs%37  *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3E[}پ&\ۃя|oxM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o,FBBމ5<0KوFi&48 q *5>HP Y`cgsmr$wz]}~|yv{qle^WNEc<2P(2CZ|ؾ&\ۃя|py?}a(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#| *n+EAA5<0KوFj'59 r *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2O(1BY{׾%\؃ҏ}qz@~b)% 09CLU\dj4p u y'|[~h}v{ xsnhTbZRVJ,A7}-#{ )m*D@@5</KڈGk6: s *5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AXz־ %\؃ҏ~r{Ad*% 09CLU\dj-p u y(|\~h}u{ xsnhSbZRUJ+A7|-#y 7l)C?@8</LڈGk߷7; t * 5>!HPY`fgumr&wz]}~|yvzqle^WNEn<2\( .@Wyվ $\؃ӏ~s|Ce+% 09CLU\dj.pu y(|\~g}u{ xsnh\bZRTJ*A7{-#x 6k(B??8>/LۈHl*< u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?UxԾ $]ك̏t}Dqf,% 09CLU\dj.puy(|\~g}u{xsnh\b[RSJ)A7z-#w 5x'A>>8=0LۈHm+> v * 5>HPY`ggwmr'wz^}~|yvyqle^WNEl<2Z(,>TwӾ  #߇]ك̏w u~ErW-% 0:CL U\dj/puy%|\~g}t{xsnh[b[RRJ(A7y-#v 4w'@=>7=0M܈In, ? w * 5>HPY`hgwmr'wz^}~|y"vxqle^WNEk<2Y(;<SvҾ  *߇]ك͏w!vFtX%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R^J'A7x-#u 3v3?<=7=0M܈In -@ x *5>HPY`hgxmr'wz^}~|y"vqke^ WNEj<2X(:KRuѾ*އ]ڃ͏xwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R]J4A7v-#t 1u2K;<7=0M܈Jo!.1 z *5>HPY``gxmr(wz_}~|y!v~qle^ WNEi<2W(8Jatо)]ڃΏyxHv[!%0:CL U\dj0p u y%|Z~g}s{xsnhYbZR]J3A7u-#r 0t1J;;7=0I݈Jp"/2  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2U(7I`~rϾ)]ڃϏyl Iw\"%09CL U\dj1p u y&|Z~h}s{xsnhXbZR\J2A7-#q /s0IE;6=0J׈Kq#04 | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEg<2T(6H^}qξ(]ڃϏzmu Jx]#%09CLU\dj2p u y&|[~h}s{xsnhWbZR[J1A7-"#p .r/HDD߉6=0J؈Dq$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^ WNEf<2S(5G]p;']ۃЏ{nvKy^$%09CLU\dj2p u y&|[~h}w{xsnhVbZRZJ0A7-!# -q.GCC߉6<0J؈Er%26 ~ *5>HP Y`bgrmr$wz_}~|y v|qle^WNEe<2R(4E\~̾']ۃЏ{nwM{_&%09CLU\dj3p u y&|[~h}v{!xsnhVbZRYJ/A7- #~ ,p-GBBމ6<0KوEs%37 p *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3D[}پ&\ۃя|ox>|a'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#| +o,FAB5<0KوFi&48 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEc<2P(1CZ|ؾ&\܃я}py@}b(%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#{ *n+EAA5<0KڈFj'59 r *5>HPY`dgtmr%wz]}~|yv{qle^WNEp<2O(0BY{׾ %\؃ҏ}qzA~c)% 09CLU\dj4p u y'|[~h}v{ xsnhSbZRVJ,A7}-#z (m*D@@8</LڈGk6: s * 5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(/AWz־ %\؃ҏ~r{Bd*% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7|-#y 7l)C??8>/LڈGl7< t * 5>!HPY`fgumr&wz]}~|yvyqle^WNEn<2\( .@Vxվ $\؃ӏs|Cpe+% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7z-#x 6k(B>?8>0LۈHl*= u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( ->UwԾ  #]ك̏t}DrV,% 0:CL U\dj.puy(|\~g}u{xsnh[b[RSJ)A7y-#w 5x'A=>8=0MۈHm+> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEl<2Z(,=TvӾ  +߇]ك̏w u~EsX%0:CL U\dj/p uy%|\~g}t{xsnh[b[R_J(A7x-#v 3w&@==7=0M܈In,? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEk<2X(:<SuҾ *߇]ك͏x!vFtY%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R^J5A7w-#t 2v3?<=7=0M܈Io -@ y *5>HPY`hgxmr(wz^}~|y"vqke^ WNEj<2W(9KRtѾ*]ڃΏxwGuZ %0:CL U\dj0p uy%|Z~g}t{xsnhYbZR]J4A7v-#s 1u2K;<7=0N݈Jo!.2 z *5>HPY``gymr(wz_}~|y!v~qle^ WNEh<2V(8J`sо)]ڃΏyxHv[!%09CL U\dj1p u y%|Z~g}s{xsnhXbZR\J3A7-#r 0t1J:;6=0I݈Kp"/3  { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEg<2U(7I_}rϾ(]ڃϏzl Jw\#%09~CL U\dj1p u y&|Z~h}s{xsnhXbZR[J2A7-#q /s0ID;߉6=0J؈Kq#04 | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEf<2T(6G^|qξ(]ڃϏzmu Ky]$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ1A7-!#p .r/HDD߉6<0J؈Dr$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^WNEe<2S(5F]p;']ۃЏ{nvLz_%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ0A7- #~ -q.GCCމ6<0J؈Er%26 ~ *5>HP Y`bgsmr$wz`}~|yv|qle^WNEd<2R(3E\}̾'\ۃЏ|owM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ/A7-#} +p-FBBމ5<0KوFs&37 p *5>HP Y`cgsmr$wz]}~|yv{qle^WNEc<2Q(2D[|ؾ&\ۃя|px?|a'%09CLU\ dj3p u y'|[~h}v{!xsnhUbZRWJ.A7-#| *n,EAA5<0KوFi'49 q *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2P(1CY{׾&\؃ҏ}qy@}b(% 09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7}-#{ )m+D@A5</KڈGj(5: r *5>HPY`egtmr%wz]}~|yvzqle^WNEo<2N(0BXz־ %\؃ҏ}rzA~c)% 09CLU\dj5p u y'|[~h}u{ xsnhSbZRVJ,A7|-#z (l*D@@8</LڈGk6; s * 5> HPY`egumr%wz]}~|yvzqle^WNEn<2](/@Wyվ $\؃ӏ~r{Bd+% 09CLU\dj-pu y(|\~h}u{ xsnh]bZRUJ+A7{-#y 6k)C??8>/LۈHl7< u * 5>HPY`fgvmr&wz]}~|yvyqle^WNEm<2[( .?VxԾ $\كˏs|Cqe,% 09CLU\dj.pu y(|\~g}u{xsnh\b[RTJ*A7z-#x 5j(B>?8>0LۈHm*= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(,>UwӾ  #߇]ك̏wt}DrW-% 0:CL U\dj/puy(|\~g}u{xsnh[b[RSJ)A7y-#v 4x'A=>7=0MۈIm+> w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(;=TvҾ  +߇]ك͏w u~EsX%0:CL U\dj/p uy%|\~g}t{xsnhZb[R_J(A7x-#u 3w&@<=7=0M܈In -? x * 5>HPY`hgwmr'wz^}~|y"vxqle^ WNEj<2X(:LRuѾ *߇]ك͏x!vGtY%0:CL U\dj0p uy%|Z~g}t{xsnhZb[R^J4A7w-#t 2v2?<<7=0M܈Jo!.A y *5>HPY`_gxmr(wz^}~|y!vqke^ WNEi<2W(9Katо)]ڃΏxwHuZ!%0:CL U\dj0p u y%|Z~g}t{xsnhYbZR]J3A7v-#s 1u1K;<7=0I݈Jp!/2 z *5>HPY``gpmr(wz_}~|y!v~qle^ WNEh<2V(8I`~sϾ)]ڃΏyxIw["%09CL U\dj1p u y&|Z~g}s{xsnhXbZR\J2A7-#r 0t0J:;6=0I׈Kp"03  { *5>HP Y`agqmr(wz_}~|y!v}qle^ WNEg<2U(7H_}rξ(]ڃϏzl Jx]#%09~CL U\dj1p u y&|Z~h}s{xsnhWbZR[J1A7-"#q /r/ID:߉6=0J؈Dq#14 } *5>HP Y`agrmr#wz_}~|y v}qle^ WNEf<2T(5G^q;(]ۃϏzmv Ky^$%09CLU\dj2p u y&|[~h}s{xsnhWbZRZJ0A7-!# -q.HCC߉6<0J؈Er$25 ~ *5>HP Y`bgrmr#wz_}~|y v|qle^WNEe<2S(4F]p̾']ۃЏ{nwLz_%%09CLU\dj2p u y&|[~h}w{xsnhVbZRYJ/A7- #~ ,p-GCCމ6<0JوEs%37  *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3E[}˾'\ۃя|oxM{`&%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o,FBBމ5<0KوFi&48 p *5>HP Y`cgsmr$wz]}~|yv{qle^WNEc<2P(2DZ|ؾ&\ۃя|px?|a'%09CLU\dj4p u y'|[~h}v{!xsnhTbZRWJ-A7~-#| *n,EAA5<0KوFj'59 r *5>HP Y`dgtmr%wz]}~|yv{qle^WNEp<2O(1BY{׾%\؃ҏ}qy@~b)% 09CLU\dj4p u y'|[~h}v{ xsnhTbZRVJ,A7}-#{ )m+D@@5</KڈGj6: s *5> HPY`egumr%wz]}~|yvzqle^WNEo<2N(0AXz־ %\؃ҏ~rzAd*% 09CLU\dj-p u y(|\~h}u{ xsnhSbZRUJ+A7|-#y 7l*C?@8</LڈGk߷7; t * 5> HPY`egumr&wz]}~|yvzqle^WNEn<2\(.@Wyվ $\؃ӏ~s{Be+% 09CLU\dj.pu y(|\~g}u{ xsnh\bZRTJ*A7{-#x 6k)B??8>/LۈHl*< u * 5>HPY`fgvmr&wz^}~|yvyqle^WNEm<2[( -?VxԾ $\ك̏t|Dqf,% 09CLU\dj.puy(|\~g}u{xsnh\b[RSJ)A7z-#w 5y(A>>8=0LۈHm+= v * 5>HPY`ggvmr&wz^}~|yvyqle^WNEl<2Z(,>TwӾ  #߇]ك̏w u}ErW-% 0:CL U\dj/puy$|\~g}t{xsnh[b[RRJ(A7y-#v 4x'@=>7=0MۈIn, ? w * 5>HPY`ggwmr'wz^}~|yvxqle^WNEk<2Y(;=SvҾ  *߇]ك͏w!v~FsX%0:CL U\dj/p uy%|Z~g}t{xsnhZb[R_J'A7x-#u 3v3@<=7=0M܈In -@ x *5>HPY`hgxmr'wz^}~|y"vxqke^ WNEj<2X(:KRuѾ*߇]ڃ͏xvGuY %0:CL U\dj0p uy%|Z~g}t{xsnhYb[R^J4A7w-#t 2u2K;<7=0M܈Jo!.A y *5>HPY`_gxmr(wz_}~|y!v~qke^ WNEi<2W(9Jatо)]ڃΏywHv[!%0:CL U\dj0p u y%|Z~g}t{xsnhYbZR]J3A7u-#s 0t1J;<7=0I݈Jp"/2 { *5>HP Y``gqmr(wz_}~|y!v~qle^ WNEh<2V(7I`~sϾ)]ڃΏyl Iw\"%09CL U\dj1p u y&|Z~h}s{xsnhXbZR\J2A7-#q /s0IE;6=0J׈Kq#03  | *5>HP Y`agqmr)wz_}~|y v}qle^ WNEg<2T(6H^}rξ(]ڃϏzlu Jx]#%09CLU\dj1p u y&|Z~h}s{xsnhWbZR[J1A7-"#p .r/HDD߉6=0J؈Dq$15 } *5>HP Y`bgrmr#wz_}~|y v}qle^ WNEf<2S(5G]p;(]ۃЏ{mvKy^$%09CLU\dj2p u y&|[~h}w{xsnhVbZRZJ0A7-!# -q.HCC߉6<0J؈Er$26 ~ *5>HP Y`bgrmr$wz_}~|y v|qle^WNEe<2R(4E\~̾']ۃЏ{nwLz_%%09CLU\dj3p u y&|[~h}v{"xsnhVbZRYJ/A7- #~ ,p-GBBމ6<0KوEs%37  *5>HP Y`cgsmr$wz\}~|yv|qle^WNEd<2Q(3D[}پ&\ۃя|ox>|`'%09CLU\dj3p u y'|[~h}v{!xsnhUbZRXJ.A7-#} +o,FBBމ5<0KوFi&48sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/32000-1-16.wav0000644000175000017500000037205412252354725026154 0ustar miramiraRIFF$WAVEfmt }data M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, sSτfwEËޒ|~°jr"0>0"rj°~|ޒËEwfτSsų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, sSτfwEËޒ|~°jr"0>0"rj°~|ޒËEwfτSsų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, sSτfwEËޒ|~°jr"0>0"rj°~|ޒËEwfτSsų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, sSτfwEËݒ|~°jr"0>0"rj°~|ޒËEwfτSsų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, ߬sSτfwEËݒ|~°jr"0>0"rj°~|ޒËEwfτSsų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, ߬sSτfwEËݒ|~°jr"0>0"rj°~|ޒËEwfτSsų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, ߬sSτfwEËݒ|~°jr"0>0"rj°~{ޒËEwfτSsų M,:G S]goAv1{l~}y=t#mdZ>OB5' BuĴꇊ䀊􍓕ĴvB '5B>OZd#m=ty}l~1{Avog] SG:M, sSτfwEËޒ|~°jr"0>0"sj°~|ޒËEwfτSs߬ų M,:G!S]goAv1{l~}y=t"mdZ>OB5' AuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, ߬sSτfwEËݒ|~°jr"0>0"rj°~{ޒËEwfτSsų M,:G S]goAv1{l~}y=t#mdZ>OB5' BuĴꇊ䀊􍓕ĴvB '5B>OZd#m=ty}l~1{Avog] SG:M, sSτfwEËޒ|~°jr"0>0"sj°~|ޒËEwfτSs߬ų M,:G!S]goAv1{l~}y=t"mdZ>OB5' AuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, ߬sSτfwEËݒ|~°jr"0>0"rj°~{ޒËEwfτSsų M,:G S]goAv1{l~}y=t#mdZ>OB5' BuĴꇊ䀊􍓕ĴvB '5B>OZd#m=ty}l~1{Avog] SG:M, sSτfwEËޒ{~°jr"0>0"sj°~|ޒËEwfτSs߬ų M,:G!S]goAv1{l~}y=t"mdZ>OB5' AuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, ߬sSτfwEËݒ|~°jr"0>0"rj°~{ޒËEwfτSsų M,:G S]goAv1{l~}y=t#mdZ>OB5' BuĴꇊ䀊􍓕ĴvB '5B>OZd#m=ty}l~1{Avog] SG:M, sSτfwEËݒ|~ðjs"0>0"si°~|ޒËEwfτSs߬Ų N,:G!S]goAv1{l~}y=t#mdZ>OB5' AuĴꇊ䀊ĴvA '5B>OZd#m=ty}l~1{Avog]!SG:N, ߬sSτfwEËޒ|~°jr"0>0"sj°~|ݒËEwfτSs߬ų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴvB '5B>OZd#m=ty}l~1{Avog] SG:M, sSτfwEËޒ{~°jr"0>0"rj °~{ޒËEwfτSsų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, sSτfwEËݒ{~° jr"0>0"rj°{ޒËEwfτSsų M,:G!S]goAv1{l~}y=t#mdZ>OB5' AvĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, ߬sSτfwEËݒ|~ðjs"0>0"si°~|ޒËEwfτSs߬Ų N,:G!S]goAv1{l~}y=t#mdZ>OB5' AuĴꇊ䀊ĴvA '5B>OZd#m=ty}l~1{Avog]!SG:N, ߬sSτfwEËޒ|~°js"0>0"sj°~|ݒËEwfτSs߬ų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴvB '5B>OZd#m=ty}l~1{Avog] SG:M, sSτfwEËޒ{~°jr"0>0"rj °~{ޒËEwfτSsų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, sSτfwEËݒ{~° jr"0>0"rj°{ޒËEwfτSsų M,:G!S]goAv1{l~}y=t#mdZ>OB5' BvĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, ߬sSτfwEËݒ|~ðjs"0>0"si°~|ޒËEwfτSs߬ų N,:G!S]goAv1{l~}y=t#mdZ>OB5' AuĴꇊ䀊ĴvA '5B>OZd#m=ty}l~1{Avog]!SG:N, ߬sSτfwEËޒ|~°js"0>0"sj°~|ݒËEwfτSs߬ų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴvB '5B>OZd#m=ty}l~1{Avog] SG:M, sSτfwEËޒ{°jr"0>0"rj °~{ޒËEwfτSsų M,:G S]goAv1{l~}y=t"mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, sSτfwEËݒ{~° jr"0>0"rj°{ޒËEwfτSsų M,:G!S]goAv1{l~}y=t#mdZ>OB5' BvĴꇊ䀊􍓕ĴuB '5B>OZd"m=ty}l~1{Avog] SG:M, ߬sSτfwEËݒ|~ðjs"0>0"si°~|ޒËEwfτSs߬ų N,:G!S]goAv1{l~}y=t#mdZ>OB5' AuĴꇊ䀊ĴvA '5B>OZd#m=ty}l~1{Avog]!SG:N, ߬sSτfwEËޒ|~°js"0>0"sj°~|ݒËEwfτSs߬ų M,:G S]goAv1{l~}y=t"mdZ>OB5' Bvôꇊ䀋􍓕ŴvA '5B>OZd"m=ty}k~1{Avog] SG:N, sSτfwEËݒ|°is"0>0"rj ð~{ޒËEvfτSs߬ų M,:G!S]go@v1{l~}y=t"mdZ=OB5' BtĴꇊ䀋􍓕ĴuA '5B>OZd#m=ty}k~1{Avog] SG:N,  rSτfwEËޒ|~°ks"0>0"rj ~{ޒËEvfτSs߬ų M,:G!S]goAv1{l~}y=t#mdZ=OB5' BuĴꇊ䀊􍓕ĴuC '5B>OZd#m=ty}l~1{Avog] SG:L, sSτfwE‹ޒ|~°js"0>;KVUamj rxv|v|x rmjTaV;K>0"sj °~|ޒËDwfτSsų M,:G!S]goAv1{l~}y=t#mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd#m=ty}l~1{Avog]!SG:M, sSτfwDËޒ|~° js"0>=KVTamj rxv|v|x rmjUaV;K>0"sj°~|ޒ‹EwfτSsŲ L,:G S]goAv1{l~}y=t#mdZ>OB5' CuĴꇊ䀊􍔕ĴuB '5B=OZd#m=ty}l~1{Avog]!SG:M, ߬sSτfvEËޒ{~ jr"0>=KVTamj rxv|u|x rmjUaV0"si°~|ޒËEwfτSrŲ N,:G S]goAv1{k~}y=t#mdZ>OB5' AuĴꇋ䀊ĴvB '5B=OZd"m=ty}l~1{@vog]!SG:M, ߬sSτfvEËݒ{~ð jr"0>0"si°|ݒËEwfτSsŴ N,:G S]goAv1{k~}y=t"mdZ>OB5' AvŴꇋ䀊ôvB '5B?OZd"m=ty}l~1{Avog]!SG:M, ߬sSτfwEËݒ{ðjr"0>0"ri°{ݒËEwfτRs߬ų N,:G S]goAv1{l~}y=t"mdZ>OB5' AvŴ뇊䀊ŴvA '5B>OZd"m=ty}l~1{Avog] SG:N, ߬sRτfwEËݒ{°ir"0>0"rjð{ݒËEwfτSs߬ų M,:G!S]goAv1{l~}y=t"mdZ?OB5' Bvôꇊ䀋􍓕ŴvA '5B>OZd"m=ty}k~1{Avog] SG:N, sSτfwEËݒ|°is"0>0"rj ð~{ޒËEvfτSs߬ų M,:G!S]go@v1{l~}y=t"mdZ=OB5' BtĴꇊ䀋􍓕ĴuA '5B>OZd#m=ty}k~1{Avog] SG:N,  rSτfwEËޒ|~°ks"0>0"rj ~{ޒËEvfτSs߬ų M,:G!S]goAv1{l~}y=t#mdZ=OB5' BuĴꇊ䀊􍓕ĴuC '5B>OZd#m=ty}l~1{Avog] SG:L, sSτfwE‹ޒ|~°js"0>;KVUamj rxv|v|x rmjTaV=K>0"sj °~|ޒËDwfτSsų M,:G!S]goAv1{l~}y=t#mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd#m=ty}l~1{Avog]!SG:M, sSτfwDËޒ|~° js"0>=KVTamj rxv|v|x rmjUaV;K>0"sj°~|ޒ‹EwfτSsŲ L,:G S]goAv1{l~}y=t#mdZ>OB5' CuĴꇊ䀊􍔕ĴuB '5B=OZd#m=ty}l~1{Avog]!SG:M, ߬sSτfvEËޒ{~ jr"0>=KVTamj rxv|u|x rmjUaV0"sk°~|ޒËEwfτSrŲ N,:G S]goAv1{k~}y=t#mdZ>OB5' AuĴꇋ䀊ĴvB '5B=OZd"m=ty}l~1{@vog]!SG:M, ߬sSτfvEËޒ{~ð jr"0>0"si°|ݒËEwfτSsŴ N,:G S]goAv1{k~}y=t"mdZ>OB5' AvŴꇋ䀊ôvB '5B?OZd"m=ty}l~1{Avog]!SG:M, ߬sSτfwEËݒ{ðjr"0>0"ri°{ݒËEwfτRs߬ų N,:G S]goAv1{l~}y=t"mdZ>OB5' AvŴ뇊䀊ŴvA '5B>OZd"m=ty}l~1{Avog] SG:N, ߬sRτfwEËݒ{°ir"0>0"rjð{ݒËEwfτSs߬ų M,:G!S]goAv1{l~}y=t"mdZ?OB5' Bvôꇊ䀋􍓕ŴvA '5B>OZd"m=ty}k~1{Avog] SG:N, sSτfwEËݒ|°is"0>0"rj ð~{ޒËEvfτSs߬ų M,:G!S]go@v1{l~}y=t"mdZ=OB5' BvĴꇊ䀋􍓕ĴuA '5B>OZd#m=ty}k~1{Avog] SG:N,  rSτfwEËޒ|~°ks"0>0"rj ~{ޒËEvfτSs߬ų M,:G!S]goAv1{l~}y=t#mdZ=OB5' BuĴꇊ䀊􍓕ĴuC '5B>OZd#m=ty}l~1{Avog] SG:L, sSτfwE‹ޒ|~°js"0>;KVUamj rxv|v|x rmjTaV=K>0"sj °~|ޒËDwfτSsų M,:G!S]goAv1{l~}y=t#mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd#m=ty}l~1{Avog]!SG:M, sSτfwDËޒ|~° js"0>=KVTamj rxv|v|x rmjUaV;K>0"sj°~|ޒ‹EwfτSsŲ L,:G S]goAv1{l~}y=t#mdZ>OB5' CuĴꇊ䀊􍔕ĴuB '5B=OZd#m=ty}l~1{Avog]!SG:M, ߬sSτfvEËޒ{~ jr"0>=KVTamj rxv|u|x rmjUaV0"sk°~|ޒËEwfτSrŲ N,:G S]goAv1{k~}y=t#mdZ>OB5' AuĴꇋ䀊ĴtB '5B=OZd"m=ty}l~1{@vog]!SG:M, ߬sSτfvEËޒ{~ð jr"0>0"si°|ݒËEwfτSsŴ N,:G S]goAv1{k~}y=t"mdZ>OB5' AvŴꇋ䀊ôvB '5B?OZd"m=ty}l~1{Avog]!SG:M, ߬sSτfwEËݒ{ðjr"0>0"ri°{ݒËEwfτRs߬ų N,:G S]goAv1{l~}y=t"mdZ>OB5' AvŴ뇊䀊ŴvA '5B>OZd"m=ty}l~1{Avog] SG:N, ߬sRτfwEËݒ{°ir"0>0"rjð{ݒËEwfτSs߬ų M,:G!S]goAv1{l~}y=t"mdZ?OB5' Bvôꇊ䀋􍓕ŴvA '5B>OZd"m=ty}k~1{Avog] SG:N, sSτfwEËݒ|°is"0>0"rj ð~{ݒËEvfτSs߬ų M,:G!S]go@v1{l~}y=t"mdZ=OB5' BvĴꇊ䀋􍓕ĴuA '5B>OZd#m=ty}k~1{Avog] SG:N, rSτfwEËޒ|~°is"0>0"rj ð~{ޒËEvfτSs߬ų M,:G!S]goAv1{l~}y=t#mdZ=OB5' BuĴꇊ䀊􍓕ĴuC '5B>OZd#m=ty}l~1{Avog] SG:L, sSτfwE‹ޒ|~°js"0>;KVUamj rxv|v|x rmjTaV=K>0"sj °~|ޒËDwfτSsų M,:G!S]goAv1{l~}y=t#mdZ>OB5' BuĴꇊ䀊􍓕ĴuB '5B>OZd"m;KVSanj rxv|v|x rljSaV;K>0" qi°~|ޒËEwfτSs߬Ŵ L,:GS]goAv1{l~}yOB5' AuĴꇊ䀊􍓕ŴvB '5B?OZd#m=ty}k~0{@vog]!SG:O, tRτfvD‹ݒ}ð jr"0>=KVTamj rxu|u|x rmjUaV=K>0"sk İ}{ݒËEwfτTtŲ N,:G S]go@v1{l~}y=t#mdZty}l~1{Avog]SG:M,  ߬sSЄfwEËޒ{~ht "0>;KVUanj rxv|v|x rljTaV0"qi°|ޒċEvfτSrެŴ L,:G"S]goAv1{k~}y=t"mdZ>OB5' AvŴꇊ䀊􍒕ŴvB '5B?OZd"m=ty}k~1{Avog]!SG:K, rRτfvD‹ޒ|ðjr"0>K>0"sk!}{ݒËEwfЄSs߬Ų N,:G S]goAv1{l~}y>t#mdZ=OB5' Ctô뇋䀋ôtC '5B=OZd#m>ty}l~1{Avog] SG:N, ߬sSЄfwEËݒ{}!kt"0>:KVUamj rxv|v|x rljTaV0"rjð|ޒ‹DvfτRrų L,:G!S]goAv1{k~}y=t"mdZ?OB5' BvŴꇊ䀊􍔕ŴvA '5B>OZd"m=ty}k~1{Avog]"SG:L, ެrSτfvEċޒ|°iq"0>0" tl~{ݒËEwfЄSs߬ű! M,:G S]goAv1{l~}y>t#mdZ=OB5' @tĴ뇋䀋􍓕ôtC '5B=KVUamj rxu|u|x rmjTaV=K>0"rj ð}ݒ‹DvfτRtų O,:G!S]go@v0{k~}y=t#mdZ?OB5' BvŴꇊ䀊ĴuA '5B>OZd"m;KVSalj rxv|v|x rnjSaV;K>0" qh°~|ޒËEwfτSs߬Ŵ  M,:GS]goAv1{l~}yOB5' @uĴ뇊䀊􍓕ƴwB '5B?OZd#m=ty}l~0{@vog]!SG:N, tRτfwD‹ݒzð js"0>=KVTamj rxu|u|x rmjTaV=K>0"sj ðzݒ‹EwfτTtŲ N,:G S]go@v0{l~}y=t#mdZ?OB5' Cwôꇊ䀊Ĵu@ '5B=OZd"m>ty}l~1{Avog]SG:M,  ߬sSЄfwEËޒ{~ht "0>;KVVanj rxv|v|x rljSaV0"qi°~|ޒËEvfτSrެŴ L,:G"S]goAv1{k~}y=t"mdZ>OB5' AuĴꇊ䀊􍒕ŴvB '5B?OZd"m=ty}k~0{@vog]!SG:O, rRτfvD‹ߒ}ð jr"0>0"sk!İ}{ݒËEwfτTtŲ N,:G S]goBv1{l~}y=t#mdZ=OB5' Ctôꇋ䀋ôt@ '5B=OZd#m>ty}l~1{Avog] SG:M, ߬sSЄfwEËݒ{}kt"0>;KVUamj rxv|v|x rljTaV0"ri°|ޒċDvfτRrŴ L,:G!S]goAv1{k~}y=t"mdZ>OB5' AvŴꇊ䀊􍒕ŴvA '5B>OZd"m=ty}k~1{Avog]!SG:L, rRτfvDċޒ|°ir"0>0"tk}{ݒËEwfЄSs߬ű M,:G S]goAv1{l~}y>t#mdZ=OB5' Dtô뇋䀋􍓕ôtC '5B=OZd#m=ty}l~1{Avog] SG:N, sTτfwEËݒ{}!ks"0>=KVUamj rxv|u|x rljTaV0"rj ð|ߒ‹DvfτRrų O,:G!S]go@v0{k~}y=t"mdZ?OB5' BvŴꇊ䀊ĴuA '5B>OZd"m=ty}k~1{Avog]"SG:L, ެrSτfvEËޒ|~°iq"0>0" th~{ޒËEwfЄSs߬ű  M,:GS]goAv1{l~}y>t!mdZ=OB5' @uĴ뇋䀊􍓕ôwC '5B?OZd#m=ty}l~1{@vog] SG:N, tTτfwEËݒzð js"0>=KVUamj rxu|u|x rmjTaV=K>0"rj ð}ݒ‹DwfτRtų O,:G!S]go@v0{l~}y=t#mdZ?OB5' Bwƴꇊ䀊ĴuA '5B>OZd"m;KVSanj rxv|v|x rljSaV;K>0" qi°~|ޒËEwfτSs߬Ŵ L,:GS]goAv1{l~}yOB5' AuĴꇊ䀊􍓕ŴvB '5B?OZd#m=ty}k~0{@vog]!SG:O, tRτfvD‹ݒ}ð jr"0>=KVTamj rxu|u|x rmjUaV=K>0"sk ð}{ݒËEwfτTtŲ N,:G S]go@v1{l~}y=t#mdZty}l~1{Avog]SG:M,  ߬sSЄfwEËޒ{~ht "0>;KVUanj rxv|v|x rljTaV0"qi°~|ޒċEvfτSrެŴ L,:G"S]goAv1{k~}y=t"mdZ>OB5' AvŴꇊ䀊􍒕ŴvB '5B?OZd"m=ty}k~0{Avog]!SG:K, rRτfvD‹ޒ|ðjr"0>K>0"sk!}{ݒËEwfЄSs߬Ų N,:G S]goAv1{l~}y>t#mdZ=OB5' Ctô뇋䀋ôtC '5B=OZd#m>ty}l~1{Avog] SG:N, ߬sSЄfwEËݒ{}!kt"0>:KVUamj rxv|v|x rljTaV0"rið|ޒ‹DvfτRrų L,:G!S]goAv1{k~}y=t"mdZ>OB5' BvŴꇊ䀊􍔕ŴvA '5B>OZd"m=ty}k~1{Avog]"SG:L, ެrSτfvDċޒ|°iq"0>0" tl~{ݒËEwfЄSs߬ű! M,:G S]goAv1{l~}y>t#mdZ=OB5' @tô뇋䀋􍓕ôtC '5B=KVUamj rxu|u|x rljTaV=K>0"rj ð}ݒ‹DvfτRtų O,:G!S]go@v0{k~}y=t#mdZ?OB5' BvŴꇊ䀊ĴuA '5B>OZd"m;KVSalj rxv|v|x rnjSaV;K>0" qh°~|ޒËEwfτSs߬Ŵ  M,:GS]goAv1{l~}y>t"mdZ=OB5' @uĴ뇊䀊􍓕ƴwB '5B?OZd#m=ty}l~0{@vog]!SG:N, tRτfwE‹ݒzð js"0>=KVTamj rxu|u|x rmjTaV=K>0"sj ðzݒ‹EwfτTtŲ N,:G S]go@v0{l~}y=t#mdZ?OB5' Cw´ꇊ䀊Ĵu@ '5B=OZd"m>ty}l~1{Avog]SG:M,  ߬sSЄfwEËޒ{~ht "0>;KVSanj rxv|v|x rljSaV;K>0"qi°~|ޒËEvfτSrެŴ L,:G"S]goAv1{k~}yOB5' AuĴꇊ䀊􍒕ŴvB '5B?OZd"m=ty}k~0{@vog]!SG:O, rRτfvD‹ߒ}ð jr"0>0"sk!İ}{ݒËEwfτTtŲ N,:G S]goBv1{l~}y=t#mdZ=OB5' Ctôꇋ䀋ôt@ '5B=OZd#m>ty}l~1{Avog] SG:M, ߬sSЄfwEËݒ{~kt"0>;KVUamj rxv|v|x rljTaV0"ri°|ޒċDvfτRrŴ L,:G!S]goAv1{k~}y=t"mdZ>OB5' AvŴꇊ䀊􍒕ŴvB '5B>OZd"m=ty}k~1{Avog]!SG:L, rRτfvDċޒ|°ir"0>0"tk}{ݒËEwfЄSs߬ű M,:G S]goAv1{l~}y>t#mdZ=OB5' Dtô뇋䀋ôtC '5B=OZd#m=ty}l~1{Avog] SG:N, sTτfwEËݒ{}!ks"0>=KVUamj rxv|u|x rljTaV0"rj ð|ߒ‹DvfτRrų O,:G!S]go@v0{k~}y=t"mdZ?OB5' BvŴꇊ䀊󍔕ĴuA '5B>OZd"m=ty}k~1{Avog]"SG:L, ެrSτfvEËޒ|~°iq"0>0" th~{ޒËEwfЄSs߬ű  M,:GS]goAv1{l~}y>t!mdZ=OB5' @uĴ뇋䀊􍓕ôwC '5B?OZd#m=ty}l~1{@vog] SG:N, tTτfwEËݒ{ð ks"0>=KVUamj rxu|u|x rmjTaV=K>0"rj ð}ݒ‹DwfτRtų O,:G!S]go@v0{l~}y=t#mdZ?OB5' Bwƴꇊ䀊ĴuA '5B>OZd"m;KVSanj rxv|v|x rnjSaV;K>0" qi°~|ޒËEwfτSs߬Ŵ L,:GS]goAv1{l~}yOB5' AuĴꇊ䀊􍓕ŴwB '5B?OZd#m=ty}k~0{@vog]!SG:O, tRτfvD‹ݒ}ð jr"0>=KVTamj rxu|u|x rmjUaV=K>0"sk ð}{ݒËEwfτTtŲ N,:G S]go@v1{l~}y=t#mdZty}l~1{Avog]SG:M,  ߬sSЄfwEËޒ{~ht "0>;KVUanj rxv|v|x rljSaV0"qi°~|ޒËEvfτSrެŴ L,:G"S]goAv1{k~}y=t"mdZ>OB5' AuĴꇊ䀊􍒕ŴvB '5B?OZd"m=ty}k~0{Avog]!SG:K, rRτfvD‹ޒ|ðjr"0>K>0"sk!}{ݒËEwfЄSsŲ N,:G S]goAv1{l~}y>t#mdZ=OB5' Ctô뇋䀋ôtC '5B=OZd#m>ty}l~1{Avog] SG:N, ߬sSЄfwEËݒ{}!kt"0>:KVUamj rxv|v|x rljTaV0"ri°|ޒċDvfτRrų L,:G!S]goAv1{k~}y=t"mdZ>OB5' BvŴꇊ䀊􍔕ŴvA '5B>OZd"m=ty}k~1{Avog]"SG:L, ެrSτfvDċޒ|°iq"0>0" tl~{ݒËEwfЄSs߬ű! M,:G S]goAv1{l~}y>t#mdZ=OB5' @tô뇋䀋􍓕ôtC '5B=KVUamj rxu|u|x rljTaV0"rj ð}ݒ‹DvfτRrų O,:G!S]go@v0{k~}y=t#mdZ?OB5' BvŴꇊ䀊ĴuA '5B>OZd"m;KVSalj rxv|v|x rnjSaV;K>0" qh°~{ޒËEwfτSs߬Ŵ  M,:GS]goAv1{l~}y>t"mdZ=OB5' @uĴ뇊䀊􍓕ƴwB '5B?OZd#m=ty}l~0{@vog]!SG:N, tTτfwE‹ݒzð js"0>=KVTamj rxu|u|x rmjTaV=K>0"sj ðzݒ‹EwfτTtŲ N,:G!S]go@v0{l~}y=t#mdZ?OB5' Cw´ꇊ䀊Ĵu@ '5B=OZd"m>ty}l~1{Avog]SG:M,  ߬sSЄfwEËޒ{~ht "0>;KVSanj rxv|v|x rljSaV;K>0"qi°~|ޒËEvfτSsެŴ L,:G"S]goAv1{l~}yOB5' AuĴꇊ䀊􍒕ŴvB '5B?OZd"m=ty}k~0{@vog]!SG:O, rRτfvD‹ݒ}ð jr"0>0"sk!İ}{ݒËEwfτTtŲ N,:G S]go@v1{l~}y=t#mdZty}l~1{Avog] SG:M, ߬sSЄfwEËݒ{~kt "0>;KVUamj rxv|v|x rljTaV0"qi°|ޒċDvfτSrŴ L,:G!S]goAv1{k~}y=t"mdZ>OB5' AvŴꇊ䀊􍒕ŴvB '5B>OZd"m=ty}k~1{Avog]!SG:L, rRτfvDċޒ|°ir"0>0"tk}{ݒËEwfЄSs߬ű M,:G S]goAv1{l~}y>t#mdZ=OB5' Dtô뇋䀋ôtC '5B=OZd#m>ty}l~1{Avog] SG:N, sTЄfwEËݒ{}!ks"0>=KVUamj rxv|u|x rljTaV0"rj ð|ߒ‹DvfτRrų O,:G!S]go@v0{k~}y=t"mdZ?OB5' BvŴꇊ䀊󍔕ĴuA '5B>OZd"m=ty}k~1{Avog]"SG:L, ެrSτfvEËޒ|~°iq"0>0" th~{ޒËEwfЄSs߬ű  M,:GS]goAv1{l~}y>t!mdZ=OB5' @uĴ뇋䀊􍓕ôwC '5B?OZd#m=ty}l~1{@vog] SG:N, tTτfwEËݒ{}ð ks"0>=KVUamj rxu|u|x rmjTaV=K>0"rj ð}ݒ‹DwfτRtų O,:G!S]go@v0{l~}y=t#mdZ?OB5' BwŴꇊ䀊ĴuA '5B>OZd"m;KVSanj rxv|v|x rnjSaV;K>0" qi°~|ޒËEwfτSs߬Ŵ M,:GS]goAv1{l~}yOB5' AuĴ뇊䀊􍓕ŴwB '5B?OZd#m=ty}k~0{@vog]!SG:O, tRτfwD‹ݒ}ð jr"0>=KVTamj rxu|u|x rmjUaV=K>0"sk ð}{ݒËEwfτTtŲ N,:G S]go@v1{l~}y=t#mdZty}l~1{Avog]SG:M,  ߬sSЄfwEËޒ{~ht "0>;KVUanj rxv|v|x rljSaV0"qi°~|ޒËEvfτSrެŴ L,:G"S]goAv1{k~}y=t"mdZ>OB5' AuĴꇊ䀊􍒕ŴvB '5B?OZd"m=ty}k~0{@vog]!SG:K, rRτfvD‹ޒ|ðjr"0>0"sk!}{ݒËEwfЄSsŲ N,:G S]goAv1{l~}y>t#mdZ=OB5' Ctô뇋䀋ôtC '5B=OZd#m>ty}l~1{Avog] SG:M, ߬sSЄfwEËݒ{}!kt"0>:KVUamj rxv|v|x rljTaV0"ri°|ޒċDvfτRrų L,:G!S]goAv1{k~}y=t"mdZ>OB5' BvŴꇊ䀊􍔕ŴvA '5B>OZd"m=ty}k~1{Avog]"SG:L, ެrSτfvDċޒ|°iq"0>0" tk~{ݒËEwfЄSs߬ű! M,:G S]goAv1{l~}y>t#mdZ=OB5' @tô뇋䀋􍓕ôtC '5B=KVUakj rxu|v|x rljWaV9K>0"  rf zߒ‹FvfτRtůO,:GS]goBv0{l~}y?t#mdZty}l~1{?vog]SG:P, uSτfvE‹ޒy~Űlq "0>?KVValj rxv|v|x rkjVaV>K>0" qlŰ~~ޒEvfτSuű Q,:GS]go@v1{k~}y>t"mdZAOB5' @uǴ뇊䀊􍕕´wC '5B:KVRamj rxv|u|x rojTaV=K>0" ojð}}ݒċEwfЄTqݬŲ" K,:G!S^go@v1{k~}y=t!mdZ?OB5' ?sƴꇊ䀋ĴxD '5B=OZd$m;KVSanj rxu|u|x rnjSaV;K>0"ui"°{|ܒËDwf΄UsެŴ L,:G"S]goAv2{l~}yOB5' EyĴꇋ䀋Ŵs> '5B?OZd m=ty}k~1{@vog]!SG:K, "ݬrTЄfwDċݒ}|ðjv"0>0" sg!{ߒËFwfτRtŶ N,:G#S]goBv0{l~}yty}k~1{@vog] SG:I,!qSЄfvEݒ~~İkp  "0>>KVUakj rxv|v|x rljVaV?K>0" qmzޒ‹EvfτSuŰP,:GS]goBv1{l~}y>t"mdZ;OB5' Av뇊倊􍔕´vB '5B;OZd"m>ty}l~1{Bvog]SG:O,tRτfvE‹ޒzmr "0>9KVValj rxv|v|x rkjUaV>K>0" pkİ}}ݒŋEvfЄSqű!J,:G S]go@v1{k~}y>t!mdZ@OB5' @tƴ뇊䀋 ôwC '5B=OZd#m:KVRamj rxv|u|x rojTaV0"vjð||ܒċDwfЄTrެų# K,:G!S]go@v2{k~}y=t$mdZ?OB5' >sŴꇋ䀋ĴrE '5B>OZd$m=ty}k~2{Avog]"SG:L, ެrU΄fwDËܒ||°"iu"0>0"th!{ےËDwf΄Qs߬ŵ M,:G"S]goAv0{l~}y=KVUakj rxu|v|x rmjRaV9K>0"  rf zߒ‹FwfτRtŶO,:GS]goBv0{l~}y?t#mdZty}l~1{?vog]SG:P, uSτfvE‹ޒy~Űlq "0>>KVValj rxv|v|x rljVaV>K>0" qlŰ~yޒ‹EvfτSuű P,:GS]go?v1{l~}y>t"mdZAOB5' Au뇊䀊􍕕´wB '5B9KVRamj rxv|u|x rkjUaV=K>0" okð}}ݒċEwfЄTqݬŲ" J,:G S^go@v1{k~}y=t!mdZ?OB5' ?sƴꇊ䀋!ĴxD '5B=OZd$m;KVSanj rxu|u|x rnjSaV0"ui"°||ܒËDwf΄UrެŴ L,:G"S]goAv2{k~}y=t$mdZ>OB5' ErĴꇋ䀋Ŵs> '5B?OZd$m=ty}k~2{@vog]!SG:K, #ެrTЄfwDċܒ||ðjv"0>0" sg!{ߒËDwfτRsŵ N,:G#S]goAv0{l~}yty}k~1{@vog] SG:J,!qSЄfvEŋݒ}}İkp "0>>KVUakj rxv|v|x rljVaV9K>0" rmzޒ‹EvfτRtŰO,:GS]goBv1{l~}y>t"mdZ;OB5' Bv´뇊倊􍔕vA '5B;OZd"m>ty}l~1{Bvog]SG:P,uSτfvE‹ޒzmq "0>?KVValj rxv|v|x rkjUaV>K>0"  pkİ~~ݒEvfЄSqű!I,:G S]go@v1{k~}y>t!mdZ@OB5' @tǴ뇊䀋􍕕 ôwC '5B:KVRamj rxv|u|x rojTaV0"vjð|}ݒċDwfЄTrݬų" K,:G!S]go@v1{k~}y=t mdZ?OB5' >sŴꇋ䀋ĴyE '5B>OZd$m;KVSanj rxu|u|x rnjSaV;K>0"th"{ܒËDwf΄Qs߬ŵ M,:G"S]goAv0{l~}y=KVTaoj rxu|v|x rmjRaV:K>0"  sg zߒ‹FwfτRtŶ N,:GS]goBv0{l~}yty}k~1{@vog]SG:Q, uSτfvEޒ~~Űlq "0>>KVVakj rxv|v|x rljVaV?K>0" qlŰ~yޒ‹EvfτSuŰ P,:GS]go?v1{l~}y>t"mdZAOB5' Au뇊䀊􍕕´vB '5B9KVWalj rxv|u|x rkjUaV=K>0" okİ}}ݒċEvfЄTqݬŲ! J,:G S^go@v1{k~}y=t!mdZ@OB5' ?tƴꇊ䀋 ôxD '5B=OZd#m;KVSamj rxu|u|x rnjTaV0"ui"°||ܒċDwfЄTrެŴ L,:G"S]goAv2{k~}y=t$mdZ>OB5' ErŴꇋ䀋ŴrE '5B>OZd$m=ty}k~2{Avog]!SG:L, ެrTЄfwDċܒ||°iv"0>0"th!{ߒËDwfτQs߬ŵ M,:G#S]goAv0{l~}yty}k~1{@vog^ SG:J, !ܬqSЄfvEċݒ}}İkp "0>=KVUakj rxv|v|x rljWaV9K>0"  rmzޒ‹FvfτRtůO,:GS]goBv0{l~}y?t"mdZ;OB5' Bv´뇊倊􍔕uA '5B;OZd"m>ty}l~1{?vog]SG:P,uSτfvE‹ޒy~Űmq "0>?KVValj rxv|v|x rkjUaV>K>0" plİ~~ޒEvfЄSqű Q,:GS]go@v1{k~}y>t!mdZ@OB5' @uǴ뇊䀊􍕕 ôwC '5B:KVRamj rxv|u|x rojTaV=K>0"vjð|}ݒċDwfЄTrݬų" K,:G!S^go@v1{k~}y=t!mdZ?OB5' >sŴꇉ䀋ĴyD '5B>OZd$m;KVSanj rxu|u|x rnjSaV;K>0"uh"°|ܒËDwf΄Us߬Ŵ M,:G"S]goAv0{l~}yOB5' DxĴꇋ䀉Ŵs> '5B?OZd!m=ty}k~1{@vog^!SG:K, "ݬrTЄfwDċݒ}}ðjv"0>=KVTaoj rxu|v|x rmjRaV:K>0" sg {ߒËFwfτRtŶ N,:G#S]goBv0{l~}yty}k~1{@vog]SG:Q, qSЄfvEޒ~~İlp "0>>KVUakj rxv|v|x rljVaV?K>0" qmŰ~yޒ‹EvfτSuŰP,:GS]go?v1{l~}y>t"mdZ;OB5' Au뇊䀊􍕕´vB '5B9KVWalj rxv|v|x rkjUaV=K>0" pkİ}}ݒċEvfЄTqݬŲ! J,: G S^go@v1{k~}y>t!mdZ@OB5' ?tƴ뇊䀋 ôxD '5B=OZd#m:KVSamj rxw|u|x rnjTaV0"ui#°||ܒċDwfЄTrެų L,:G!S]goAv2{k~}y=t$mdZ>OB5' ErŴꇋ䀋ŴrE '5B>OZd$m=ty}k~2{Avog]!SG:L, ެrTЄfwDċܒ||°#iu"0>0"th!{ËDwfτQs߬ŵ M,:G#S]goAv0{l~}y=KVUakj rxu|v|x rljWaV9K>0"  rf zߒ‹FvfτRtůO,:GS]goBv0{l~}y?t"mdZty}l~1{?vog]SG:P, uSτfvE‹ޒy~Űlq "0>?KVValj rxv|v|x rkjVaV>K>0" plŰ~~ޒEvfЄSuű Q,:GS]go@v1{k~}y>t"mdZAOB5' @uǴ뇊䀊􍕕 ´wC '5B:KVRamj rxv|u|x rojTaV=K>0"ojð}}ݒċEwfЄTrݬŲ" K,:G!S^go@v1{k~}y=t!mdZ?OB5' ?sƴꇉ䀋ĴxD '5B=OZd$m;KVSanj rxu|u|x rnjSaV;K>0"ui"°|ܒËDwf΄UsެŴ L,:G"S]goAv2{l~}yOB5' EyĴꇋ䀋Ŵs> '5B?OZd m=ty}k~1{@vog]!SG:K, "ݬrTЄfwDċݒ}|ðjv"0>0" sg!{ߒËFwfτRtŶ N,:G#S]goBv0{l~}yty}k~1{@vog] SG:Q,!qSЄfvEݒ~~İlp  "0>>KVUakj rxv|v|x rljVaV?K>0" qmzޒ‹EvfτSuŰP,:GS]goBv1{l~}y>t"mdZ;OB5' Av뇊倊􍔕´vB '5B;OZd"m>ty}l~1{Bvog]SG:O,tRτfvE‹ޒzmr "0>9KVValj rxv|v|x rkjUaV>K>0" pkİ}}ݒŋEvfЄSqŲ!J,:G S]go@v1{k~}y>t!mdZ@OB5' @tƴ뇊䀋 ôwC '5B=OZd#m:KVRamj rxv|u|x rojTaV0"vjð||ܒċDwfЄTrެų K,:G!S]goAv2{k~}y=t$mdZ?OB5' >sŴꇋ䀋ĴrE '5B>OZd$m=ty}k~2{Avog]"SG:L, ެrU΄fwDËܒ||°"iu"0>0"th!{ےËDwf΄Qs߬ŵ M,:G"S]goAv0{l~}y=KVUakj rxu|v|x rmjRaV9K>0"  rf zߒ‹FvfτRtŶO,:GS]goBv0{l~}y?t#mdZty}l~1{?vog]SG:P, uSτfvE‹ޒy~Űlq "0>?KVValj rxv|v|x rljVaV>K>0" qlŰ~yޒ‹EvfτSuű P,:GS]go?v1{l~}y>t"mdZAOB5' AuǴ뇊䀊􍕕´wB '5B9KVRamj rxv|u|x rkjUaV=K>0" okð}}ݒċEwfЄTqݬŲ" J,:G S^go@v1{k~}y=t!mdZ?OB5' ?sƴꇊ䀋!ĴxD '5B=OZd$m;KVSanj rxu|u|x rnjSaV0"ui"°||ܒËDwf΄UrެŴ L,:G"S]goAv2{k~}y=t$mdZ>OB5' ErĴꇋ䀋Ŵs> '5B?OZd$m=ty}k~2{@vog]!SG:K, #ެrTЄfwDċܒ||ðjv"0>0" sg!{ߒËDwfτRsŶ N,:G#S]goAv0{l~}yty}k~1{@vog] SG:J,!qSЄfvEݒ~}İkp "0>>KVUakj rxv|v|x rljVaV9K>0" rmzޒ‹EvfτRtŰO,:GS]goBv1{l~}y>t"mdZ;OB5' Bv´뇊倊􍔕vA '5B;OZd"m>ty}l~1{Bvog]SG:P,uRτfvE‹ޒzmr "0>?KVValj rxv|v|x rkjUaV>K>0" pkİ~~ݒEvfЄSqű!J,:G S]go@v1{k~}y>t!mdZ@OB5' @tǴ뇊䀋􍕕 ôwC '5B=OZd#m:KVRamj rxv|u|x rojTaV0"vjð|}ܒċDwfЄTrެų" K,:G!S]go@v2{k~}y=t mdZ?OB5' >sŴꇋ䀋ĴyE '5B>OZd$m;KVSanj rxu|u|x rnjSaV;K>0"th"{ܒËDwf΄Qs߬ŵ M,:G"S]goAv0{l~}y=KVTakj rxu|v|x rmjRaV:K>0"  sg zߒ‹FwfτRtŶ N,:GS]goBv0{l~}yty}l~1{@vog]SG:P, uSτfvE‹ޒ~~Űlq "0>>KVValj rxv|v|x rljVaV?K>0" qlŰ~yޒ‹EvfτSuŰ P,:GS]go?v1{l~}y>t"mdZAOB5' Au뇊䀊􍕕´vB '5B9KVWalj rxv|u|x rkjUaV=K>0" okİ}}ݒċEvfЄTqݬŲ! J,:G S^go@v1{k~}y=t!mdZ@OB5' ?tƴꇊ䀋 ôxD '5B=OZd#m;KVSamj rxu|u|x rnjTaV0"ui"°||ܒċDwf΄UrެŴ L,:G"S]goAv2{k~}y=t$mdZ>OB5' ErŴꇋ䀋ŴrE '5B>OZd$m=ty}k~2{Avog]!SG:L, ެrTЄfwDċܒ||ðiv"0>0" th!{ߒËDwfτQs߬ŵ N,:G#S]goAv0{l~}yty}k~1{@vog^ SG:J, !qSЄfvEċݒ}}İkp "0>>KVUakj rxv|v|x rljWaV9K>0"  rmzޒ‹FvfτRtůO,:GS]goBv0{l~}y?t"mdZ;OB5' Bv´뇊倊􍔕vA '5B;OZd"m>ty}l~1{Bvog]SG:P,uSτfvE‹ޒz~Űmq "0>?KVValj rxv|v|x rkjUaV>K>0" plİ~~ޒEvfЄSqű Q,:GS]go@v1{k~}y>t!mdZ@OB5' @uǴ뇊䀋􍕕 ôwC '5B:KVRamj rxv|u|x rojTaV=K>0"vjð|}ݒċDwfЄTrݬų" K,:G!S]go@v1{k~}y=t mdZ?OB5' >sŴꇉ䀋ĴyE '5B>OZd$m;KVSanj rxu|u|x rnjSaV;K>0"th"°|ܒËDwf΄Qs߬Ŵ M,:G"S]goAv0{l~}yOB5' DxĴꇋ䀉ƴs? '5B?OZd!m=ty}k~1{@vog^!SG:K, "ݬrTЄfwDċݒ}}ðjo"0>=KVTaoj rxu|v|x rmjRaV:K>0" sg zߒËFwfτRtŶ N,:G#S]goBv0{l~}yty}k~1{@vog]SG:Q, uSЄfvEޒ~~İlp "0>>KVUakj rxv|v|x rljVaV?K>0" qmŰ~yޒ‹EvfτSuŰP,:GS]go?v1{l~}y>t"mdZ;OB5' Au뇊䀊􍕕´vB '5B9KVWalj rxv|v|x rkjUaV=K>0" okİ}}ݒċEvfЄTqݬŲ! J,: G S^go@v1{k~}y=t!mdZ@OB5' ?tƴ뇊䀋 ôxD '5B=OZd#m:KVSamj rxw|u|x rnjTaV0"ui#°||ܒċDwfЄTrެų L,:G!S]goAv2{k~}y=t$mdZ>OB5' ErŴꇋ䀋ŴrE '5B>OZd$m=ty}k~2{Avog]!SG:L, ެrTЄfwDċܒ||°#iu"0>0"th!{ߒËDwfτQs߬ŵ M,:G#S]goAv0{l~}y=KVUakj rxu|v|x rljWaV9K>0"  rf zߒ‹FvfτRtůO,:GS]goBv0{l~}y?t"mdZty}l~1{?vog]SG:P, uSτfvE‹ޒy~Űlq "0>?KVValj rxv|v|x rkjVaV>K>0" plŰ~~ޒEvfЄSuű Q,:GS]go@v1{k~}y>t"mdZAOB5' @uǴ뇊䀊􍕕 ôwC '5B:KVRamj rxv|u|x rojTaV=K>0"ojð}}ݒċDwfЄTrݬŲ" K,:G!S^go@v1{k~}y=t!mdZ?OB5' ?sƴꇉ䀋ĴxD '5B>OZd$m;KVSanj rxu|u|x rnjSaV;K>0"ui"°|ܒËDwf΄UsެŴ L,:G"S]goAv2{l~}yOB5' EyĴꇋ䀋Ŵs> '5B?OZd m=ty}k~1{@vog]!SG:K, "ݬrTЄfwDċݒ}|ðjv"0>=KVTaoj rxu|v|x rmjRaV:K>0" sg {ߒËFwfτRtŶ N,:G#S]goBv0{l~}yty}k~1{@vog] SG:Q,!qSЄfvEݒ~~İlp "0>>KVUakj rxv|v|x rljVaV?K>0" qmzޒ‹EvfτSuŰP,:GS]goBv1{l~}y>t"mdZ;OB5' Av뇊倊􍔕´vB '5B;OZd"m>ty}l~1{Bvog]SG:O,tRτfvE‹ޒzmr "0>9KVValj rxv|v|x rkjUaV>K>0" pkİ}}ݒċEvfЄSqŲ! J,:G S]go@v1{k~}y>t!mdZ@OB5' @tƴ뇊䀋 ôwC '5B=OZd#m:KVRamj rxv|u|x rnjTaV0"vjð||ܒċDwfЄTrެų K,:G!S]goAv2{k~}y=t$mdZ?OB5' >sŴꇋ䀋ŴrE '5B>OZd$m=ty}k~2{Avog]"SG:L, ެrU΄fwDċܒ||°"iu"0>0"th!{ËDwf΄Qs߬ŵ M,:G#S]goAv0{l~}y=KVUakj rxu|v|x rmjWaV9K>0"  rf zߒ‹FvfτRtŶO,:GS]goBv0{l~}y?t#mdZty}l~1{?vog]SG:P, uSτfvE‹ޒy~Űlq "0>?KVValj rxv|v|x rljVaV>K>0" qlŰ~yޒ‹EvfτSuű P,:GS]go?v1{l~}y>t"mdZAOB5' AuǴ뇊䀊􍕕´wB '5B:KVRamj rxv|u|x rkjUaV=K>0" ojð}}ݒċEwfЄTqݬŲ" K,:G S^go@v1{k~}y=t!mdZ?OB5' ?sƴꇊ䀋ĴxD '5B=OZd$m;KVSanj rxu|u|x rnjSaV0"ui"°||ܒËDwf΄UrެŴ L,:G"S]goAv2{k~}y=t$mdZ>OB5' ErĴꇋ䀋Ŵs> '5B?OZd%m=ty}k~2{@vog]!SG:K, "ެrTЄfwDċܒ||ðjv"0>0" sg!{ߒËFwfτRsŶ N,:G#S]goAv0{l~}yty}k~1{@vog] SG:J,!qSЄfvEݒ~}İkp "0>>KVUakj rxv|v|x rljVaV9K>0" rmzޒ‹EvfτRuŰO,:GS]goBv1{l~}y>t"mdZ;OB5' Av´뇊倊􍔕´vA '5B;OZd"m>ty}l~1{Bvog]SG:O,uRτfvE‹ޒzmr "0>?KVValj rxv|v|x rkjUaV>K>0" pkİ}~ݒEvfЄSqű!J,:G S]go@v1{k~}y>t!mdZ@OB5' @tǴ뇊䀋􍕕 ôwC '5B=OZd#m:KVRamj rxv|u|x rojTaV0"vjð||ܒċDwfЄTrެų" K,:G!S]go@v2{k~}y=t%mdZ?OB5' >sŴꇋ䀋ĴyE '5B>OZd$m=ty}k~2{Avog]"SG:L, ެrU΄fwDËܒ||°"iu"0>0"th"{ܒËDwf΄Qs߬ŵ M,:G"S]goAv0{l~}y=KVUakj rxu|v|x rmjRaV:K>0"  sg zߒ‹FwfτRtŶ O,:GS]goBv0{l~}y;t#mdZty}l~1{?vog]SG:P, uSτfvE‹ޒy~Űlq "0>>KVValj rxv|v|x rljVaV?K>0" qlŰ~yޒ‹EvfτSuŰ P,:GS]go?v1{l~}y>t"mdZAOB5' Au뇊䀊􍕕´vB '5B9KVWamj rxv|u|x rkjUaV=K>0" okİ}}ݒċEvfЄTqݬŲ! J,:G S^go@v1{k~}y=t!mdZ@OB5' ?tƴꇊ䀋!ĴxD '5B=OZd#m;KVSamj rxu|u|x rnjTaV0"ui"°||ܒċDwf΄UrެŴ L,:G"S]goAv2{k~}y=t$mdZ>OB5' ErŴꇋ䀋ŴsF '5B?OZd$m=ty}k~2{Avog]!SG:K, ެrTЄfwDċܒ||ðjv"0>0" sh!{ߒËDwfτQs߬ŵ N,:G#S]goAv0{l~}yty}k~1{@vog] SG:J, !qSЄfvEċݒ}}İkp "0>>KVUakj rxv|v|x rljVaV9K>0"  rmzޒ‹EvfτRtůO,:GS]goBv1{l~}y?t"mdZ;OB5' Bv´뇊倊􍔕vA '5B;OZd"m>ty}l~1{Bvog]SG:P,uSτfvE‹ޒzmq "0>?KVValj rxv|v|x rkjUaV>K>0" plİ~~ޒEvfЄSqű Q,:GS]go@v1{k~}y>t!mdZ@OB5' @tǴ뇊䀋􍕕 ôwC '5B:KVRamj rxv|u|x rojTaV=K>0"vjð|}ݒċDwfЄTrݬų" K,:G!S]go@v1{k~}y=t mdZ?OB5' >sŴꇋ䀋ĴyE '5B>OZd$m;KVSanj rxu|u|x rnjSaV;K>0"th"°|ܒËDwf΄Qs߬Ŵ M,:G"S]goAv0{l~}yOB5' DxĴꇋ䀉ƴs? '5B?OZd!m=ty}k~1{@vog^!SG:K, "ݬrTЄfwDċݒ}}ðjo"0>=KVTaoj rxu|v|x rmjRaV:K>0"  sg zߒ‹FwfτRtŶ N,:G#S]goBv0{l~}yty}k~1{@vog]SG:Q, uSЄfvEޒ~~Űlp "0>>KVUakj rxv|v|x rljVaV?K>0" qlŰ~yޒ‹EvfτSuŰ P,:GS]go?v1{l~}y>t"mdZ;OB5' Au뇊䀊􍕕´vB '5B9KVWalj rxv|v|x rkjUaV=K>0" okİ}}ݒċEvfЄTqݬŲ! J,: G S^go@v1{k~}y=t!mdZ@OB5' ?tƴꇊ䀋 ôxD '5B=OZd#m;KVSamj rxw|u|x rnjTaV0"ui#°||ܒċDwfЄTrެų L,:G!S]goAv2{k~}y=t$mdZ>OB5' ErŴꇋ䀋ŴrE '5B>OZd$m=ty}k~2{Avog]!SG:L, ެrTЄfwDċܒ||°#iu"0>0"th!{ߒËDwfτQs߬ŵ M,:G#S]goAv0{l~}y=KVUakj rxv|v|x rljWaV9K>0"  rm zߒ‹FvfτRtůO,:GS]goBv0{l~}y?t"mdZty}l~1{?vog]SG:P, uSτfvE‹ޒy~Űlq "0>?KVValj rxv|v|x rkjUaV>K>0" plŰ~~ޒEvfЄSuű Q,:GS]go@v1{k~}y>t"mdZ@OB5' @uǴ뇊䀊􍕕 ôwC '5B:KVRamj rxv|u|x rojTaV=K>0"ojð}}ݒċDwfЄTrݬų" K,:G!S^go@v1{k~}y=t!mdZ?OB5' ?sƴꇉ䀋ĴxD '5B>OZd$m;KVSanj rxu|u|x rnjSaV;K>0"ui"°|ܒËDwf΄Us߬Ŵ L,:G"S]goAv0{l~}yOB5' EyĴꇋ䀋Ŵs> '5B?OZd m=ty}k~1{@vog]!SG:K, "ݬrTЄfwDċݒ}|ðjv"0>=KVTaoj rxu|v|x rmjRaV:K>0" sg {ߒËFwfτRtŶ N,:G#S]goBv0{l~}yty}k~1{@vog]SG:Q, qSЄfvEޒ~~İlp "0>>KVUakj rxv|v|x rljVaV?K>0" qmzޒ‹EvfτSuŰP,:GS]goBv1{l~}y>t"mdZ;OB5' Av뇊倊􍕕´vB '5B;OZd"m?ty}l~1{Bvog]SG:O,tRτfvE‹ޒzmr "0>9KVValj rxv|v|x rkjUaV>K>0" pkİ}}ݒċEvfЄSqŲ! J,:G S]go@v1{k~}y>t!mdZ@OB5' @tƴ뇊䀋 ôxC '5B=OZd#m:KVRamj rxw|u|x rnjTaV0"vjð||ܒċDwfЄTrެų K,:G!S]goAv2{k~}y=t$mdZ?OB5' FrŴꇋ䀋ŴrE '5B>OZd$m=ty}k~2{Avog]"SG:L, ެrU΄fwDċܒ||°"iu"0>0"th!{ËDwfτQs߬ŵ M,:G#S]goAv0{l~}y=KVUakj rxu|v|x rmjWaV9K>0"  rf zߒ‹FvfτRtůO,:GS]goBv0{l~}y?t#mdZty}l~1{?vog]SG:P, uSτfvE‹ޒy~Űlq "0>?KVValj rxv|v|x rljVaV>K>0" qlŰ~yޒ‹EvfτSuű P,:GS]go?v1{l~}y>t"mdZAOB5' @uǴ뇊䀊􍕕´wB '5B:KVRamj rxv|u|x rkjUaV=K>0" ojð}}ݒċEwfЄTqݬŲ" K,:G S^go@v1{k~}y=t!mdZ?OB5' ?sƴꇊ䀋ĴxD '5B=OZd$m;KVSanj rxu|u|x rnjSaV0"ui"°{|ܒËDwf΄UrެŴ L,:G"S]goAv2{k~}y=t$mdZ>OB5' EyĴꇋ䀋z> '5B8OZd m@ty}k~2{Cvog^SG:S, ޸ެwPЄfvGċܒxðcv "0>0"  lg!ǰz{ߒƋCwfτVtڬŮ%N,:#G#S]goBv0{k~}y>KVPapj rxw|t|x rqjQaV?K>0"  yfŰyzޒŋCvfτVu۬ŰO,:G$S]goBv1{k~}y;t"md|Z;OB5' Ao뇌䀌􍐕´oA '5B;O|Zd"m;ty}k~1{Bvog]$SG:O,۬tVτfvCŋޒzyưfy  "0>?KVQaqj rxt|w|x rpjPaV>K>0" wdİyݒŋBvfЄOvܬűQ,:G&S]goCv1{k~}y:t!mdZ:OB5' @{뇌䀉􍑕 ôp C '5B=O~Zd#mAKVRaijrxu|w|x rojYaV0" vqðxܒċGvfЄPwެ޸ų S,:GS^goDv2{k~}y@t mdZ8OB5' >zꇋ䀉!Ĵr E '5B>OZd$m=ty}m~0{Avog]"S!G:L,#rU‰΄gwD||Ȱ"im"0>BKVSajjrxu|w|x rnjXaV;K>1" toܒËFufфQx߬߸ŵ T,:GS^go>v2{l~}y@tmdZDOB5' <xʴ釋䀊#ƴsG '5B?OZd%m=ty}l~/{@vog] S G:K,"qT‰΄ewE}}$jo"0>7KVUakjrxu|v|x rmjWaV9K>1" snے‹FxfфRoŶG, :GS^go?v2{l~}y?tmdZBOB5' ;wɴ释䀊ǴuH '5BAOZd&m>ty}l~/{?vog]SG":I, pS̈́fxE‹ڒ~~%lq"0>8KVValj rxv|v|x rljVaV8K>0"ql%~~ڒ‹Exf̈́SpŸ I,":GS]go?v/{l~}y>t&mdZAOB5' HuǴ臊倊ɴv; '5BBOZdm?ty}l~3{?vog]SG!:G,oRфfxF‹ےnr "1>9KVWamj rxv|u|xrkjUaV7K>0"ok$}}Ewe΄‰Tqź!J,: G S]go@v/{l~}y=t%mdZ?OB5' Gtƴ#臊個񍖕ʴx< '5BCOZdm?ty}l~2{>vog^SG:U, ߸߬nQфfuFËےot "1>;KVXanj rxw|u|xrjjTaVBK>0"ni"Ȱ||Dwg΄‰UrŬ#L,:!G"S]goAv0{m~}y=t$mdZ>OB5' E rŴ!퇉個򍗕z> '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwPЄfvGċܒwðqv "0>0"  lg!ǰz{ߒƋDwfτUsŮ%N,:#G#S]goAv0{j~}y>KVPaoj rxw|t|x rqjQaV?K>0"  yfưyzޒŋCvfτVt۬ŰO,:G$S]goBv1{k~}y;t"md|Z;OB5' B o´뇌䀌􍐕oA '5B;O|Zd"m;ty}k~1{Bvog]%SG:P,۬uVτfvCŋޒzyŰey  "0>?KVQapj rxt|t|x rpjPaV>K>0"  xdİyݒŋBvfЄOuܬűQ,:G&S]goCv1{k~}y:t!mdZ:OB5' @{뇌䀉􍑕 ôp C '5B@KVRaij rxu|w|x rojYaV=K>0" vcðxݒċGvfЄPvݬ޸ų S,:GS^goCv1{k~}y@t mdZ9OB5' >zꇋ䀉!Ĵr E '5B>OZd$mBKVSaijrxu|w|x rnjXaV;K>1" tp°ܒËFufфQw߬߸Ŵ T,:GS^go>v2{l~}y@t mdZDOB5' =xʴꇋ䀉"ƴsF '5B?OZd%m=ty}l~/{@vog]!S G:K,"rT‰΄ewE}}#jo"0>6KVTajjrxu|v|x rmjWaV:K>1" snے‹FxfфRoŶ G, :GS^go?v2{l~}y?tmdZBOB5' ;wɴ释䀊ǴuH '5BAOZd&m>ty}l~/{@vog]SG":I, qS̈́fxEْ~~%lp"0>8KVVakj rxv|v|x rljVaV8K>0"ql&~~ڒ‹Exf̈́SpŸ H,":GS]go?v3{l~}y>t&mdZAOB5' Iuȴ臊倊ȴv: '5BBOZd'm?ty}l~3{?vog]SG!:G,oRфfxF‹ڒmr "1>9KVWalj rxv|u|xrkjUaV7K>0"ok$}}Ewe΄TqŹ!J,: G S]go@v/{l~}y=t%mdZ@OB5' Gtƴ#臊個񍖕ʴx< '5BCOZdm?ty}l~2{>vog^SG:F, ߬nQфfuFËےot "1>;KVXamj rxw|u|xrjjTaVBK>0"ni#||Dwg΄‰TrŬ#L,:!G!S]goAv0{m~}y=t$mdZ>OB5' ErŴ"퇉個򍗕y> '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwPЄfvGċܒw°qu "0>0" lh!ǰ{{ߒDwfτUsŮ%M,:#G#S]goAv0{j~}y=KVPaoj rxw|t|x rqjQaV@K>0"  zf ưyzߒŋCvfτVt۬ů&O,:G$S]goBv0{k~}y;t"md}Z?KVQapj rxt|t|x rpjPaV>K>0"  xdİyޒŋCvfЄOuܬűQ,:G%S]goCv1{k~}y;t!mdZ:OB5' @|뇌䀉􍑕 ôp C '5B@KVRahj rxt|w|x rojOaV=K>0" vcðxݒċGvfЄPvݬݸų R,:GS^goCv1{k~}y@t!mdZ9OB5' >zꇋ䀉!Ĵq D '5B>O~Zd$mBKVSaijrxu|w|x rnjXaV;K>1" up°wܒËFufЄQw߬߸Ŵ T,:GS^go>v2{l~}y@t mdZDOB5' =yꇋ䀉"ŴsF '5B?OZd%m=ty}m~/{@vog]!S G:K,"rT‰΄gwD}|#jo"0>6KVTajjrxu|v|x rmjWaV:K>1" snےËFufфRoŶ G, :GS^go?v2{l~}y?tmdZCOB5' ;wɴ釋䀊#ǴuH '5B@OZd&m>ty}l~/{@vog]SG#:I, qS̈́fxE~~%lp"0>8KVUakjrxv|v|x rljVaV8K>0"qm&~~ڒ‹Exf̈́SpŸH,":GS]go?v3{l~}y>t&mdZAOB5' Ivȴ臊倊ȴv: '5BBOZd'm?ty}l~3{?vog]SG!:H,pRфfxF‹ڒmr "1>9KVWalj rxv|v|xrkjUaV7K>0"pk$}}Ewe΄SqŹ!J,:G S]go@v/{l~}y>t%mdZ@OB5' Gtƴ#臊個񍖕ʴx< '5BCOZdm?ty}l~2{>vog^SG:F, ߬oQфfuFËےot "1>:KVXamj rxw|u|xrjjTaV6K>0"ni#||Dwg΄‰TrŬ#L,:!G!S]goAv/{m~}y=t$mdZ>OB5' ErŴ"퇉個򍖕y= '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwQЄfvGċܒw°pu "0>0" lh!ǰ{{DwfτUsŭ$M,:"G#S]goAv0{j~}y=KVPaoj rxw|t|x rqjRaV@K>0"  zf ưzzߒƋCvfτVtڬů&O,:G$S]goBv0{k~}y;t#md}Z?KVQapj rxt|t|x rpjPaV>K>0"  xeŰyޒŋCvfτOuܬűP,:G%S]goCv1{k~}y;t"mdZ:OB5' @|뇌䀉􍑕´p B '5B@KVRaqj rxt|w|x rojOaV=K>0" wcðxݒċGvfЄPvݬݸŲ R,:GS^goCv1{k~}y:t!mdZ9OB5' ?zꇋ䀉!Ĵq D '5B=O~Zd$mAKVSaijrxu|w|x rnjYaV;K>0" up°wܒËFufЄQwެ߸Ŵ T,:GS^go>v2{l~}y@t mdZ8OB5' =yꇋ䀉"ŴsF '5B?OZd%m=ty}m~/{@vog]!S!G:K,"rT‰΄gwD}|#jn"0>6KVTajjrxu|v|x rmjWaV:K>1" snےËFufфRoŶ F, :GS^go>v2{l~}y?tmdZCOB5' ;wɴ釋䀊#ǴtH '5B@OZd%m>ty}l~/{@vog] SG#:J,!qS̈́exE~~%kp"0>7KVUakjrxv|v|x rljVaV9K>1"rm&ڒ‹ExfфSpŷH,!:GS]go?v3{l~}y>t&mdZAOB5' Ivȴ臊倊ȴvI '5BBOZd&m>ty}l~3{?vog]SG!:H,pRфfxE‹ڒ&mr"1>9KVValj rxv|v|xrkjUaV7K>0"pk$}~Exe΄SqŹ!J,#:G S]go@v/{l~}y>t%mdZ@OB5' GtǴ#臊個񍕕ɴw< '5BCOZdm?ty}l~2{>vog^SG :F, oRфfuFËےos "1>:KVWamj rxv|u|xrjjTaV6K>0"nj#||Dwg΄‰TrŬ#K,:!G!S]go@v/{m~}y=t$mdZ?OB5' FsŴ"퇉個򍖕y= '5B8OZd m@ty}k~2{>vog^SG:T, ߸ެwQЄfuGËܒw°pu "0>0" mh!Ȱ{{Dwf΄Usŭ$M,:"G"S]goAv0{j~}y=KVOaoj rxw|t|x rqjRaV@K>0"  kg ưzzߒƋCwfτVtڬů&O,:G$S]goBv0{k~}y;t#md}Z>KVQapj rxt|t|x rpjQaV?K>0"  xeŰyޒŋCvfτWuܬűP,:G%S]goBv1{k~}y;t"mdZ;OB5' A|뇌䀉􍐕´p B '5B@KVRaqj rxt|w|x rojOaV=K>0" wcðxݒċGvfЄPvݬݸŲ R,:G&S^goCv1{k~}y:t!mdZ9OB5' ?{ꇋ䀉!Ĵq D '5B=O~Zd$mAKVSaijrxu|w|x rnjYaV0" up°wܒËGufЄQwެ߸Ŵ T,:GS^go>v2{k~}y@t mdZ8OB5' =yꇋ䀉"ŴsF '5B?OZd$m=ty}m~/{Avog]!S!G:K,#rT‰΄gwD||#jn"0>6KVTajjrxu|v|x rmjXaV:K>1" soےËFufфRoŵ F, :GS^go>v2{l~}y?tmdZCOB5' <wʴ釋䀊#ƴtG '5B@OZd%m>ty}l~/{@vog] SG#:J,!qS΄exE}}$kp"0>7KVUakjrxv|v|x rljVaV9K>1" rmڒ‹ExfфRpŷH,!:GS]go?v3{l~}y>t&mdZBOB5' Ivȴ释倊ȴvI '5BAOZd&m>ty}l~3{?vog]SG!:H,pSфfxE‹ڒ&mq"1>9KVValj rxv|v|xrkjUaV7K>0"pk%~~Exë́SqŹ!I,#:G S]go@v/{l~}y>t&mdZ@OB5' HtǴ#臊個񍕕ɴw; '5BCOZdm?ty}l~2{>vog^SG :F, oRфfuFËےns "1>:KVWamj rxv|u|xrjjTaV6K>0"nj#|}Dwg΄‰Trū"K,: G!S]go@v/{m~}y=t%mdZ?OB5' FsŴ"퇉個򍖕y= '5BDOZd m@ty}l~2{>vog^SG:T, ߸ެwQЄfuFËܒw°pu "0>;KVXanj rxw|u|xrijSaVBK>0" mh"Ȱ{{Dwf΄Usŭ$M,:"G"S]goAv0{m~}y=KVOaoj rxw|t|x rqjRaV@K>0"  kg ưzzߒƋCwfτVtڬů&N,:G$S]goBv0{k~}y>KVPapj rxt|t|x rpjQaV?K>0"  yeŰyyޒŋCvfτWu۬ŰP,:G%S]goBv1{k~}y;t"mdZ;OB5' A|뇌䀌􍐕´o B '5B@KVRaqj rxt|w|x rojPaV=K>0" wdİxݒċGvfЄPvݬŲ R,:G&S^goCv1{k~}y:t!mdZ9OB5' ?{ꇋ䀉 ôq D '5B=O~Zd#mAKVSaijrxu|w|x rnjYaV0" up°wܒċGvfЄQwެ޸Ŵ S,:GS^goDv2{k~}y@t mdZ8OB5' =yꇋ䀉"ŴrE '5B>OZd$m=ty}m~/{Avog]!S!G:L,#rT‰΄gwD||#in"0>6KVTajjrxu|w|x rmjXaV:K>1" toےËFufфQo߬ŵ F,:GS^go>v2{l~}y?tmdZCOB5' <xʴ釋䀊#ƴtG '5B@OZd%m>ty}l~/{@vog] SG:J,!qT΄ewE}}$kp"0>7KVUakjrxv|v|x rljWaV9K>1" rmڒ‹FxfфRpŷH,!:GS]go?v3{l~}y?t'mdZBOB5' :vȴ释倊ȴuI '5BAOZd&m>ty}l~3{?vog]SG":H,pS̈́fxE‹ڒ~~&mq"0>8KVValj rxv|v|xrkjUaV8K>0"pl%~~ْExf̈́SqŸ I,":GS]go@v/{l~}y>t&mdZ@OB5' HuǴ$臊倊ɴw; '5BCOZdm?ty}l~2{?vog^SG :G, oRфfxFËےns "1>:KVWamj rxv|u|xrjjTaV6K>0"oj#|}Dwg΄‰Trź"K,: G!S]go@v/{m~}y=t%mdZ?OB5' FsŴ"퇉個񍖕˴x= '5BDOZd m@ty}l~2{>vog^SG:T, ߸߬wQфfuFËܒw°pu "1>;KVXanj rxw|u|xrijSaVBK>0" mi"Ȱ{|Dwf΄Usŭ$M,:"G"S]goAv0{m~}yOB5' D rĴ!쇉》򍗕z> '5B9OZd!m@ty}k~1{Cvog^SG:R, ޸ݬvPЄfvGċݒxðcv "0>=KVOaoj rxw|t|x rhjRaV@K>0"  kg ǰz{ߒƋCwfτVtڬŮ%N,:G#S]goBv0{k~}y>KVPapj rxt|t|x rpjQaV?K>0"  yeŰyyޒŋCvfτWu۬ŰP,:G%S]goBv1{k~}y;t"mdZ;OB5' An뇌䀌􍐕´o B '5B;O}Zd"m;ty}k~0{Bvog]$SG:O,&۬tVτfvCŋޒzyưfz  "0>?KVQaqj rxt|w|x rojPaV=K>0" wdİxݒċBvfЄPvݬŲ Q,:G&S^goCv1{k~}y:t!mdZ:OB5' ?{뇌䀉 ôq C '5B=O~Zd#mAKVRaijrxu|w|x rnjYaV0" vq°wܒċGvfЄPwެ޸ų S,:GS^goDv2{k~}y@t mdZ8OB5' >yꇋ䀉"Ŵr E '5B>OZd$m=ty}m~0{Avog]!S!G:L,#rT‰΄gwD||"in"0>BKVTajjrxu|w|x rmjXaV;K>1" toےËFufфQn߬ŵ F,:GS^go>v2{l~}y?tmdZCOB5' <xʴ釋䀊#ƴtG '5B@OZd%m=ty}l~/{@vog] S G:J,!qT΄ewE}}$ko"0>7KVUakjrxu|v|x rljWaV9K>1" rnڒ‹FxfфRoŷG,!:GS]go?v3{l~}y?tmdZBOB5' :vɴ释䀊ǴuI '5BAOZd&m>ty}l~3{?vog]SG":I, pS̈́fxE‹ڒ~~%lq"0>8KVValj rxv|v|x rkjVaV8K>0"ql%~~ڒExf̈́SpŸ I,":GS]go@v/{l~}y>t&mdZAOB5' HuǴ臊倊ɴw; '5BBOZdm?ty}l~2{?vog^SG :G, oRфfxF‹ےns "1>:KVWamj rxv|u|xrkjTaV6K>0"oj$}}Ewe΄‰Trź"K,: G!S]go@v/{l~}y=t%mdZ?OB5' Fsƴ"퇊個񍖕ʴx= '5BDOZdm@ty}l~2{>vog^SG:T, ߸߬xQфfuFËܒpt "1>;KVXanj rxw|u|xrjjSaVBK>0" mi"Ȱ{|Dwg΄Usŭ$L,:"G"S]goAv0{m~}yOB5' E rĴ!쇉》򍗕z> '5B9OZd m@ty}k~1{Cvog^SG:S, ޸ݬvPЄfvGċݒxðcv "0>0"  lg!ǰz{ߒƋCwfτVtڬŮ%N,:#G#S]goBv0{k~}y>KVPapj rxt|t|x rpjQaV?K>0"  yfŰyzޒŋCvfτVu۬ŰP,:G%S]goBv1{k~}y;t"md|Z;OB5' Ao뇌䀌􍐕´o B '5B;O|Zd"m;ty}k~1{Bvog]$SG:O,۬tVτfvCŋޒzyưfy  "0>?KVQaqj rxt|w|x rpjPaV>K>0" wdİyݒŋBvfЄOvܬűQ,:G&S]goCv1{k~}y:t!mdZ:OB5' @{뇌䀉 ôp C '5B=O~Zd#mAKVRaijrxu|w|x rojYaV0" vqðwܒċGvfЄPwެ޸ų S,:GS^goDv2{k~}y@t mdZ8OB5' >zꇋ䀉!Ĵr E '5B>OZd$m=ty}m~0{Avog]"S!G:L,#rU‰΄gwD||Ȱ"im"0>BKVSajjrxu|w|x rnjXaV;K>1" toےËFufфQn߬߸ŵ U,:GS^go>v2{l~}y?tmdZDOB5' <xʴ釋䀊#ƴtG '5B?OZd%m=ty}l~/{@vog] S G:J,"qT‰΄ewE}}$ko"0>7KVUakjrxu|v|x rmjWaV9K>1" rnے‹FxfфRoŶG, :GS^go?v3{l~}y?tmdZBOB5' ;wɴ释䀊ǴuH '5BAOZd&m>ty}l~/{?vog]SG":I, pS̈́fxE‹ڒ~~%lq"0>8KVValj rxv|v|x rljVaV8K>0"ql%~~ڒ‹Exf̈́SpŸ I,":GS]go?v/{l~}y>t&mdZAOB5' HuǴ臊倊ɴw; '5BBOZdm?ty}l~3{?vog^SG :G,oRфfxF‹ےnr "1>9KVWamj rxv|u|xrkjUaV7K>0"ok$}}Ewe΄‰Tqź"J,: G S]go@v/{l~}y=t%mdZ?OB5' Gsƴ#臊個񍖕ʴx< '5BDOZdm@ty}l~2{>vog^SG:T, ߸߬nQфfuFËےot "1>;KVXanj rxw|u|xrjjSaVBK>0"mi"Ȱ||Dwg΄‰UrŬ#L,:!G"S]goAv0{m~}y=t$mdZ>OB5' E rĴ!퇉》򍗕z> '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwPЄfvGċܒwðqv "0>0"  lg!ǰz{ߒƋDwfτUs٬Ů%N,:#G#S]goAv0{j~}y>KVPapj rxw|t|x rqjQaV?K>0"  yfưyzޒŋCvfτVt۬ŰO,:G$S]goBv1{k~}y;t"md|Z;OB5' B o´뇌䀌􍐕oA '5B;O|Zd"m;ty}k~1{Bvog]%SG:P,۬uVτfvCŋޒzyŰfy  "0>?KVQapj rxt|t|x rpjPaV>K>0"  xdİyݒŋBvfЄOuܬűQ,:G&S]goCv1{k~}y:t!mdZ:OB5' @{뇌䀉􍑕 ôp C '5BAKVRaij rxu|w|x rojYaV0" vcðxݒċGvfЄPwݬ޸ų S,:GS^goCv1{k~}y@t mdZ9OB5' >zꇋ䀉!Ĵr E '5B>OZd$mBKVSajjrxu|w|x rnjXaV;K>1" tpܒËFufфQx߬߸ŵ T,:GS^go>v2{l~}y@tmdZDOB5' <xʴ釋䀊"ƴsF '5B?OZd%m=ty}l~/{@vog]!S G:K,"qT‰΄ewE}}$jo"0>6KVTakjrxu|v|x rmjWaV:K>1" snے‹FxfфRoŶ G, :GS^go?v2{l~}y?tmdZBOB5' ;wɴ释䀊ǴuH '5BAOZd&m>ty}l~/{@vog]SG":I, pS̈́fxE‹ڒ~~%lq"0>8KVVakj rxv|v|x rljVaV8K>0"ql%~~ڒ‹Exf̈́SpŸ I,":GS]go?v3{l~}y>t&mdZAOB5' IuǴ臊倊ɴv: '5BBOZdm?ty}l~3{?vog]SG!:G,oRфfxF‹ڒnr "1>9KVWalj rxv|u|xrkjUaV7K>0"ok$}}Ewe΄TqŹ!J,: G S]go@v/{l~}y=t%mdZ@OB5' Gtƴ#臊個񍖕ʴx< '5BCOZdm?ty}l~2{>vog^SG:U, ߬nQфfuFËےot "1>;KVXamj rxw|u|xrjjTaVBK>0"ni"||Dwg΄‰TrŬ#L,:!G"S]goAv0{m~}y=t$mdZ>OB5' E rŴ!퇉個򍗕y> '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwPЄfvGċܒw°qv "0>0"  lh!ǰ{{ߒƋDwfτUsŮ%N,:#G#S]goAv0{j~}y=KVPaoj rxw|t|x rqjQaV?K>0"  zfưyzޒŋCvfτVt۬ů&O,:G$S]goBv0{k~}y;t"md}Z;OB5' B o´뇌䀌􍐕oA '5B;OZd"m;ty}k~1{Bvog]%SG:P,۬uWτfvCŋޒyyŰey  "0>?KVQapj rxt|t|x rpjPaV>K>0"  xdİyޒŋCvfЄOuܬűQ,:G&S]goCv1{k~}y:t!mdZ:OB5' @|뇌䀉􍑕 ôp C '5B@KVRahj rxt|w|x rojOaV=K>0" vcðxݒċGvfЄPvݬ޸ų R,:GS^goCv1{k~}y@t!mdZ9OB5' >zꇋ䀉!Ĵr D '5B>OZd$mBKVSaijrxu|w|x rnjXaV;K>1" up°wܒËFufфQw߬߸Ŵ T,:GS^go>v2{l~}y@t mdZDOB5' =xʴꇋ䀉"ŴsF '5B?OZd%m=ty}m~/{@vog]!S G:K,"rT‰΄gwD}}#jo"0>6KVTajjrxu|v|x rmjWaV:K>1" snےËFxfфRoŶ G, :GS^go?v2{l~}y?tmdZCOB5' ;wɴ释䀊$ǴuH '5B@OZd&m>ty}l~/{@vog]SG":I, qS̈́fxEْ~~%lp"0>8KVUakjrxv|v|x rljVaV8K>0"qm&~~ڒ‹Exf̈́SpŸH,":GS]go?v3{l~}y>t&mdZAOB5' Iuȴ臊倊ȴv: '5BBOZd'm?ty}l~3{?vog]SG!:H,pRфfxF‹ڒmr "1>9KVWalj rxv|v|xrkjUaV7K>0"pk$}}Ewe΄TqŹ!J,: G S]go@v/{l~}y=t%mdZ@OB5' Gtƴ#臊個񍖕ʴx< '5BCOZdm?ty}l~2{>vog^SG:F, ߬oQфfuFËےot "1>:KVXamj rxw|u|xrjjTaV6K>0"ni#||Dwg΄‰TrŬ#L,:!G!S]goAv/{m~}y=t$mdZ>OB5' ErŴ"퇉個򍗕y> '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwQЄfvGċܒw°qu "0>0" lh!ǰ{{DwfτUsŮ%M,:"G#S]goAv0{j~}y=KVPaoj rxw|t|x rqjQaV@K>0"  zf ưyzߒƋCvfτVtڬů&O,:G$S]goBv0{k~}y;t"md}Z?KVQapj rxt|t|x rpjPaV>K>0"  xeŰyޒŋCvfЄOuܬűQ,:G%S]goCv1{k~}y;t"mdZ:OB5' @|뇌䀉􍑕 ´p C '5B@KVRaqj rxt|w|x rojOaV=K>0" vcðxݒċGvfЄPvݬݸŲ R,:GS^goCv1{k~}y:t!mdZ9OB5' ?zꇋ䀉!Ĵq D '5B=O~Zd$mBKVSaijrxu|w|x rnjXaV;K>0" up°wܒËFufЄQwެ߸Ŵ T,:GS^go>v2{l~}y@t mdZDOB5' =yꇋ䀉"ŴsF '5B?OZd%m=ty}m~/{@vog]!S G:K,"rT‰΄gwD}|#jn"0>6KVTajjrxu|v|x rmjWaV:K>1" snےËFufфRoŶ F, :GS^go?v2{l~}y?tmdZCOB5' ;wɴ釋䀊#ǴtH '5B@OZd&m>ty}l~/{@vog] SG#:I,!qS̈́exE~~%lp"0>7KVUakjrxv|v|x rljVaV9K>1"qm&ڒ‹Exf̈́SpŷH,!:GS]go?v3{l~}y>t&mdZAOB5' Ivȴ臊倊ȴvI '5BBOZd&m>ty}l~3{?vog]SG!:H,pRфfxE‹ڒmr "1>9KVValj rxv|v|xrkjUaV7K>0"pk$}}Exe΄SqŹ!J,#:G S]go@v/{l~}y>t%mdZ@OB5' Gtƴ#臊個񍕕ʴw< '5BCOZdm?ty}l~2{>vog^SG :F, oRфfuFËےos "1>:KVXamj rxv|u|xrjjTaV6K>0"nj#||Dwg΄‰TrŬ#K,:!G!S]goAv/{m~}y=t$mdZ?OB5' FsŴ"퇉個򍖕y= '5B8OZd m@ty}k~2{Dvog^SG:T, ޸ެwQЄfuGċܒw°pu "0>0" lh!Ȱ{{Dwf΄Usŭ$M,:"G"S]goAv0{j~}y=KVOaoj rxw|t|x rqjRaV@K>0"  zf ưzzߒƋCvfτVtڬů&O,:G$S]goBv0{k~}y;t#md}Z?KVQapj rxt|t|x rpjQaV>K>0"  xeŰyޒŋCvfτOuܬűP,:G%S]goCv1{k~}y;t"mdZ:OB5' A|뇌䀉􍐕´p B '5B@KVRaqj rxt|w|x rojOaV=K>0" wcðxݒċGvfЄPvݬݸŲ R,:G&S^goCv1{k~}y:t!mdZ9OB5' ?zꇋ䀉!Ĵq D '5B=O~Zd$mAKVSaijrxu|w|x rnjYaV0" up°wܒËGufЄQwެ߸Ŵ T,:GS^go>v2{k~}y@t mdZ8OB5' =yꇋ䀉"ŴsF '5B?OZd$m=ty}m~/{@vog]!S!G:K,"rT‰΄gwD||#jn"0>6KVTajjrxu|v|x rmjWaV:K>1" soےËFufфRoŶ F, :GS^go>v2{l~}y?tmdZCOB5' ;wɴ釋䀊#ǴtG '5B@OZd%m>ty}l~/{@vog] SG#:J,!qS΄exE~}$kp"0>7KVUakjrxv|v|x rljVaV9K>1"rm&ڒ‹ExfфRpŷH,!:GS]go?v3{l~}y>t&mdZBOB5' Ivȴ释倊ȴvI '5BAOZd&m>ty}l~3{?vog]SG!:H,pRфfxE‹ڒ&mr"1>9KVValj rxv|v|xrkjUaV7K>0"pk%}~Exë́SqŹ!J,#:G S]go@v/{l~}y>t%mdZ@OB5' HtǴ#臊個񍕕ɴw; '5BCOZdm?ty}l~2{>vog^SG :F, oRфfuFËےns "1>:KVWamj rxv|u|xrjjTaV6K>0"nj#|}Dwg΄‰Trū"K,:!G!S]go@v/{m~}y=t%mdZ?OB5' FsŴ"퇉個򍖕y= '5B8OZd m@ty}k~2{>vog^SG:T, ߸ެwQЄfuFËܒw°pu "0>0" mh"Ȱ{{Dwf΄Usŭ$M,:"G"S]goAv0{j~}y=KVOaoj rxw|t|x rqjRaV@K>0"  kg ưzzߒƋCwfτVtڬů&N,:G$S]goBv0{k~}y;t#md}Z>KVPapj rxt|t|x rpjQaV?K>0"  yeŰyޒŋCvfτWu۬ŰP,:G%S]goBv1{k~}y;t"mdZ;OB5' A|뇌䀌􍐕´o B '5B@KVRaqj rxt|w|x rojPaV=K>0" wcİxݒċGvfЄPvݬŲ R,:G&S^goCv1{k~}y:t!mdZ9OB5' ?{ꇋ䀉 Ĵq D '5B=O~Zd#mAKVSaijrxu|w|x rnjYaV0" up°wܒċGvfЄQwެ޸Ŵ S,:GS^goDv2{k~}y@t mdZ8OB5' =yꇋ䀉"ŴrE '5B>OZd$m=ty}m~/{Avog]!S!G:L,#rT‰΄gwD||#in"0>6KVTajjrxu|w|x rmjXaV:K>1" toےËFufфQo߬ŵ F,:GS^go>v2{l~}y?tmdZCOB5' <xʴ釋䀊#ƴtG '5B@OZd%m>ty}l~/{@vog] SG:J,!qS΄ewE}}$kp"0>7KVUakjrxv|v|x rljVaV9K>1" rmڒ‹FxfфRpŷH,!:GS]go?v3{l~}y?t&mdZBOB5' :vȴ释倊ȴvI '5BAOZd&m>ty}l~3{?vog]SG":H,pS̈́fxE‹ڒ~~&mq"1>8KVValj rxv|v|xrkjUaV8K>0"pl%~~Exf̈́SqŹ I,#:GS]go@v/{l~}y>t&mdZ@OB5' HuǴ#臊個ɴw; '5BCOZdm?ty}l~2{?vog^SG :G, oRфfuFËےns "1>:KVWamj rxv|u|xrjjTaV6K>0"oj#|}Dwg΄‰Trź"K,: G!S]go@v/{m~}y=t%mdZ?OB5' FsŴ"퇉個򍖕y= '5BDOZd m@ty}l~2{>vog^SG:T, ߸߬wQЄfuFËܒw°pu "1>;KVXanj rxw|u|xrijSaVBK>0" mh"Ȱ{|Dwf΄Usŭ$M,:"G"S]goAv0{m~}yOB5' D qĴ!쇉》򍗕z? '5B9OZd!m:ty}k~1{Cvog^SG:R, ݸݬvPЄfvGċݒxðcv "0>=KVOaoj rxw|t|x rhjRaV@K>0"  kg ǰzzߒƋCwfτVtڬů&N,:G#S]goBv0{k~}y>KVPapj rxt|t|x rpjQaV?K>0"  yeŰyyޒŋCvfτWu۬ŰP,:G%S]goBv1{k~}y;t"mdZ;OB5' An뇌䀌􍐕´o B '5B@KVQaqj rxt|w|x rojPaV=K>0" wdİxݒċGvfЄPvݬŲ R,:G&S^goCv1{k~}y:t!mdZ9OB5' ?{ꇌ䀉 ôq D '5B=O~Zd#mAKVSaijrxu|w|x rnjYaV0" uq°wܒċGvfЄPwެ޸ų S,:GS^goDv2{k~}y@t mdZ8OB5' >yꇋ䀉"ŴrE '5B>OZd$m=ty}m~/{Avog]!S!G:L,#rT‰΄gwD||#in"0>BKVTajjrxu|w|x rmjXaV;K>1" toےËFufфQn߬ŵ F,:GS^go>v2{l~}y?tmdZCOB5' <xʴ釋䀊#ƴtG '5B@OZd%m=ty}l~/{@vog] S G:J,!qT΄ewE}}$ko"0>7KVUakjrxu|v|x rljWaV9K>1" rmڒ‹FxfфRpŷG,!:GS]go?v3{l~}y?t'mdZBOB5' :vȴ释䀊ȴuI '5BAOZd&m>ty}l~3{?vog]SG":H, pS̈́fxE‹ڒ~~&lq"0>8KVValj rxv|v|x rkjVaV8K>0"pl%~~ْExf̈́SqŸ I,":GS]go@v/{l~}y>t&mdZAOB5' HuǴ臊倊ɴw; '5BBOZdm?ty}l~2{?vog^SG :G, oRфfxF‹ےns "1>:KVWamj rxv|u|xrjjTaV6K>0"oj#}}Dwe΄‰Trź"K,: G!S]go@v/{m~}y=t%mdZ?OB5' Fsƴ"퇉個񍖕ʴx= '5BDOZd m@ty}l~2{>vog^SG:T, ߸߬wQфfuFËܒw°pt "1>;KVXanj rxw|u|xrijSaVBK>0" mi"Ȱ{|Dwg΄Usŭ$L,:"G"S]goAv0{m~}yOB5' E rĴ!쇉》򍗕z> '5B9OZd m@ty}k~1{Cvog^SG:S, ޸ݬvPЄfvGċݒxðcv "0>=KVYaoj rxw|u|x rijRaV@K>0"  kg ǰz{ߒƋCwfτVtڬŮ%N,:G#S]goBv0{k~}y>KVPapj rxt|t|x rpjQaV?K>0"  yeŰyzޒŋCvfτVu۬ŰP,:G%S]goBv1{k~}y;t"mdZ;OB5' Ao뇌䀌􍐕´o B '5B;O|Zd"m;ty}k~1{Bvog]$SG:O,۬tVτfvCŋޒzyưfy  "0>?KVQaqj rxt|w|x rojPaV>K>0" wdİxݒċBvfЄPvܬŲ Q,:G&S]goCv1{k~}y:t!mdZ:OB5' @{뇌䀉 ôq C '5B=O~Zd#mAKVRaijrxu|w|x rnjYaV0" vqðwܒċGvfЄPwެ޸ų S,:GS^goDv2{k~}y@t mdZ8OB5' >zꇋ䀉!Ŵr E '5B>OZd$m=ty}m~0{Avog]"S!G:L,#rU‰΄gwD||"in"0>BKVTajjrxu|w|x rnjXaV;K>1" toےËFufфQn߬߸ŵ U,:GS^go>v2{l~}y?tmdZCOB5' <xʴ釋䀊#ƴtG '5B?OZd%m=ty}l~/{@vog] S G:J,!qT‰΄ewE}}$ko"0>7KVUakjrxu|v|x rmjWaV9K>1" rnے‹FxfфRoŷG,!:GS]go?v3{l~}y?tmdZBOB5' :vɴ释䀊ǴuH '5BAOZd&m>ty}l~/{?vog]SG":I, pS̈́fxE‹ڒ~~%lq"0>8KVValj rxv|v|x rljVaV8K>0"ql%~~ڒ‹Exf̈́SpŸ I,":GS]go?v/{l~}y>t&mdZAOB5' HuǴ臊倊ɴw; '5BBOZdm?ty}l~2{?vog^SG :G,oRфfxF‹ےns "1>:KVWamj rxv|u|xrkjUaV6K>0"oj$}}Ewe΄‰Tqź"K,: G S]go@v/{l~}y=t%mdZ?OB5' Gsƴ#臊個񍖕ʴx< '5BDOZdm@ty}l~2{>vog^SG:T, ߸߬xQфfuFËܒot "1>;KVXanj rxw|u|xrjjSaVBK>0"mi"Ȱ||Dwg΄‰UrŬ#L,:!G"S]goAv0{m~}y=t$mdZ>OB5' E rĴ!쇉》򍗕z> '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwPЄfvGċܒxðqv "0>0"  lg!ǰz{ߒƋCwfτVsڬŮ%N,:#G#S]goAv0{k~}y>KVPapj rxw|t|x rqjQaV?K>0"  yfưyzޒŋCvfτVu۬ŰO,:G$S]goBv1{k~}y;t"md|Z;OB5' Ao´뇌䀌􍐕´oA '5B;O|Zd"m;ty}k~1{Bvog]$SG:O,۬uVτfvCŋޒzyŰfy  "0>?KVQaqj rxt|w|x rpjPaV>K>0" xdİyݒŋBvfЄOvܬűQ,:G&S]goCv1{k~}y:t!mdZ:OB5' @{뇌䀉􍑕 ôp C '5B=O~Zd#mAKVRaijrxu|w|x rojYaV0" vqðxܒċGvfЄPwެ޸ų S,:GS^goDv2{k~}y@t mdZ8OB5' >zꇋ䀉!Ĵr E '5B>OZd$m=ty}m~0{Avog]"S!G:L,#rU‰΄gwD||Ȱ"im"0>BKVSajjrxu|w|x rnjXaV;K>1" toܒËFufфQx߬߸ŵ T,:GS^go>v2{l~}y@tmdZDOB5' <xʴ釋䀊#ƴsF '5B?OZd%m=ty}l~/{@vog] S G:K,"qT‰΄ewE}}$jo"0>6KVUakjrxu|v|x rmjWaV:K>1" snے‹FxfфRoŶG, :GS^go?v2{l~}y?tmdZBOB5' ;wɴ释䀊ǴuH '5BAOZd&m>ty}l~/{?vog]SG":I, pS̈́fxE‹ڒ~~%lq"0>8KVValj rxv|v|x rljVaV8K>0"ql%~~ڒ‹Exf̈́SpŸ I,":GS]go?v/{l~}y>t&mdZAOB5' HuǴ臊倊ɴv: '5BBOZdm?ty}l~3{?vog]SG!:G,oRфfxF‹ےnr "1>9KVWamj rxv|u|xrkjUaV7K>0"ok$}}Ewe΄‰Tqź!J,: G S]go@v/{l~}y=t%mdZ@OB5' Gtƴ#臊個񍖕ʴx< '5BCOZdm?ty}l~2{>vog^SG:U, ߸߬nQфfuFËےot "1>;KVXanj rxw|u|xrjjTaVBK>0"ni"||Dwg΄‰UrŬ#L,:!G"S]goAv0{m~}y=t$mdZ>OB5' E rŴ!퇉個򍗕y> '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwPЄfvGċܒwðqv "0>0"  lg!ǰz{ߒƋDwfτUsŮ%N,:#G#S]goAv0{j~}y>KVPaoj rxw|t|x rqjQaV?K>0"  yfưyzޒŋCvfτVt۬ůO,:G$S]goBv1{k~}y;t"md|Z;OB5' B o´뇌䀌􍐕oA '5B;OZd"m;ty}k~1{Bvog]%SG:P,۬uVτfvCŋޒzyŰey  "0>?KVQapj rxt|t|x rpjPaV>K>0"  xdİyޒŋBvfЄOuܬűQ,:G&S]goCv1{k~}y:t!mdZ:OB5' @{뇌䀉􍑕 ôp C '5B@KVRaij rxu|w|x rojYaV=K>0" vcðxݒċGvfЄPvݬ޸ų S,:GS^goCv1{k~}y@t mdZ9OB5' >zꇋ䀉!Ĵr E '5B>OZd$mBKVSaijrxu|w|x rnjXaV;K>1" tp°wܒËFufфQw߬߸Ŵ T,:GS^go>v2{l~}y@t mdZDOB5' =xʴꇋ䀉"ƴsF '5B?OZd%m=ty}m~/{@vog]!S G:K,"rT‰΄ewD}}#jo"0>6KVTajjrxu|v|x rmjWaV:K>1" snے‹FxfфRoŶ G, :GS^go?v2{l~}y?tmdZBOB5' ;wɴ释䀊ǴuH '5B@OZd&m>ty}l~/{@vog]SG":I, qS̈́fxEْ~~%lp"0>8KVVakj rxv|v|x rljVaV8K>0"ql&~~ڒ‹Exf̈́SpŸ H,":GS]go?v3{l~}y>t&mdZAOB5' Iuȴ臊倊ȴv: '5BBOZd'm?ty}l~3{?vog]SG!:G,pRфfxF‹ڒmr "1>9KVWalj rxv|v|xrkjUaV7K>0"ok$}}Ewe΄TqŹ!J,: G S]go@v/{l~}y=t%mdZ@OB5' Gtƴ#臊個񍖕ʴx< '5BCOZdm?ty}l~2{>vog^SG:F, ߬nQфfuFËےot "1>;KVXamj rxw|u|xrjjTaVBK>0"ni#||Dwg΄‰TrŬ#L,:!G!S]goAv/{m~}y=t$mdZ>OB5' ErŴ"퇉個򍗕y> '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwQЄfvGċܒw°qu "0>0" lh!ǰ{{ߒDwfτUsŮ%M,:#G#S]goAv0{j~}y=KVPaoj rxw|t|x rqjQaV@K>0"  zf ưyzߒƋCvfτVt۬ů&O,:G$S]goBv0{k~}y;t"md}Z?KVQapj rxt|t|x rpjPaV>K>0"  xeİyޒŋCvfЄOuܬűQ,:G%S]goCv1{k~}y;t"mdZ:OB5' @|뇌䀉􍑕 ôp C '5B@KVRahj rxt|w|x rojOaV=K>0" vcðxݒċGvfЄPvݬݸų R,:GS^goCv1{k~}y:t!mdZ9OB5' ?zꇋ䀉!Ĵq D '5B>O~Zd$mBKVSaijrxu|w|x rnjXaV;K>1" up°wܒËFufЄQw߬߸Ŵ T,:GS^go>v2{l~}y@t mdZDOB5' =yꇋ䀉"ŴsF '5B?OZd%m=ty}m~/{@vog]!S G:K,"rT‰΄gwD}|#jo"0>6KVTajjrxu|v|x rmjWaV:K>1" snےËFufфRoŶ G, :GS^go?v2{l~}y?tmdZCOB5' ;wɴ釋䀊#ǴtH '5B@OZd&m>ty}l~/{@vog]SG#:I, qS̈́fxE~~%lp"0>8KVUakjrxv|v|x rljVaV8K>1"qm&~~ڒ‹Exf̈́SpŷH,":GS]go?v3{l~}y>t&mdZAOB5' Ivȴ臊倊ȴv: '5BBOZd&m?ty}l~3{?vog]SG!:H,pRфfxF‹ڒmr "1>9KVValj rxv|v|xrkjUaV7K>0"pk$}}Exe΄SqŹ!J,:G S]go@v/{l~}y>t%mdZ@OB5' Gtƴ#臊個񍖕ʴx< '5BCOZdm?ty}l~2{>vog^SG:F, ߬oQфfuFËےot "1>:KVXamj rxw|u|xrjjTaV6K>0"nj#||Dwg΄‰TrŬ#L,:!G!S]goAv/{m~}y=t$mdZ>OB5' ErŴ"퇉個򍖕y= '5B8OZd m@ty}k~2{Dvog^SG:S, ޸ެwQЄfvGċܒw°pu "0>0" lh!ǰ{{DwfτUsŭ$M,:"G#S]goAv0{j~}y=KVPaoj rxw|t|x rqjRaV@K>0"  zf ưzzߒƋCvfτVtڬů&O,:G$S]goBv0{k~}y;t#md}Z?KVQapj rxt|t|x rpjPaV>K>0"  xeŰyޒŋCvfτOuܬűP,:G%S]goCv1{k~}y;t"mdZ:OB5' @|뇌䀉􍑕´p B '5B@KVRaqj rxt|w|x rojOaV=K>0" wcðxݒċGvfЄPvݬݸŲ R,:GS^goCv1{k~}y:t!mdZ9OB5' ?zꇋ䀉!Ĵq D '5B=O~Zd$mAKVSaijrxu|w|x rnjYaV0" up°wܒËFufЄQwެ߸Ŵ T,:GS^go>v2{k~}y@t mdZ8OB5' =yꇋ䀉"ŴsF '5B?OZd%m=ty}m~/{@vog]!S!G:K,"rT‰΄gwD}|#jn"0>6KVTajjrxu|v|x rmjWaV:K>1" snےËFufфRoŶ F, :GS^go>v2{l~}y?tmdZCOB5' ;wɴ釋䀊#ǴtG '5B@OZd%m>ty}l~/{@vog] SG#:J,!qS̈́exE~}%kp"0>7KVUakjrxv|v|x rljVaV9K>1"rm&ڒ‹ExfфRpŷH,!:GS]go?v3{l~}y>t&mdZAOB5' Ivȴ臊倊ȴvI '5BBOZd&m>ty}l~3{?vog]SG!:H,pRфfxE‹ڒ&mr"1>9KVValj rxv|v|xrkjUaV7K>0"pk$}~Exe΄SqŹ!J,#:G S]go@v/{l~}y>t%mdZ@OB5' GtǴ#臊個񍕕ɴw; '5BCOZdm?ty}l~2{>vog^SG :F, oRфfuFËےos "1>:KVWamj rxv|u|xrjjTaV6K>0"nj#||Dwg΄‰TrŬ"K,:!G!S]go@v/{m~}y=t$mdZ?OB5' FsŴ"퇉個򍖕y= '5B8OZd m@ty}k~2{>vog^SG:T, ߸ެwQЄfuGËܒw°pu "0>0" mh!Ȱ{{Dwf΄Usŭ$M,:"G"S]goAv0{j~}y=KVOaoj rxw|t|x rqjRaV@K>0"  kg ưzzߒƋCwfτVtڬů&O,:G$S]goBv0{k~}y;t#md}Z>KVPapj rxt|t|x rpjQaV?K>0"  xeŰyޒŋCvfτWuܬŰP,:G%S]goBv1{k~}y;t"mdZ;OB5' A|뇌䀈􍐕´p B '5B@KVRaqj rxt|w|x rojOaV=K>0" wcðxݒċGvfЄPvݬݸŲ R,:G&S^goCv1{k~}y:t!mdZ9OB5' ?{ꇋ䀉!Ĵq D '5B=O~Zd$mAKVSaijrxu|w|x rnjYaV0" up°wܒċGufЄQwެ޸Ŵ T,:GS^goDv2{k~}y@t mdZ8OB5' =yꇋ䀉"ŴsF '5B?OZd$m=ty}m~/{Avog]!S!G:K,#rT‰΄gwD||#jn"0>6KVTajjrxu|v|x rmjXaV:K>1" soےËFufфRoŵ F, :GS^go>v2{l~}y?tmdZCOB5' <wʴ釋䀊#ƴtG '5B@OZd%m>ty}l~/{@vog] SG#:J,!qS΄exE}}$kp"0>7KVUakjrxv|v|x rljVaV9K>1" rmڒ‹ExfфRpŷH,!:GS]go?v3{l~}y>t&mdZBOB5' Ivȴ释倊ȴvI '5BAOZd&m>ty}l~3{?vog]SG!:H,pS̈́fxE‹ڒ&mq"1>9KVValj rxv|v|xrkjUaV7K>0"pl%~~Exë́SqŹ!I,#:G S]go@v/{l~}y>t&mdZ@OB5' HtǴ#臊個񍕕ɴw; '5BCOZdm?ty}l~2{?vog^SG :F, oRфfuFËےns "1>:KVWamj rxv|u|xrjjTaV6K>0"nj#|}Dwg΄‰Trū"K,: G!S]go@v/{m~}y=t%mdZ?OB5' FsŴ"퇉個򍖕y= '5BDOZd m@ty}l~2{>vog^SG:T, ߸ެwQЄfuFËܒw°pu "0>;KVXanj rxw|u|xrijSaVBK>0" mh"Ȱ{|Dwf΄Usŭ$sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/44100-1-32.wav0000644000175000017500000126116012252354725026152 0ustar miramiraRIFFhbWAVEfmt D factXPEAK9Qm?data bwܮ=9.>߁>>n=>U?>5?3!?@2?T%A?KN?Z?re?Mn?Bku?z?;~?T?|?}?y?os?(@l?+b?X?K?݂=?.?0w?- ?><>U>n>>N7==mڽCl&޾\rM%5:DQس]^gw?pcv{*~BH|Nxrj c` U&H89*F #*ꖾU.YJ,//=A>M.Y>&>">>E ??*?<9?&H? U?c`?j?r?Nx?|?H?B?*~?{?av?u?p?\g?ճ]?Q?6D?5?L%?t?\?&>>l>,C>nm=<}71nU<ʾ/ 2w.ۂ=KX*b&@lmsߔy}|T;~zAkuMnreZKNU%AB25!5]?x=Ծî߁8.@ܮ.4ܮ=9.> ߁>>p=>U?>5?2!??2?R%A?HN?Z?re?Mn?Dku?z?;~?T?{?}?y?ns?(@l?,b?X?K?ނ=?.?5w?2 ?&>;>U>n>u>7=LmڽCl&޾\}U%5>DQ۳]agy?pdv{+~BH|Nxrj!c` U&H?9*O #=ꖾ}.YrN/h/=x>.Y>@>#>>P ??*?@9? &H? U?"c`?j?r?Nx?|?H?B?+~?{?dv?y?p?`g?ڳ]?Q?=D?5?S%?|?\?&>>l>TC>l= <7HnU<ʾ)4 6w.߂=KX-b(@losy}{T;~zCkuMnreZQN[%AI2=!5n?=Ծށ8.ܮ.;5ܮ=&9.>߁>Ʈ>{=>_?>5?6!?C2?V%A?LN?Z?re?Mn?Aku?z?;~?T?|?}?y?qs?+@l?1b?X?K?=?.?=w? ?>;>U>n>^>6={mڽ2Cl &޾\uM%57DQֳ]\gv?pbv{*~BH|Nxrj&c` U%&H09*< "ꖾ'.Y//=P>\.Y>->#>>H ??*?99?.&H? U?-c`?j?"r?Nx?|?H?B?+~?{?gv?q?p?dg?ϳ]?Q?/D?5?C%??\?,&>o>l>C>n=<[6nUC<ʾF .w.؂=KX7b$@lusޔy}{T;~zFkuMnreZWNM%AP2,!5H?=Ծ9߁8.aݮ.3|ۮ=8.>?߁>>=>N?>5?.!?R2?O%A?XN?Z?re?Mn?Gku?z?;~?T?{?}?ݔy?ts?#@l?6b?X?K?ւ=?.?,w?C ?>><>U>n>>B6=y)nڽ Cmu2&޾\E%51DQѳ]fgr?pgv{,~BH|Nx!rj+c` U,&H79*` 9#'ꖾ-YC/#/=>4.Y>W>">>? ??*?I9?&H? U?c`?j?r?Nx?|?H?B?)~?{?av??p?[g?]?Q?JD?5?c%?s?|\?&>F>l>C>am=W < 7nV;ʾ># @w.=KX$b-@lhsy}|U;~z@kuMnreZJNi%A@2!5"?u=Ծ߁8.ܮ.5+ܮ=T9.>ށ>ܮ>V=>t?>5??!?42?^%A?@N?Z?re?Mn?;ku?z?;~?T?}?}?y?ns?3@l?,b?X?K?Ȃ=?.?w?1 ?><>U>;n>0>7=4lڽ`Cl%޾\eV%5?DQܳ]Tgz?p\v{(~BH|Nxrj!c` U&H(9*N s#閾w.Y4//=>.Y>>#>|>R ??*?,9?!&H? U?#c`?j?r?Nx?|?H?B?-~?{?[v?x?p?Rg?ڳ]?Q?>l>MC>l=<7CNnU<ʾ5 w.˂=KX.b@losٔy}}T;~z:kuMnreZ=NZ%A12߁>>~=>*?>5?!?D2?B%A?LN?Z?re?Mn?Aku?z?;~?S?|?}?Ӕy?{s?+@l?"b?X?K?=?.? w?T ?6>;>U>߄n>מ>6=kڽCl󵾚%޾\wf%5$DQ]xgk?pbv{0~BH|Nx(rjc` U8&HE9*q "閾/Y//=X>-Y>0>B#>1>. ??*?g9?&H? U?.c`? j?r?Nx?|?H?C?+~?{?Uv??p?dg?ϳ]?Q?WD?5?B%?O?\?)&>l>|l>C>n=@lbsޔy}~V;~z4kuMnreZ0Nv%AO2+!5?=Ծށ9.Tݮ.L4ݮ=8.>ށ>>=>?>5?0!?T2?z%A?4N?Z?re?Mn?5ku?z?;~?V?~?}?ݔy?`s?;@l?5b?X?K?=?.?+w? ?>;<>U>n>}>48=6nڽ Clx4&޾\TF%5[DQҳ]fg?pWv{,~CH|Nx rj*c` U&Hb9*)  6#$ꖾ-Y?x/=/=>4/Y>>">>w ??*?J9?<&H? U?c`?j?*r?Nx?|?H?B?/~?{?`v?i?p?vg?]?Q? D? 5?b%?q?{\?u&>>l>C>Xk=#<7nU;ʾAZ w.=KX$b-@l|sՔy}|S;~z@kuMnreZIN>%Am2K!5?<Ծ ߁8.ڮw7ܮ=[9.>l߁>g>Y=>w?>5?!?52?_%A?fN?Z?re?Mn?Nku?z?;~?T?y?}?y?ms?@l?Ib?X?K?ǂ=?.?Lw?/ ?>;>%V>5n>*>5=h lڽgC.m)%޾\&%5@DQ]Ug{?pnv{(~BH|Nxrjc` U&H'9*L q羗"tꖾp.Y//=>.Y>>">>S ??*?-9?"&H? U?c`?j?r?Nx?|?H?B?'~?{?lv?x?p?Qg?]?Q?;D?5? %??\?%>>m>GC>l=h <5ITn4V;ʾ6 Rw.̂=KXb@lpsy}zT;~zLkuMnreZbNY%A02 !5i?J=ԾX]߁;9.ۮ.;6ڮ=8.>߁>> =>-?>5?Q!?2?C%A?MN?Z?re?Mn?Bku?z?;~?S?|?}?Ӕy?zs?*@l?!b?X?K?=?.?w?S ?3>;>U>لn>О>6=#kڽCl󵾝%޾\xh%5%DQ]ygl?pbv{0~BH|Nx'rjc` U7&HD9*p "閾/Y//=_>-Y>3>E#>4>/ ??*?9?&H? U?.c`? j?r?Nx?|?H?C?+~?{?Uv??p?cg?γ]?Q?VD?5?@%?N?\?&&>i>yl>C>m=@lcsߔy}U;~z3kuMnreZ/Nu%AN2)!5?=Ծށ9.Gݮ4ݮ=8.>ށ>>=>?>5?1!?U2?{%A?5N?Z?re?Mn?6ku?z?;~?V?~?}?ܔy?`s?:@l?4b?X?~K?=?.?)w? ?}>8<>U>n>w>'8=BnڽCl{7&޾\VH%5\DQӳ]gg?pWv{,~CH|Nx rj*c` U&Ha9*' 3#!ꖾ-Y4^/V/=>;/Y>>">>x ??*?K9?=&H? U?c`?j?*r?Nx?|?H?B?/~?{?`v?i?p?ug?]?Q?D? 5?`%?p?z\?r&>>l>C>Kk=<#7nU;ʾD[ w.=KX%b.@l}sՔy}|S;~z?kuMnreZHN=%Al2J!5?<Ծ߁8.ڮSDܮ=a9.>p߁>j>\=>y?>5?!?72?`%A?gN?Z?re?Mn?Nku?z?;~?T?y?}?y?ms?@l?Hb?X?K?ł=?.?v?. ?Ǩ>;>"V>=n>#>w9=lڽvC1m,&޾\3%5DQ]g{?pLv{(~AH|Nxrjc` U%H&9/*{K R羔"qꖾv,Y / /= >,Y>>">f>T ??8*?.9?%H? U?c`?j?r?Nx?|?H?C?'~?{?Iv?w?p?g?]?Q?D?5?%?*?\?&>>m>JC>l=4<9Pin8V;ʾۨ8 v .͂=QKXbO@lps̔y}zX;~z'kuMnreZaN%A.2k!v5f?1>ԾUZ߁<7.ۮힶޮ=8.>&ށ> >=>@>5?!?t2?D%A?N?Z?re?Mn?Bku?ٽz?;~?S?u?}?y?Ss?*@l?[b?X?K?=?.?lw? ?0><>U>ӄn>М>6=WoڽǾCk󵾟%޾\y%5&DQ]Cg?pcv{0~BH|NxrjRc` U6&H9* #閾/Y//=a>-Y>A>H#>7> ??*?i9? &H? U?/c`?j?8r?Nx?|?H?C?~?{?vv?Z?p?bg? ]?Q?UD?5??%??T\?#&>U>vl>C>i=y<4nTL<ʾ񾀨 2w.=KX9b@lsߔy}U;~zWkuMnreZ.Nt%A2(!6>=Ծށ9.>ٮ.4ٮ= :.>ށ>˭>=>>> 6?2!?2?|%A?6N?Z?re?Mn?[ku?z?;~?V?~?}?ܔy?s? @l?4b?X?}K?=?~.?(w?u ?>5<>V>n>q>4=UjڽClm:&޾_\I%5]DQ]hg^?pzv{ ~CH|Nx4rj)c` U&H`9*  0#떾-Y.G.p/=>A/Y>>#>> ??*?9?>&H? U?Xc`?j?r?Nx?|?H?B?/~?{?`v??p?>g?]?Q?D? 5?%?o?\?%>>m>C>8o=<07nU<ʾF vw.=KXab/@lVsy}vS;~׽z?kuMnreZN<%Ak2!5?<Ծ󮫾ށ8.ޮ6Qܮ=o7.>s߁>m>H>>|?>5?u!?82? %A?hN?Z?re?Mn?*ku?z?;~?P?y?}?ɔy?ls?J@l? b?X?K?Ă=?.?v?- ?Ĩ>;>V>7n>>k9=mڽ}C4m/&޾\5%5DQ]g|?pMv{(~AH|Nxrjc` Uk&H%9.*zJ O羑"nꖾp,Y / /=>,Y>>">i>V ??9*?/9?%H? U?c`?j?r?Nx?|?H?C?'~?{?Iv?w?p?g?]?Q?D?5?%?)?\?&>>m>DC>l=<9Von;V;ʾި9 v .΂=RKXbP@lqs̔y}zX;~z&kuMnreZ`N%A-2i!u5c?.>ԾRW߁67.ۮwޮ=8.>)ށ>>=>@>5?!?u2?E%A?N?Z?re?Mn?Cku?ڽz?;~?S??}?y?Rs?)@l?[b?X?K?=?.?jw? ?-><>|U>̈́n>ɜ>6=oڽξCk󵾢%޾\z %5'DQ]Dg?pcv{0~BH|NxrjQc` U5&H9* #閾 /Y/-/=g>-Y>E>K#>9> ??*?j9? &H? U?0c`?j?9r?Nx?|?H?C?~?{?vv?Y?p?bg? ]?Q?TD?5?>%??S\? &>R>sl>C>i=F<4nTO<ʾ񾁨 3w.=KX:b@lsߔy}U;~zWkuMnreZ-Ns%A2'!6>=Ծށ9.2ٮ 5ٮ=:.>ށ>έ>=>>>6?3!?2?}%A?6N?Z?re?Mn?[ku?z?;~?V?~?}?ܔy?s?@l?3b?X?|K?=?}.?'w?s ?>2<>V>n>j>4=FbjڽCl=&޾`\J%5^DQ]hg_?pzv{ ~CH|Nx4rj(c` U&H_9* -#떾-Y(-./=>G/Y>>#>> ??*?9??&H? U?Yc`?j?r?Nx?|?H?B?/~?{?_v??p?=g?]?Q?D?5?%?m?\?%>>m>C>,o=<=7  nU<ʾI ww.=KXbb/@lWsy}vS;~ֽz>kuMnreZN;%Aj2!5?<Ծ𮫾߁8.~ޮ.6^ܮ=u7.>v߁>p>K>>?>5?v!?92?%A?iN?Z?re?Mn?+ku?z?;~?P?y?}?ɔy?ls?I@l? b?X?K?Â=?.?v?+ ?¨>;>V>1n>>^9= mڽC7m2&޾\6%5DQ]g|?pMv{(~AH|Nxrjb` Uj&H$9-*yH L美"kꖾi,Y / /=>,Y>>">l>W ??:*?09?%H? U?c`?j?r?Nx?|?H?C?'~?{?Hv?v?p?g?]?Q?D?5?~%?(?\?&>>m>>C>l=<9\un>V;ʾ: v .ς=SKXbP@lqs̔y}zX;~z&kuMnreZ_N%A,2h!t5`?+>ԾOT߁07.ۮ ߮=8.>-ށ>>=>@>5?!?v2?F%A?N?Z?re?Mn?Cku?ڽz?;~?S??}?y?Rs?(@l?Zb?X?K?=?.?iw? ?*><>yU>Ƅn>Ü>6=oڽԾCk󵾥%޾\| %5(DQ]Eg?pdv{1~BH|NxrjQc` U4&H9* #閾/Y~p/G/=n>-Y>H>N#><> ??*?k9? &H? U?1c`?j?9r?Nx?|?H?C?~?{?uv?Y?p?ag? ]?Q?SD?5?=%??Q\?&>O>pl>ڿC>i=<4ÃnTR<ʾ񾂨 5w. =KX;b@lsy}U;~zVkuMnreZ,Nr%A2&!6>=Ծށ9.%ٮ5ٮ=:.>ށ>ѭ>=>>>6?5!?2?~%A?7N?Z?re?Mn?\ku?z?;~?V?~?}?۔y?s?@l?2b?X?{K?=?{.?&w?r ?>/<>V>xn>d>4=ynjڽ%Cl@&޾b\²K%5_DQ]ig_?pzv{ ~CH߷|Nx3rj'c` U%H^9* *# 떾-Y!./=>M/Y>>">> ??*?9?@&H? U?Zc`?j?r?Nx?|?H?B?/~?{?_v??p?=g?]?Q?D?5?%?l?\?%>>m>C>o=WkuMnreZN9%Ai2!5?<Ծ߁|8.qޮ6jܮ={7.>y߁>s>N>>?>5?w!?:2?%A?jN?Z?re?Mn?+ku?z?;~?Q?y?}?Ȕy?ks?I@l? b?X?K?‚=?.?v?* ?>;>V>*n>>Q9=4mڽC:m5&޾\7%5DQ]g}?pNv{)~AH|Nxrjb` Ui&H#9,*wG I羋"hꖾc,Y / /=>,Y>>">n>Y ??;*?19?%H? U?c`?j?r?Nx?|?H?C?'~?{?Hv?v?p?g?]?Q?D?5?}%?&?\?&>>m>7C>tl=<9c{nAV;ʾ< v .Ђ=TKXbQ@lrs͔y}zX;~z%kuMnreZ^N%A+2g!r5]?(>ԾLQ߁)7.ۮS߮=8.>0ށ>>=>@>5?!?x2?G%A?N?Z?re?Mn?Dku?ڽz?;~?S??}?y?Qs?(@l?Yb?X?K?=?.?hw? ?'><>vU>n>>6=oڽھCk󵾨%޾\} %5)DQ]Eg?pdv{1~BH|wNxrjPc`4 U%H9* !閾.YpS/\/=t>.Y>K>v!>> ??*?9?&H? U?1c`?j?r?hNx? |?H?C?7~?{?1v?X?p?`g? ]?AQ?D?5?;%??,]?M$>n>ml>ӿC>q=-<<ɃnT:ʾ{񾄨 6w.^=#KXsyƈ}U;~z kuMnreZN$A2$!5@;Ծށ9.ᮽt= :.>ށ>ԭ>;>@>6?6!?2?$A?N?Z?re?Mn?ku?z?;~?V?~?È}?y?7s?@l?1b?X?K?O=?z.?$w?q ?S>V:>T>rn>^>;=orڽ+Clv$޾?]òM%5DNQ]jg`?p7v{9~CH|Nxrj'c` U&H9* M! 閾-Y/.=>T/Y>>">> ??*?9?%H?A U?[c`?j?r?}Nx?|?H?B?/~?{?v?:?p?>k>C>o="#<[/ nU;ʾ˨ zw.=!KJXcb0@lXsy҈}S;~ zku~MnreZN%A2!5?>Ծށu8.dޮԮ=s;.>|߁>v><>=>X6?x!?;2?%A?N?Z?re?Mn?,ku?ɽz?;~?Y?y?}?y?s??l? b?X?K?m=?;.?v?) ?>e=>0T>$n> >D9=iuڽ}C=m8%޾[ %5DZQA]g}?pNv{A~DH|Nxjrjb` Uh&H9k*vF Fc$|薾],Y /.=>0Y>>">> ?W?<*?29?%H?T U?c`?j?r?Nx?շ|?H?A?&~?{?v??p?g?]?Q?D?}5?%?%?\?&>>"k>1C>gl=g<2]enDV;ʾ#f w .т=UKeXbQ@lrs͔y}P;~znkuNnfreZ]N%A2!q5[?%>Ծ+^݁#7.ۮ +׮=<.>">>=>\>>4?!?y2?H%A?N?5Z? se?Mn?Dku?۽z?;~?\?t?}?y?s?@l?b?X?K?4=?t .?v? ?%><>YW>րn>>6=$gڽCm󵾫%޾\%5*DQl]g?pev{~EH|NxNrjb` U2&H9*1 #떾 +Yr=/z/=>1Y>7>T#>B> ??}*?m9? &H? U?b`?Bj?;r?Nx?|?H?@?~?{?uv??p?g?]?Q?QD?A5?%?߱?N\?&>I>Vn>C>i= <4țnVX<ʾ񾮧 mvG . =KXbs@lsy}qM;~zUkuMn@reTZ*Np%A2!*5>=Ծ5. ٮ.L5ٮ=56.>>>=>>>?5?q!?2?%A?9N?aZ?Lre?Nn?]ku?z?;~?N?p?}?۔y?s?i@l?b?X?yK?=?5 .?w? ?>)<>V>Pn>c>3=jڽECnyF&޾e\%S5aDQ]g?p{v{!~@H߷|Nx2r8jb`v U%H\9i* $#떾1Y./=>q+Y>>#>> ?F?*?9?B&H? U?b`?j?Vr?Nx?|?H?D?~?{?^v??p?g?_]?}Q?D?5?%?:?\?}%>>m>iC>g=<Ծ箫߁`<._֮W6ܮ=7.>݁>[>S>>?>5?!?2?%A?lN?Z?rre?hMn?uku?z?;~?Q??}?ǔy?js?H@l?b?XX?EK?=?.?w? ?>;>V>n>><1=3mڽCTk&޾\:%5DQ³]"g%?pv{)~AHѷ|Nxrjxc`F U%H!9)*B {羅"bꖾ?0Y.3 /=,>,Y>>$>t>[ ??~*?9?x&H? U? c`?j?r?Nx?|?H?C??~?{?Gv?u?p?g?4]?LQ?D?5?z%??s]?$>> m>C>Ot=6<:onaT=ʾ> vN.~=KXb?l$sy}zX;~Ľz$kuMnreZN$A)2d!C6=P<ԾEJ߁;.㮽870߮=8.>6ށ>8>>>@>5?!?2?%A?N?Z?re?Mn?ju?z?;~?S??ψ}?y?Ps?'@l?Xb?<X?K?=?.?ew? ?^>:>pU>n>>>=U&oڽCk{'޾\%d5ϱDQ]GgC?p!v{1~BH|vNxrjNc`2 U%H9* !閾.Yc //=>.Y>Q>|!> > ??*?9?&H? U?3c`?j?r?iNx? |?H?B?7~?{?1v?W?p?_g? ]??Q?D?5?9%??)]?G$>h>gl>ǿC>q=w-<<ßփnU:ʾ񾆨 8w.`=%KX=b@l?syLj}U;~z kuMnreZN$A2"!5@;Ծށ9.஽aq=-:.>ށ>ڭ>;>@>6?8!?2?$A?N?Z?re?Mn?ku? z?;~?V?}?È}?y?6s?@l?0b?X?K?M=?x.?"w?n ?N>P:>T>fn>Q>;=񮼉rڽ8Cl{$޾B]ƲO%5DPQ]kga?p8v{9~CH|Nxrj%c` U&H9* G!閾-Y/.=>`/Y>>">> ??*?9?%H?B U?\c`?j?r?}Nx?|?H?B?.~?{?v?9?p?;g?޳]?Q?D?O5?%?h?\?G'>>k>vC>n="> ?Y??*?49?%H?V U?c`? j? r?Nx?ַ|?H?A?&~?{?v??p?g?]?Q?D?{5?%?"?\?&>>k>%C>Nl=<"2jrnJV;ʾ)i w .ӂ=WKgXbS@lssΔy}P;~zmkuNnereZ[N%A2!n5U?>Ծ%X݁7.ۮE׮=<.>(>>!=>b>>4?!?{2?J%A? N?6Z? se?Mn?Eku?۽z?;~?\?t?}?y?s?@l?b?X?K?1=?q .?v?ާ ?><>SW>ʀn>>}6=gڽCm󵾱%޾\%5,DQm]g?pev{~EH|NxMrYjb` U0&H9*/ 羾#떾+Ye //=>1Y>=>Z#>H> ??*?o9?&H? U?b`?Cj?<r?Nx?|?H?@?~?{?tv??p?g?]?Q?OD??5?%?ܱ?L\?&>C>Pn>ӻC>i=F <4՛nV^<ʾ񾱧 pvJ . =KXbt@lsy}qM;~zTkuMn?reRZ(Nn%A2!'5>=Ծ5.خ 5ٮ=B6.>>>=>>>B5?s!?2?%A?;N?cZ?Mre?Nn?^ku?z?;~?N?p?}?ڔy?s?g@l?b?X?wK?=?2 .?w? ?>#<>V>Cn>V>3=FjڽQCnK&޾g\%U5cDQ]g?p|v{!~@H޷|Nx1r6jb`t U%HY9g* #떾1Y. /=>~+Y>>#>> ?H?A*?9?D&H? U?b`?j?Wr?Nx?|?H?D?~?{?]v??p?g?]]?{Q?D?5?%?7?\?w%>>m>]C>f=<}7(FnW<ʾW v.G=KXb?lsy}v[;~սz<Ծ᮫߁T<.E֮6ܮ=7.>݁>a>Y>>?>5?!?2?%A?nN?Z?sre?iMn?vku?z?;~?Q??}?ǔy?is?F@l?~b?VX?CK?=?.?w? ?>;> V>n>>"1=LmڽCZk &޾\<%5DQó]$g'?pv{)~AHѷ|Nxrjvc`D U%H9'*? u"\ꖾ30YQ.f /=9>,Y>>$>z>^ ??*?9?z&H? U? c`?j?r?Nx?|?H?C?>~?{?Fv?s?p?g?2]?JQ?D?5?x%??q]?$>>m> C>5t=<*:|ngT=ʾA vP.=KXb?l%sy}{X;~ýz$kuMnreZN$A&2b!A6AJ<Ծ?D߁;.㮽.;7J߮=8.><ށ>>>>>#@>5?!?2?%A?N?Z?re?Mn?ju?z?;~?S??Έ}?y?Os?%@l?Vb?;X?K?=?.?cw? ?Y>:>jU>n>>l>=&oڽCk򵾁'޾\%f5ѱD!Q]HgD?p"v{1~BH|vNxrjMc`1 U%H9* !閾.YV//=>.Y>W>!>> ??*?9?&H? U?4c`?j?r?iNx? |?H?B?6~?{?0v?V?p?^g?]?>Q?D?5?7%??']?B$>b>`l>C>q=-<<ϟn U:ʾ񾉨 ;w.b='KX?b@l@syLj}U;~z kuMnreZN$A2!5{@;Ծށ9.஽dn=9:.>ށ>୫>;>@>6?;!?2?$A?N?Z?re?Mn?ku?z?;~?V?}?ˆ}?y?5s?@l?.b? X?K?J=?u.?w?k ?H>J:>T>Yn>D>;={񮼢rڽECl򵾁$޾E]ȲQ%5DRQ]mgb?p9v{:~CH|Nxrj$c` U&H9* A!閾-Y/'.=>m/Y>>!">> ??*?9?%H?D U?^c`?j?r?~Nx?|?H?B?.~?{?v?8?p?9g?ݳ]? Q?D?M5?%?f?\?A'>>k>iC>n=U"Ծ݁\8.1ޮԮ=;.>߁>><>=>^6?}!?@2?%A?N?Z?re?Mn?.ku?˽z?;~?Y?y?}?y?s??l?b?X?݃K?i=?7.?v?# ?>Y=>$T> n>>9=6eeڽCImD%޾[%5D^QD]g?pPv{B~DH|Nxhrjb` Ud&H9f*q@ ;W$o薾D,Y3 /.=G>0Y>>">> ?\?A*?79?%H?X U?c`?"j?!r?Nx?ַ|?H?A?&~?{?v??p?g?]?Q?D?y5?%? ?\?&>>k>C>4l=<;2w~nPV;ʾ.l w .ւ=XKiXbT@ltsϔy}P;~zlkuNndre}ZYN%A2!l5P?>ԾR݁ 7.ۮ*R^׮=<.>.>$>'=>g>>4?!?}2?L%A? N?8Z? se?Mn?Fku?ܽz?;~?\?t?}?y?s?@l?b?X?K?/=?o .?v?ۧ ?><>MW>n>>d6=hڽCm󵾷%޾ \%5.DQo]g?pfv{~EH|NxLrXjb` U.&H9*, 羸#떾*YX//=> 2Y>C>`#>M> ??*?r9?&H? U?b`?Dj?=r?Nx?|?H?@?~?{?sv??p?g?]?Q?MD?<5?%?ڱ?I\? &>=>Jn>ǻC>i= <4̇nVd<ʾƧ񾴧 rvL .=KXbu@lsy}rM;~zSkuMn>reQZ&Nl%A2!%5>}=Ծ}5.خ5 ڮ=O6.>>ů>=>>>E5?v!?2?%A?=N?eZ?Ore?Nn?^ku?z?;~?N?p?}?ٔy?s?f@l?b?X?uK?=?0 .?w? ?><>V>7n>I>3=jڽ^CnQ&޾j\%W5eDQ]g?p}v{!~@H޷|Nx0r5jb`r U%HW9e*  #ꖾv1Yz.=/=>+Y>>#>> ?K?C*?9?F&H? U?b`?j?Yr?Nx?|?H?D?~?{?\v??p?g?\]?yQ?D?5?%?5?[?q%>>m>PC>f=$<75SnW=ʾ] v.I=KXb?lsy}vZ;~Խz;kuMnre$ZN3%Ab2!6$><Ծۮ߁G<.,֮{%6ܮ=7.>݁>g>_>>?>5?!?2?%A?pN?Z?ure?kMn?wku?z?;~?Q??}?Ɣy?hs?E@l?|b?TX?AK?=?.?w? ?>;>V>n>ߡ> 1=gfmڽC`k&&޾\?%5DQų]%g(?pv{)~AHз|Nxrjuc`B U%H9%*= py"Vꖾ&0Y. /=E>,Y>>$>>a ??*?9?|&H? U? c`?j?r?Nx?|?H?C?>~?{?Ev?r?p?g?1]?HQ?߰D?5?v%??n]?$>>l>C>t=i6 AD<Ծ9>߁:.q㮽>7c߮=8.>Bށ>D>>>(@>5?!?2?%A?N?Z?re?Mn?ju?z?;~?T??Έ}?y?Ns?$@l?Ub?9X? K?=?.?`w? ?ک>:>dU>n>>S>="'pڽCl 򵾇'޾\%h5ӱD#Q]IgE?p#v{2~BH|uNxrjKc`/ U%H9* !閾.YJ//=>*.Y>]>!>> ??*?9?&H? U?6c`?j?r?jNx? |?H?B?6~?{?/v?U?p?\g?]?\>Zl>C>qq=,<<ܟnU:ʾ񾌨 =w.d=)K!X@b@lAsyȈ}U;~z kuMnreZN$A2!5u@;Ծށ9.஽o1k=F:.>ށ>歫>;>@>6?=!?2?$A?N?Z?re?Mn?ku?z?;~?V?}?ˆ}?y?4s?@l?-b? X?K?H=?s.?w?i ?B>D:>T>Mn>8>;=񮼼rڽQCl򵾇$޾H]˲T%5°DTQ]ngc?p:vz{:~CH|Nxrj"c` U&H9* ;! 閾-Y]/Z.=>y/Y>>'">!> ??*?9?%H?F U?_c`?j?r?Nx?ɷ|?H?A?.~?{?v?7?p?8g?۳]? Q?D?K5?%?c?\?<'>>k>]C>n=!Ծ݁P8.ޮSԮ=;.>߁>><>=>`6?!?B2?%A?N?Z?re?Mn?.ku?˽z?;~?Y?y?}?y?s??l?b?X?܃K?g=?4.?v?! ?>S=>T>n>>8=~eڽCOmJ"%޾[%5D`QF]g?pPv{B~DH|Nxgrjb` Ub&H9d*n= 5Q$i薾7,Y /.=T>0Y>>">> ?^?D*?99?%H?Z U?c`?#j?"r?Nx?׷|?H?A?%~?{?v??p?g?]?Q?D?w5?%??\?&>>k> C>l=4ԾT*ၾ6.\뮽r}i= 5.>5>e>,=>A>5?¾!?2?O%A?:N?:Z? se?-Mn?Gku?Dz?;~?\??}?zy?s??l?b?X?qK?-=?.?)x?٧ ?><>{S>xn>>BF=WxڽCm-𵾼%޾]%50DQq]g>pgv{~EH|6NxKrjc` U$H9$* -羲#疾2YL#//=>G*Y>I>>S> ? ?*?9?&H? U?b`?Fj?r?Nx?6|?H?@?N~?{?v??p?g?]?Q?D?:5?p%?x?F\?l">7>kj>C>pi=uL<5ףnV8ʾ˧c uvN .=KXbv@lsy}rM;~zjuMn9Ծw܁=.خ$ڮ==>.>܁>˯>%:>?>6?x!?2?7$A??N?pZ?Pre?Nn?ju?z?;~?N?o?}?ؔy?s?e@l?b?X?sK?=?. .?Rv?> ?|>k8>V>cn>&>3=ҮjڽECj"޾m\%Z5DQ]g?pv{S~@H/|Nxr4jb` U%H9b*^ ]ꖾ)YG.w.=>h3Y>>$>[> ??E*?9? %H? U?c`?j?Zr?ANx?|?H?D?~?{?[v?>p?g?Z]?Q?D?5?%??]?l%>>m>iC>v=<'B'nS=ʾܤ Lx.K=KXb?lsy}Z;~;z:kuMnre#Z N1%A2!4A<Ծ߁X4.殽m6̮=7.>>>e>><>5?G!?2?%A?DN?Z?Yse?lMn?xku?z?;~?a??}?7y?gs??l?{b?SX?vK?=?w.?w?I ?l>z;>5R>܅n>>@=]ڽC?oo&޾ZBY%.5DQƳ]g)?pv[{*~GHз|OxrBjsc`A U'H9*:c s"}斾0Y/ /=c>,Y>> >>??*?9?~&H? U?c`?j?r?Nx?|?H?>?>~?{?v?q?p?g?/]?FQ?$D?5?%??[?k(>> i>C>d=6<]:n?X9ʾ񾙦 v .-=KXb@l's yu}{G;~½zkuMnqeZNI&A"2м!;6=?Ծ3Yہ:.fӮힷ}߮=1.>Hށ>>];>.@>.4?!?92?$A?N?Z?re?FNn?ju?z?;~?T?f?͈}?y?s?#@l?fb?7X? K?؃=?.?u? ?M>>>^U>|n>~>B.=箼*pڽC l#޾]%5D$Q]Kg?p$v{~BH|tNxrjSb`- U%H?9*[ 羉%閾&Y=.1.=>6Y>c>C%>> ?=?*?%9?t%H? U?Ab`?j?r?kNx?|?H?B?~?{?.v?@p?[g?]?:Q?D?5?2%??!]?6$>>Tl>ǷC>Wq=G<-ËnUC>ʾ 񾎨 u.=K#XUb@lsyȈ}dU;~z kuTNnreZN$AT2!M4p@;ԾVށ1.஽78Ү=S:.>>쭫>?>G=>6?!?2?0&A?N?Z?qe?Mn?ku?z?;~?F?}?{}?y?3s?@l?+b?X?K?F=? .?w? ?=>>:>X>@n>B>;=D2bڽ^Cp'(޾[Ͳ%5 D1Q]gd?pvz{:~=H|Nxrj c` U&H9 *5!얾z-Y*//= >/Y>>-">>B ??*?9?&H?, U?ac`?2j?r?Nx?ʷ|?H?G?-~?b{?v?6?p?g?ٳ]?Q?D?I5?v%?`?[?6'>>o>PC>^=!Xibp?l\s/y}c;~zkuzMnjseZZN%A2e!5^<>Ծ𬫾ၾC8. ή =3.>߁>S><>YA>4?!?2?%A? N?Z?re?Mn?/ku?3z?;~?Y??}?y?s??l?b?X?K?e=?2.?jx? ?>M=>T>n>ם>(=uڽչCVm '%޾]r%{5DQG]g>pQv{~DH|JNxfrjc` U!%H9b*; K$c薾3Y..=P>)Y>>&>>> ??F*?9?%H?w U?b`?$j?|r?Nx?)|?H?A?V~?{?v??p?g?]?Q?8D?t5?%??\?#>> k>C>l=֮.Rۮ7׮=<.>\܁>0>@>r>>6?8!?2?&A?N?EZ?+re?Mn?ju?ݽz?;~?L?t?}?y?s?@l?b?X?K?Ӂ=?j .?v? ?>9>AW>n>m>16=GChڽC"j])޾&\YS% 5zDQr]g?pv{K~?H<|NxrUjb` U*&H.9*' 떾*Y.p/?!/=>%2Y>}>l#>> ??*?v9?T'H? U?c`?xj??r?-Nx?|?H?E?~?{?qv?>p?g?]?Q?HD?5?%?ձ?]?&>t>=n>C>?y= <En3Sp<ʾX񾹧 x.=DŽKXb?lsqy}];~KzRku;MnseMZPNg%A+2!5+Bq=Ծ~5.讽.5/=h6.>> >=>B>J5?!?P2?%A?oN?hZ?4se?NMn?`ku?z?;~?_??}?Jy?s??l?b?X?K?=?.?w? ?><>R>n>0>{C=yzڽwCn]&޾(^%5iDQ]g ?pvL{"~FHݷ|Ox.rcjc`o U4'HS9*}  #疾]1Y //=>+Y>>V >> ?P?*?Q9?J&H? U?b`?jj?r?Nx?|?H???F~?{?v??p?g?X]?uQ?YD?5?,%?/?[?)>>i>7C>f=SA<77lnWa9ʾh񾮩 v .=ŃKXb@lsyj}wJ;~ӽzkuMnre*ZN&A]2!6>y@ԾϮہ.<.ծ(Cȷܮ=?.>݁>s>:>?>87?!?2?q$A?sN?Z?wre?(Nn?ju?z?<~?Q?k?و}?Ŕy?s?C@l?b?dX?=K?=?.? v? ?ߦ> ?>U>~n>š>0=8ݮmڽClk2]#޾\%5XDQȴ](g?pv{[~AH!|Nxrj{b`[ U%Hx9 * d#&Iꖾ<(Y..=_>4Y>>$>>f ?/?*?9?A%H? U?d`?j?wr?WNx?|?H?C? ~?{?Dv?!@p?~g?.]?iQ?۰D?'5?q%?I?h]?$>>l> C>s=<*nyT=ʾyI xW.=‚KXb?lsy}X;~)z!kurNnreZN$A2[!4A9<Ծ򱫾2߁2.>㮽WE7Ϯ= 9.>->P>?><>5?!?2?%A?xN?Z?se?Mn?ku?z?;~?d??}?#y?Ls?@l?Rb?#X?@K?~=?%!.?[w? ?ϩ>:>$Y>n>> >='[`ڽCo򵾒'޾K[%m5ױDQ]%gH?pvk{2~GH·|NxrjHc` U&H9^* \!x햾.YAS/\/=>C.Y><>!>$>??G*?9?&H? U?9c`?j?r?Nx?|?H?=?5~?q{?v?R?p?3g?]?Q?D?5?%??f[?'>P>'p>C>Ua=+<%= nX:ʾ Cw!.i=-KXCb@lCsy}D;~zkuMnseZN&A2!5<@?Ծj⁾9.Ю~dC=}2.>ށ>>;>@>x4?B!?y2?$A?N?Z?re?gNn?ku?"z?;~?W?a?}?y?s?@l?b?X?ՂK?=?n.?x?c ?>=>T>n>>{+=rڽCls$޾M]/Y%5ưDWQ]qg@p;v{ ~CH|^Nxrjd` UT%H9*H 2$閾?5Y..=>'Y> >%>,> ??*?b9?%H?I U?lb`?j?r?Nx?|?H?A?~?{?v??p?5g?ز]?Q?mD?5?%??\?#>l>k>C>n=&ʾ٨ u.=*KSX~b7@lsyԈ}iR;~zju4NnreZN$A2ս!R7?;Ծ݁@.ݮ7Ԯ=;.>ہ>>@@>=>f6?!?G2?j&A?N?Z?re?Mn?ku?̽z?;~?I?x?n}?y?s?@l?b?X?؃K? =? .?v?ȩ ?>9>W>n>>8=e=eڽCiV(޾[%5EDcQI]g?pv{C~>H|Nxrwjb` U^&Hg9*i *羐 0얾,Yv//=n>0Y>>">V> ?c?*?=9? 'H?] U?c`?Vj?$r?Ox?ط|?H?F?%~?R{?v??p?g?]?Q?}D? 5?2%??C^?&>>n>C>{=gԾHၾ6.)뮽:d="5.>A>q>8=>A>5?Ǿ!?2?S%A?>N?=Z?se?/Mn?Iku?Ez?;~?\??}?xy?s??l?b?X?mK?)=?.?$x?ӧ ?><>oS>`n>w>F=$Exڽ2Cn9%޾]%54DQt]g>piv{~EH|5NxIrjc` U$H9* "羦#疾2Y26#/z/=>`*Y>V>>^> ??*?9?&H? U?b`?Hj?r?Nx?7|?H?@?N~?{?v??p?g?]?Q?D?65?k%?s?A\?)>+>^j>{C>=i=K<65*nW8ʾקi zvS .=KXby@lsy}rM;~zjuMn9reUZ!N$A2P!6>AԾk܁t=.خaWڮ=W>.> ݁>ׯ>0:>?>6?}!?2?;$A?CN?sZ?Sre? Nn?ju?z?;~?N?o?}?הy?s?c@l?b?X?oK?=?) .?Mv?9 ?q>_8>V>Jn> >j3=Үkڽ^Cj"޾r\%^5$DQ]g?pv{S~@H.|Nxr1jb` U%H9^*Y Qꖾ)Y..=>3Y>'>$>g> ??J*?9? %H? U?c`?j?\r?CNx?|?H?D?~?{?Zv?>p?g?W]?Q?D?5?%??]?`%>>m>PC>zv=<'[@nS=ʾ Qx.P=KXb?lsy}Z;~9z8kuMnreZN-%A2!4A<Ծ߁?4.宽PZ6ͮ=7.>>>q>>'<>5?L!?2?%A?HN?Z?\se?nMn?zku?z?;~?b??}?6y?es?|?l?xb?OX?rK?=?s.?w?C ?`>n;>)R>Ån>Й>@=]ڽսCKoz&޾[G^%25DQʳ]g+?pv\{*~GHϷ|Oxr?jpc`= U&H9*5] g"q斾0Y|/3 /=|>,Y>> >>?? *?9?&H? U?c`?j?r?Nx?|?H?>?=~?{?v?o?p?g?,]?CQ? D?5?%??[?`(>>i>C>c=26<:ŖƂnKX:ʾ񾟦 w .1=KXb@l)s yv}{G;~zkuMnqeZNE&A2˼!66~=?Ծ'Mہ:.3Ӯw߮=71.>Uށ>>i;>9@>34?!?=2?$A?N?Z?re?INn?ku?z?;~?T?f?̈}?y?s? @l?cb?4X?K?ԃ=?.?u? ?B>}>>RU>|n>e>.=Y讼]pڽKCl#޾]%5D(Q]Ng?p&v{~BH|sNxrjPb`) U%H;9*V }%閾&Y#'..=>~&Y>o>O%>> ?B?*?)9?x%H? U?Db`?j?r?lNx?|?H?B?~?{?,v?@p?Xg?]?6Q?D?5?-%??]?+$>>Hl>C>$q={ʾ񾔨 u.Ã=K&XXb@lsyɈ}eU;~zkuRNnreZN$AO2!H4d@;ԾJށ1.x஽}47kҮ=l:.>>>?>R=>!6?!? 2?4&A?N?Z?qe?Mn?ku?z?;~?F?}?z}?y?1s?@l?(b?X? K?B=? .?w? ?2>2:>{X>'n>(>Y;=3cڽwCp3(޾[Ӳ%5D4Q]gf?pv{{;~=H|Nxrjc` U&H9*)!얾a-Y //=&>/Y>>9">>H ?!?*?9?&H?/ U?dc`?5j? r?Nx?˷|?H?G?-~?a{?v?4?p? g?ֳ]?Q?D?D5?q%?[?[?*'>>{o>7C>^= Ծ䬫ၾ*8.ͮ =3.>߁>_><>dA>4?!?2?%A? N?Z?re?Mn?1ku?4z?;~?Y??}?y?s??l?b?X?K?`=?-.?ex? ?>A=> T>n>>(=uڽCbm3%޾]x%5DQJ]g>pSv{~DH|INxdrjc` U%H9]*5 ?$W薾3Yzn.P.=i>)Y>>&>>D ??K*?9?%H?{ U?b`?'j?~r?Nx?*|?H?@?V~?{?v??p?g?]?Q?4D?p5?%??\?">>j>C>k=֮<2~nhV?ʾE$ 9v .=`KXbY@lsєy}nO;~zjuNn^reZRNK$A2!79?^:Ծ9݁>.ۮg7׮==.>i܁><>@>~>>6?=!?2?$A?N?HZ?.re?Mn?ju?޽z?;~?L?s?}?y?s?@l?b?X?K?΁=?f .?v?~ ?>8>5W>n>S>5=HvhڽC.jh)޾+\^X%$5~DQu]g?pv{K~?H;|NxrSjb` U&&H)9*" 떾*Y /!/=>>2Y>>w#>> ?? *?z9?X'H? U?c`?zj?Ar?/Nx?|?H?E?~?{?ov?>p?g?]?Q?DD?5?%?ϱ?]?%>h>1n>C> y=E >>=>B>O5? !?T2?%A?rN?kZ?7se?PMn?bku?z?;~?_??}?Hy?s??l?b?|X?K?=?.?w? ?><>R>n>>HC=F {ڽCnh&޾.^%5mDQ]g?pvM{"~FHܷ|Ox,rajc`k U0'HN9*w #疾D1Y/ /=>+Y>>a >> ?U?*?U9?N&H? U?b`?lj?r?Nx?|?H???E~?{?v??p?g?U]?rQ?UD?5?'%?*?[?(>>i>C>xf=@<7QnWl9ʾt񾳩 v .=ȃKXb@lsyk}wJ;~ѽzkuMnre'ZN{&AY2 !z6>m@Ծîہ<.ծŷݮ=?.>݁>>:>?>=7?½!?2?u$A?wN?Z?zre?*Nn?ju?z?;~?Q?j?؈}?Ôy?s?@@l?b?`X?9K? =?.?v? ?Ԧ>?>U>}n>>0=ޮmڽCyk>h#޾\%5]DQ˴]*g?pv{~AH |Nxr jxb`W U%Ht9* Y&=ꖾ#(YkQ.n.=x>4Y>>$>>l ?4?*?9?E%H? U? d`?j?yr?XNx?|?H?C? ~?{?Bv?@p?{g?*]?fQ?ְD?#5?l%?D?c]?$>>l>C>s=<*nT=ʾN x\.=ƂKX b?lsy}W;~'zkupNnreZN$A2V!4@-<Ծ汫%߁2. 㮽K7Ϯ=&9.>:>\>?><>5?!?2?%A?|N?Z?se?Mn?ku?z?;~?d??}?"y?Js?@l?Ob?X?:>Y>in>o>==(`ڽ2Co!򵾞'޾P[%q5۱DQ](gJ?pvl{3~HH|NxrjEc` U&H9Y* Q!l햾.Y(//=>\.Y>H>!>0> ??L*?9?&H? U?D>p>{C>"a=+߁>ñ> <>@>}4?G!?}2?$A?N?Z?re?iNn?ku?$z?;~?W?a?}?y?s??l?b?X?тK?=?j.?x?^ ?>=>T>n>>G+={"sڽCl$޾S]4^%5ʰD[Q!]sg@p=v{ ~CH|]Nxrjd` UP%H9*C{ '$薾&5Y.'.=!>'Y>>%>8> ?? *?g9?%H?M U?ob`?j?r?Nx?|?H?A?~?{?v??p?2g?Դ]?Q?hD?5?%??\?#>`>k>C>`n=Y<0b}nU>ʾި u.=.KVXb9@lsyՈ}iR;~zju1NnreZN$A2н!L7?:Ծ݁?.ݮ.71ծ=;.>ہ>>K@>=>k6?!?K2?o&A?N?Z? re?Mn?ku?νz?;~?I?x?m}?y?s?@l?b?X?ԃK?=? .?v?é ?>9>W>́n>>8=2>eڽCib(޾[%5IDgQL]g?pv{C~>H|Nxrtjb` UZ&Hb9*d 羄 #얾,Y]3/|/=>0Y>>">b> ?i?*?B9?$'H?a U?c`?Yj?&r?Ox?ٷ|?H?F?$~?Q{?v??p?g?]?Q?yD?5?-%??>^?&>>n>ټC>{=M>}>D=>A> 5?̾!?2?W%A?BN?@Z?se?2Mn?Kku?Fz?;~?\??}?wy?s??l?b?X?iK?$=?.?x?Χ ?><>cS>Gn>^>E=xxڽKC nE%޾]%58DQw]g>pkv{~EH|3NxGrjc` U$H9* 羚#疾2Y"//=>y*Y>b>>j> ??*?9?&H? U?b`?Kj?r?Nx?8|?H?@?M~?{?v??p?g?]?Q?D?15?f%?n?;\?)>>Rj>bC> i=JAԾ_܁Z=.Yخdڮ=p>.>݁>䯫><:>?>6?!?2??$A?GN?vZ?Vre? Nn?ju?z?;~?O?o?}?֔y?s?`@l?b?X?lK?=?$ .?Gv?3 ?f>?>V>1n>>63=Ӯ:kڽwCj"޾x\%c5(DQ]g?pv{T~@H-|Nxr.jb` U%H9Y*T 羰&ꖾf)Yz.D.=0>3Y>3>$>r>% ??O*?9?%H? U?c`?j?^r?DNx?|?H?D?~?{?Xv?>p?g?T]?Q? D?5?%??]?T%>>m>7C>Gv=$<(tYnS=ʾ Vx.T=KXb?lsy}Z;~8z6kuMnreZN)%A2!4A<Ծ߁&4.宽3(6Eͮ=7.>>>|>>2<>5?Q!?2?%A?KN?Z?_se?pMn?{ku?z?;~?b??}?4y?cs?z?l?ub?LX?nK?=?n.?w?> ?U>b;>R>n>>@=g]ڽCWo '޾ [Lc%75DQͳ]g-?pv^{+~GHη|Oxr<jmc`: U&H9*0X \"e斾/Yp/ /=>-Y>>!>>??*?9?&H? U?c`?j?r?Nx?|?H?>?=~?{?v?m?p?g?)]??Q?D?5?%??[?T(>>i>C>c=e5<:ߖ߂nWX:ʾ񾤦 w .5=KX b@l+s yw}|G;~zkuMnqeZN@&A2Ƽ!16s=?ԾAہ:.Ӯ߮=Q1.>aށ>'>u;>D@>94?!?B2?$A?N?Z?re?KNn?ku?z?;~?T?f?̈}?y?s?@l?`b?0X?K?Ѓ=?.?u? ?7>q>>FU>|n>L>-=&鮼pڽeC$l $޾ ]%5D,Q]Pg?p'v{~BH|qNxrjMb`& U%H69*Q r%閾&Y ..=>&Y>|>[%>> ?G?*?.9?|%H? U?Gb`?j?r?nNx?|?H?B?~?{?+v?@p?Ug?]?3Q?D?5?(%??]?$>>;l>C>p=ʾ!񾙨 u.ǃ=K*X[b@lsyʈ}eT;~zkuONnreZN$AK2!C4Y@;Ծ>yށ1.E஽g7Ү=:.>)ہ>>?>]=>'6?!?2?8&A?N?Z?qe?Mn?ku?z?;~?F?|?y}?y?/s?@l?%b?X?K?>=? .?w? ?&>':>nX>n>>%;=3RcڽCp>(޾[ز%5D8Q#]gi?pv}{;~>H|Nxrjc` U&H9*!얾H-Y] /R/=?>/Y>>E">>M ?&?*? 9?&H?3 U?gc`?8j? r?Ox?̷|?H?G?,~?`{?v?1?p? g?ӳ]?Q?D?@5?l%?V?[?'>>oo>C>^^=<@{nYL;ʾ?4 we.=gKEXobu?l`s2y}b;~zkuuMndseZSN%A2[!5G<>Ծجၾ8.ͮ*R<=3.>߁>k><>oA>4?!?2?!%A?N?Z?re?Mn?3ku?6z?;~?Z??}?y?s??l?b?X?K?\=?(.?`x? ?>5=>T>n>>(=uڽCnm%>%޾]}%5DQN]g>pUv{~DH|GNxbrjc` U%H9X*0 3$K薾3Ya..=>6)Y>>&>>I ??P*?9?%H?~ U?b`?*j?r?Nx?+|?H?@?U~?{?v??p? g?]?Q?/D?k5?%??\?">>j>C>k=7ծ<2ântV?ʾP) >v .=dKXb[@lsӔy}nO;~zjuNn[re}ZNNG$A2!7.?R:Ծ-݁>.ڮE7׮=*=.>u܁>H>@>>>6?B!?2? $A?N?KZ?1re?Mn?ju?z?;~?L?s?}?y?s?@l?b?X?K?ʁ=?a .?v?x ?>8>(W>rn>:>5=TIhڽ2C;j t)޾1\d]%)5DQy]g?pv{L~?H:|NxrPjb` U"&H%9* y떾*Y/ "/=>W2Y>>#>> ??*?9?$H? U?c`?}j?Cr?0Nx?|?H?E?~?{?nv?>p?g?}]?Q?@D?5?%?ʱ?]?%>\>%n>|C>x=y >%>=>B>T5?!?Y2?%A?vN?oZ?:se?RMn?dku?z?;~?_??}?Gy?}s??l?b?xX?K?=?.?w? ?>;>R>n>>C=<{ڽCnt&޾3^ $%5qDQ]g?pvO{#~FH۷|Ox*r^jc`g U,'HJ9*r x"疾+1Y@/p/=,>+Y> >m > > ?Z?*?Z9?R&H? U?b`?oj?r?Nx?|?H???E~?{?v??p?g?R]?nQ?QD?5?"%?%?[?(>y>i>C>Ef=?<08jnWx9ʾ񾹩 v .=̃KXb@lsyl}wI;~нzkuMnre$ZNw&AT2!u6>b@Ծہ;.ծ7Pݮ=?.>݁>>:>?>B7?ǽ!?2?z$A?{N?Z?}re?-Nn?ju?z?;~?Q?j?׈}?”y?s?>@l?b?]X?6K?=?.?v? ?ɦ> ?>U>}n>>o0=ޮmڽCkJt#޾\%5aDQδ]-g?pv{~AH|Nxr jub`T U%Ho9* N &1ꖾ (YR..=>4Y>>$>>q ?:?*?9?I%H? U? d`?j?{r?ZNx?|?H?C? ~?{?@v?@p?yg?']?bQ?ҰD?5?g%?>?]]?$>>l>ٸC>s=<*ԞnT=ʾT xa.=ʂKXb?lsy}`W;~&zkunNnreZN$A2Q!4@!<Ծڱ߁2.⮽{%R7 Ю=?9.>F>h>?><>5?!?2?&A?N?Z?se?Mn?ku?z?;~?D??}?!y?Hs?@l?Lb?X?8K?u=?!.?Qw? ?>:> Y>Pn>V>==)`ڽKCp-򵾩'޾V[%v5߱D Q]+gL?pvn{4~HH|NxrjBc` U&H9U* E羶!_햾.Y/)/=>u.Y>T>!>;> ??P*?9?&H? U??c`?j?r?Nx?|?H?=?4~?o{?v?N?p?-g?]? Q?D?z5?%??[[?'>8>p>bC>`=D*<=?9nY:ʾ Mw!.q=4KXIb@lFsy}D;~zkuMnseZN&A2!5<)?ԾsQ⁾V9.:ЮW=2.>߁>ϱ><>@>4?L!?2?$A?N?Z?re?kNn?ku?%z?;~?W?a?}?y?s??l?b?X?͂K?=?e.?x?Y ?>=>T>ʊn>>+=HUsڽ¸Cl$޾X]:b%5ϰD_Q$]vg@p?v{ ~CH|[Nx}rjd` UL%H9*>v $薾 5Y1..=;>'Y>&>&>C> ??*?k9?%H?P U?rb`?j?r?Nx?|?H?A?~?{?v??p?0g?Ѵ]?Q?dD?5?%??\?#>U>k>C>-n=߮ʾ u.=2KZXb<@lsyֈ}jR;~zju/NnreZ~N~$A 2̽!G7?:Ծ݁?.ݮ7dծ=;.>ہ>>W@>=>p6?!?P2?s&A?N?!Z? re?Mn?ku?Ͻz?;~?I?x?l}?y?s?@l?b?X?ЃK?=? .?v? ?>9>W>n>>^8=>fڽCin(޾[ %5MDkQO]g?pv{D~?H|Nxrqjb` UV&H^9*_ x 얾+YC//=>1Y>>">m> ?n?*?F9?('H?d U?c`?\j?(r?Ox?ڷ|?H?F?$~?P{?v??p?g?]?Q?uD?5?)%? ?8^?~&>>n>C>k{=Z>>O=> B>5?Ѿ!?2?[%A?EN?DZ?se?4Mn?Lku?Hz?;~?\??}?uy?s??l?b?X?eK? =?.?x?ɧ ?y><>WS>.n>D>E= xڽeCnQ%޾]ű%5plv{~EH|2NxErjc` U$H9*  美#疾n2Yi"/F/=>*Y>n>>u> ??*?!9?&H? U?b`?Nj?r?Nx?9|?H???M~?{?v??p?g?{]?Q?D?-5?a%?h?6\?~)>>Fj>IC>h=J<5#\nW8ʾt v] .Ɓ=KXb~@lsy}sL;~zjuMn4reNZN $A2F!6>@ԾS܁A=.&خo1뷽ڮ=>.>!݁>>H:>$?>6?!?2?C$A?JN?zZ?Yre?Nn?ju?z?;~?O?n?}?Ԕy?s?^@l?b?X?hK?=? .?Bv?. ?Z>?>V>n>ڢ>3=}ԮmkڽCj"޾}\%g5,DQ] g?pv{U~@H,|Nxr,jb` U%H9T*N 群&ꖾM)Y..=J>3Y>@>($>~>+ ??T*?9?%H? U?c`?j?`r?FNx?|?H?D?~?{?Vv?>p?g?P]?Q?D?5?%??]?I%>0>ym>C>v=W>ͬ>>>=<>5?V!?2?%A?ON?Z?bse?sMn?}ku?z?;~?b??}?3y?as?w?l?rb?HX?jK?=?i.?w?9 ?J>V;>Y>n>>M@=4/^ڽCdo'޾[Qh%;5DQг]g/?pv_{,~GHͷ|Ox r:jjc`6 U&H 9*+R P"X斾/YV/ /=>1-Y>>!>>??*?9?&H? U?c`?j?r?Nx?|?H?>?<~?~{?v?k?p?g?&]?;Q?D?5?%?ݲ?[?I(>>h>C>c=4<:ncX:ʾ񾩦 w .:=KX#b@l-s yx}|G;~zkuMnqeZN<&A2!+6h=?Ծ4ہ:.ҮS=j1.>nށ>3>;>O@>>4? !?G2?$A?N?Z?re?MNn?ku?z?;~?T?e?ˈ}?y?s?@l?]b?-X?K?˃=?.?u? ?,>e>>9U>||n>3>-=鮼pڽ~C0l$޾]#%5D/Q]Sg?p)v{~BH|oNxrjJb`" U%H29*L f%閾&Y[.d.=>&Y>>g%>> ?L?*?29?%H?# U?Jb`?j?r?pNx?|?H?B?~?{?)v??p?Sg?]?/Q?D?5?#%??]?$>>/l>|C>p=<-5~|n:Uf>ʾ-񾞨 u.̃=K-X^b@lsyˈ}eT;~zkuMNnreZN$AF2 !=4N@;Ծ2mށh1.஽o7Ү=:.>5ہ>>?>i=>,6?¼!?2?=&A?N?Z?qe?Mn?ku?z?;~?G?|?x}? y?-s?@l?#b?X?K?9=? .? w? ?>:>bX>n>>:=4cڽChJ(޾[ݲ%5DH|Nxrjc` U&H9*!얾/-Y /.=7>/Y>Y>)>>S ??*? 9?v$H?n U?jc`?:j?Zr?Ox?ͷ|?H?<?,~?{?v?/?p?g?е]?Q?D? 5?\%?Q?^?>>co>C>+^="߁>>D>zA>4?w!?2?%%A?N?,Z?re?Mn?Xlu?7z?;~?9?\?}?ly?ws??l?b? X?K?X=?".?4u? ? >5>S>on>^>M(=iHVڽC{mﵾ,޾]%Y5DHQQ]g>pev{~9H|?Oxrjc` U%H9Q** 羽?薾3Y&..=>8Y>>;>>O ??W*?9?%H?J U?d`?,j?r?Ox?,|?H?K?~?{? v?a>p? g?]?Q?+D?g5?%?j?}\?*>4>j>C>:=kԮ<3 nVH8ʾi. Cv1.?=hKdXb^@lsy}np;~zkuLnXreyZNC$A2!3#?AԾe ݁>.Xy7*خ=-.>>>T>9>E>6?G!?2?&A?N?l?b?X?-K?Ɓ=?\ .?y? ?>9@>O>Zn>!>U= JhڽCqJ"޾_ib%]5DQ|]g?pvV{M~?I|Nxrjb` U#H 9*L .t='㖾*Y.B/r"/=>"Y>G>#>>K ??*?9?`'H? U?a`?j?Er?2Nx?|?H?E?}~?@{?lv?V@p? g?z]?Q?D?5?%??zZ?%>>gf>bC>x=Iف>>=>;>8?!?^2?"A?zN?rZ?wqe?Nn?fku?z?:<~?_??)}?by?{s?"Al?b?uX?K?4=?.?w?ت ?Σ>;>EZ>Dwn>>B=甮o{ڽ¼Cgr&޾ZO)%5DQ]2gu@pvP{~FH}|Nx(rja`d U('H9*m J"o!Y/.=E>+Y>s>'>>{? ?*?^9?#H? U?b`?j?r?Nx?|?I???D~?E{?v??p?sg?O]?kQ?MD?5?%? ?Z_?!>m>Lq>7C>f=>݁>>2B>?>3?!? 2?~$A?#N?Z?re?Ln?lu?z?;~?r?j?ֈ}?y?s?;@l?]b?4X?2K?=?.?u? ?˭>7>U>Mn>><0=߮`NڽCk*޾\%5eDQҴ]0g>p"v{~LH|}Oxerj_d` U%Hk9* d羕%ꖾ7YZ.:.=>5Y>>c>>>v ? ?*?9?L%H? U?d`?j?0r?UOx?|?H?8? ~?{?Mv?>p?vg?$]?Q?ΰD?5?V%?9?X]?+>>l>uC>S=6<+̊nTu6ʾY zuT".=΂KXb?lsy}a6;~%z?luLnreZN$A22!4@]CԾD ߁rB.®mX7>Ю=).>R>t>7>C>5?!?2?&A?N?Z?se?Mn?sju?|z?;~?D?J?}?y?s?U?l?Ib?> X?ǁK?q=?!.?%t? ?> B>gQ>7n>>=V*`ڽCp9򵾀 ޾^%J5D Q].gN?pv({4~=zH|Nx=rj?c`< U>$H9P* :)喾r.Y/./=>Y>`>!>%>r ??X*?9?&H? U?Ua`?j?r?Mx?c|?H?H?~?m{?v?@p?xg?]?RQ?PD?u5?%?R?U[?'>>Ph>IC>=~<=Xtn Y:ʾN Rw-.&=8KXrb@lHs=y}e^;~zkuOnqeZNb#A2!2<?Ծ񴫾ځ=9.﮽K8=2.>]ׁ>۱>"<>9>7?Q!?2?'A?N?Z?qe?nNn?ku?Xz?<~?W??1}?y?s?Al?4b?X?7K?߀=?`.?x? ?>=>(\>!{n>Ҟ>J= usڽ۸C*e$޾Yg%N5bDbQ']g@pAv"{n~CH_|ZNx{rajb` U'H49*9 $Q%Y,/7/=T> (Y>> &>O>??*?9?6(H?T U?ub`?lj?r?Nx?||?H?A?\~?{?v??p?g?β]?Q?D?5?%??SY?s#>I>5s>C>m=^ls”yI}Q<~4zju,NnCteZ{N'A'2ǽ!B78:Ծ}偾0.Lݮy=;.>ہ>/>c@>>>'3? !?T2?#A?DN?$Z?re?\Ln?ku?нz?s;~?j?w?}?y?s?@l?b?X?̃K?=?.?v? ?p>w9>W>*n>>+8=ӿڽCi(޾[/%5¯DQR]g(>pv{~JHF|Mxrojd` UR&H9*Z l 얾v;YKg/X.=>-1Y>>`*>y> ?>?*?J9?$H? U?c`?^j?r?Ox?۷|?H?;?#~?{?tv??p?g?]?Q?qD?5?%??3^?>>>n>[C>f[=<*#ҪnRTCʾ񾄧 t!.=3K Xb?lEsGy}S>;~Xz@juRMn:seZN%A82!T5B6Ծ$\F.ʮ[gSȮ=2E.>f>>D>B>5?!?2?_%A?N?ZZ?se?6Mn?+ju?Iz?;~?<?W?}?Xy?\s??l?b? X?aK?=?!.?t?ç ?m>-5>JS>n>>%= Yڽ2C&n] -޾]˱%5AD{Q}]g>p`v{~:H|)Oxr}jc` U$H~9*{ 疾U2Y./=>N:Y>z>>> ??*?9?#&H?{ U?d`?Pj?r?Mx?:|?H?J?~?{?v?B>p?g?x]?Q?D?(5?h%?"?0\?s)>>:j>0C>u=Iɮ<5jn)W8ʾy vs.{=KXb@lsy}sm{;~zkuxLn1reKZqN $A2[!f3>@Ծt܁(=. 8ڮ=..>>>S:>'F>7?!?2?&A?NN?jZ?!te?Nn?ju?$z?;~?O??T}?Ӕy?s?>l?b?X?хK?=? .?ey?Υ ?O>?>N>~n>>R=BUkڽCr"޾_%5DQ]g?pv{U~@H|Nxrjb`~ Ue(H9O* 羘&㖾4)Y)$Y>>4$>> ??X*?9?'H? U?a`?Bj?br?GNx?S|?H?D?u~?/{?Uv?7@p?g?M]?Q?D?5?%??.Z?=%>$>e>C>u=~ف>b>>>H<>8?[!?2?0#A?N?Z?qe?Nn?ku?z?U;~?b??}?Ny?`s?@l?b?EX?fK?Y=?e.?w? ?1>K;>Y>un>>@=4~ڽ Cg '޾[m%@5D'Qӳ]Xg@pv`{~GHo|Nx rjza`3 U&H9*& D"햾 Y=I/u.=>K-Y>>(>>? ?*?9?$H? U?c`?j?$r?Nx?|?tH?>?;~?5{?v?h?p?Ng?"]?8Q?D?5?%?ײ?_?!>>p>ٰC>Nc=3<;nPAʾ'񾯦 8z .>=K X&b8?lgsyy}FF;~zjuMnseZN8&A2!&6UDl8Ծ⁾*.Ү g=GA.>zށ>>B>Z@>C4?+!?K2?$A?XN?Z?re?Ln?)lu?z?;~?4?e?ʈ}?y?s?@l?4b?X?K?ǃ=?".?u? ?.>7>-U>n>G>u-=ꮼ%QڽKC=lU+޾]4%5DQ]Vg>p9v{~7H|gOxHrj4d` U|%H-9*G {閾76Y..=.>l6Y>>>> ?Q?*?79?%H? U?:d`?j?Mr?jOx?|?H?M?~?{?6v?>p?Pg?]?Q?D?5?*%?? ]?=+>i>#l>C>P=<-|&nGU7ʾE񾤨 u".Ѓ=K X:b@lsÿ}fu;~z%luLnreZPN$AB2 !84C@BԾ`ށA.Θ7Ӯ=*.>>>8>lD>16?Ǽ!?2?A&A?N?Z?se?Mn?ju?z?;~?G?E?w}? y?cs?3?l? b? X?K?5=? .?-z? ?>hA>P>݂n>>=w5cڽCp !޾_%5D?Q)]Sgm?pv8{=~>sH|Nx rjc` U$H9 * p(喾-Yr./=r>G Y> >]">> ?1?*?9?&H?: U?a`?j?r? Nx?q|?H?G?~?]{?v?@p?Rg?̳]?Q?D?75?c%?? [?'>>g>C>}=]<@vnYc;ʾH񾙪 wn.b=nKLXbAldsQy}bS;~z{kuNnqeZN'#A2Q!81<{>ԾIف7.#a8=(4.> ؁>><>:>8?!?2?'A?N?Z?.qe?Nn?7ku?jz?'<~?Z??$}?y?s?aAl? b?X?K?=?.?Vx?c ?>=>[>yn>r> H=.Lvڽ9Ce=U%޾9Zɴ%5DQT]g;@pXv2{v~DHQ|DNx^r=ja` U'H9N* q$#Y.,'/t=/=>h)Y>7>&>>? ?Y*?9?n(H? U?b`?j?r?Nx?|?H?@?T~?{?v??p?g?]?Q?D?5?%??_?">>r>C>6k=S<*S3nN?ʾg٥ oy% .=مKXb>ls֔yV}O;~"zju NntecZFN&A2!6F;:Ծ⯫䁾..ڮ?=]=.>܁>֧>A>>>q3?f!?2?$A?yN?RZ?7re?|Ln?ku?z?};~?m?r?}?y?s?{@l?b?X?K?r=?i.?v?n ?>8>W>Џn>5>d5=ʮڽeCSj쵾)޾<\,r%25DQ]gG>pv{~JH8|MxrKjd`t U&H9* a떾:Y/.=>2Y>>1>> ??*?9?$H? U?c`?j?r?,Ox?|?H?:?~?{?\v?>p?g?w]?sQ?8D?5?%??]?->D> n>C>X=<%2IndSE5ʾϧ t!.%=iK Xb?l`s[y}X;;~Fz'ju2MnseSZNW%A2! 5ADԾ|LD.Ǯ.L6ˮ=F.>>=>6>B>_5?!?B2?%A?"N?Z?@se?WMn?Dju?[z?;~???R?}?Dy?@s??l?b? X?+K?=?!.?t?y ?Ъ>R>n>>"=[ڽCnV޾>^"%5zDQ]g?pwv {$~;Hٷ|OxrYjc` U$HA9*3 aG*斾0Yc.</=>;Y>$> >> ?e?*?#9?Z&H? U?d`?tj?r?Mx?I|?H?I?~?{?v?#>p?g?L]?Q?D?5?$%?ٯ?[?(>>i>C>=(<8ʕ^nW9ʾĩ v.=ԃKXb@lsy}xjq;~νzkuWLn reZ=N#AK2!3=J@Ծ(ہ;.]E"8ݮ==0.>>>:>8>M7?ѽ!?02?"'A?N?Z?Ite?1Nn?ju?6z? <~?R??G}?y?s?>l?b?VX?K?N=?.?y? ?>>>b]>}n>`>O=c`dnڽRCOsb#޾^Y%5DQղ]g?pv{^~AHy|Nxrgjob`M U.(H9 *7%'Y7/-/=>%Y>>$>(>?D?*?=9?'H? U?&b`?fj?r?]Nx?a|?H?C?l~?{?=v?@p?g?!]?[Q?ZD?E5?]%?u?Y?$>~>st>C>s=as<;KU{nA\=ʾ xj.=?KX:bAlsy2}W<~UzkuiNnqeZN'A2G!79 <Ծ±恾2.q⮽(CHT=r9.>ځ> >6?><>2?!?2?j#A?N?Z?qe? On?ku?z?_;~?e??}?:y?Ds?@l?lb?X?0K?=?#.?Gw?C ?>:>X>tn>#>S==*ڽ~Cjh'޾a[]%5XDZQ]~g@pvp{~HHa|MxrjOa` U&H9N*g  羟!G햾Y/.=>.Y>>.)>R> ??Z*?9?G$H?D U?Ec`?j?Ar?Nx?|?{H?=?3~?%{?v?J?p?(g?]?Q?۱D?A5?%??^?h > >o>|C>`=(<DknQ%Bʾĩ /t !.z=ρKE XObZ?ls"y}JD;~yzojuMnseZ|N%A2w!5C7Ծ[8⁾`).Ϯ.K-î=B.>&߁>^>vC>@>4?\6>T>n>>*=SڽCl(ﵾ+޾c]D`%#5װDQ+]{g>pQv{ ~8H|QOx+rj d` UD%H9*k &J薾4Ye.Z.=>7Y>>>>|> ??*?t9?%H? U?ed`? j?jr?Ox? |?H?L?~?{?v?{>p?*g?˴]?Q?\D?5?%??\?*>>xk>C>M=ݮ<0ܑnU7ʾ v. =:K;Xcb@@lsy؈}jr;~z luLnzreZNu$A2!3?BԾ݁?.6W7ծ=R,.>>Į>&9>E>{6? !?y2?{&A?N?Z?se?Mn?ju?z?;~?J??k}?y?Hs??l?b?X?[K?=? .?y?Y ?s>@>P>n>N> =@}fڽkCfq!޾f_+(%'5UDrQV]yg?pvH{E~?I|Nxrjb` U#HU9* o'Z䖾+Y./=>!Y>>#>b> ?x?*?9?0'H?k U?a`?j?,r?Nx?|?H?F?~?M{?v?p@p?-g?]?Q?ޮD?5?%?E?Z?g&>Y>f>C>{=;؁>+>g=>(;>i8?۾!?'2?"A?MN?JZ?Uqe?Nn?Pku?|z?1<~?]??3}?ry?s??Al?b?X?˄K?g=?.?x? ?T>z<>Z>mxn>>BE=PyڽCf%޾Z%5DQ]gZ@ppvB{~EH|.NxArja` UX'H9 *? v#-"Y!/C/=>*Y>>V'>>:?W ?*?*9?#H? U?b`?j?r?Nx?|?I???K~?S{?v??p?g?u]?Q?~D?S5?X%?^?_?2">>q>bC>qh=uHl5syb}L;~zjuMnse5ZN&A2.>:݁>~>A>:?>3?!?2?L$A?N?Z?^re?Ln?ku?z?;~?p?n?}?y?s?Y@l?b?]X?`K?6=?(.?8v?# ?Q>08>gV>vn>Ւ>2=֮ڽCjM+*޾\u%p54DQ]ge>p v{~KH*|Ox~r'jd`C U%H9M*C "ꖾ8YG.w.=[>3Y>X>>>6 ??[*?9?%H? U?c`?j?r?BOx?|?H?9?~?{?av?>p?g?J]?@Q?D?O5?%?w?]?g,>>am>C>U=<(n T5ʾ" >u".a=KXb?l{soy}]9;~4zTluMnre%ZN%A2m!4cACԾԪ߁C."ŮH 7ͮ=G.>>嬫>W7>LC>5?G!?2?%A?WN?Z?gse?wMn?]ju?mz?;~?B?N?}?0y?s?r?l?lb?g X?K?=?O!.?at?. ?3>B>Q>`n>=>= ^ڽC|o޾^\f%5DQֵ] g4?pv{-~<H˷|NxVr5jdc`g Un$H9*G 羢)@斾/Y. /=>=Y>>*!>>2 ??*?`9?&H? U? e`?j?r?Mx?W|?H?H?~?{{?v?@p?g?]?~Q?D?5?%??[?2(>5>h>uC>=<];+n|X3:ʾ% w.= KXb@l1s,y}}gf;~zku#OnqeZN#A 2ѿ!2Q=?Ծہj:.I򮽶88|=1.>C>K>;>m9>7?!?p2?]'A?N?Z?pte?RNn?ku?Hz?<~?U??;}?y?s?Al?Wb?&X?eK?=?.?x?9 ?>N>>\>J|n>>1M=k)qڽCs,$޾YB-%51D7Q] g@p,v{f~BHk|lNxrjDb` U'Hi9*vKN%{&Y1/!3/=&>&Y>E>%>>b??*?{9?(H?* U?Pb`?j?r?sNx?o|?H?B?d~?{?&v??p?g?]?(Q?!D?5?%?-?Y?#>>s>IC>Yp=@h<Ng|n\~>ʾCO x.$=uK4XdbAlsy?}T<~CzkuHNneteZNK'A]2!7?9h;Ծ恾51.߮1=:.>Nہ>>?>=>2?!?2?#A?N?Z?qe?,On?ku?z?j;~?h?{?}?&y?)s?@l?b?X?K?=?.?w? ?>:>JX>Sn>Ö>:=KڽCifa(޾[%5DQ,]g@pv{~IHS|Mxrjd` U&HN9 * n 얾0Y>r>)>>^ ??*?9?~$H?u U?pc`??j?^r?Ox?Ϸ|?H?<?*~?{?v?+?p?g?ɵ]?Q?D?5?R%?F?t^?>y>Jo>C>]=< ƅn*RBʾaD vtb!.=Ku Xxb|?ls6y}OA;~hzVjunMn\seZGN%Ao22!5C(7ԾၾG.ͮ:Ů=D.>߁>>D>A>4?!?2?-%A?N?2Z?re?Mn?\lu?9z?;~?9?[?}?iy?ss??l?b? X?K?O=? ".?*u? ?>5>S>=n>+>'=VڽCmﵾ,޾]%b5DOQW]g>phv{~9H|$9Y>>S>>Y ??a*?9?%H?Q U?d`?1j?r?Ox?.|?H?K?~?{?v?\>p?g?]?Q?#D?^5?%?`?r\?)>>j>[C>Ԋ=Ү.5J7خ=-.>W>l>9>E>6?Q!?2?&A?!N?CZ?te?Mn?ju?z?;~?M??^}?y?-s?>l?b?X?K?=?S .?y? ?֧>!@>lO>(n>> U=KAiڽɳCr,a"޾_sl%f5DQ]g?pvX{N~@H|Nxrjb` U(H9*B $]&'㖾^*YbA/?#/=4>"Y>_>#>>U ??*?9?h'H? U?a`?#j?Ir?5Nx?|?H?E?|~?={?iv?Q@p?g?s]?Q?óD?5?%??oZ?%>>Nf>0C>@x= <Fyxn[<ʾ. $x.y=ڄKXbIAlsxy7}\.<~vzIkuNnIqe=Z>N'A2Ǿ!S8:7=Ծ؁ 5.箽aq.=6.>bف>ҳ> >>;>8? !?g2?"A?N?yZ?}qe?Nn?iku?z?<<~?`??'}?_y?ws?Al?b?nX?K?=?.?w?ͪ ?>;>-Z>wn>>{B={ڽC,g&޾ZZ3% 5DQ]8gy@pvR{~FH{|Nx$rja`] U 'H|9*c 3"=!Yk /.=x> ,Y>>'>+>? ?*?g9?#H? U?b`?j? r?Nx?|?I?>?C~?C{?v??p?ng?H]?cQ?ED?5?%??O_?!>U>3q>C>e=S=<nGP@ʾo y . =kKXb?lPsyn}I;~zjuMnseZNj&Ag2!e6D8Ծxま+.ԮA=@.>݁>&>IB>?>4?!?2?$A?+N?Z?re?Ln?lu?z?;~?s?i?Ԉ}?y?s?6@l?Wb?-X?*K?=?.?u?ب ?>7>U>n>u>/=8ᮼNڽ Ck*޾\%5mDQش]5g>p%v{~LH|zOxarjYd` U%Hb9 * M} ꖾa7Y'..=>A5Y>>{>U> ??*?9?T%H? U?d`?j?4r?XOx?|?H?8? ~?{?Jv?>p?pg?]? Q?ưD?5?M%?/?M]?+>>l>BC>S=<+NnT6ʾd u]".=ՂKXb@lsy}a6;~"z;luLnreZ}N$Ax2(!w4@FCԾ,ށ?B.\®PZe7Ю=).>k>>7>C>5?!?2?&A?N?Z?se?Mn?wju?z?;~?D?I?}?y?{s?P?l?Cb?7 X?K?h=? !.?t? ?>A>OQ>n>ܧ>1=+ZaڽC(pQ򵾗 ޾^%S5DQ]3gS?pv*{5~=yH|Nx9rj9c`5 U6$H9F*#(喾@.Yb.\/=C>Y>y>!>;>} ??a*?9?&H? U?\a`?j?r?Mx?e|?H?G?~?k{?v?@p?sg?]?KQ?GD?l5?%?H?J[?'>>8h>C>(=姮<$>tn%Y:ʾ¢Y \w6./=@K#Xxb@lLs@y}d\;~zkuOnqeZNY#A2!2<?Ծٴoځ 9.﮽N8B=2.>vׁ>>:<>:>7?[!?2?'A?N?Z? qe?rNn?!ku?Zz?<~?X??/}?y?s?Al?.b?X?/K?ր=?W.?x? ?x>=>\>zn>>jJ=vsڽCCe$޾Yq%W5jDjQ.]g!@pDv${o~CH]|WNxvr\jb` U'H+9*/義$i%Y]+/8/=>>(Y>>$&>e>?? *?9?>(H?[ U?{b`?qj?r?Nx?~|?H?A?[~?{?v??p?g?Ȳ]?Q?D?5?%??HY?\#>1>s>C>m=]lsŔyK}Q<~1zju(Nn=teZsN'A2!778:Ծrd偾/.ܮw=0<.>ہ>G>z@>>>23?*!?^2?#A?LN?+Z?re?aLn?ku?ӽz?t;~?k?v?}?y?s?@l?b?X?ăK?=?.?v? ?Z>`9>W>n>c>7=mڽ9Ci쵾)޾[8%5ʯDQY]g,>pv{~JHD|Mxrjjd` UJ&H9*P U 떾D;Y/$.=>_1Y>>>> ?H?*?S9?$H? U?c`?cj?r?Ox?ݷ|?H?;?"~?{?pv? ?p?g?]?Q?iD?5?%??(^?'>>n>)C>[=g<# nR4ʾ񾏧 t!.=;K Xb?lHsJy}T>;~Vz=juMMn4sezZN%A/2!I5B6Ծ *F.Hʮ_ȵȮ=dE.>>>+6>,B> 5?ƻ!? 2?h%A?N?`Z?se?;Mn?.ju?Kz?;~?<?W?}?Uy?Xs??l?b? X?ZK?=?!.?t? ?W>5>2S>n>˫> %=$ rYڽdC>nu7-޾]ձ%5IDQ]g>pcv{~:H|&Oxrxjc` U$Hv9*q |疾#2YE.y/=R>:Y>>>> ?(?*?9?+&H? U?d`?Uj?r?Mx?<|?H?J?~?{?v?>>p?g?r]?Q?D?5?^%??%\?\)>u>!j>C>=Ǯ<566nBW9ʾ񾄩 v|.=KXb@lsy}tlz;~ݽzkusLn+reEZjN$A2Q![3q>@Ծ[܁<.o}48Vۮ=/.>>>k:>>F>7?!?2?&A?VN?qZ?'te?Nn?ju?'z?<~?O??R}?Дy?s?>l?b?X?ɅK?=? .?[y?ĥ ?9>~?>N>~n>>YR=Vlڽ'Cr#޾_%5DzDQ]g?pv{V~AH|Nxrjb`w U](H9F*羀&㖾)YN;/(/=>[$Y> >L$>> ??b*? 9?'H? U?b`?Gj?fr?JNx?U|?H?D?t~?-{?Qv?2@p?g?G]?Q?D?{5?%??#Z?&%> >e>ҹC>|u=|ځ>z>>>_<>8?e!?2?8#A?N?Z?qe?Nn?ku?z?V;~?c??}?Ky?\s?@l?b?>X?_K?P=?[.?w? ?>3;>Y>un>Q>?=~ڽRCg17'޾[w%I5'D.Qڳ]]g@pvb{~GHm|Nxrjta`+ U&H9* ,"햾Y }/B.=>}-Y>6>(>>? ?!*?9?$H? U?!c`?j?(r?Nx?|?uH?=?:~?3{?v?d?p?Hg?]?0Q? D?w5?%?Ͳ?_? >>p>C>b=22<CnPAʾ>񾹦 Bz .G=K X,b=?lksy{}FF;~zjuMnseZN0&A2!6?DU8Ծ뭫⁾*.4Ү=zA.>ށ>Ω>B>q@>N4?5!?T2?$A?_N?Z?re?Ln?-lu?z?;~?4?d?Ȉ}?y?s?@l?.b?X?K?=?".?u? ?>6>U>n>>-=Y쮼Qڽ~CUll+޾"]>%5DQ][g>p6Y>> >> ?\?*??9?%H? U?@d`?j?Qr?mOx?|?H?M?~?{?2v?>p?Kg?]?Q?D?5? %??]?&+>Q> l>C>TP=z>4>8>D><6?Ѽ!?2?I&A?N?Z?se?Mn?ju?z?;~?G??u}? y?_s?.?l?b? X?K?,=? .?#z? ?>QA>P>n>|>j=7dڽ@Cp7!޾$_%5%DGQ/]Ygq?pv:{>~> I|Nxrjc` U#H9* X(䖾,Y?./=>y Y>#>t">> ?;?*?9?'H?A U?a`?j?r? Nx?s|?H?G?~?[{?v?@p?Mg?Ƴ]?Q?D?.5?Y%??Z?&>>g>C>c}=Ü<@OvnY{;ʾ_񾤪 wx.j=vKSXb AlhsTy }aB<~zxkuNnqeZN#A2G!8Ծ1ف7.쮽ge8=Z4.>"؁>><>:>*8?!?2?'A? N?#Z?3qe?Nn?:ku?lz?)<~?Z??>}?y?s?\Al?b?X?K?=?.?Lx?X ?ۤ>=>g[>yn>?>G=ȁvڽkCeUm%޾DZӴ%5DQZ]g@@p[v4{w~DHO|ANxYr8ja` U'H9E* Z$#Y_&/A>/=>)Y>P>&>>? ?c*?9?v(H? U?b`?j?r?Nx?|?H?@?S~?{?v??p?g?]?Q?D?5?%??_?">>qr>C>j=QlsٔyW}N;~zjuNnte]Z?N&A2x!6E$:Ծʯ䁾w.. ڮv==.>܁>匿>A>>>|3?o!?2?$A?N?YZ?8>V>n>>4=̮EڽClj쵾)޾G\7|%;5DQ]gK>pv{~KH6|MxrFjd`m U&H9* t羯H떾9Y /.=,>2Y>>H>.> ??"*?9?$H? U?c`?j?r?0Ox?|?H?:?~?{?Yv?>p?g?p]?lQ?0D?5?%??]?,>,>m>C>+>U>6>B>j5? !?K2?%A?*N?Z?Fse?\Mn?Hju?]z?;~???R?}?Ay?=s??l?b? X?#K?ׂ=?!.?t?n ?>$C>R>n>j>Y"=F7\ڽCnm޾I^,%5DQ]g?pzv {&~;H׷|OxrTjc` U$H89*) J0*斾0Y0. /=>;Y>=> >> ?o?*?,9?b&H? U?d`?yj?r?Mx?K|?H?I?~?{?v?>p?g?E]?Q?D?5?%?ϯ?[?(>>vi>C>K=<8nW9ʾΩ v.=܃KXb@lsy}yio;~˽zkuRLnreZ5N#AB2 !3=3@Ծہ;.x%8ޮ=p0.>>> ;>8>X7?۽!?92?+'A?N?Z?Ote?6Nn?ju?9z? <~?R??F}?y?s?>l?{b?OX?K?E=?.?y?y ?>>>I]>s}n>.>O=anڽChsy#޾iY%5D Q۲]g?pv{_~BHw|Nxrbjib`F U&(H9* %񖾦'YB6/^./=>%Y>>$>?>!?N?*?F9?'H? U?,b`?kj?r?`Nx?c|?H?C?k~?{?:v?@p?g?]?SQ?QD?<5?S%?k?Y?$>f>[t>uC>r=qځ>">M?><>2?!?2?s#A?N?Z?qe?On?ku?z?a;~?e??}?7y?@s?@l?fb?X?)K?=?.?=w?8 ?}>:>X>|n>><=ì^ڽCh'޾l[h%5`DaQ]g@pvr{~HH_|MxrjIa` U&H9D*\ 羇!.햾=Y/.=;>.Y>>E)>i> ??c*?9?O$H?K U?Lc`? j?Er?Nx?÷|?|H?<?2~?#{?v?E?p?"g?]?Q?ӱD?85?%??^?P >>o>C>$`='î=B.>?߁>v>C> A>4?F!?2?$A?N? Z?re?Ln?Flu?*z?;~?7?_?}?zy?s??l?b?X?K?=?A".?fu?C ?z>E6>lT>fn>Y>H*={OTڽCm@ﵾ ,޾n]Nj%,5߰D#Q1]g>pTv{ ~8H|NOx'rjd` U<%H9*` 3薾4Ye.&.=>7Y>W>>> ??(*?}9?%H?' U?kd`?j?nr?Ox?"|?H?L?~?{?v?w>p?%g?Ĵ]?Q?TD?5?%??\?*>>_k>C>M=Yܮ< 1nV7ʾ v.=BKBXibE@lsyڈ}kr;~zluLntreZNm$A2!3?BԾݨ݁?.м70֮=,.>>ܮ>>9>E>6?!?2?&A?N?Z?se?Mn?ju?z?;~?J??i}?y?Ds? ?l?b?X?SK?=? .?y?N ?\>@>O>Pn>>=2BfڽC~q!޾q_51%05^DyQ\]g?pvJ{F~?I|Nxrjb` U#HL9* d羳'A䖾+YC.|/=>!Y>>#>y> ??*?9?8'H?r U?a`?j?0r?"Nx?|?H?F?~?K{?}v?k@p?'g?]?Q?ծD?5?%?:?Z?P&>A>f>\C>z=؁>C>~=>?;>s8?!?02?"A?UN?QZ?[qe?Nn?Tku?~z?3<~?]??2}?py?s?:Al?b?X?ÄK?_=?.?x? ?>>c<>Z>;xn>ߛ>D=ꌯvyڽɻCf &޾Z%5DQ]g_@psvD{~EH|+Nx<rja` UP'H9*4 _#g"Y /C/=J>*Y>>n'>>E?a ?*?29?#H? U?b`?j?r?Nx?|?I???J~?Q{?v??p?g?o]?Q?uD?J5?N%?S?_?">>q>0C> h=Fl9syd}K;~zjuMnse.Z N&A23!6_E9Ծ# 䁾-.Z׮c޷k=>.>S݁>>A>Q?>3?!?2?T$A?N?Z?dre?Ln?ku?z?;~?p?m?߈}?y?s?T@l?{b?VX?XK?-=?.?.v? ?;>8>OV>Dn>>72=׮ ڽCkeB*޾\%y5pv{~LH(|Oxzr"j}d`< U%H9C*8  ꖾ8YV{.D.=>4Y>q>>>A ??d*?9?%%H? U?c`?j?r?EOx?|?H?9?~?{?^v?>p?g?D]?9Q?D?F5?%?m?]?P,>>Hm>nC>xU=$<)ŭՉn%T6ʾ8$ Hu&".i=KXb?lsqy}]8;~2zQlu MnreZN%A2c!4MACԾ߁lC.Į7Eή=#H.>>>o7>bC>5?P!?2?%A?^N?Z?mse?|Mn?aju?oz?;~?B?M?}?-y?s?m?l?fb?` X?K?=?E!.?Wt?# ?>B>Q>.n> >=g"^ڽ Co ޾^fp%5DQݱ]g8?pv{.~<Hɷ|NxRr0j^c`` Uf$H9*< 羋)'斾j/Y%./=>8=Y>>B!>>< ??(*?i9?&H? U?7a`?j?r?Mx?Y|?H?H?~?y{?v?@p?g?]?vQ?xD?5?%??[?(>>h>BC>=l<;]nXK:ʾ< w.=KXUb@l5s/y }}ge;~zkuOnqeZN#A2ǿ!2;=?Ծhہ7:..;8=1.>\>c>;>9>7? !?y2?e'A?N?Z?pe?WNn? ku?Kz?<~?U??9}?y?s?Al?Rb?X?]K? =?.?x?. ?>6>>\>|n>͟>L=mqڽCt C$޾YM7%"59D>Q]g@p0v{g~BHi|iNxrzj>b` U'H`9*lA6%I&Y0/3/=X>'Y>^>%>>l??*?9?(H?1 U?Wb`?j?r?vNx?q|?H?B?b~? {?"v??p?g?]? Q?D?5?%?#?Y?#>>s>C>o=fʾZZ x.,=}K;XjbAlsy@}S<~AzjuDNn_teZNC'AT2!v7)9Q;Ծ偾1.E߮W.=;.>gہ>ʵ>?>=>2?!?'2?#A?N?Z?qe?1On?ku?Ľz?k;~?h?{?}?#y?%s?@l?b?X?K?؄=?.?v? ?>9>2X>!n>>&:=差"ڽC.i~x(޾[%5DQ3]g@pv{~IHQ|Mxrjd` Uy&HE9* W 얾n50Y>>)>>h ? ?*?9?$H?| U?vc`?Dj?br?Ox?ѷ|?H?<?)~?{?v?&?p?g?õ]?Q?D?5?H%?<?i^?>a>1o>UC>_]=߁>>/D>A>4?!?2?6%A?N?9Z?re?Mn?_lu?5>S> n>>'=Wڽ9Cmﵾ,޾]%k5DVQ^]g>pkv{~9H|9Ox rjc` U%H9=* q美薾M3Y..=#>V9Y>>j>1>d ??j*?9?%H?X U?d`?6j?r?Ox?0|?H?K?~?{?v?X>p?g?]?Q?D?U5?%?U?g\?)>>j>)C>n=7Ѯ<3o nVw8ʾD WvD.P=xKrXbh@lsy}po;~zkuLnMrelZN2$A2!3>`AԾ5܁">.;G7خ=-.>p>>9>E>6?[!?2?&A?)N?IZ?te?Mn?ju?z?;~?M??]}?y?)s?>l?b?X?K?=?I .?y? ?> @>TO>n>>T=TMiڽC*rDx"޾_~u%o5DQ]g?pvZ{O~@H|Nxrjb` U(H9*8 G'㖾,*Y|@/ $/=g>1#Y>x>#>>` ??)*?9?p'H? U?a`?(j?Mr?8Nx?|?H?E?{~?;{?ev?M@p?g?m]?Q?D?5?%??dZ?%>>6f>C>w=q{ف>볫> >>;>8?*!?p2?#A?N?Z?qe?Nn?mku?z?=<~?`??%}?\y?ss?Al?b?gX?K?=?.?w?ê ?>;>Z>vn>>B=;|ڽ'CEg&޾Zd=%5DQ]=g}@pvT{~FHy|Nxrja`V U'H9*Y 羺"j !Y8@/~.=>R,Y>>(>B>? ?*?p9?#H? U?b`?j?r?Nx?|?I?>?B~?A{?v?~?p?ig?B]?\Q?=>q>ұC>Ge=;<@n_P Aʾy z .=sKXb?lTsyp}H;~zjuMnseZNb&A2![6D8Ծ{`ま+.Ԯڱm=M@.>݁>>>`B>?>4?!?2?$A?2N?Z?re?Ln?lu? z?;~?s?h?ӈ}?y?s?1@l?Qb?&X?"K?=?".?u?Ψ ?>u7>U>n>B>p/=⮼,OڽRCk *޾\Ȱ%5uDQ޴];g>p(v{~LH|vOx]rjRd` U%HY9*z 6e閾/7Y..=2>t5Y>>>l> ??*? 9?\%H? U?d`?j?8r?[Ox?|?H?8?~?{?Fv?>p?kg?]?Q?D?5?C%?$?B]?+>>l>C>R=<+0nT6ʾլo ug".=݂KXb@lsyÈ}b5;~ z7luLnreZuN$Ao2!m4@/CԾށ B.3(r7 Ѯ=).>>>8>C>5?!?2?&A?N?Z?se?Mn?zju?z?;~?E?H?}?y?ws?K?l?=b?0 X?K?`=?!.?t?٦ ?>A>7Q>ԃn>>=-aڽC@pi򵾮 ޾^%\5DQ ]8gW?pv,{7~=xH|Nx5r j3c`. U.$H9=* (}喾.Yn.)/=v>OY>>!>R> ??k*?9?&H? U?ba`?j?r?Mx?g|?H?G?~?i{?v?@p?mg?]?CQ??D?c5?%?>??[?z'>v>h>C>=K<>'un=Y:ʾ٢d fw@.7=HK*X~b@lPsCy}d[;~zkuNnqeZNQ#A2!2<>ԾVځ8.﮽R8=.3.>ׁ> >Q<>:>7?e!?2?'A?N?Z?qe?wNn?%ku?]z? <~?X??-}?y?s?zAl?(b?X?'K?΀=?N.?x? ?a>=>[>zn>m>J=@xStڽ@C[e$޾Z{%`5rDqQ4]g&@pGv&{p~CH[|TNxrrVjb` U'H"9~*%羑$Q$Y*#+/~9/=>p(Y>>;&>|>??**?9?F(H?b U?b`?vj?r?Nx?|?H?A?Z~?{? v??p?g?]?Q?߲D?5?%?ڳ?=Y?E#>>s>C>.m=[lsȔyM}Q<~/zju#Nn8teZlN 'A2!-78:ԾZL偾/.ܮF=b<.>܁>_>@>0>>=3?4!?g2?#A?TN?1Z?re?eLn?ku?սz?v;~?k?v?}?y? s?@l?b?X?K?=?.?v? ?C>H9>W>ǐn>0>_7=îڽkCi0쵾)޾\B%5үDQ_]g1>pv{~JHB|Mxrdjd` UB&H9*E = 떾;Y/.=>1Y>5>>> ?S?*?\9?$H? U?c`?ij?r?Ox?߷|?H?;?!~?{?mv??p?g?]?Q?aD?5?%??^?>>n>C>Z=<#7RnR4ʾ񾙧 t!.=CK Xb?lLsMy}U=;~Sz9juIMn/setZ N%A&2!?5mBn6ԾE.ɮCɮ=E.>>ū>B6>BB>+5?л!?2?p%A?N?gZ?$se?@Mn?2ju?Nz?;~?=?V?}?Ry?Ts??l?b? X?RK? =?!.?t? ?@>4>S>n>>$= YڽCWn޾^߱%5QDQ]g>pfv{~:H|#Oxrrjc` U$Hm9*f c疾1Y_x.F/=>:Y>> >> ?2?*?9?3&H? U?d`?[j?r?Mx?>|?H?J?~?{?v?9>p?g?k]?Q?D?5?U%? ?\?E)>]>j>C>=Ʈ<6ϔhnZW9ʾ񾎩 v.=KXb@ls y}ulx;~ڽzkunLn%re>ZbN#Ax2G!Q3[>@ԾB܁<. g8ۮ=C/.>>,>:>c8>7?!?2?&A?]N?wZ?-te?Nn?ju?*z?<~?P??P}?͔y?s?>l?b?xX?K?y=? .?Qy? ?">f?>N>~n>[>Q=uXllڽYCr#޾(YƳ%5вDQ]g?pv{X~AH|Nxrjb`p UU(H9<*i&▾(Y;/)/=>$Y>">d$>> ??l*?9?'H? U?b`?Mj?jr?NNx?W|?H?D?r~?+{?Nv?.@p?g?@]?Q?D?r5?%??Z?%>>e>C>u=P{<@I _zn[f=ʾ6񾃫 ux<.=KXbpAlsy*}Y"<~bz,kuNnqeZN'A2x!7I:~<Ծ9ׁ3.k䮽 XZ=x8.>'ځ>>>>u<>9?o!?2?A#A?N?Z?qe?Nn?ku?z?X;~?c??}?Hy?Xs?@l?b?7X?WK?H=?R.?yw?x ?>;>kY>un>>N?=<~ڽCgIN'޾*[%R5/D5Q]cg@pvd{~GHk|Nxrjma`$ U&H9}* ~"햾Y/.= >-Y>N>(>>? ?**?9?$H?! U?'c`?j?-r?Nx?|?vH?=?9~?1{?v?_?p?Cg?]?)Q?D?n5?%?²?^? >>op>uC>b=0<ItnQAʾTĦ Lz .O=K# X2bB?losy|}GF;~zjuMnseZN'&A2!6(D=8Ծӭ⁾Z*.Ѯ*R3=A.>ށ>橫>C>@>X4??!?^2?$A?gN?Z?re?Ln?0lu?z?;~?4?c?ƈ}?y?s?@l?(b?X?K?=?y".?u? ?>6>T>n>>,=QڽCnl+޾-]H%5DQ ]ag>p@v{~8H |aOx@rj(d` Ul%H9*2 J閾5Y[.c.=>6Y>>8> > ?f?*?H9?%H? U?Gd`?j?Ur?qOx?|?H?M?~?{?/v?>p?Eg?]?Q?D?5?%?ܰ?\?+>9>k>C>O=<.nwUH7ʾs񾹨 u".=KXFb(@lsyψ}gt;~zluLnreZAN$A/2 !#4@BԾl/ށ@.0ʜ7Ӯ=X+.>0>M>8>D>F6?ۼ!? 2?R&A?N?Z?se?Mn?ju?z?;~?H??s}?y?\s?)?l?b? X?K?$=? .?z? ?>9A>P>yn>I>=8dڽrCpN!޾/_%5-DNQ6]^gv?pv<{?~> I|Nxrjc` U#H9* m@(䖾,Y ./=> Y><>">> ?E?*?9? 'H?H U?a`?j?r?Nx?u|?H?F?~?Y{?v?@p?Gg?]?Q?D?%5?O%?x?Z?&>>tg>C>|=)Ծفy7.W쮽Eh8n=4.>;؁>><>:>48?!?2?'A?(N?)Z?9qe?Nn?>ku?oz?*<~?[??<}?y?s?WAl?b?X?K?=? .?Bx?M ?Ĥ><>N[>cyn> >=G=bwڽCfm%޾OZ޴%5DQa]gD@p_v6{y~DH|>NxUr2ja` U'H9;*u C##Y%/?/=>)Y>h>&>>?$ ?l*?9?~(H? U?b`?j?r?Nx?|?H?@?Q~?_{?v??p?g?]?Q?D?5?%??_?">r>Yr>\C>jj=cPl"s۔yY}N;~zjuNnteVZ7N&A2n!6E :Ծ䁾D..ٮB ==.>܁>>3A>>>3?y!?2?"$A?N?_Z?Bre?Ln?ku?z?;~?n?q?}?Õy?s?q@l?b?X?K?a=?V.?jv?X ?>8>V>ln>Г>4=(ήڽCj쵾)޾R\A%D5 DQ]gO>pv{~KH4|Oxr@jd`f U &H9|*y ]羘0떾9Y>/.=_>2Y>>`>E> ??+*?9?$H? U?c`?j?r?3Ox?|?H?:?~?{?Uv?>p?g?j]?dQ?(D?|5?%??]?,>>m>C>W=<&nSt5ʾ u!.6=yK Xb?lgs`y}Y;;~Az ju(MnseFZNF%A2!4A\DԾLD.Ǯ6ˮ=F.>D>m>6>B>t5?!?T2?%A?1N?Z?Kse?`Mn?Kju?`z?;~???Q?}?>y?9s??l?b? X?K?ς=?}!.?t?c ?> C>qR>Wn>8>!=\ڽCo4񵾄޾T^(6%5DQ]g?p~v{'~;Hշ| OxrNjc` U$H09*} 3*斾0Y. /=>U> >+> ?y?*?59?j&H? U?d`?j?r?Mx?M|?H?I?~?{?v?>p?g??]?Q?D?5?%?į?[?(>>]i>nC>=>԰>$;>8>b7?!?C2?3'A?N?Z?Tte?;Nn?ju?l?ub?HX?K?==?.? y?n ?>>>1]>A}n>>,O=c0oڽCs#޾tY%5 DQ]g?pv {`~BHu||Nxr\jbb`> U(H9* %t'Yu5/+//=*>%Y>> %>U>,?X?*?O9?'H? U?2b`?qj?r?cNx?e|?H?C?j~?{?6v?@p?g?]?LQ?ID?35?J%?a?Y?o$>N>Bt>BC>Qr=.p<Ll{nr\ >ʾӥ x}.=NKXFbAlsy6}V<~Pzku`NnpeZNu'A23!79;Ծ恾/2.ᮽ7A =9.>ځ>:>d?>=>2?!?2?{#A?N?Z?qe?On?ku?z?b;~?f?? }?4y?=s?@l?`b?X?!K? =?.?3w?- ?g>x:>X>Jn>><=]āڽCh'޾w[r%5hDhQ ]g@pvu{~HH]|MxrjCa` U&Hz9;*Q o!햾=Yv /.=n> /Y>>])>>( ??m*?9?W$H?R U?Rc`?&j?Jr?Nx?ŷ|?}H?<?0~?!{?v?A?p?g?]?Q?ʱD?/5?%?z?^?9 >>o>C>_=w%<τnQTBʾ Dt3!.=߁KS X[bd?ls(y}LC;~tzhjuMnxseZmN%A2c!5C7Ծ+⁾H.Ϯ1î= C.>X߁>>C>"A>4?P!?2?%A?N?Z?re?Mn?Jlu?-z?;~?7?_?}?wy?s??l?b?X?K?z=?8".?\u?8 ?d>-6>TT>4n>&>)=TڽCmXﵾ$,޾y]Yt%55D+Q7]g>pWv{~9H|KOx#rjc` U4%H9v*U 薾w4Y..=>,8Y>o>>>$ ??1*?9?%H?. U?rd`?j?rr?Ox?$|?H?L?~?{?v?r>p?g?]?Q?LD?5?%??\?n*>>Fk>UC>͌=ڮ>>U9>4E>6? !?2?&A?N?"Z?se?Mn?ju?z?;~?K??g}?y?@s??l?b?X?KK?=? .?y?C ?E>@>O>n>>W=CHgڽвCq!޾|_@;%95fDQb]g?pvM{H~?I|Nxrjb` U#HC9*u Y羛')䖾V+Yv.H/=9>"Y>>1#>> ??*?9?@'H?z U?a`? j?4r?%Nx?|?H?E?~?I{?yv?g@p?"g?]?Q?ͮD?5? %?0?Z?9&>)>f>)C>9z=<D~wnZ6<ʾ w.N=KXb1Alsjy.}^6<~z[kuNnfqe^ZcN"AB2!8i;=Ծq؁6.鮽8~84=5.>؁>[>=>U;>~8?!?92?"A?\N?XZ?`qe?Nn?Wku?z?4<~?^??0}?my?s?5Al?b?X?K?V=?.?w? ?'>K<>Z> xn>>vD=yڽCf$&޾Z&%5ƮDQ]gc@pvvG{~EH|(Nx8rja` UH'H9*) G#5"Yg /D/=}>(+Y>>'>>P?l ?*?;9?#H? U?b`?j?r?Nx?|?I???I~?O{?v??p?g?h]?Q?mD?A5?D%?I?_?">>q>C>g=BEl݁>>A>g?>3?!?2?]$A?N?Z?jre?Ln?lu?z?;~?q?l?݈}?y?s?O@l?ub?OX?PK?%=?.?$v? ?$>8>6V>n>p>1=Jٮpڽ'C0k}Y*޾\%5DDQ]gn>pv{~LH&|Oxvrjwd`4 U%H9:*- ꖾY8Y#..=>I4Y>>>>K ??n*?9?-%H? U?c`?j?r?HOx?|?H?9?~?{?Zv?>p?g?=]?1Q?D?=5?}%?b?]?9,>n>0m>;C>U=<)n=T6ʾO/ Ru/".r=KXb?lsty}^8;~/zMluMnreZN %A2Y!47ACԾn߁9C.VĮ%7ή=UH.>>>7>yC>5?Z!?2?%A?fN?Z?sse?Mn?eju?rz?;~?B?L?}?*y?s?i?l?`b?Y X?K?=?iB>Q>n>ר>,=$a_ڽRCo$ ޾^py%'5ñDQ]g=?pv{/~<~HǷ|NxMr*jWc`Y U^$H9v*2 s)斾8/YY.f/=G>j=Y>>Z!>>G ??2*?r9?&H? U?=a`?j?r?Mx?[|?H?H?~?w{?v?@p?g?]?oQ?pD?5?%?|?[?(>>h>C>!=ӯ<)<nXb:ʾR$ *w.=KX[b@l9s2y }~fc;~zkuOnqeZN#A2!2%=z?ԾPځ:.}񮽧>8H=2.>u>|>;>9>7?*!?2?m'A?N?Z?pe?[Nn?ku?Nz?<~?V??8}?y?s?Al?Lb?X?UK?=?.?x?# ?>>>\>{n>>eL=nqڽC,t8Z$޾YWA%+5BDEQ]g @p3v{i~CHg|fNxruj8b` U'HW9*b6j%&YX//4/=>F'Y>v>%>>w??*?9?(H?8 U?]b`?Xj?r?yNx?s|?H?B?a~? {?v??p?g?]?Q?D?5?%??~Y?#>>s>C>o= eʾpd y.5=KBXob>lsyB}S<~>zju?NnYteZN;'AK2!l799;Ծ갫偾0.ޮޗ+=6;.>ہ>⵫>@>=>2?!?02?#A?'N? Z?qe?ILn?ku?ƽz?m;~?i?z?}? y?!s?@l?b?X?K?Є=?.?v? ?ʡ>9>X>n>^>9=ڽ@CGi(޾[%5DQ9]g>pv{~IHO|Mxrjd` Uq&H=9* @ l얾<g0Y>>*>>s ??*?(9?$H? U?}c`?Jj?gr? Ox?ӷ|?H?;?(~?{?v?"?p?g?]?Q?D?5??%?1?^^?>J>o>"C>\=U>6>GD>A>4?!?2?>%A?N?@Z?se?$Mn?clu??z?;~?:?Z?}?cy?ks??l?b? X?K?>=?!.?u? ?ǫ>5>S>ڈn>Ƭ>'=6yWڽkCmﵾ,޾]%t5 D^Qd]g>pov{~9H|5Oxrjc` U$H94* Zv疾3Y;..=V>9Y>>>H>o ??t*?9?&H?_ U?d`?<j?r?Ox?2|?H?K?~?{?v?S>p?g?]?Q?D?L5?%?K?\\?)>>j>C>=Ϯ<:4?nV8ʾN avM.Y=KyXbm@lsy}pn;~zkuLnGreeZN*$A2!3>IAԾ܁=.i-7\ٮ=..>>>9>E>6?e!?2?&A?0N?PZ? te?Mn?ju?z?;~?M??[}?ޔy?%s?>l?b?X?K?=?@ .?y? ?>?>n>>TT=N jڽ.CBr\"޾_%x5DQ]g?pv]{P~@H|Nxrjb` U(H9u*. 0&~㖾)YJ?/$/=>c#Y>>#>/>k ??3*?9?x'H? U?a`?.j?Qr?;Nx?|?H?D?z~?9{?bv?H@p?g?g]?Q?D?5?%??YZ?%>>f>̺C>uw=ׄqe0Z/N'A2!>8:=ԾɲQ؁4.殽o1k=K7.>ف>>7>>;>8?4!?y2?#A?N?Z?qe?Nn?qku?z??<~?a??$}?Yy?os?Al?b?`X?K?{=?.?w? ?>;>Y>vn>L>A=|ڽYC]g&޾ZoF%5D Q]Cg@pvW{~FHw|Nxrja`O U'H9*N 羢"R Ys/K.=>,Y>>+(>Y>? ?*?y9?#H? U?c`?j?r?Nx?|? I?>?@~??{?v?z?p?cg?<]?UQ?4D?5?%??9_?c!>%>q>C>d= :<LnxP$AʾΨ񾄦 z .=zKXb$?lXsyr}H;~zjuMnseZNY&A2!P6D8ԾcGま+..ԮsӾ=@.>ށ>V>wB>@>4?!?'2?$A?:N?Z?re?Ln?lu? z?;~?t?h?ш}?y?s?-@l?Lb?X?K?=?".?u?è ?>]7>U>n>> /=k䮼OڽCk#*޾\Ұ%5}DQ]@g>p,v{~MH|sOxYrjLd` U%HP9*o M閾6Y..=e>5Y>3>>> ?)?*?9?d%H? U?"d`?j?<r?^Ox? |?H?8?~?{?Cv?>p?eg?]?Q?D?5?P%??7]?+>>l>C>MR=i>>(8>D>6?!?2?&A?N?Z?se?Mn?~ju?z?;~?E?H?~}?y?ss?F?l?7b?) X?K?W=? .?Uz?Φ ?i>A>Q>n>w>d="/%bڽGCYp ޾^%e5D"Q]>g[?pv/{8~=wH|Nx0rj,c`' U'$H93* (e喾-Y;./=>Y>>!>i> ??t*?9?&H? U?ha`?j?r?Mx?i|?H?G?~?g{?v?@p?hg?]?^>h>C>\=<>XunUY;ʾn pwI.@=PK1Xb@lTsEy}cY;~zkuNnqeZNH#A2x!t2<>Ծ>ځ8.5U8=`3.>ׁ>#>h<>5:>7?o!?2?'A?N?Z?qe?|Nn?(ku?_z?!<~?X??+}?y?s?uAl?"b?X?K?ŀ=?D.?~x?٤ ?K>{=>[>zn>:>I=ytڽrCte$޾Z%i5{DxQ;]g*@pKv){q~DHY|PNxnrQj b` U'H9t*y$8𖾻$YV*/J:/=>(Y>>S&>>??3*?9?N(H?i U?b`?|j?r?Nx?|?H?A?Y~?{?v??p?g?]?Q?ײD?5?%?г?2Y?.#>>r>C>l=Yl sʔyO}P<~,zjuNn2te}ZdN'A 2!"7x8:ԾB3偾q/.ܮS=<.>,܁>w>@>G>>G3?>!?p2?#A?[N?8Z? re?jLn?ku?ؽz?w;~?l?u?}? y?s?@l?b?X?K?=?.?v? ?->19>pW>n>>6=ĮMڽCiG쵾0)޾\L%5گDQf]g5>pv{~JH@|Mxr_jd` U:&H9*; % 떾:Y/.=0>1Y>M>>> ?]?*?e9?$H? U?c`?nj?r? Ox?|?H?:?~?{?iv??p?g?]?Q?XD?5?%??^?>>nn>C>5Z=4<\$jnS4ʾ+񾤧 t!.=KK Xb?lPsOy}U=;~Pz5juDMn)semZNx%A2ٻ!45WBW6Ծ۫E.|ɮ3ɮ=E.>>ޫ>Y6>YB>55?ڻ!?2?y%A?N?nZ?)se?DMn?6ju?Qz?;~?=?U?}?Oy?Ps??l?b? X?JK?=?!.?t? ?*>4>S>n>e>S$=X>ZڽCpn޾^%5YDQ]g?pjv{~:H| Oxrmjc` U$Hd9*\ K疾1Y,./=>:Y>>' >> ?<?*?9?;&H? U?d`?`j?r?Mx?A|?H?J?~?{?v?5>p?g?e]?Q?گD? 5?K%??\?-)>E>i>C>D=|Į<7nrW39ʾ/񾙩 v.=KXb@ls y}ukw;~ؽzkujLn re7ZZN#Ao2=!F3E>@Ծu*܁<.o8"ܮ=u/.>5>D>:>y8>#7?!? 2?'A?eN?~Z?2te?Nn?ju?,z?<~?P??N}?ʔy? s?>l?b?qX?K?p=?.?Fy? ? >N?>N>j~n>)>Q=ZlڽCr0#޾3Yѳ%5زDQ]g?pv{Y~AH|Nxr{jb`i UM(H92*Q&▾(Y9:/h*/=>$Y>:>{$>>??u*?9?'H? U? b`?Rj?nr?QNx?Y|?H?D?q~?({?Jv?*@p?g?:]?xQ?zD?i5?%?? Z?$>>re>nC>t=y>>>><>u2?F!?x2?(A?N?Z?qe? Ln?Ciu?Bz?I<~?c??}? y?s?=l?b?0X?OK??=?&$.? q? ?>;>SY>sn>> =ƤeڽC hl굾޾b%[58DQ]g@pvg{~11H"|MxrjAe`U!H-9t* 0^ޖ}Y/.=>&MY>>(>>??9*?79?$)H?( U?-c`?j?r?Lx?|?I?=?8~?.{?v?Bp?g?]?"Q?D?e5?%?5? X? >>Wp>C>= />>>C>@>c4?!?2?*A?&N?Z?re?Ln?iu?z?<~?w?c?Ĉ}?y?s?Cl?ob?X?K?=?o".?{?ġ ?Ϟ>6>T>]n>T>!l=~ﯼڽCl0޾UVQ%5DQ]goApCv{~86Iö|kMx<rj!d`AUa*H9*( },{[Y`.0.=>Y>'>$->!> ?p?*?9?*H?sU?Md`?j?Yr?Mx?Ѷ|?=I?7?~?{?+v?PAp?g?]?Q?}D?5? %?T?V?>!>k>C>+=8Ӂ>w>ZG>D>Q6?!?U2?!A?N? Z?se?Mn?ju?z?:~??C?r}?y?Xs?9Bl?b?X?zK?=? .?z?8 ?>o2>vP>Gn>>|Y=S:ڽCq'e!޾XX~%55DUQ<]g I|Lxyrjc` U(H9 *IW)(KY9./= > Y> ߖ>x1>K> ?O?*?k9?"H?U?me`?j?r?Nx?0|?7H?0?~?V{?v?@p?g?]?uQ?D?5?E%?n?a?X>>[g>UC>|=<ѕnY;ʾ gqh$.|=KaXb=ls!y$}`?<~/z)iuKnqeZNN(A82!*2;5>Ծ 遾V.-Xyk8=4.>T؁>>K>H>?8?!?2?"A?xN?VZ?te?Nn?Bku?qz?;;~??#?}?~y?s?RAl?b? X?K?=?.?8x?C ?ɲ>$.>L>2yn>ڜ>F= 7ڽ9Cu%޾ZZe%H6DQg]g=pv{z~DH|-Pxrja` Uw'H]9,*j-#BYR.?/=N>)Y>>$>u>?. ?v*?9?#H?+U?f`?j?r?Nx?|?dH?V?~?{?v??p?g?]?GQ?D?w5?~%??_?0>f>b>)C>j=N<~nm^?ʾ ?sc.=KXb>lsyv}M;~z muKn~peOZ0N&A2!<079Ծ䁾M.ix8q==.>܁>>2>L>-:?!?2?+$A?N?@Z?ue?wOn?ku?z?;~?-?ޢ?̇}?y?s?l@l?b? X?YK?~=?M.?`v?N ?>@G>G>pn>>14=ϮoJڽCz)޾]\Lx%52DQ]gT>pv{~KH2|Ox)rj``_ U&H9n*]#羀떾9YS//e/=>3Y>>x>>?"?5*?9?$H?w U?_`?j?r?6Ox?|?H?O?~?~{?Rv?>p?g?c]?Q?>D?5?%??]?,>>_^>C>pW=<$'&inb?Dʾɫ u.}=[K Xb?lksyɉ}Ǣ:;~>zcluPnuoeZN=%A2!;35Ծ4fD.z =)G.>]>>6>5><?S!?]2?%A?9N?vZ?oe?QPn?lu?cz?;~?@??}?ty?5s??l?b? X?K?'=?.?t?X ?>B>a>gn>`>!=y]ڽC_@.޾_^2?%Q5sDWQ]g"?pv{~QHӷ| Oxfrj_` U$H'9*~!>,斾c0YY/.= >@n> >B>;?#?*?=9?r&H? U?a`?Gj?cr?Ox?O|?H?I?~?{?v?>p?g?8]?Q?D?o6?%??[?(>>x>ӡC>D=[<9brnHHʾ v.p=K# Xb@l"s!y}'l;~ƽzku5OnueZoN#A/2!9Ku1Ծͦ}ہ1;.$=]P.>>찫>;;>9>0?"!? 2?;'A?N?Z?pe?SKn?@mu?۾z?<~?S??^}?~y?~s?>l?ob?AX?K?=?%.?r?c ?n>>>]>.n>$>=0eoڽC6d浾;2޾b`%5DQ]g?pv {~XWHs|yNxrj6f`U#H9*B6*▾A'Y4/.=>aEY>>!%>l>7??*?9?'H? U?8b`?9j?r?YPx?|?H?C?i~?{?Ov?G=p?g?]?EQ?AD?5?W%?ӭ?Y?X$>6>)t>yC>I2=n±=.>f>R>|?>'=>2?!?2?(A?N?Z?qe?.Ln?]iu?Tz?T<~?f?~? }?y?s?=l?Zb?X?K?=?#.?x}?n ?P>`:>X>n>0>B=误*ڽCh뵾޾db%5qDQ]g@pvw{~2*H|Mxrje`[U!H91*F  ,0ݖ YCT/k.=>Y>[>u)>>3 ??|*?t9?\)H?Y U?Xc`?+j?r?Mx? |?I?<?/~?{?v?Bp?g?]?Q?±D?&5?%??W?" >>o>NC>=#<_ܨnQ3ʾέ z=!.=KXb~Bls+y}L:~ռzdjuMnrseZN A2Z!5wCFԾ&tҁ(.ή$_Į=#.>ρ>>C>8A>4?Z!?2?L*A?ZN?Z?re?Mn?ju?z?<~?y?^?}?ty?s?Bl?Fb?X?K?q=?.".?{?y ?2>6>;T>n>>Zi=ڽ@C2mpﵾ޾V%>5D2Q>]'gAp[v{~9/I|VMxrjc`U)*HU9r*J +Y..=(>Y>>ۖ>->>. ??;*? 9?*H?U?xd`?j?vr?Mx?߶|?CI?6?~?{?v?1Ap?g?]?Q?DD?5?%? ?U?>z>.k>"C>g=ٯ{ԁ>>G>JE>6?*!?2?T!A?N?NZ?se?Mn?ju? z?;~??>?e}?y?=s?Bl?b?X?DK?߁=?x .?y? ?>1>O>n>>V=tEQڽkCq"޾XǬ\%5nDQi]%g9"Y>ߖ>t>>* ??*?9?K"H?U?e`?j?9r?(Nx??|?>H?/?~?F{?vv?c@p?g?]?BQ?ŮD?5?%?%?}a?>>f>C>y=_<U,nZM<ʾ)O q$.=KXb!>ls5y0}^4<~ziuKn`qeWZ[N(A2!1S;=ԾY_聾pU.gހ8=6.>ف>`>/>\I>8?!?B2?"A?N?Z?te?Nn?[ku?z?F;~???}?jy?s?0Al?b? X?K?M=?.?w? ?,>->^K>wn>z>D=,:ڽC-v+;&޾Z%6DQ]"g=p]v{~EH|Pxrja`y U@'H 9*"S/#HAYT.jE/=>Z+Y>+>>>&?v ?*?D9?#H?]U?f`?j?r?Nx?|?kH?U?~?{?v??p?g?b]?Q?FD?85?:%???{_?W0>>2b>̲C>@g=C݁>Ǩ>]3>1>v:?!?2?e$A? N?nZ?ue?On?lu?z?;~?0?٢?}?y?s?J@l?ob? X?#K?~=? .?v? ?>F>F>nn>=>j1=ڮ3MڽCzp*޾\%5kD4Q] gs>pvC{~LH$|Ox rj``- U%H9+*#Wdmꖾ'8Yy/j/=>{4Y>>>>?U"?w*?9?5%H? U?#``?j?r?KOx?|?H?N?~?n{?:v?>p?g?7]?Q?D?5?s%?X?x]?",>K>]>C>T=<)kncDʾf9 \u[.~=K Xb?lsy}̢7;~,zIluOnNoeZN%A2!=;/35ԾV߁C.=H.> >->7>5>,/?!?2?%A?mN?Z?oe?rPn?lu?uz?;~?C??}?`y?s?d?l?Zb?R X?K?=?U.?Ct? ?>RB>`>en>>=%_ڽCc`.޾^{%5DQ]gA?pv{l~R}Hŷ|NxIrbjw_`UV$H9l*7!:羆喾/YinT/P.=7 >=Y>>q!>>?a?6*?{9?&H? U?Ca`?kj?r?Ox?]|?H?H?~?{?v?=p?g? ]?hQ?D?06?%?q?v[?'>>w>uC>B=9<<×0tnI-Iʾ. 4w.=GKS Xb@l=s4y}$b;~zkuOn]ueZ:Nz#A2!O9J0Ծ%ځ9.ힸꡮ=Q.>>>;>9>1?!?K2?v'A?N?Z?pe?tKn?Ymu?z?<~?V??Q}?jy?cs?}>l?Fb?X?NK?Y=?Y%.?kr? ?ѥ>>>p\>Ӛn>> =RpZrڽGCd[絾2޾`bJ%45+DQ]g@p7v{~-PHe|cNxrpj f`U"HN9*W 2ᖾ%Y%//.=>FY>>%> >?A?*?9?(H?? U?cb`?]j?r?nPx?|?H?B?`~?z{?8v?)=p?g?]?Q?D?5?%??sY?#>>~s>C>/=c<5OE}nN0ʾ# y.>=KX)bAlsyD}1;~;zju:NnTteZN!AB2!a7FIԾLց0.yޮfd(=.>>>@>=>3?й!?2?(A?.N?Z?qe?NLn?viu?fz?^<~?i?y?}?y?s?=l?1b?X?K?DŽ=?#.?1}?$ ?>9>X>n>е>{= ڽrC_i뵾<޾bH%5DQ?]g@pv{~3UI|Mxr~jd`*Ul!H9*x m羇/ ݖY /.=E>SY>>*>5>~ ? ?*?9?)H? U?c`?Oj?r?Mx?|?I?;?'~?{?v?Ap?g?]?Q?D?5?L%??qW?>2>o>C>6=Ё>a>^D>A>4?!?'2?*A?N?FZ?se?)Mn? ju?z?<~?|?Y?}?`y?s?Bl?b?X?xK?5=?!.?Z{? ?>r5>S>n>>f=ڽCmq޾V/%}5(DeQj]MgAprv{~:)I4|@Mxrjc` U)H90* C3+'Yo.P/=>tY>ۖ>n.>_>z ??}*?K9?+H?U?d`?Aj?r?Mx?|?JI?5?~?{?v?Ap?Yg?]?fQ? D?C5?%?ö?3c?L>>j>C>=ͯ<tyqnV8ʾ񾥢 |4#.a=KXb]=l`sĕy}qnp<~ziuLnBre_ZNb)A2E!3>1AԾ7쁾4.>8ٮ=I..>'Ձ>>H>E>6?o!?2?!A?N?|Z?te?Nn?ju?z? ;~??9?Y}?۔y?!s?Al?ob?OX?K?=?7 .?y? ?>(1>#O>n>V>S=PڽC[rt"޾X%!5DQ]Jg#Y>^>>>v ??<*?9?"H?!U?e`?3j?Vr?>Nx?M|?EH?.?~?6{?_v?D@p?[g?`]?Q?D?5?%?ݴ?1a?3>v>f>C>w=>l5sIy<}[*<~ zmuKn8qe)Z'N'A2v!1:<Ծ灾T.8`=}7.>ف>>/>I>8?>!?2?#A?N?Z?ue?Nn?tku?z?P;~???}?Vy?ks?Al?Zb? X?K?=?.?w? ?>CJ>J>}vn>>HA=Md=ڽCv&޾Z9%6&DQ]Hg=puv{~FHu|Pxrja`G U'H9*羊"9?Y ę.J/=>,Y>>n>,>r? ?*?9?#H?U?f`?%j?r?Nx?|?qH?T?z~?{?v?u?p?^g?5]?Q? D?5?%??._?/>>a>nC>{d=8< n_;Aʾ񾏦 s.=\K Xb)?ls>y}H;~zluPn/peZNQ&A 2 !/68ԾJ.まJ.¼8=@.>1ށ>n>3>'2>:? !?02?$A?AN?Z?#ve?On?lu?z?;~?2?Ԣ?}?ѓy?s?(@l?Fb?c X?K?~=?.?u? ?q>E>d>gmn>ݐ>.=殼OڽNCW{0+޾\ݰ%)5DgQ]Fg>pvS{~MH|pOxrjl`` U%HH9*" 6閾6YL3t/Op/=T>5Y>L>>V>?"?*?9?l%H? U?N``?j?r?aOx? |?H?M?~?^{?#v?>p?`g? ]?Q?̵D?U5?/%??,]?+>>{>CC>Q=<,tln.dEʾ񾄨 u.V~=LJKB X)b@lsÓy}Ѣ4;~z0luOn&oeZfN$A]2>!:2q4Ծ䩫ށA.޸=I.>>խ>?8>96>v/?!?2?(&A?N?Z?pe?Pn?lu?z?;~?F??}?Ly?s?A?l?1b?" X?K?=?.?s?æ ?R>A>6`>n>>=0bڽyCaF/޾^ò%5DQ]Cg`?pv{t~SvH|Nx,r>jL_`U$H9** L喾-YN/.= >>Y>>">>??y*?9?&H?% U?na`?j?r?Ox?k|?H?G?~?{?v?=p?bg?߳]?5Q?ND?6?h%?)?)[?L'>F>Qw>C>T?=JIʾ!y zwS.=}K X=b@lXsHy}!X;~zkuNn5ueZN@#A2n!9dJ10Ծ}%ځs8.Q˓=S.>:>;><>K:>d1?E!?2?'A?N? Z?qe?Kn?rmu?z?#<~?Y??E}?Vy?Hs?[>l?b?X?K?=?%.?%r?Τ ?4>d=>[>yn>>Y =s{uڽCe赾|3޾`%r5dDQA]Ag.@pNv+{~.IHW|MNxjrLje`eU"H9k* 羍$Y)/5.=c>HY>9>k&>>??B *?S9?V(H?p U?b`?j?+r?Px?˸|?H?A?W~?j{? v? =p?eg?]?Q?ϲD?M5?%?B?'Y?#>>r>C>=`X>>@>]>>R3?!?2?9)A?cN?>Z?&re?oLn?iu?wz?i<~?l?t?}?ѕy?ss?u=l?b?X?K?=?b#.?|?٢ ?>9>XW>cn>o>qv=+ƯڽC j_쵾޾bV%5DBQl]>g@pv{~4OI|MxrZjd`U5!Hv9*1 ._ܖhY4/.=>Y>>*>> ?g?*?9?)H? U?c`?sj?r?1Mx?*|?$I?:?~?{?v?Ap?gg?]?Q?PD?5?%?b?$W?>>Un>C>q= Oс>>E>oB>@5?!?g2?A A?N?tZ?/se?IMn?9ju?z?<~??U?}?Ly?s?Bl?b?`X?BK?=?!.?{?M ?>4>R>Nn>3>c=FڽCn޾;Ww%5aDQ]rgApv{!~;"I&|*Mxrhjc` U)H9*R 美*|GY<./=>Y>ܖ>/>> ?F?*?9?F!H?U?d`?ej?r?Mx?|?QI?4?~?{?v?@p?3g?_]?3Q?үD?5?A%?{?b?>->i>gC>ކ=¯<ٴːnWJ9ʾE }u#.=KXb=l{sוy}vkf<~rziueLnre1ZSN')A2!<3.>@Ծp끾.x8ܮ=/.>Ձ>I>@I>F>.7?!?2?!A?N?Z?8te?$Nn?ju?/z?;~??5?M}?ǔy?s?Al?Eb?X?׀K?g=?.?0>zN>8~n>>&Q=[ڬڽ'CsG#޾>YX%`5DQ²]pg=p'vo{Z~AHƸ|}Px"rvjb`b UE(HA9. *sz9&򖾱GY.4+/=.>$Y> >>(> ?%?*?#9?"H?tU?e`?Wj?sr?TNx?[|?KH?-?~?&{?Gv?%@p?6g?4]?Q?SD?`5?z%??`?K3>>Ye>Jt=xlPs\yI}X<~zkmuKnqeZN'Ax21!N1:O<Ծ 灾R.ۣ1#8&=8.>Xځ>>a0>J>9?!?2?R#A?N?Z?Aue?Nn?ku?z?[;~?"??}?By?Ps?@l?1b?t X?mK?=??.?ew?c ?>I> J>"un>>>=o(@ڽRCwx|'޾@[?|%6_DDQ]ng=pv{~GHg|Oxrjaa` U&H9e*P!햾>Y. 5.P/=r>.Y>>>>?!?>*?9?/$H?U?Y_`?Ij?5r?Nx?|?xH?S?r~?{?v?W?p?8g? ]?Q?ԬD?5?%??^?/>[>`>C>a=e-< nh`Aʾڦ t'.=K1 X=bL?lsRy}E;~zluPnpeZN&A2!`/ 68Ծ⁾}I.8=B.>ށ>>4>2> ;?R!?p2?$A?vN?Z?2oe?On?8lu? z?;~?5?Ϣ?}?y?s?@l?b?3 X?K?D~=?.?u?n ?Ӭ>UE>c> ln>|>+=&񮼼RڽC|+޾C]%D%h5ݵDQ]kg>p*vc{~NH|[Oxr jA`` U\%H 9*"&羑閾o5Yn/u/=>47Y>>g>>"?"?*?Z9?%H? U?y``?j?r?wOx?|?H?L?~?N{? v?>p?:g?޴]?XQ?D?5?%?ǰ?\?*>>#{>C>#O=b>}>8>6>/?"!?2?b&A?N?Z?;pe?Jn?lu?z?;~?H??}?8y?s??l?b?X?LK?s=?.?s?y ?> A>_>4n>@>7=;PeڽױCa4/޾E_  % 5DQC]ig?pv{}~ToH|Nxrjf`U#Ho9* [<䖾N,YOI/p.= >U@Y>m>">>??*?9?'H?V U?a`?j?r?Px?y|?H?F?~?{?mv?=p?=g?]?Q?D?6?$%??Z?&>>v>C><=<BvnJtJʾĪ w.#=K XfbAlss\y }M;~zmkuNnueZN#Ao2)!8I/Ծ֤xف7.뮽v=zT.>>㲫>"=>:>1?!?2?'A?7N?7Z?Dqe?Kn?hu?z?-<~?\??9}?Cy?-s?9>l?b?X?K?=?$.?q? ?><>[>n>L>=wڽC8f赾4޾Ha%5DQn]ggM@pfv;{~/CHI|8NxMr(je`Ur"H9(*_ Y+-#Yc#/.=>vIY>>'>I>?? *?9?(H? U?b`?j?Hr?Lx?ٸ|?H?@?O~?Z{? v?B>'r>`C>A=?Mk>J>bA>>>3?Z!?2?s)A?N?mZ?Mre?Ln?iu?Pz?s<~?o?p?}?y?Xs?R=l?b?qX?wK?P=?!#.?|? ?y>u8>V> n>>s=Lѯwڽ.Cj}޾Jcٶ%V5DuQ]dgApv{~5HI|Mxr6jd`U*H89i*c /=.ۖ Y..=> Y>Z>d+>s> ??D*?*9?*H? U?c`?j? r?GMx?8|?+I?9?~?{?kv?Ap?Ag?]]?VQ?D?j5?%??V?A>>m>5C>=iс>>E> C>5?)!?2?{ A?N?Z?Wse?jMn?Sju?ȼz?<~??P?}?9y?s?Bl?b?0X? K?=?j!.?z? ?[>+4>@R>n>ҩ>a=" ڽYC4od񵾲޾Wa%5DQñ]gApv{)~<I|MxrDjvc`| U)H9* g )YO.o /=L>-Y><ݖ>/>> ??*?9?}!H?9U?d`?j?r?Mx? |?WI?3?~?{?v?@p? g?2]?Q?D?5?%?2?b? >>,i> C>=b=lsy}{h[<~`zniuDLnqeZN(A2!2=?Ծȵꁾv.@/8N߮=1.>ց>>I>G>w7?!?U2?"A?N?Z?`te?DNn?ju?Az?;~??0?@}?y?s?Al?b?X?K?,=?.?x? ?s>/>M>|n>>_N=fY0ڽCs#޾Y(%5D!Q]g2=p?v{c~BH|hPxrRjVb`0 U(H9*+l羔%\UFY.0/=>N&Y>>d>> ?m?*?a9?"H?U?f`?{j?r?jNx?i|?RH?,?~?{?0v?@p?g?]?Q?D?!5?6%?L?`?2>)>d>޷C>q=l< -;n\8>ʾ/ rm%.k=^K XRb>lkspyU}U<~zRmujKnpeZNd'A82R!19;ԾaZ恾SQ.]E8=<:.>ہ>X>1>.K>e9?ȿ!?2?#A?JN?Z?iue?On?ku?z?e;~?%??}?.y?5s?@l?b?D X?7K?=?.?w? ?U>H>bI>sn>Y>;=BڽޠC/x(޾[%C6DwQ]g>pv{~HHY|Oxwr`j6a` U&Hh9"*$p@!얾4=Y .V/=>o/Y>*>>i> ?L!?*?9?g$H?U?_`?mj?Rr?Nx?ɷ|?H?R?i~?{?v?8?p?g?ܵ]?{Q?D?|5?o%?e?^?v.>>0`>C>^=C"<jfnaBʾ$ Xti.=ȆKa Xgbn?l"sfy}B;~ozluhPnoeZ^N%A2!N<o5m7ԾၾH.8=pC.>߁>>C5>^3>S;?!?2?%A?N?Z?Yoe?On?Qlu?2z?;~?8?ˢ?}?y?~s??l?b? X?K?~=?G.?Gu?# ?6>D>Rc>jn>>)=HUڽ C]}R,޾]n%5DQD]g>pAvs{~OH|EOxrj`` U$%H9c*@" n薾4Yi/n{/=>8Y>> >>m?+#??*?9?%H?< U?``?j?r?Ox?(|?H?L?~?>{?v?i>p?g?]?%Q?ZD?5?%?~?\?@*>W>xz>C>^L=׮<@2)on!GFʾ= /v.~=3K X{bT@lsyÇ}ڢ/;~zkuOnueaZNS$A2!`:?M,3ԾQ݁>.b(Cȸ'=L.>>%>9>p7> 0?g!?]2?&A? N?/Z?cpe?Jn?lu?z?;~?K??}?$y?s?>l?b?X?K?7=?.?ps?. ?>g@>^>ڟn>߄>p=Fhڽ5Ceb䵾0޾_TO%K5WD#Qo]g?pv{~UiH|Nxrjf`NU#H29*` ]羗㖾*YEC/.=[>AY>>a#>>i?8?*?29?P'H? U?a`?j?r?Px?|?H?E?~?{?Vv?=p?g?]?Q?ܳD?t6?%??Z? &>>u>.C>9=Ռ>>=>;>1?ϸ!? 2?%(A?kN?eZ?lqe?Kn?iu?#z?7<~?^??,}?/y?s?>l?b?X?K?=?$.?q?9 ?><>uZ>Ėn>>=zڽ`CfO鵾޾a;%5֮DRQ]gl@p}vK{~0JY>>'>>e?? *?9?(H? U?b`?j?er?Lx?|?I???F~?J{?v?>|q>C>|=B>>B>?>3?!?:2?)A?N?Z?ure?Ln?iu?bz?~<~?r?k?ڈ}?y?7>V>n>>p=nܯ;ڽCak޾U"%5UDQŰ]g:Apv{~6AI۶|Mxmrjkd`U*H9'* 羘- ۖY..=i>hY>> ,>>a ??*?g9?:*H?U?d`?j?(r?\Mx?|?1I?8? ~?{?Tv?Ap?g?0]?#Q?ްD?+5?%?ѷ?V?>>>l>C>=Hҁ>X>DF>C>5?n!?2? A?,N?Z?~se?Mn?lju?ڼz?:~??K?}?%y?s?sBl?b?X?ցK?=?)!.?z? ?>3>Q>n>r>=^=C'ϟڽCo S ޾W%95ӱDQ]g Bpv#{2~<I |Lxr jKc`J UK)Hb9h* gC)(Yz./=>Y>ݖ>^0>;>] ??E*?9?!H?jU?#e`?j?r?Mx?|?,H?2?~?r{?v?@p?g?]?Q?`D?5?%??Mb?k>>h>C>U=<nX:ʾ񾅣 p#.=)KXgb=lsy}eQ<~NzUiu$LnqeZN(A2v!2,ׁ>>J>G>7?>!?2?>"A?N?Z?te?eNn?ku?Sz?);~??+?4}?y?s?Al?b?X?kK?=?s.?x?« ?ֳ>=/>(M>{n>5>K=q3ڽC]th$޾Y=%5RDTQ]gQ=pVv{k~CH|RPxr.j+b` U'H9* =$DY6j.T6/=>'Y>]> >e>Y??*?9?)#H?U?Cf`?j?r?Nx?x|?YH?W?~?{?v??p?g?۶]?wQ?D?5?%??K`? 2>>d>C>n=a<nL]>ʾz r.=KPX{b>lsya}R <~־z8muIKnpeZN*'A2 !08 ;Ծ偾O.Og8=;.>ہ>>1>K>9? !?B2?#A?~N?Z?ue??On?ku?˽z?p;~?(??}?y?s?@l?b? X?K?^=?.?v?ͩ ?>XH>H>mrn>>8=Eڽ;Cx(޾[Я%A5ѴDQF]g>pv{~IHJ|OxZr<j a` Ua&H+9*#$羛 ;얾;Yl .[/=5>0Y>>]>>U?!?*?99?$H?" U?_`?j?or?Ox?׷|?H?Q?~?{?zv??p?g?]?HQ?bD?>5?+%??H^?->>_>UC>.\="!<46ԾS)ၾF.: G#8O=D.>6>f>5>3>;?!?2?O%A?N?'Z?oe?Pn?jlu?Dz?;~?;?Ƣ?ʼn}?y?cs??l?b? X?KK?}=?.?u?ا ?>D>b>Win>>N&=iEXڽgC^#,޾]%5ODQq]g>pYv{~PH|/Oxrj_`h U$H9!*!F疾2Y(c//=y>9Y>J>>2>?r#?*?9?&H?n U?``? j?1r?Ox?6|?H?K?~?{?v?K>p?g?]?Q?!D?5?d%?6?F\?)>>y>)C>I=j̮<5pnGqGʾڮd uv`. =iK Xbv@lsyЇ}ߢ,~;~zkumOnue2ZN$A2o!:L2Ծ짫܁=. =N.>>̯>&:> 8>R0?!?2?&A??N?]Z?pe?Kn?mu?z?;~?N??s}?y?s?>l?b?X?K?=?P.?*s? ?{>?>:^>n>>=!RjڽCc嵾(1޾_%5DVQ]g?pv{~VbH|Nxrjf`Ux#H9b* FN㖾)Y/>/.=> CY>>$>\>??@*?p9?'H? U?a`?j?r?3Px?|?H?D?w~?{?xv?|=p?g?Z]?Q?D?66?%?O?CZ?k%>S>Ou>C>7=?>3>f>><>@2?!?K2?`(A?N?Z?qe?Kn?1iu?5z?B<~?a?? }?y?s?=l?b?RX?uK?j=?T$.?Rq? ?]>y;>Y>in>>=؜l}ڽCg鵾޾aZ%.5DQǷ]g@pv[{~15H,| Nxrj`e`U"HY9*: G1ޖu Y/.=>.LY>8>Z(>>?^? *? 9?(H? U?c`?j?r?Lx?|? I?>?>~?:{?v?4Bp?g?/]?FQ?$D?5?%?i?AX?5!>>p>C>=6>>B>/@>.4?!?z2?)A?N?Z?re?Ln?iu?sz?<~?t?f?͈}?y?!s?7Cl?b?X? K?؃=?".?|? ??>.7>]U>Tn>O>n=篼ڽC lS޾Vj!%5DQ]gYAp2v{~7;IͶ|{MxQrj@d`dU*H9*[ ,TY\.:.=>Y>>,>> ?=?*?9?q*H?PU?.d`?j?Er?rMx?Ƕ|?8I?7?~?{?V?>>Sl>yC>$=&TӁ>>F>AD>6?!?'2? A?aN?Z?se?Mn?ju?z?:~??F?z}?y?ks?QBl?b?X?K?F=? .?Az?m ?!>2>P>>n>>v[=e2ڽCp ޾!XK%w5 D1Q]g(Bpv3{:~=I|Lxrj c` U)H$9%*|羞(~LY0./=>Y>ޖ>1>> ??*?@9?!H?U?Ne`?j?r?Nx?&|?3H?1?~?b{?v?@p?g?ٯ]?Q?'D?H5?v%??b?>:>g>NC>~=o<۔nY5;ʾϣ 5q9$.Q=_K?Xb=lsy}cF<~Ծx遾W.'[8=3.>ׁ>A>&K>RH> 8?!?2?y"A?RN?5Z?te?Nn?0ku?ez?4;~??&?(}?y?s?kAl?b?X?5K?=?1.?jx?x ?9>.>L>(zn>՝>H=}5ڽ@Cu(%޾$Z1%6DQG]go=pnv{t~DH|)Y>>>>??F*?9?a#H?U?nf`?j?r?Nx?|?_H?V?~?{?v??p?g?]?DQ?D?5?%??_?j1>>Wc>"C>k=V<n]?ʾ:ĥ s5.=ʅKXb>lsyn}O<~ľzmu)KnpepZUN&A2!q0K8i:Ծ偾N.8x=<.>]܁>>H2>dL>9?R!?2?$A?N?Z?ue?`On?ku?ݽz?z;~?+??Շ}?y?s?@l?b? X?~K?"=?{.?v? ?>G>H>qn>>,6=ǮvHڽCyl^)޾&\H%5 DQr]g>>pv {~JH<|Ox=rj`` U*&H9*#t떾|:Y I/9a/=>'2Y>~>>>?!?*?v9?$H?S U?_`?j?r?&Ox?|?H?P?~?{?cv?>p?g?]?Q?)D?5?%?Ա?]?5->h>^>C>iY= <)%+hncbCʾY񾺧 t.}=5K Xb?lXsy}Ģ<;~Kzulu'Pnoe:ZNg%A 2!;94(6Ծ}`E.t =.F.>>>6>4>;?"!?02?%A?N?UZ?oe?:Pn?lu?Vz?;~?>??}?y?Hs??l?b? X?K?}=?.?t? ?>jC>b>gn>[>#= [ڽŬC>_-޾)^%$5KD3Q]g ?ppv{~QHݷ|Ox{rj_`6 U$HR9*!tJ羡疾[1Y]/ʆ.=>H;Y>>W >>?#?*?9?K&H? U?``?-j?Nr?Ox?E|?H?J?~?{?v?,>p?g?X]?Q?D?[5? %??[?(> >!y>̢C>F=I<7gqntHHʾw񾯩 v.E=~K Xb@lsy܇})t;~ӽzkuLOnueZN#A]2*!9 L1ԾEہ+<.*=cO.>g>t>:>8>0?!?2?'A?tN?Z?pe?l?b?cX?K?=?.?r? ?ަ>?>]>%n>>=B]mڽCc>浾1޾+`%5ɭDbQȶ]g?pv{~W[H}|NxrjUf`U@#H9*xM▾:(Y8/.=>iDY>k>$>>??*?9?'H? U?b`?j?r?IPx?|?H?C?o~?{?`v?]=p?g?-]?iQ?jD?5?Y%??Y?$>>t>rC>B4=v>۴>?><>2?Y!?2?(A?N?Z?qe?Ln?Jiu?Gz?L<~?d??}?y?s?=l?xb?"X??K?.=?$.? q? ?>:>#Y>n>+>==1ڽC:h굾)޾.b̵%m5HDQ]g@pvk{~2/H|Mxrj5e`~U!H9`*| }羢0-ޖY?J/t.=>MY>>(>%>??L*?H9?4)H?6 U?9c`?j?r?Lx?|?I?=?5~?*{?v?Bp?g?]?Q?D?R5?%? ?W? >O>&p>GC>=+<] nQQD3ʾ}񾙭 jz!.i=KXbeBl{sy}I:~zwjuMnseZBN A2!5CFԾҁ).Ю:de®=".>p>A>HC>@>x4?)!?2?"*A?5N?Z?re?Ln?iu?z?<~?w?a?}?y?s?Cl?cb?X?ՂK?=?]".?{? ?>6>T>n>>Tk=ĒڽGCl^޾kVe%5ǰDQ] gxApJv{ ~84I|eMx4rjd`3UQ*H9* SM,JY..=,> Y>X>T->O> ?? *?9?*H?U?Yd`?j?br?Mx?ն|??I?6?~?{?%v?GAp?g?װ]?Q?lD?5?%?@?U?_>>k>C>`=ԁ>>G>D>f6?!?g2?+!A?N?-Z?se?Mn?ju?z?:~??A?n}?y?Ps?/Bl?b?X?jK? =? .?y?" ?>@2>EP>n>>X==XڽrC6qW󵾓!޾nX,%5EDdQI] gI|Lxqrjb` U(H9 *4)'bKY./=p>A!Y>;ߖ>1>y> ?d?*?}9?$"H?U?ye`?j?$r?Nx?5|?9H?0?~?R{?v?y@p?g?]?gQ?D? 5?2%?Y?a?*>>*g>C>{=N<Z5n/Z;ʾ |q{$.=KnXb>ls'y'}`<<~*z"iuKn|qexZN=(A%2!2;>Ծг聾jV.aJq8=$5.>؁>飫>K>H>T8?Ⱦ!?2?"A?N?cZ?te?Nn?Iku?wz?>;~??!?}?xy?s?IAl?b? X?K?x=?.?#x?- ?>->K>xn>u> F=>8ڽCu%޾pZz%Z6ijDQt]g=pLv{|~EH|'Pxrja` Ug'HL9*U羥#]ABYK.tA/=>b*Y>>S>>?C ?*?9?#H?9U?f`?j?r?Nx?|?fH?U?~?{?v??p?g?]?8Q?oD?e5?k%?r?_?0>6>b>ųC>8i=Klsyz}L;~zmuKnspeBZ N&Ax2!'079ԾjU䁾6M.K8>=Y>.> ݁>O>2>L>B:?!?2?;$A?N?NZ?ue?On?ku?z?;~?.?ܢ?ȇ}?y?s?b@l?b? X?IK?~=?:.?Lv?8 ?}>G>gG>on>8>e3=Ү:KڽC1z)޾s\a%5CDQ]g]>pv7{~KH.|Ox rj``Q U%H9Z*I#Pꖾ 9Y}/f/=>3Y>(>>F>?""?H*?9? %H? U?``?j?r?p?g?W]?Q?.D?5?%??]?,>>.^>C>V=<'#jn cnDʾ *u-.}=kK Xb?lssy}ɢ9;~9z[luPnjoe ZN-%A2!r;35Ծ߁D.a =G.>>>*7>/5>0<?g!?p2?%A?HN?Z?oe?ZPn?lu?hz?;~?A??}?ny?-s?|?l?xb?t X?߆K?=?.?ut?C ?_>B>Wa>fn>> =]ڽ"C_p3.޾u^GS%c5DfQʵ]g+?pv{f~QHϷ|Ox^r|j_` U~$H9*i!(p斾/YedX/Z.=; >> >p>P?$?*?O9?&H? U?%a`?Qj?kr?Ox?S|?H?I?~?{?v? >p?g?,]?Q?D?]6?%??[?_(>d>vx>nC>D='<:Ȗ9snIHʾ w.= K1 Xb@l*s&y}&i;~zku,OnyueZ_N#A2!9nKF1ԾLہ:.󮽤ܦ=P.>>>j;>A9>0?6!?2?L'A?N?Z?pe?\Kn?Gmu?z?<~?T??Z}?xy?ws?>l?cb?3X?tK?=?%.?r?N ?A>|>>\>ʛn>>=dhbpڽNCgd浾i2޾x`.%5DQ]g?p&v{~XUHo|rNxrj*f`U #Hz9*-辨ᖾ&Y!3/.=>EY>>P%>>L??*?9?'H? U?Db`?Cj?r?_Px?|?H?B?f~?{?Iv??=p?g?]?6Q?1D?5?D%??Y?*$>>s>C>}1=pk<:MO|nM/ʾ2 x.=KX bAlsy;}.#;~HzkuQNnpteZN"Ao2!7\G%JԾ6ց1.s஽A8=.>>>?>S=>2?!?2?(A? N?Z?qe?7Ln?diu?Yz?W<~?g?}?}?y?s?=l?Ob?X? K?=?#.?c}?Y ?#>1:>yX>n>˶>v=ڽyChB뵾޾zb%5DQ ]g@pv{{~2(H|Mxrj e`MU!H9*1 /ݖY /.=I>[Y>>)>>H ??*?9?l)H?g U?dc`?5j?r? Mx?|?I?<?-~?{?v?Ap?g?ֱ]?Q?D?5?}%?޸?W?>>zo>C>/= <_AdnQ3ʾ zO!.=KXbBls0y}N:~мz]juwMngseZ N A2F!5JCEԾCҁc(.ͮJ) +Ů=$.>(Ё>鹫>C>eA>4?n!?2?]*A?iN?%Z?re?Mn?ju?z?<~?z?]?}?ny?s?Bl?:b?X?K?`=?".?{?ͮ ?>5> T>n>>h=ڽCcmﵾ޾V%P5DAQK]2gApav{~9-I|OMxrjc`U*HC9_*5 羨+Ye.Y.=>|Y>oۖ>->>D ??N*?9?*H?U?d`?'j?r?Mx?|?EI?5?~?{? v?(Ap?tg?]?Q?3D?o5?%??jc?>K>j>C>=կԁ>*>*H>wE>6?=!?2?e!A?N?[Z?se?Mn?ju?z?;~??=?b}?y?5s? Bl?b?qX?4K?΁=?e .?y?ج ?>1>O>n>Q>U=HڽCq4"޾Xܬp%5~DQv]/g"Y>ߖ>>>@ ?? *?9?["H?U?e`?j?Ar?/Nx?C|?@H?/?~?B{?ov?Z@p?vg?]?4Q?D?5?%??ga?^4>>~f>C>y=,l"s:y4}]1<~z iuKnUqeJZLN(A2!1&;e=Ծ)-聾 U.Q8f=6.>1ف>>L/>I>8? !?U2?"A?N?Z?te?Nn?bku?z?I;~???}?dy?~s?&Al?wb? X?K?<=?.?w? ?>J>-K>swn>>CC=_k;ڽC_v[i&޾Z®%6DQ]-g=pdv{~FH|Pxrja`k U0'H9*=`#@Y.G/=>+Y>\>>><? ?*?V9?#H?kU?f`? j?r?Nx?|?mH?T?~?{?v??p?yg?U]?Q?6D?&5?'%?*?e_?)0>>b>gC>tf=u@<nG_@ʾuZ s.[=6KXb?ls0y}J;~zluJnKpeZNz&A82>!/7$9Ծ®まK.8=?.>݁>>3>1>:?!?2?v$A?N?|Z?ve?On? lu?z?;~?0?آ?}?ߓy?s?@@l?cb? X?K?~=?.?v? ?>mF>F>^nn>ؑ>0=ޮMڽUCz*޾\%5|DCQ˴]+g{>pvG{~LH |Oxrj`` U%Hs9*#A6羫<ꖾ7YH*x/Yl/=Y>4Y>>L>>?i"?*?9?E%H? U?0``?j?r?ROx?|?H?N?~?j{?4v?>p?{g?*]?Q?D?5?`%?C?b]?+>>]>S=<*~kncEʾO qun.+~=K X b?lsy}͢6;~'zBluOnBoeZN$A2o!(;34Ծ[$߁B.4v渡=H.>;>]>7>5>A/?!?2?%A?|N?Z?oe?{Pn?lu?zz?;~?D??}?Zy?s?Z?l?Nb?D X?K?ڇ=?B.?.t? ?©>#B>`>Hen>>=(`ڽC`.޾^%5DQ](gJ?pv{n~R{H|NxArXjk_`UF$H9Y*"! W喾.YR/.= >>Y>I>!>>?v?I*?9?&H? U?Oa`?uj?r?Ox?a|?H?H?~?{?v?=p?}g?]?YQ?vD?6?%?\?`[?'>>w>C>LA=<\=(tnI\IʾD Hw$.=VK` X b@lEs:y}#_;~zku OnRueZ+Nj#A2!:9J0Ծځm9.Kw=!R.>>ı> <>9>/1?!?]2?'A?N?Z?qe?}Kn?`mu?z?<~?W??N}?ey?[s?s>l?:b?X?>K?H=?G%.?Wr? ?>=>?\>pn>^>T =s&sڽCe絾 3޾`v^%F5;DQ!]&g@p=v {~-NHa|]Nxrfje`U"H=9*C iOᖾ%Y-/?.=g>"GY>>%>9>?U? *?(9?.(H?M U?ob`?gj?r?tPx?|?H?A?^~?v{?1v? =p?g?Բ]?Q?D?z5?%?v?]Y?#>_>Ms>C>.=N`<Pe}n5N@0ʾϴ9 y.O=K X4bAlsyH}3;~6zju1NnHteZN!A/2н!L7FIԾց90.ݮt!T=E.>D>*>L@>=>3?!?2?)A?=N?Z? re?WLn?}iu?kz?a<~?j?x?}?y?s?=l?%b?X?ӃK?=?#.?}? ?>9>W>Zn>j>==ڽCi뵾j޾b]%%5DQL]$g@pv{~3SI|Mxrtjd`U\!H9*d ?X/ܖ`Y|*/.=>Y>6>J*>c> ?4?*?9?)H? U?c`?Yj?r?!Mx? |?I?;?$~? {?v?Ap?g?]?Q?yD?5?9%??[W?T>>n>C>j=Ё>>D>B> 5?!?:2? A?N?SZ?se?2Mn?'ju?z?<~?}?X?}?[y?s?Bl?b?X?iK?$=?!.?F{? ?h>C5>bS>Dn>.>e=MڽCnF𵾟޾WD%59DtQw]WgApyv{~:'I0|:Mxrjc` U)H9* +?Y8./=>Y>ܖ>.>> ??*?\9?+H?U?d`?Kj?r?Mx?|?LI?5?~?{?v? Ap?Ng?~]?WQ?D?15?r%??c?>>Qj>`C>׈=ʯAԾ綫쁾.r8ڮ=..>YՁ>Ҡ>H>F>6?!?2?!A?N?Z?te? Nn?ju?"z? ;~??8?U}?Քy?s?Al?cb?AX?K?=?$ .?ny? ?>0>N>/n>>!S=Sڽ-Cr"޾Y$%35DQ]Ug'/=2>#Y>>I>> ??O*?9?"H?0U?e`?=j?^r?DNx?Q|?GH?.?~?2{?Xv?;@p?Pg?S]?Q?|D?5?%?ȴ?a?3>F>e>5C>Cv= <4n[ =ʾ񾯤 r$.=KX bM>l=sNy@}Z'<~z}muKn-qeZN'A2b!1:<Ծ灾S.ե}48,=7.>ف>8>/>$J>8?R!?2?(#A?N?Z?%ue?Nn?|ku?z?S;~? ??}?Py?cs?Al?Nb? X?K?=?n.?w? ?b>J>J>vn>>|@=0>ڽYC w '޾ [ L%66D Qͳ]Sg=p{v{~GHq|Oxrja`9 U&H9*[" ?Y* +.L/=v>-Y>>>Y>? ?*?9?$H?U?f`?/j? r?Nx?|?sH?S?x~?{?v?m?p?Sg?(]?Q?D?5?%??_?/>>Ua> C>c=S5<n_kAʾ񾤦 s.=lK X b3?lsDy}G;~zluPn$peZN@&A2!/y68Ծ⁾wJ.;8=A.>bށ>>.4>T2>:?!!?B2?$A?PN?Z?.ve?On?&lu?z?;~?3?Ӣ?}?˓y?s?@l?:b?U X?݇K?n~=?.?u? ?C>E>td>mn>w>-=8鮼PڽC{_?+޾ ]%;5DvQ]Pg>pvX{~MH|jOxr&j``` U%H69*"閾g6Yr/q/=><6Y>}>>>?"?*?.9?|%H? U?[``?!j?r?gOx?|?H?M?~?Z{?v?>p?Ug?]?|Q?D?C5?%??]?S+>t>{>ާC>Q=<~-Kln_dEʾ0񾙨 u.g~=ׇKO X5b@lsɓy}Ң4;~z)luOn3veZWN$AJ2*!:g2B4ԾxށCA."T۸g=LJ.>>>n8>f6>/?!?2?9&A?N?Z?pe?Pn?lu?z?;~?F??}?Fy?s?7?l?%b? X?sK?=?.?s? ?%>A>`>+n>;>2=3WcڽްC@at/޾_ز%5DQ#]Ngi?pv{w~StH|Nx$r4jf`U$H9* m羲喾F-YEM/y.= >]?Y>>F">>??*?9?&H?3 U?za`?j?r?Ox?o|?H?G?~?{?~v?=p?Xg?ӳ]?&Q?=D?6?T%??[?'>>w>C>>=䟮<#@unoJIʾN񾏪 we.=K XIbAl`sNy} U;~zkuNn*ueZN/#A2Z!87J0ԾMف8.K|=S.>l>l><>x:>y1?Y!?2?'A?N?Z?(qe?Kn?zmu?z?&<~?Z??A}?Qy?@s?Q>l?b?X?K? =?%.?r? ?>4=>[>n>G>=~uڽ Ce2赾3޾a%5tDQN]Lg7@pUv0{~.GHS|GNxbrBje`6U"H9X* ]%$Y_'/μ.=>~HY>j>&>>??U *?e9?f(H? U?b`?j?3r?Px?ϸ|?H?@?U~?f{?v?=p?Zg?]?Q?D?;5?%?-?Y?">>r>YC>9=-U>Ҷ>@>>>g3?)!?2?I)A?rN?LZ?1re?xLn?iu?}z?l<~?m?s?}?̕y?ks?k=l?b?X?K?z=?O#.?|?Ģ ?>8>'W>n> >u=^ɯ~ڽ4CY>>*>> ?|?*?9?)H? U?c`?}j?r?7Mx?.|?&I?:?~?{?|v?Ap?\g?}]?zQ?@D?5?%?M?W?>[>$n>.C>=X с>9>/E>B>U5?!?z2?Q A?N?Z?:se?RMn?Aju?z?<~??S?}?Gy?s?Bl?b?RX?3K?=?!.?{?7 ?˜>4>R>n>ͪ>b=3ڽ`Cn@޾QW0%5rDQ]}gApv{#~; I"|$Mxr^jc` U)H9*= w^*KYF.y/=P>5Y>ܖ>C/>+> ?[?*?9?V!H?U?d`?oj?r?Mx?|?SI?4?~?{?v?@p?(g?R]?$Q?D?5?.%?f?b?~>>i>C>=/nWy9ʾr }#.=̓KX b=lsݕy}wjc<~mziu\Lnre#ZDN)A2!&3>a@Ծ?Y끾p.58Uݮ= 0.>ց>y>oI>F>C7?ǽ!?'2?!A?N?Z?Dte?-Nn?ju?4z?;~??3?I}?”y?s?Al?:b?X?ȀK?V=?.?(y?B ?>U0>JN>}n>>ZP=^`.ڽC7sKu#޾TYm%r5DQϲ]{g=p.vt{]~AH¸|wPxrljub`S U5(H/9 *^M &MGY.,/=>V%Y>:>>U> ?:?*?59?"H?U?e`?aj?{r?ZNx?_|?MH?-?~?"{?@v?@p?+g?']?Q?BD?N5?f%??`?3>>(e>׸C>s=t< 2Dn*\=ʾ Nr>%.@=7KX5bo>lXsbyL}W<~zdmuKnqeZN'Ae2!819 <Ծٱ恾MR.V8=A9.>ځ>५>0>J>19?!?2?b#A?$N?Z?Mue?On?ku?z?^;~?#??}?=y?Hs?@l?%b?f X?]K?=?,.?Qw?M ?İ>pI>I>tn>T>==@ڽCw'޾V[S%6oDSQ]yg=pv{~HHc|OxrzjUa` U&H9R*#羵!^햾,>Y .#R/=>w.Y>>B>>?!?Q*?9??$H?U?f_`?Sj?=r?Nx?|?zH?S?o~?{?v?N?p?-g?]?Q?ĬD?5?%??^?.>+>`>C>`=2*<oen`Bʾ &t:.҇=K? XIbU?lsXy}D;~|zluPnoeZN&A2!J/57ԾrP⁾I.g8=vB.>߁>G>4>2>;?f!?2?$A?N?Z?=oe?On??lu?%z?;~?6?΢?}?y?s??l?b?& X?K?2~=?v.?yu?X ?>&E>c>kn>>+=ZSڽCm]+޾Y]:W%z5DQ%]vg>p1vh{~NH|TOxrj5`` UL%H9*r"a薾 5Y m/xw/=>7Y>'>>">7?"?*?l9?%H? U?``?j?r?}Ox?|?H?L?~?I{?v?>p?/g?Ѵ]?IQ?D?5?%??\?*>>z>C>WN=z߮>>9>7>/?6!?02?s&A?N?Z?Fpe?Jn?lu?z?;~?I??}?2y?s??l?b?X?=K?b=?.?s?c ?>@>\_>Рn>څ>k=?fڽ;Cad0޾[_!%5/DQO]tg?pv{~TmH|Nxrjf`qU#H]9* E q䖾+YAG/ .=_>@Y>>">L>3??*?9?)'H?e U?a`?j?r?Px?}|?H?F?~?{?gv?=p?2g?]?Q?D?6?%?ˮ?Z?}&>p>tv>'C>;=Ô>>P=>;>1?!?2?'A?FN?DZ?Pqe?Kn?iu?z?0<~?\??5}?=y?%s?/>l?b?X?҄K?Ѕ=?$.?q?n ?j><>Z>n>>=ȉxڽgCif赾J4޾^a%5D-Qz]qgV@plv@{~/AHE|1NxErje`Ub"H9*J ,羸ߖ"Y`"/^.=*>IY>>?'>v>/?? *?9?(H? U?b`?j?Pr?Lx?ݸ|?I???L~?U{?v?>q>C>u= J>z>A>%?>3?n!? 2?)A?N?zZ?Yre?Ln?iu?Uz?v<~?p?n?}?y?Ps?I=l?b?cX?gK?>=?#.?|?y ?L>F8>~V>n>>r=ԯCڽCj6޾`c%h5,DQ]og$Ap v{~5FI|Mxr,jd`U*H'9V*N  .ۖY ..=m>pY>>+>>+ ??W*?;9?*H? U?c`?j?r?MMx?|?-I?9?~?{?dv?Ap?6g?P]?GQ?D?X5?%??V?>>xm>C>=6<4hbtnS5ʾî {".Y=KX5bBlsly}\{<~zjuMnre+ZpNd*A2w!4xACԾ>ЁF$.Ů 7}ͮ=7(.>-ҁ>ừ>E>7C>5?=!?2? A?N?Z?bse?sMn?Zju?ͼz?:~??N?}?3y?s?Bl?b?#X?K?=?X!.?z? ?.>3>R>n>m>8`=U֝ڽCeo޾Wոt% 5DQб]gApv{,~<I|Mxr:jjc`m Us)H9*R 羹)Yv. /=>Y>mݖ>/>>' ??*?9?!H?GU?e`?j?r?Mx?|?'H?3?~?}{?v?@p?g?%]?Q?D?5?%??b?>W>h>C>N=<ndX:ʾP [}#.=KXIb=lsy}|gX<~[zgiu;LnqeZN(A2!2g=?Ծꁾ.沮2z58=l1.>ց>!>J>IG>7? !?g2?"A?N?Z?kte?MNn?ku?Fz?";~??.?=}?y?s?Al?b?X?K?=?.?x? ?F>/>M>z|n>0>M= j%1ڽCs$޾Y;%5)D0Q]g;=pFv{e~BH|bPxrHjJb`" U'H9*Ve%+EY2a.^2/=>&Y>>>>#??*?r9?#H?U?$f`?j?r?pNx?m|?TH?,?~?{?)v??p?g?]?Q? D?5?#%?7?`?}2>>}d>yC>p=i< n\g>ʾ.E r%.|=mK.X^b>lssvyY}T<~zJmuaKnpeZNS'A%2?!0U9~;Ծ1(恾P.Ix8=:.>6ہ>>21>ZK>z9?ܿ!?2?#A?YN?Z?tue?(On?ku?z?h;~?&??}?)y?-s?@l?b?7 X?'K?=?.? w? ?'>H>2I>dsn>>:=ĴCڽBCaxOK(޾[%U6DQ&]g >pv{~IHU|OxorVj*a` U&HW9* $Z!얾/Y>Z>>>?`!?*? 9?w$H?U?_`?wj?Zr?Ox?ͷ|?H?R?g~?{?v?/?p?g?ϵ]?lQ?D?j5?[%?P?^?G.>>_>NC>&^=7ԾˬၾG.4 48U=C.>߁>>r5>3>h;?!?2?%%A?N?Z?eoe?Pn?Xlu?7z?;~?9?ɢ?}?y?ws??l?b? X?qK?}=?5.?3u? ? >D>"c>Njn>>I(={LVڽnC^,޾]%5'DQQ]g>pHvx{~OH|?Oxrj `` U%H9P*+"Z羼=薾3Y$zg/}/=}>8Y>><>>?@#?R*?9?%H?J U?``?j?r?Ox?,|?H?K?~?9{?v?a>p? g?]?Q?JD?5?%?j?|\?*>'>Gz>#C>K=YԮ< 3 onRGFʾj/ Cv2.~=CK Xb^@lsyLJ}ܢ.;~zkuOnueSZNC$A2!K:M2Ծd݁>.Ÿ= M.>@>U>9>7>0?{!?p2?&A?N?l?b?X?K?&=?~.?\s? ?>8@>^>vn>z>=2JhڽCb!嵾0޾_ib%]5hD2Q|]g?pv{~UgH|Nxrjf`?U#H 9*L h㖾*Y%B/.=>BY>H>#>>?L?*?D9?`'H? U?a`?j?r?$Px?|?H?E?}~?{?Ov?=p? g?z]?Q?˳D?b6?%??zZ?%>>u>C>8=V.>>>=>;> 2?!?2?6(A?zN?rZ?wqe?Kn?iu?(z?:<~?_??)}?)y? s? >l?b?tX?K?=?$.?q?# ?ͣ>;>DZ>`n>>=ꔯs{ڽļCg鵾޾aP)%5D`Q]gu@pvP{~0:H6|Nx(rj~e`U+"H9*m 羽1Pߖm!Y/.=>6KY>>'>>{?+? *?9?(H? U?b`?j?mr?Lx?|?I?>?D~?E{?v?l>Kq>C>=>I>">3B>?>3?!?L2?)A?N?Z?re?Ln?iu?gz?<~?r?j?ֈ}?y?5s?&=l?b?4X?1K?=?".?J|?. ?>7>U>Kn>J>p=߯ڽCkK޾U7%5eDQҰ]gCAp"v{~6?I׶|Mxerj^d`U*H9* ch-nLYX{.C.=>Y>5>9,>?>w ? ?*?y9?J*H?-U?d`?j?0r?bMx?|?3I?8? ~?{?Mv?|Ap?g?$]?Q?ΰD?5?m%??uV?r>>l>rC>=ҁ>>sF>C>5?!?2? A?;N?Z?se?Mn?sju?߼z?:~??J?}?y?~s?jBl?b?X?ǁK?p=?!.?sz? ?>X3>fQ>5n> >q]=v*ڽCp:򵾁 ޾W%K5D Q]gBpv({4~=I|Lxrj?c`< U;)HP9U* 9)*Y&./=>Y>ޖ>0>i>s ??X*?9?!H?xU?/e`?j?r?Mx?|?.H?2?~?m{?v?@p?g?]?Q?OD?u5?%?յ?7b?=>>Oh>GC>=]<n Y:ʾ񾚣 q $.&=9KXsb=lsy}eN<~IzNiuLnqeZN(A2b!2<?Ծ𴫾ꁾ. K8=2.>^ׁ>ɢ>J>G>7?R!?2?O"A?-N?Z?te?nNn?ku?Xz?,;~??*?0}?y?s?Al?b?X?\K?߀=?`.?x? ?>/>L>{n>О>J=.u3ڽGCt$޾YP%5bDcQ(]gY=p]v{n~CH|LPxr$jb` U'H9* $𖾕DYѬ.7/=V>(Y>>8>>o??*?9?9#H?U?Of`?j?r?Nx?||?[H?W?~?{?v??p?g?ζ]?hQ?ЭD?5?%??5`?1>S>c>C>m=^<n|] ?ʾ˦񾏥 r.=K]Xb>lsye}Q<~Ѿz1mu@KnpeZzN'A2!08:Ծ|偾O.8~=<.>ہ>0>1>K>9?!!?U2?#A?N?Z?ue?HOn?ku?нz?s;~?)??އ}?y?s?@l?b? X?~K?M=?.?v? ?>)H>H> rn>>'8=忮}FڽC y(޾[%S5DQS]g(>pv{~JHF|OxRr1j`` UQ&H9*#k 얾t;Y |.C]/=>/1Y>>>6>k?!?*?K9?$H?0 U?_`?j?wr?Ox?۷|?H?Q?~?{?sv??p?g?]?9Q?RD?,5?%??2^?->>S_>C>b[=<.#/gnaUCʾ񾄧 t.}=K Xb?lEsy}>;~Xzlu>Pnoe[ZN%A82*!;46Ծ#ZF.n V8=4E.>g>>6>&4>;?!?2?`%A?N?4Z?oe?#Pn?rlu?Iz?;~?<?Ţ?‰}?y?[s??l?b? X?;K?}=?.?t?ç ?l>C>yb>hn>V>%= Yڽ˫C^S!-޾]˱%5"DQ~]g>p`v{~PH|)Oxrj_`Z U$H~9*!疾S2Ya//=>P:Y>{>>`>?#?*?9?#&H?| U?``?j?:r?Ox?:|?H?J?~? {?v?B>p?g?x]?Q?D?5?P%?!?0\?r)>>y>ţC>H=7ɮ<5lpnGGʾy vs.=~K Xb@lsyӇ}+{;~߽zkudOnue%ZN$A2[!:xL\2Ծs܁&=.=iN.>>>T:>88>h0?!?2?&A?NN?jZ?pe?%Kn?mu?¾z?;~?O??o}?y?s?>l?b?X?хK?=?=.?s?Υ ?N>?> ^>n>>=TUkڽCBc嵾V1޾_%5D=Q]g?pv{~V`H|Nxrjsf`Uh#H9O* 㖾2)Y~qCY>>5$>>??T*?9?'H? U?a`?j?r?:Px?|?H?D?u~?{?qv?s=p?g?M]?Q?D?$6?%?:?-Z?<%>#>u>kC>;6=~p>c>>>I<>V2?(!?]2?p(A?N?Z?qe?Kn?8iu?:z?E<~?b??}?y?s?=l?b?EX?fK?X=?A$.?>q?٣ ?0>J;>Y>n>&>7= 8~ڽ"Cg%굾޾am%@5DQӷ]g@pv`{~13H(|Nx rjSe`U!HG9*% 1ޖ Y;@/~.=>LY>i>(>>?s?*?9? )H? U?c`?j?r?Lx?|? I?>?;~?5{?v?+Bp?g?"]?7Q?D?5?%?T?+X?!>>p>@C>=3<[nP2ʾ c 8z .>=KXbMBlhsyy}F:~zjuMnseZgN A/2!&6TDFԾjӁ*.Ү$ؑk=!.>>ʸ>B>[@>D4?!?2?)A?N?Z?re?Ln?iu?yz?<~?u?e?ʈ}?y?s?-Cl?b?X?K?ǃ=?".?|? ?>6>,U>n>>Om=꯼̐ڽNC>l޾4V5%5DQ]gbAp9v{~79Iɶ|uMxHrj4d`VUx*H9*F ,Y..=0>(Y>>,>> ?R?*?9?*H?^U?;d`?j?Mr?xMx?˶|?:I?7?~?{?5v?]Ap?g?]?Q?D?5?)%?s?(V?>h>"l>C>X=Ӂ>0>G>mD>26?Ǽ!?:2?!A?pN? Z?se?Mn?ju?z?:~??E?w}? y?cs?GBl?b?X?K?5=? .?-z?W ?>2>P>ۂn>>Z=5_ڽyCp!!޾7X`%5D@Q)]g0Bpv8{=~> I|Lxrjc` U)H9*go(MZLY.(/=t>I Y>ޖ>21>> ?1?*?Q9?!H?U?Ze`?j?r? Nx?*|?4H?1?~?]{?v?@p?g?̷]?Q?D?65?b%??a?> >g>C>}=<<_>nYd;ʾI JqL$.b=oKLXb=lsy}bC<~7z4iuKnqeZNg(AS2!J20ԾHT遾dW.Zb8=*4.> ؁>q>UK>H> 8?!?2?"A?aN?BZ?te?Nn?7ku?jz?7;~??%?$}?y?s?aAl?b? X?&K?=?.?Vx?b ? >j.>OL>yn>p>H=O6ڽC9u>V%޾:ZF%.6DQT]gx=puv{v~DH|6Pxrja` U'Hw9I*p$9CYA.}=/=>j)Y>8>>2>? ?Z*?9?q#H?U?zf`?j?r?Nx?|?aH?V?~?{?v??p?g?]?\Q?D?5?%??_?<1>>&c>C>1k=Slsyq}O;~zmuKnpecZFN&A2!\08::Ծᯫ䁾0N.E.8D=_=.>܁>ا>v2>L>:?f!?2?$A?N?-Z?ue?iOn?ku?z?};~?+??ч}?y?s?{@l?b? X?pK?=?h.?~v?m ?>G>G>pn>3>`5=ˮAIڽCy)޾<\-[%5DQ]gG>pv{~JH8|Ox5r j``t U&H9*{#F`떾:Y/b/=>2Y>>2>>?!?*?9?$H?b U?_`?j?r?-Ox?|?H?P?~?{?\v?>p?g?v]?Q?D?5?%??]?->8>^>C>X=<%,inbCʾϧ t.}=DK Xb?l`syĉ}Ţ;;~FznluPnoe-ZNV%A2!; 45Ծ{KD. =F.>>>>6>4>;?5!?B2?%A?"N?cZ?oe?CPn?lu?[z?;~????}?|y?@s??l?b? X?K?}=?.?t?x ?Ϫ>;C>a>gn>>"=[ڽ)Co_-޾?^#%65[DBQ]g?pwv{~QHٷ|Oxsrj_`( U$HA9*!^r斾0Ya[\/c.=? >;Y>&> >>?#?*?#9?[&H? U?a`?7j?Wr?Ox?I|?H?I?~?{?v?#>p?g?K]?Q?شD?I5? %?ٯ?[?(>>x>gC> F=<8͕BrnHDHʾĩ v.V=~K Xb@lsy}(q;~νzkuCOnueZN#AJ2!9K1Ծہ;. Wˮ=O.>>>:>8>0?!?2?#'A?N?Z?pe?EKn?5mu?Ӿz? <~?R??c}?y?s?>l?b?VX?K?=?.?r? ?>>>a]>n>>=u`inڽUCcn浾1޾A`%5ڭDpQն]g?pv{~WYHy|NxrjHf`U0#H9 *byr▾'Y7/.= >DY>>$>)>??*?9?'H? U?&b`?)j?r?OPx?|?H?C?l~?{?Yv?T=p?g? ]?ZQ?YD?5?E%??Y?$>}>rt>C>v3=^s<@K X{nM(/ʾ³񾹫 xk.=eKXbAlsy2}*+;~UzkuiNnte Z$NE"A2F!7GJԾBׁ2.m⮽4H=.>> >7?><>2?m!?2?(A?N?Z?qe? Ln?Riu?Lz?O<~?e??}?y?s?=l?lb?X?0K?=?$.?p? ?>:>X>n>Ʒ>p=-ڽCkh굾W޾Db%5XDQ]g@pvp{~2-H|Mxrj)e`pU!H 9M*g Or0ݖY/.=N>cY>>/)>S> ??`*?Z9?D)H?D U?Fc`?j?r?Lx?|?I?=?3~?%{?v? Bp?g?]?Q?ڱD?@5?%? ?W?g >>o>C>'=(<]FmnQs3ʾ񾮭 z!!.z=ρKXboBls"y}J:~ܼzojuMnseZ3N A2w!5CXFԾmҁ]).ϮJ1î= #.>ρ>r>wC>@>4?=!?2?3*A?DN?Z?re?Ln?iu?z?<~?x?`?}?|y?s? Cl?Wb?X?łK?=?J".?{? ?u>[6>T>n>>j=ڽCl)ﵾ޾Vȷx%#5װDQ+]gApQv{ ~82I|_Mx+rj d`%UA*Ho9*k %,Y\.c.=>Y>ږ>->}> ??*?9?*H?U?ed`? j?jr?Mx?ٶ|?AI?6?~?{?v?>Ap?g?˰]?Q?\D?5?%?+?U?1>>vk>C>=ݯ2ԁ>>G>E>{6? !?z2?;!A?N?:Z?se?Mn?ju?z?:~??@?k}?y?Hs?%Bl?b?X?[K?=? .?y? ?V>2>P>n>L>W=@$ڽCgq!޾X@%5VDrQV]g!Y>lߖ>.>> ?x?*?9?4"H?U?e`?j?,r?Nx?9|?;H?0?~?M{?v?p@p?g?]?XQ?ݮD?5?%?D?a?>c>f>C>{=ls,y+}_9<~%ziuKnqqekZrN,(A2ظ!2;=Ծ聾V.;Gx8l=5.>؁>>K>I>i8?ܾ!?'2?"A?N?pZ?te?Nn?Pku?|z?A;~?? ?}?ry?s??Al?b? X?K?g=?.?x? ?n>->K>jxn>>>E=qr9ڽCu%޾Z%l6ԳDQ]g=pSv{~EH|!Pxrja` UW'H:9*Asu#,AY. C/=>*Y>>>>?X ?*?*9?#H?HU?f`?j?r?Nx?|?hH?U?~?{?v??p?g?u]?)Q?^D?S5?W%?]?_?0>>{b>`C>mh=cH<n^R@ʾ% gs.0=KXb>ls"y~}L;~zluJngpe5ZN&Ae2o!079Ծ:$䁾L.[8 =>.>;݁>>3>,M>W:?!?2?L$A?N?[Z?ue?On?ku?z?;~?.?ۢ?Ň}?y?s?X@l?b? X?:K?~=?'.?8v?# ?P>F>7G>Uon>Ӓ>2=(֮Lڽ[CczB,*޾\u%5SDQ]gf>pv<{~KH*|Oxrj``B U%H9G*4#w!ꖾ8YC |/bh/=]>3Y>Y>>t>?7"?[*?9?%H? U?``?j?r?BOx?|?H?O?~?u{?Dv?>p?g?J]?Q?D?5?%?w?]?f,>>]>5C>U=<(jn=cDʾ# ?u?.~=zK Xb?l{sy}ʢ8;~4zTluOn^oeZN%A2!\;q3X5ԾӪ߁C.d =G.>>欫>X7>\5>E<?z!?2?%A?WN?Z?oe?dPn?lu?mz?;~?B??}?hy?%s?r?l?lb?g X?φK?=?q.?`t?. ?2>B>&a>?fn>>= ^ڽC`b.޾^\f%u5DuQ׵] g4?pv{h~RH˷|NxVrqj_`Un$H9*U!}?斾/YV/.= > =Y>>+!>>f?$?*?a9?&H? U?1a`?[j?tr?Ox?W|?H?H?~?{?v?>p?g?]?}Q?D?K6?%??[?1(>4>Ex> C>EC= Xb@l1s,y}%f;~zku#OnnueZPN#A 2ѿ!n9AK1Ծmہg:.D+='Q.>D>L>;>n9>0?J!?02?]'A?N?Z?pe?fKn?Nmu?z?<~?U??W}?sy?os?>l?Wb?&X?eK?s=?u%.?r?8 ?>M>>\>gn>Y>N =k-qڽCd絾2޾`C.%5DQ] g@p-v{~,SHk|lNxrjf`U"Hh9*vxᖾy&Yv1/H.=k>*FY>F>%>>b?"?*?9?(H?* U?Qb`?Mj?r?ePx?|?H?B?d~?{?Bv?6=p?g?]?'Q? D?5?0%??Y?#>>s>C>0==h<Nj|nM/ʾ_ x.$=KXbAlsy?}/ ;~CzkuHNneteZN "A]2!7/GIԾց31.߮1Z=J.>>>?>=>2?!?2?(A?N?Z?qe?@Ln?kiu?^z?Z<~?h?{?}?y?s?=l?Cb?X?K?=?#.?O}?C ?>:>IX>Qn>e>=NڽCir뵾޾b)%5DQ,] g@pv{~3XI |Mxrjd`?U!H9 * /RݖXYx! /.=>Y>>)>>^ ??*?9?|)H?v U?qc`?@j?r?Mx?|?I?<?*~?{?v?Ap?g?ɱ]?Q?D?5?i%?ɸ?W?>x>Io>C>c=<`ȅn+R4ʾG zb!.=K*XbBls6y}O:~ʼzVjunMn[seZN A22!5CEԾŻҁ'. ͮŮ=$.>ZЁ>>D>A>4?!? 2?n*A?xN?3Z?re?Mn?ju?z?<~?{?[?}?iy?s?Bl?.b?X?K?O=? ".?x{? ?؝>5>S>;n>)>g=Uڽ Cmﵾ-޾V%b5DOQW]=gAphv{~9,I|IMxrjc` U *H29L* y+o7Y4..=>Y>ۖ>(.>>Z ??a*?19?*H?U?d`?2j?r?Mx?|?GI?5?~?{?v?Ap?ig?]?{Q?#D?]5?%??Tc?>>j>YC>ϊ=үԁ>Z>YH>E>6?Q!?2?v!A?N?hZ?te?Mn?ju?z?;~??;?^}?y?-s?Bl?b?cX?$K?=?R .?y?¬ ?>m1>kO>&n>>U=Kڽ4Cr.b"޾X%5DQ]:g#Y>>>E>V ?? *?9?k"H? U?e`?$j?Ir?5Nx?G|?BH?/?~?={?iv?Q@p?kg?s]?%Q?D?5?%??Qa?04>>Mf>.C>l)s@y7}\.<~ziuKnIqecف>>z/>I>8?!!?g2?"A?N?Z? ue?Nn?jku?z?L;~??? }?_y?ws?Al?lb? X?K?+=?.?w?ͪ ?ѱ>J>J>wn>>wB=7<ڽ`Cv&޾Z׮%6 DQ]8g=pkv{~FH{| Pxrja`\ U 'H9*'2"@Y&!.H/={>#,Y>>(>>R? ?*?g9?#H?yU?f`?j? r?Nx?|?oH?T?~~?{?v??p?ng?H]?Q?%D?5?%??O_?/>I>a>C>e=A=< nw_@ʾo s.l=EKXb?ls6y}I;~zluJn@peZNj&A%2*!/68ԾwまrK.8=@.>݁>'>3>1>:?!?2?$A?+N?Z?ve?On?lu?z?;~?1?֢?}?ٓy?s?6@l?Wb?w X?K?~=?.?u?ب ?>>F>d>mn>r>/=JᮼNڽC{*޾\%5DQQش]6g>pvL{~LH|yOxrj~`` U%Hb9*"+| ꖾ_7Yv/m/=>D5Y>>|>>?~"?*?9?U%H? U?<``?j?r?XOx?|?H?N?~?e{?-v?>p?pg?]?Q?D?p5?L%?.?L]?+>>|>רC>S=<+Pknc@Eʾd u.<~=K- Xb@lsy}Ϣ6;~"z;luOn7oeZ|N$Ax2[!;24Ծ+ށ=B.Bm=QI.>l>>7>5>V/?!?2?&A?N?Z?pe?Pn?lu?z?;~?D??}?Ty? s?P?l?Cb?7 X?K?ɇ=?/.?t? ?>A>}`>"n>6>,=,^aڽC`F/޾^%5ͬDQ]3gS?pv{q~SyH|Nx9rMj__`U6$H9F*!'喾>.Y;Q/.= >e>Y>z>!><>??\*?9?&H? U?\a`?j?r?Ox?e|?H?G?~?{?v?=p?rg?]?JQ?fD? 6?%?H?J[?'>>w>~C>@=ӧ<)>tnIIʾްY \w7.=fKn X,b@lMs@y}"\;~zkuOnFueZNY#A2!%9Ju0Ծťnځ9.~﮽=R.>>>;<> :>D1?(!?p2?'A?N?Z? qe?Kn?hmu?z?<~?X??J}?_y?Ts?j>l?.b?X?/K?7=?4%.?Cr? ?w>=>\> n>~> =vsڽCDe絾73޾`q%X5LDQ.]1g!@pDv${~-LH]|WNxvr[je`zU"H+9*. <ᖾ%YZ+/ظ.=>GY>>%&>f>?j?& *?99?>(H?[ U?|b`?rj?r?{Px?Ÿ|?H?A?[~?q{?*v?=p?ug?Dz]?Q?D?h5?%?a?GY?[#>0>s>RC>-=]u>[>{@>>>23?!?2? )A?LN?+Z?re?aLn?iu?pz?d<~?k?v?}?ڕy?~s?=l?b?X?ăK?=?~#.? }? ?Y>_9>W>n>>=pڽ;Ci쵾޾br9%5ʯD,QY].g@pv{~4QI|Mxrijd`UM!H9*O (/ܖY/-.=>Y>g>y*>> ?I?*?9?)H? U?c`?dj?r?(Mx?$|?!I?;?"~?{?v?Ap?wg?]?Q?hD?5?%%??EW?&>>n>'C>=dс>>D>-B> 5?ǻ!?L2?( A?N?aZ?se?;Mn?/ju?z?<~?~?W?}?Uy?s?Bl?b?tX?YK?=?!.?2{?l ?;>5>1S>n>ȫ>d=' ڽgC@nv޾WY%5IDQ]bgApv{~:%I,|4Mxrwjc` U)H9 *p *Y<./=T>=Y>Jܖ>.>> ?(?*?n9?.!H?U?d`?Vj?r?Mx?|?NI?4?~?{?v?Ap?Cg?q]?HQ?D?5?^%??c?>t> j>C> =ǯ<vC8nCW9ʾТ |Z#.=KXbp=losϕy}tlj<~zziusLn+reDZiN@)A2![3p>@Ծ끾k.rX8[ۮ=/.>Ձ>>H>?F>7?!?2?!A?N?Z?'te?Nn?ju?'z?;~??7?R}?Дy?s?Al?Wb?4X?K?=? .?Zy?w ?R>0>N>~n>>UR=VڽCr#޾Y9%E5ȲDQ]`g=pvh{V~AH̸|Px/rjb`w U](H[9J *&NEHY.(/=>^$Y>>x>> ??b*? 9?"H?_U?e`?Hj?fr?KNx?U|?HH?.?~?-{?Qv?2@p?Fg?G]?Q?kD?z5?%??a?3>>e>йC>wu=|< Nn[O=ʾ!Ť r%.=KXbW>lEsTyC}Y$<~zvmuKn"qeZ N'A2N!m1_:<ԾPP灾GS. g8=G8.>ځ>h>0>QJ>8?f!?2?9#A?N?Z?0ue?Nn?ku?z?V;~?!??}?Ky?[s?@l?Bb? X?K?=?[.?w? ?4>I>SJ>un>O>?=>ڽC;w28'޾ [ `%6FD.Qڳ]^g=pv{~GHm|Oxrjsa`+ U&H9*+"햾$?Y .-N/=>-Y>7>>>? ?!*?9?$H?U?G_`?:j?)r?Nx?|?uH?S?u~?{?v?d?p?Hg?]?Q?D?5?%?̲?_?Z/>>$a>C>b= 2<tcn `Aʾ?񾺦 s .=|K X,b=?lsIy}F;~zluPnpeZN/&A2!/M6T8Ծ꭫⁾J.#8=|A.>ށ>ϩ>\4>2>:?5!?U2?$A?_N?Z?:ve?On?-lu?z?;~?4?Ѣ?}?Ɠy?s?@l?.b?H X?·K?]~=?.?u? ?>E>Cd>ln>> -=k쮼QڽC{m+޾"]'%M5ŵDQ][g>p v\{~MH|dOxrjT`` Us%H$9*"ja閾6Yq/s/= >6Y>>!>>?"?*?@9?%H? U?g``?+j?r?nOx?|?H?M?~?U{?v?>p?Jg?]?nQ?D?15?%??]?%+>D>l{>yC>PP=h>5>8>6>/?!?2?J&A?N?Z?*pe?Pn?lu?z?;~?G??}?Ay?s?.?l?b? X?cK?=?.?s? ?>PA>_>ǡn>Ն>e=#7#dڽBCqa/޾%_%5DQ0]Ygr?pv{y~TrH|Nxr)jf`U#H9* {@羂䖾,Y=K/.=c >?Y>$>u">>??*?9?'H?A U?a`?j?r?Ox?s|?H?G?~?{?wv?=p?Mg?Ƴ]?Q?-D?6?A%??Z?&>>v> C>==<@QvnJ.Jʾ{񾤪 wx. =K XUb AlhsTy} R;~zwkuNnueZN#A2G!8 J/Ծف7.쮽dH=S.>>><>:>1?m!?2?'A? N?#Z?3qe?Kn?mu? z?)<~?Z??>}?Ky?8s?G>l?b?X?K?=?$.?q? ?ڤ>=>f[>n>>=ځvڽnCea赾3޾'aԴ%5D Q[]Wg@@p\v4{~.EHO|ANxYr7je`(U"H9D* .t#YV&/h.=.>HY>>&>>??h *?v9?v(H? U?b`?j?<r?Px?Ӹ|?H?@?S~?a{?v?>pr>C>n=Q">>A>>>|3?8>V>n>>t=̯JڽCmj쵾8޾*c}%;5D_Q]TgApv{~5KI|MxrEjd`U+HR9* s羃.ۖY/.=r>xY>>+>/> ??'*?9?)H? U?c`?j?r?=Mx?2|?(I?:?~?{?uv?Ap?Qg?p]?kQ?/D?5?%?8?V?>+>m>C>ڗ=$<:fg}n}S^5ʾ񾎮 Q{!..=qKXbBls^y}Y}<~z#ju-Mn seLZN*A/2!4ArDԾvЁ@%.~Ǯ*6ˮ=='.>с>i>]E>B>j5? !?2?b A?N?Z?Fse?\Mn?Hju?z?<~??R?}?Ay?s?Bl?b?EX?#K?ׂ=?!.?z?" ?>p4>R>n>h>3b=gݛڽCnn޾gWD%5DQ]gApv {&~;I|MxrSjc` U)H9*) I/*Yq. /=>Y>ܖ>r/>Y> ?o?*?9?f!H?$U?d`?zj?r?Mx?|?TI?3?~?{?v?@p?g?E]?Q?D?5?%?Q?b?P>>ui>C>F=m<"nW9ʾ )}#.=܃KX,b=lsy}yi`<~hzyiuRLnreZ5N)A2ع!3=2@Ծ(끾 .മʜ%8!ޮ=r0.>7ց>>I>F>X7?۽!?:2?!A?N?Z?Ote?6Nn?ju?9z?;~??2?F}?y?s?Al?.b?X?K?E=?.?y?- ?>&0>N>q}n>+>O=b,/ڽCis{#޾jY %5D Q۲]g%=p5vx{_~BH|qPxrajhb`E U%(H9 *J%FY-W.g./=>%Y>k>>> ?O?*?G9?"H?U?f`?lj?r?`Nx?c|?OH?-?~?{?:v?@p? g?]?Q?2D?<5?S%?k?`?2>p>d>rC>r=q< n[\=ʾ brQ%.R=GK XAby>l`shyP}V<~z\muxKnpeZN}'AS2 !#19;Ծ恾Q.C"8=9.>ځ>>0>J>F9?!?2?s#A?4N?Z?Xue?On?ku?z?a;~?$??}?7y?@s?@l?b?Y X?NK?=?.?=w?8 ?>AI>I>[tn>><=լAڽICw'޾l[h%(6DaQ]g=pv{~HH_|OxrojHa` U&H9>*j羆!-햾=Yc .S/==>.Y>>r>&>?.!?d*?9?O$H?U?r_`?^j?Fr?Nx?÷|?|H?R?m~?{?v?E?p?"g?]?Q?D?5?%??^?.>>y`>GC>`=&@߁>w>4>3>4;?z!?2?$A?N?Z?Ioe?On?Flu?*z?;~?7?͢?}?y?s??l?b? X?K?!~=?c.?eu?C ?y>D>c>Ekn>>C*=STڽuC]6,޾o]Ok%5DQ1]g>p7vl{~NH|NOxrj)`` U<%H9*^"2薾4Yqk/y/=>7Y>X>>P>M? #?#*?}9?%H?' U?``?j?r?Ox?"|?H?L?~?E{?v?v>p?%g?Ĵ]?;Q?rD?5?%??\?*>>z>C>M=Gܮ<1nnFFʾ v.~=K XjbF@lsy}آ0;~zluOnvetZNl$A2!:1q3Ծܨ݁?.c̸=L.>>ݮ>?9>.7>/?I!?B2?&A?N?Z?Rpe?Jn?lu?z?;~?J??}?-y?s? ?l?b?X?-K?Q=?.?s?N ?[>@>+_>mn>u>=DBfڽCb䵾C0޾q_62%15?D Q\]g?pv{~UlH|Nxrjf`cU#HL9* 0@䖾+YF/.=>AY>>#>z>I??*?9?9'H?s U?a`?j?r?Px?|?H?F?~?{?`v?=p?'g?]?Q?D?6?%??Z?O&>@>Cv>C>:=I>D>=>@;>1?!?2? (A?UN?QZ?[qe?Kn? iu?z?3<~?]??2}?7y?s?%>l?b?X?„K?=?$.?q?Y ?=>b<>Z>Wn>>={yڽ˻Cf鵾޾ta%5D>JY>E>o'>>E?? *?9?(H? U?b`?j?Yr?Lx?|?I???J~?Q{?v?>q>C>=F<\V€nO1ʾ yp .؁==KyXbBl9syd}=;~ zjuMnseTZN[!A22!6^EHԾԁ-.U׮޷=h.>>>A>Q?>3?!?2?)A?N?Z?dre?Ln?iu?Zz?y<~?p?m?߈}?y?Hs??=l?b?VX?XK?-=?".?||?c ?>8>NV>Bn>E>r=ׯڽCkf޾vc%z5Y>>+>>A ??j*?M9?"*H? U?c`?j?r?SMx?|?/I?9?~?{?^v?Ap?,g?C]?8Q?D?F5?%??V?>>Gm>lC>=<iǭ׉n&T6ʾٮ {&".j=KXAbBlsry}]z<~z ju MnreZaNS*A2c!4LACԾι Ё#.Į7Iή=(.>_ҁ>>E>cC>5?Q!?2? A?N?Z?mse?|Mn?aju?Ҽz?:~??M?}?-y?s?Bl?b?X?K?=?E!.?z?׭ ?>3>Q>,n>>l_="ڽ"Co ޾W%5DQݱ]gApv{.~<I|Mxr/j]c`_ Uc)H|9*< 羊)p#Y./=>Y>ݖ>0>>= ??)*?9?!H?UU?e`?j?r?Mx?|?)H?2?~?y{?v?@p?g?]?Q?xD?5?%? ?nb?>'>h>@C>=K<nXL:ʾ=e o}#.=KXUb=lsy }}gU<~Vz`iu2LnqeZN(A2!2:=?Ծg|ꁾ.#;8=1.>ց>R>?J>uG>7? !?z2?%"A?N?Z?vte?WNn? ku?Kz?%;~??-?9}?y?s?Al?b?X?K? =?.?x? ?>/>pM>|n>˟>L=@m1ڽMCt!D$޾YʭO%5:D>Q]gD=pLv{h~BH|[Pxr=j=b` U'H9*@5%𖾍EYǰ.3/=[>'Y>>>">9??*?9?#H?U?1f`?j?r?vNx?r|?VH?X?~? {?"v??p?g?]?Q?D?5?%?"?k`?O2>>Kd>C>o=f<n]>ʾ[Z r%.=}K;Xjb>l{s|y\}S<~ݾzCmuWKnpeZNC'A2+!0(9P;Ծ偾P.}O8=;.>hہ>>a1>K>9?!?'2?#A?hN?Z?ue?1On?ku?Ľz?k;~?'??}?#y?%s?@l?b?) X?K?w=?.?v? ?>H>I>sn>>!:=DڽCxy(޾[%g6DQ3]g>pv{~IHQ|OxgrKja` Uy&HE9*#DV 얾l70Y>>>>5?u!?*?9?$H? U?_`?j?cr?Ox?ѷ|?H?Q?~?{?v?&?p?g?õ]?^Q?zD?X5?H%?;?i^?.>U>_>C>[]=<4!4fnsaBʾyO t.=K| X~b?l1sqy}@;~ezluUPnoe|Z?N%Ae2[!$<57ԾrၾTG.h h8!=:D.>߁>>5>3>};?!?2?6%A?N?Z?poe? Pn?`lu?SD>b>in>Q>|'=WڽҪCJ^,޾]%57DQ^]g>pOv|{~OH|8Oxrj_`} U%H9=*",羍 薾K3Ye/~/=>X9Y>>k>>?T#?e*?9?%H?Y U?``?j?%r?Ox?0|?H?K?~?{?v?X>p?g?]?Q?9D?5?%?U?f\?)>>z>C>J=%Ѯ<3qonG+GʾD XvD.~=RK Xbh@lsyʇ}ݢ-;~zku{OnueFZN2$A2!6:L2Ծ4܁ >.7=oM.>q>>9>7>30?!?2?&A?)N?JZ?ype?Kn? mu?z?;~?M??x}?y?s?>l?b?X?K?=?l.?Hs? ?> @>^>n>>=fMiڽCbQ嵾0޾_~v%o5xD@Q]g?pv{~VeH|Nxrjf`1U#H9~*7 8㖾**Yz@/2.=&>yBY>y>#>>?a?$*?V9?p'H? U?a`?j?r?*Px?|?H?E?{~?{?Hv?=p?g?m]?Q?D?P6?%?n?dZ?%>>u>dC>38=n<~FynK.ʾ9 /x.=K XbNAls{y}"=;~tzEkuNnte[Z~N"A 2!H8HKԾͣi؁4.-箽@nԫ=V.>>쳫>!>>;>!2?!?02?G(A?N?Z?qe?Kn?&iu?-z?=<~?`??%}?#y?s?>l?b?gX?K?=?p$.?pq? ?>;>Z>n>!>2=?|ڽ)CFg鵾D޾ae=%5DoQ]g~@pvT{~08H2|Nxrjre`U"Hs9*X _羍1ߖ !Y67/.=>KY>>(>C>?@? *?9?(H? U?b`?j?vr?Lx?|? I?>?A~?A{?v?<>q>9C>=;<#Yn`PZ2ʾ. z .=sKXb4BlTsyp}B:~zjuMnse&ZN!!A]2!Z6DnGԾӁ+.Ԯ򒱷r= .>z>R>aB>?>4?ƺ!?_2?)A?N?Z?re?Ln?iu?lz?<~?s?h?҈}?y?-s?=l?b?&X?"K?=?".?6|? ?>t7>U>n>>Jo=⯼ӎڽTCk y޾UK%5uDQ߰]gLAp(v{~7>IӶ|Mx]rjRd`yU*H9*y 59-=Y..=4>0Y>f>h,>m> ??*?9?Z*H?;U?d`?j?8r?iMx?|?5I?8?~?{?Fv?sAp?g?]?Q?D?5?Z%??_V?D>>l>C>Q= Ӂ>>F>C>5?!? 2? A?JN?Z?se?Mn?{ju?z?:~??H?}?y?ws?`Bl?b?X?K?_=?!.?_z? ?c>)3>6Q>уn>>\=-fڽCApj򵾯 ޾X,%]5DQ ]gBpv,{7~=I|Lxr j2c`. U+)H>9B* (RMY.2/=x>QY>Hޖ>0>> ??k*?&9?!H?U?>h>C>=*Y:ʾڢ񾰣 q$.8=HK*X~b=ls y}dK<~DzFiuLnqeZN(A2N!~2<>Ծ遾^X.T{%R8=03.>ׁ>>J>H>7?e!?2?`"A?.>L>zn>k>I=ax4ڽCt$޾Zd%6sDqQ5]gb=pdv{p~CH|FPxrjb` U'H9x*羐$P1DY7.9/=>r(Y>>h>>??**?9?I#H?U?\f`?j?r?Nx?|?\H?W?~?{? v??p?g?]?YQ?D?5?%?ڳ?`?1>#>c>C>*m=s[lsyh}Q<~˾z*mu7KnpeZkN'A2!08:ԾYK偾*O.{γ8J=e<.>܁>`>2>"L>9?5!?g2?#A?N? Z?ue?ROn?ku?ֽz?v;~?)??ڇ}?y? s?@l?b? X?~K?;=?.?v? ?]>G>XH>qn>.>Z7=îIGڽC=y%)޾\+%e5DQ_]g1>pv{~JHB|OxJr'j`` UB&H9*#< 떾;Y.^/=>1Y>6>>d>?!?*?\9?$H?> U?_`?j?r?Ox?߷|?H?P?~?{?mv??p?g?]?+Q?AD?5?%??^?y->>"_>C>Z=<#5hnbCʾ񾚧 t.}=K Xb?lLsy}¢=;~Szlu5PnoeNZ N%A%2!;{4m6Ծ򫫾E. 88=E.>>ƫ>C6>R4>;?!?2?p%A?N?BZ?oe?,Pn?ylu?Nz?;~?=?â?}?y?Ts??l?b? X?,K?}=?.?t? ??>C>Hb>hn>>$= Yڽ0C^O-޾^% 52DQ]g>pfv{~PH|#Oxrj_`K U$Hl9*!b疾1Y]Q`/1/=D>:Y>> >>?#?*?9?3&H? U?``?j?Br?Ox??|?H?J?~? {?v?9>p?g?k]?Q?D?u5?=%? ?\?D)>Q>jy>`C>H=Ʈ<6ҔKqn,HGʾ4񾏩 v.,=~K Xb@ls yׇ}*x;~ڽzkuZOnueZN#Ax2G!9KL-2ԾA܁<. =N.>>->:>d8>}0?!?2?&A?]N?xZ?pe?.Kn?#mu?Ǿz?<~?P??l}?y?s?>l?b?xX?K?ن=?*.?s? ?!>e?>]>n>>=Xplڽ[Csc嵾1޾ `dz%5DLQ]g?pv{~V^H|Nxrjgf`UX#H9<*输▾(Y:/©.=>CY>#>e$>>??g*?9?'H? U?b`?j?r?@Px?|?H?D?r~?{?jv?j=p?g?@]?Q?D?6?v%?&?Z?%>>t>C>o5=L{KXbpAlsy*}'2;~bz+kuNnte-ZJNo"A2w!79H KԾ%ׁ3.g䮽W=X.>>>>>v<>k2?;>jY>n>>k=?ڽCgU굾޾ b%R50DQ]g@pve{~11H$|NxrjGe`U!H69}* 0uޖY/.=R>LY>>(>>??0*?.9?)H?! U?'c`?j?r?Lx?|?I?=?9~?1{?v?#Bp?g?]?)Q?D?m5?%???X? >>np>C> =0<[Kwn Q2ʾ:y Lz .P=KX~bWBlosy|}G:~zjuMnseZXN A2!6'DFԾ弫8ӁW*.ѮA 8=&".>'>>C>@>Y4? !?2? *A?N?Z?re?Ln?iu?~z?<~?v?c?ƈ}?y?s?$Cl?ub?X?K?=?x".?{?Ρ ?>6>T>n>>l=ڽCol޾KVH%5DQ ]gkAp@v{~87IŶ|nMx@rj'd`HUh*H9*2 羔,YR.l.=>Y>> -> > ?f?*?9?*H?lU?Gd`?j?Ur?~Mx?϶|?8>k>C>=Ӂ>`>CG>D>G6?ۼ!?L2?!A?N?Z?se?Mn?ju?z?:~??C?s}?y?[s?=Bl?b?X?K?#=? .?z?B ?ƚ>2>P>wn>G>Y=8+ڽCpO!޾MXt%5-DNQ6]g9Bpv={?~> I|Lx}rjc` U(H9 *Sl?(KYM./=> Y>ޖ>b1>6> ?F?*?c9? "H?U?ge`?j?r?Nx?.|?6H?0?~?Y{?v?@p?g?]?|Q?D?$5?O%?x?a?n>>sg>C>|=Ծ#遾V.ih8r=4.><؁>>K>H>58?!?2?"A?qN?OZ?te?Nn?>ku?oz?:;~??$?!}?y?s?WAl?b? X?K?=? .?Ax?M ?޲>;.>L>ayn> >8G=y7ڽ Ckun%޾PZ[%@6DQa]g=p{v{y~DH|0Pxrja` U'Hf96*sB#BY.?/=>)Y>i> >_>?% ?m*?9?#H?$U?f`?j?r?Nx?|?cH?V?~?{?v??p?g?]?NQ?D?5?%??_?1>|>b>YC>ej=QP<nV^?ʾ 5sZ.=KXb>lsyu}N;~zmuKnpeVZ7N&A2!G07 :Ծ䁾M.y8==.>܁>>2>L>#:?z!?2?#$A?N?:Z?ue?rOn?ku?z?;~?,?ޢ?·}?y?s?q@l?b? X?`K?~=?V.?jv?X ?>VG>G>Kpn>Γ>4=:ή JڽbCy)޾R\Bo%5*DQ]gP>pv{~KH4|Ox-rj``f U &H9w*g#羗/떾9Y?/ld/=a>2Y>>a>>?"?,*?9?$H?p U?_`?j?r?3Ox?|?H?O?~?{?Uv?>p?g?j]?Q?FD?5?%??]?,>>w^>.C>W=<&inb(Dʾ u.}=TK Xb?lhsylj}Ǣ;;~AzfluPnzoe ZNE%A2!;35ԾKD.S =F.>E>n>6>4><?I!?U2?%A?2N?pZ?oe?MPn?lu?`z?;~????}?vy?8s??l?b? X?K?/=?.?t?c ?> C>a>6gn>>!=\ڽC_)-޾U^(6%H5kDPQ]g?p~v{~QHշ| Oxjrj_` U$H/9*!IB斾0YZ/.= >V> >,>0?#?*?59?j&H? U?a`?Bj?_r?Ox?M|?H?I?~?{?v?>p?g??]?Q?ǴD?w6?%?į?[?(>>x>C>>E=⺮ޗž=-P.>>հ>%;>8>0?!?2?3'A?N?Z?pe?OKn?l?ub?HX?K?=?%.?r?n ?>>>0]>]n>T>I=c5oڽCd浾%2޾W`%5DQ]g?pv {~WXHu||Nxrj1EY>> %>V>,??*?9?'H? U?2b`?4j?r?VPx?|?H?C?j~?{?Sv?L=p?g?]?LQ?ID?5?a%?ݭ?Y?n$>M>At>C>2=+p< Lo{nDMW/ʾϫ x}.=tKXbAlsy6},(;~Pzku_NnteZN5"A22!7GjJԾ~ׁ-2.ᮽCA`=P.>N>;>e?>=>2?!?2?(A?N?Z?qe?)Ln?Yiu?Qz?R<~?f?? }?y?s?=l?`b?X? K? =?#.?p?y ?f>w:>X>Hn>`>=`ȁڽCh굾޾Zb%5iDQ ]g@pvu{~2+H|Mxrje`bU!H9:*Q "C0ݖPYt/.=>Y>D>^)>>( ??s*?l9?T)H?R U?Rc`?&j?r?Mx? |?I?<?0~?!{?v?Bp?g?]?Q?ʱD?.5?%??W?8 >>o>~C>\=t%<^фnQ3ʾכĭ z4!.=߁KXbyBls(y}L:~׼zhjuMnxseZ$N A2c!5C*FԾ=ҁ(.Ϯ!1î=#.>ρ>>C>#A>4?Q!?2?D*A?SN?Z?re?Mn?ju?z?<~?y?_?}?wy?s?Cl?Kb?X?K?y=?7".?{? ?H>,6>ST>2n>$>i=\ڽCmYﵾ޾Vܷ%55D+Q8]"gApWv{~90I|YMx#rjc`U1*H]9{*U +/Y0..=>Y>&ۖ>->>$ ??2*?9?*H?U?rd`?j?rr?Mx?ݶ|?BI?6?~?{?v?5Ap?g?]?Q?KD?5?%??U?>>Ek>RC>Ȍ=گcԁ>⟫>G>5E>6? !?2?L!A?N?HZ?se?Mn?ju?z?:~????g}?y?@s?Bl?b?X?KK?=? .?y? ?)>1>O>n>>W=Cڽ;Cq!޾XS%5fDQc]g "Y>ߖ>^>> ??*?9?D"H?U?e`? j?5r?&Nx?=|?=H?/?~?I{?yv?g@p?g?]?IQ?ͮD?5? %?/?a?>4>f>'C>5z=珯ls2y.}^6<~ ziuKneqe]ZcN(A2ĸ!1h;=Ծpw聾U.ȩ-~88=5.>؁>I>/>GI>~8?!?:2?"A?N?}Z?te?Nn?Wku?z?D;~???}?my?s?5Al?b? X?K?V=?.?w? ?A>->uK>xn>>qD=>:ڽfCv%&޾Z%~6DQ]g=pZv{~EH|Pxrja` UG'H)9*,]F#xAY!.D/=>++Y>>>w>?l ?*?<9?#H?VU?f`?j?r?Nx?|?jH?U?~?{?v??p?g?h]?Q?ND?A5?D%?I?_?m0>>Ib>C>g=0E<n^@ʾ2: {s.A=KXb?ls(y}K;~zluJn\pe'ZN&AS2\!/V7i9Ծ まlL.8=#?.>m݁>>G3>w1>l:?!?2?]$A?N?hZ?ue?On?lu?z?;~?/?ڢ?}?y?s?O@l?tb? X?*K?~=?.?$v? ?#>F>G>nn>m>1=\ٮLڽCzrZ*޾\%5cD-Q]gn>pvA{~LH&|Oxrj``4 U%H94*#azꖾW8Yz/i/=>L4Y>>>>?K"?n*?9?-%H? U?``?j?r?HOx?|?H?N?~?p{?>v?>p?g?=]?Q? D?5?|%?b?]?8,>b>]>ЩC> U=x<)UjnncDʾP/ SuR.~=K Xb?lsy}ˢ8;~/zMluOnSoeZN %A2!G;E3)5Ծm߁7C.o1s=WH.>>>7>5>Z<?!?2?%A?fN?Z?oe?mPn?lu?rz?;~?B??}?cy?s?h?l?`b?Y X?K?=?^.?Lt? ?>hB>`>en>1>'=$e_ڽCL`.޾^qz%5DQ]g=?pv{k~R~HƷ|NxMrgj}_`U^$H9u*@!P羝斾6/Y2U/.= >m=Y>>[!>>|?*$?-*?r9?&H? U?=a`?fj?|r?Ox?[|?H?H?~?{?v?=p?g?]?oQ?D?96?%?{?[?(>>x>C>zB=<.<tn~IIʾn$ *w.=@KL Xb@l9s2y}$c;~zkuOnbueZAN#A2!Y9K0Ծ<ځ:.x񮽲u=Q.>v>}>;>9>1?^!?B2?n'A?N?Z?pe?oKn?Vmu?z?<~?V??S}?my?gs?>l?Kb?X?UK?a=?b%.?ur?# ?>>>\>n>> =nqڽCdD絾2޾`XA%+5#DQ]g @p3v{~-QHg|fNxrujf`U"HW9*aIᖾ&YV//.=>FY>w>%>>x?7?*?9?(H?8 U?]b`?Xj? r?kPx?|?H?B?a~?|{?;v?-=p?g?]?Q?D?5?%??~Y?#>>s>KC>/= ezju?NnYteZN!AK2!k7GIԾ֡dց0.ޮs+&=.>>㵫>@>=>2?ƹ!?2?(A?'N? Z?qe?JLn?riu?cz?]<~?i?z?}?y?s?=l?7b?X?K?τ=?#.?;}?. ?ɡ>9>X>n>>=ڽBCHi뵾&޾b>%5DQ9]g@pv{~3VI|Mxrjd`1Ut!H9* 羞/!ݖY /7.=>#Y>>*>>t ??*?9?)H? U?}c`?Jj?r?Mx?|?I?;?(~?{?v?Ap?g?]?Q?D?5?V%??{W?>I>o> C>=RЁ>J>HD>A>4?!?2?*A?N?@Z?se?$Mn?ju?z?<~?|?Z?}?cy?s?Bl?"b?X?K?>=?!.?d{? ?>5>S>؈n>ì>f=9 ڽmCm[޾V%%t5!D^Qd]GgApov{~9*I6|CMxrjc` U)H 99* YI+>Y2..=X>EY>ۖ>X.>I>p ??t*?B9?+H?U?d`?<j?r?Mx?|?II?5?~?{?v?Ap?^g?]?mQ?D?K5?%?Ͷ?>c?c>>j>C>=}ϯ<tHAnV8ʾ񾚢 |+#.Y=KyXbX=l\sy}pnq<~ziuLnGreeZNj)A2O!3>HAԾ.O쁾e.7aٮ=..>Ձ>>H>E>6?e!?2?!A?N?vZ? te?Mn?ju?z? ;~??:?[}?ޔy?%s?Al?tb?VX?K?=?@ .?y? ?µ>>1>;O>n>>OT=OڽCCr]"޾X%5DQ]Eg

f#Y>G>>s>l ??3*?9?{"H?U?e`?.j?Rr?;Nx?K|?DH?.?~?8{?bv?H@p?`g?f]?Q?D?5?%??;a?4>>f>ɺC>pw=ń<Wn9[<ʾ񾐤 q$.=KXb>>l1sFy;}[+<~zmuKn>qe/Z.N'A2!1:=ԾȲ灾AT.Cy8=M7.>ف>>/>I>8?4!?z2?#A?N?Z?ue?Nn?qku?z?O;~???}?Yy?os?Al?`b? X?K?=?.?w? ?>YJ>J>vn>J>A=ƙ=ڽCv&޾Z/%6D Q]Cg=pqv{~FHw|Pxrja`N U'H9*羡"Q@Y .6J/=>,Y>>W>>h? ?*?y9?#H?U?f`? j?r?Nx?|?pH?T?{~?{?v?z?p?cg?;]?Q?D?5?%??9_?/>>a>C>d=:<yln_%AʾϨ񾅦 s.}=UKXb%?ls;y}H;~zluJn5peZNY&A2!/68ԾbFま K.58=@.>ށ>W>3>2>:?!?'2?$A?:N?Z?ve?On?lu? z?;~?2?բ?}?ԓy?s?,@l?Kb?j X?K?~=?.?u?è ?>F>d>mn> >/=}䮼OڽC?{*޾\Ӱ%!5D`Q]@g>pvQ{~MH|sOxrjr`` U%HP9*"L閾6Y|t/o/=$>5Y>4>>@>?"?*?9?e%H? U?H``?j?r?^Ox? |?H?N?~?`{?&v?>p?eg?]?Q?ԵD?^5?9%??6]?+>>{>sC>IR=W>>)8>$6>l/?!?2? &A?N?Z?pe?Pn?lu?z?;~?E??}?Oy?s?F?l?7b?) X?K?=?.?t?ͦ ?h>A>M`>n>Ї>`=4/*bڽIC`v0/޾^%5ݬDQ]>g\?pv{s~SwH|Nx0rCjR_`U&$H93* d喾-Y9O/.=h >>Y>>">j>??p*?9?&H? U?ha`?j?r?Ox?i|?H?G?~?{?v?=p?hg?]?]>hw>C>?=<>[un'JIʾ o pwJ.=vK| X8b@lTsFy}"Y;~zkuNn;ueZ NH#A2x!9yJG0Ծ<ځ8.SN=R.>">$>i<>6:>Z1?l?"b?X?K?&=?!%.?/r?ؤ ?J>z=>[>n>ݽ> =ytڽtCue絾e3޾`%j5\DQ;]GY>">T&>>?~?9 *?K9?N(H?j U?b`?|j?'r?Px?ɸ|?H?A?Y~?l{?$v?=p?jg?]?Q?ײD?V5?%?L?1Y?-#>>r>C>f=Y>>@>H>>H3? !?2?1)A?[N?8Z? re?jLn?iu?uz?g<~?l?u?}?ԕy?ws?y=l?b?X?K?=?k#.?|? ?,>/9>oW>n>>v=įQڽCiI쵾޾bL%5ۯD;Qf]9g@pv{~4PI|Mxr_jd`U=!H~9*; .vܖY/.=v>Y>>*>> ?]?*?9?)H? U?c`?nj?r?.Mx?(|?#I?:?~?{?v?Ap?lg?]?Q?XD?5?%?l?/W?>>ln>C>ә=7с>>D>ZB>65?ۻ!?_2?9 A?N?nZ?*se?EMn?6ju?z?<~??U?}?Oy?s?Bl?b?gX?JK?=?!.?{?W ? >4>S>}n>c>-d=ZڽCqn޾0Wm%5ZDQ]mgApv{~:#I(|-Mxrmjc` U)H9*\ 群*wYm./=>Y>{ܖ>.>> ?=?*?9?>!H?U?d`?`j?r?Mx?|?PI?4?~?{?v?@p?8g?e]?:Q?ٯD? 5?K%??b?>D>i>C>?=[į@Ծ끾.ڶc8'ܮ=x/.>Ձ>2>*I>kF>$7?!? 2?!A?N?Z?3te?Nn?ju?,z?;~??5?N}?ʔy? s?Al?Kb?&X?߀K?p=?.?Fy?b ?%>0>N>g~n>&>Q=0ZxڽCr1#޾3YN%W5زDQ]kg=p$vm{Y~AHȸ|Px&r{jb`h UM(HI97 *|P&GY)M.q*/=>$Y>>>> ??v*?9?"H?mU?e`?Rj?or?QNx?Y|?JH?.?~?({?Jv?)@p?;g?:]?Q?[D?h5?%??`?a3>>qe>lC>t=y< n[~=ʾNڤ 0r#%.'= KX#ba>lLsZyG}X!<~znmuKnqeZN'A2:!X12:e<Ծ 灾R.Aځ>>K0>}J>9?z!?2?J#A?N?Z?I>#J>Run>>>=礮?ڽ"Cmwbf'޾6[5s%6WD=Q]ig=pv{~GHi|Oxrjga` U&H9n*f!햾>Y_ .O/=A>-Y>h>>>? ?4*?9?($H?U?S_`?Dj?1r?Nx?|?wH?S?s~?{?v?[?p?=g?]?Q?ܬD?5?%??^?,/>r>`>@C>b=.ށ>>4>2>:?I!?g2?$A?oN?Z?,oe?On?4lu?z?;~?5?Т?}?y?s? @l?"b?: X?K?L~=?.?u?x ?>kE>d>>>,=﮼[Rڽ{C{+޾8]:%_5յDQ]fg>p'va{~NH |^OxrjG`` Uc%H9*"<羧0閾5Ygo/u/=>7Y>>Q>>?"?*?Q9?%H? U?s``?j?r?tOx?|?H?M?~?P{?v?>p??g?]?_Q?D?5?%?Ѱ?\?*>>;{>C>O=5</mndFʾĨ u.~=Kk XLb-@lsԓy}բ2;~ zluOnveZ9N$A&2!|-23ԾSށy@.Ըw= .>Vā>̫>U>R><?!?2?Z&A?N?Z?6pe?Jn?Qhu?\z?:~??ա?V}?;y?s?$?l?b?X?TK?|=?&.?]? ?>#>EA>&cn>p>=V:dڽCa4䵾޾uQ0%E6TDQ<]dgz?pv{|~(I7|Jxrj'_`U#Hw9* f6M kY^NJ.p/= >%@Y>U>"> >?? *?9?H?.U?Fi`?(j?r?Px?w|?H?F?~?{?v?DCp? g?]?Q?ߩD?{5?-%??Z?&>>v>C>6=`<n/i^Jʾ񾹪 w.=KXb:lsy?}O;~zpkuNnueZGN-A"2̲!+-/ԾفD7.뮽Z1=9.>ȁ>>*Z>V>>?!?2?'A?0N?0Z??qe?Kn?hu?Իz?K:~???}?y?1s?=>l?b?X?K?=?$.?~? ?>p><>Zn>3}>= wڽҺC f赾1޾xS%6ӸD?Qg]agI@pbv9{~/vIع|Rxrj^`:Uz"H91*j o羨2aY 0$.ſ/= >FIY>>&>3>??| *?9?H?U?fj`?j?xr?Px?׸|?H?@?P~?\{? v?vBp?g?]?Q?`D?5?f%??X?">Y>?r>C>=N<ԂFdnmNʾƵ񾮬 yA .=KWXb;lDsmy} ;~zjuMn teuZN,AI!2!))d+Ծ Ձ..Oٮr=n.>_́> >,$>Z>@?!?o2?k)A?N?fZ?Hre?Ln?iu?Mz?:~??K?}?1y?zs?W=l?b?xX?~K?X=?*#.?|? ?ļ>U>g8>Pn>s>O=ϯڽCj쵾g޾{Uɩa% 5QDQ]_gApv{~5IIy|Qxrj\`U!HA9r*n ES.`XY&,//=Q >gRY>B>N+>]> ??:*?!9? H?U?\`? j?;r?(Qx?6|?*I?9?~?{?nv?Ap?g?c]?Q?\D?25?%??V?W>>m>eC>=B?!? 2?*A?N?Z?Qse?eMn?Oju?Ƽz?:~??+?̊}?y?s?qQ>p>Gn>j>=|ڽ)CoM񵾜޾}W(%5UDQ]]gApv{(~;I|Pxrj[`UH9*r )OY/ .=)>[Y>>/>> ??*?9?u!H?SU?>]`? j?r?Qx?|?VI?3?~?{?v?@p?g?8]?.Q?޹D?6?%?6?T?">>Ci>9C>{=:hց>ڡ>,>%+>5*?V!?!2?|,A?QN?Z?Zte?@Nn?ju?>z?;~?? ?y}?Ey? s?;l?b?X?K?4=?.?y? ?>]M>Gl>Jn>}a>ς=3e=ڽTCs#޾Y%U5ӨDQ]ZgBprjj`XUH 9 *5v羫%s񖾅FYA/<0.=>dY>/>3>>?c?*?X9?"H?U?^^`?j?Wr?KRx?|?I?-?~?{?3v? @p?g? ]?Q?_D?j6?n%?O?R?>@>d>C>q=n< \n,> ʾ!񾎲 d%.c=VKXLb>lhsޒy}6:~zhunKnpeZNl'A@2\!F>xUXԾR}ǁr.v8= :.>ځ>A>0>7/>#,?W!?x#2?.A?N?Z?cue?On?ku?z?d;~?%??&}?y?s?:l?b?X?>K?=?.?(w?" ?j>I>g>4n>>_=믰ڽCx(޾[}%5RDHQ]XgCpv{~HH[|Ox{rjh`UHo96 *VzW!얾d=Y -/U.=)>X>>J8>>?B!?w*?9?_$H?U?~_`?j?r?Kx?T|?I?&?j~?{?v?>G`>C>S_=#<99enB%ʾҍ񾃴 '.=KZ Xabi?lscyo}ߡ9~7zhuJnoeZeN%A2!X<fQTԾ7˫= .َXy8(=@C.>r߁>>-5>H3>.?'!?(2?/A?N?>Z?lve?On?Nlu?/z?;~?8?ˢ?Ӊ}?;y?cs?Fl?b?tX?}K?~=?P.?Qu?- ?L>D>ic>n>>3=dڽC|f<,޾]d~%5ѫDQ>]gQDpwvU{~OH|HOxrjg`U%/Hӿ9w *w~薾C4Yi/z.=m>X>˖><> >?!#?6*?9?%H?5 U?``?j?r?Kx?|?I? ?1~?@{?v?n>p?g?]?,Q?bD?!6?%??N? >޵>[>C>L=ٮ<1vnn GQ)ʾ񾦛 Â(.=,K XubO@lsy‡}j=~zsguInnegZN\$A2!j:UMbPԾƫ\.;|9=uL.>>>m9>Z7>/?!?2?A?rN?tZ?uwe?Pn?lu?z?;~?K??}?y?s?+El?Jb?3X?i|K?~|=?.?zs?8 ?.>}@>^> n>Y>=EڽCq0޾_JE%C5ODQi]g:pv{ ~UjH|Nxrjf`3U-H<9*s羮䖾"+YvD/<.=>Y>kЖ>>. >?%?*?*9?I'H? U?a`?j?r?6Lx?|?G??~?{?Yv?=p?g?]?Q?D?}6?%??_h?L >'ڵ>LW>C>,:=\{>t>=>l;>1?Ƹ!?2?A?N?Z?xe?Qn?mu? z?6<~?^??.}?1y?s?EDl?6b?X?zK?z=?.?q?C ?>3<>Z>n>>郃=MٽC!4޾a1 %5ήDKQ]g:p@v-{G~[=H<|%Nx4r je`U<,H9*IYߖ"Y2-/.=> Y>Ԗ> >J>?&?*?9?(H? U?b`?j?ar?Lx?W|?G?j?~?h{?v?>յ>R>`C>'=C<(W%nO1ʾ-񾐟 7m.=K XbBlAsyg}?<~Bz:ouHnleZCNK!A2!61EGԾSk.VHe9<=^.>>۷>A>~?>3?!?12?%A?VN?IZ?ye?Rn?Lnu?z?|<~?q?l?ۈ}?y?@s?^Cl?"b?X?K?Zy=?-.?o?N ?>7>V>ލn>߱>Dq=ۭ ڽC 8޾c%5MDQ]g;pv{~aHݶ|Mxqrjqd`U*H9%*~)"ۖY..=9>8Y>Xٖ>I>t>?(?r*?a9?2*H?U?c`?j?$r?YMx?|?G?d?~?{?v?> >PN>5C>=>A>.F>C>5?e!?2? A?N?Z?`le?^Sn?nu?z?<~??L?}?'y?s?xBl? b? X?K?K=?w.?m?Y ?ӛ>3>Q>Ȅn>>^=%( ڽCQ=޾e%05̱DQ]g~YY>ݖ>>>??1*?9?+H?cU?e`?j?r?Mx?|?+H?^?^~?X{?v?3;p?#g? ]?Q?gD?5?%??Xb?V6>>^> C>q=6 >>nJ>G>7?4!?2?6"A?N?Z?ime?Hn?ou?z?=~??,?6}?y?s?Al?b?\ X?(K?=?6+.?l?d ?>S/>?M>{n>f>K=sp2ڽCUgصFA޾gb%5JDMQ]gL=pv{~G|pLxr3j1b` U'H9*%\5ҖYf..5/=>z'Y>F>>>??*?9?-H?U?=f`?j?r?|Nx?v|?XH?W?$~?{?Tv?e:p?%g?]?~Q?D?5?%? ?U`? 2>>>C>=c<fn4]>ʾp r.{={KWbDldsy`}S <~ؾz>ū>N>K>9?!?:2?#A?wN?Z?rne?bIn?/gu?z?N=~?? ?}?y?s?@l?b? X?K?(=?).??o ?> +>H>rn>)>U9=*PEڽ CYܵ ޾i̼)%y6ɴDQ@]g>pv{~I|Kx*rAja` Ui&H39*# Z>͖|X#ى.Z/=>0Y>>F>>??*?29?.H?U?]g`?j?kr?Ox?շ|?H?Q?~?{?v?Dp?(g?]?'Q?jD?F5?4%?'?S^?->%>b~>WC>=<|naCʾe t.o}=B}KX#bElsy}?;~`zluLPnveZN)A2!.46ԾjAၾF. >e=.>*>tɫ>R>O>;?!?2?G%A?N?!Z?{oe?&>bD>in>>&=Wڽ7C{^#ᵾ޾ P%6GDQk]g>pVv{S~$Iz|MKxgrOj_`o U$H9**":o[Xd.;/=H>9Y>3>>>?? *?9?0H?FU?|h`?~j?-r?Ox?4|?H?K?~?{?v?Cp?g?]?Q?D?5?m%?@?P\?)>>y>+C>@=ͰN.A' 2!,02Ծ܁=.=.>Ł>>.W>S>=?!?2?&A?8N?WZ?pe?Kn?hu?z?:~??̡?=}?y?s?>l?b?X?K?=?&.??V ?>s">?>q`n>> =PwjڽbCb嵾=޾R%6ƷDOQ]g?pv{~*I|Rxr]j^`#U#H9k*# [農5PhY.?./=>BY>>#>F>?u?B *?e9?H?U?i`?pj?r?1Px?|?H?D?x~?{?{v?Cp?g?`]?{Q?mD?5?%?Y?NZ?%>j>fu>C>=<ǂ\njKʾO Cx.=KvXLb.;lsyX}:;~oz=kuNnteNZN-Av"2A!*,`.Ծ7؁4.a殽g=.>3ʁ>>0!>W>o??r!?B2?X(A?N?Z?qe?Kn?.iu?z?`:~???}?y?s?=l?b?YX?}K?r=?]$.?}?a ?>X>;>\Wn>sz>f=P }ڽCwg鵾r޾Ts!%f6EDQ]g@pvY{~0hI|QxKrkj]`U "Ha9*D 2^10_YJ-./=>KY> >C(>p>?T?*?9?H?U?j`?bj?r?Px?|? I?>??~?<{?v?8Bp?g?5]?tQ?D?Y5?%?s?KX?K!> >p>C>=e8<3ڂgnnOʾD z .%=KXab=,!.>΁>]>q%>7$>\A?A!?2?)A?N?Z?re?Ln?iu?qz?:~??A?}? y?Ds?=l?b?X?K?=?".?"|?l ?>T>s>FNn>6q>=毼ڽCk<޾VZ%5úDQ]gUAp/v{~7UY>>,>> ?4?*?9?p H?jU?t\`?Tj?tr?SQx?S|?7I?8?~?{??v?jAp?g? ]?Q?D?5?%??IV?>>kl>C>=<삽DpXMn^s:Tʾ9 {z".=KXvb:~}ziuLnreZN*A2q!A$%ԾК.ρ".&)7Ѯ=`*.><Ӂ>Þ>)>I(>(?!? 2?h+A?YN?Z?se?Mn?ju?z?:~??!?}?y?s?,`P>do>n>g>܂=02ڽCsp ޾XA%.5ǧDQQ]g#Bpv1{9~=I|Pxr{jr[`@U!H+9.*羵(LY/.=W,>@^Y> >0>> ??~*?79?!H?U?]`?Rj?7r?Qx?|?dI?1?~?d{?v?@p?g?߷]?Q?lD?6?P%??FT?>Q>g>~C>~=<}ymVn;Xʾ=. }0$.I=XK8Xb=lsy}g:~z?iuLnqeZN(An2!?TX!Ծiʁ.mX8y=3.>ׁ>*>->[,>*?!?J"2?,A?N?.Z?te?Nn?,ku?bz?2;~???`}?y?s?F;l?ib?X?=K?=?:.?sx? ?N>L>j>n>N>vɂ=v{ƴڽCt%޾Z'w%5EDXQA]gBpkv{s~DH|?Pxrji`UH9p *a$CYb/\;.=>agY>>@5>>??=*?9?Y#H?U?^`?Dj?r?vRx?|?I?+?~?{?v??p?g?]?rQ?D?6?%??CR?>>oc>SC>^l=?X<"_n?"ʾ[# %.ۆ=…KyXb>lsy5}ȡ!:~zhu-KnpewZ\N&A2!=BTWԾ%Ɓ.뛮8=<.>F܁>>12>m0>,?!? 2?y.A?N?dZ?ue?[On?ku?۽z?y;~?*??}?y?s?_:l?Tb?VX?~K?*=?.?v? ?0>G>f>n>>J=.ưYڽ;CnyUH)޾\?%w5ĪDQl]gCpv {~JH>|OxArjh`hU7H9 * 떾:Y; /`.=>lX>>9>>?!?*?n9?$H?M U?_`?6j?Tr?>Kx?p|?I?$?Y~?{?fv?>p?g?]?Q?oD?H6?%??AP?v>>^>'C>Y= <$hnCM&ʾ  x'.m=-K Xb?lTsy}=~zguSJnoeAZNo%A2!;0P^SԾɫ.M9 =E.>>>q6>4>.?!?2?A?zN?Z?ve?5Pn?lu?Sz?;~?=?¢?}?y?-s?El?@b?X?g}K?}=?.?t? ?>C>b>jn>>=!ڽfC}}-޾^%5CDQ]gDpvu{~PH߷|Oxrjzg`U.HY9*`羸1疾1Y^/.=0>X>I͖>=>B >?#?*? 9?C&H? U?``?(j?r?Kx?|?I?? ~? {?v?0>p?g?^]?Q?D?6?X%??i?@ >8ݵ>sZ>C>7G=®O>]>:>8>0?!?V2?A?N?Z?we?Qn?*mu?̾z?<~?Q??h}?y?vs?Dl?b?W?{K?|=?.?r? ?>6?>]>Tn>>=[ٽCj1޾!`۳%5­D[Q®] gP:pDv{~W\H|NxrjZf`UB-H93* 6d▾i(Yc9/[.=t>Y>і>>l>?%?z*?9?'H? U?b`?j?r?bLx?|?G??~?{?*v?b=p?g?3]?pQ?qD?6?%??g?A>ص>U>ЙC>4=x<JtznL.ʾI0 k +.=K; XbzAlsy-}(=~zouHnmeZ;N^"A2d!7 HJԾ8r.dK9.=gX.>>Ĵ>>><>2?P!?2?A?^N?oZ?xe?Qn?mu?Dz?K<~?d??}? y?s?Dl?b?X?zK?tz=?a.?q? ?֢>:>:Y>?n>[>[~=ڽC膌n5޾#bµ%d5@DQ] g;povM{X~]0H |Mxrj;e`U+H&9_*) DޖHYo/.=>Y>6֖>? >>?n'?9*?@9?,)H?/ U?3c`? j?r?Lx?t|?G?h?~?H{?v?O>wQ>C>"=b-<\ڃn:Q-3ʾg& mJ."=mK| XbaBlwsy}H<~zoutSn{leZN A 2!5CFԾi.Ptp9A=a.>X>*>2C>@>n4?!?2?A?N?Z?ke?Rn?~nu?z?<~?w?b?È}?y? s?Cl?b?~X?K?x=?.?>o? ?>6>T>)n>>k=GڽECf :޾&d[% 5DQ]g;p v{~cH|hMx8rjd`:UX*H9*(羻ٖ'Y+..=>Y>ږ>>>V?M)?*?9?*H?{U?Sd`?j?^r?Mx?Ӷ|? H?b?~?{?v?;p?g?ݰ]?Q?tD?5?%?J?c?J9> >>yC>|=<\onUx7ʾ o.1y=،KXbGCl.syӈ}hs<~z]nuRnyeiZzNMA]2ź! 4?]BԾNv큾_.=i)T=j.>>>rG>D>\6?!?_2?#!A?N?Z?le?Gn?(ou?5z?<~??B?p}?y?Ts?4Bl?b?= X?&K?Ԍ=?.?gm?ğ ?>V2>\P>n>>Y=;%ڽpCXR)R>޾(f#%5>D]QC]g!Y>$ߖ>>>R??*?v9?,H?U?se`?j? r?Nx?3|?8H?\?M~?8{?Pv?:p?g?]?nQ?D?5?;%?c?a?5>>>C>=<*nZ;ʾ rq.z=zKXb-Dls$y&}`=<~-zmuQnxeZNA2!2;>Ծ糫聾V.J+KDg=t.>a>>K>H>J8?!? 2?"A?N?Z?me?Hn?fu?z?=~??"?}?{y?s?MAl?b? X?K?B=?*.?k?Ν ?{> .>K>xn>>lF=E8ڽCVٵB޾+hv%R6DQn]g=pIv{~G|ELxrja` Uo'HT9"*1%+ ЖY.@/=>2*Y>><>>N?f?*?9?-H?U?f`?j?r?Nx?|?eH?V?~?{?%v?':p?g?]?Q?wD?n5?t%?|?_?0>6>>C>=;M>^ƫ>O>L>8:?!?2?3$A?N?GZ?ne?In?bgu?z?c=~???ʇ}?y?s?g@l?b? X?QK?=?(.??ٛ ?]>)>~G>on>h>3=mѮJڽǤCT[޵ ޾-j]%6;D Q]gX>pv5{+~I|Kxrj``W U%H9d*R#/r =i̖X`~.f/=>T3Y>>>0>J?F?I *?9?.H?]U?g`?j?r?9Ox?|?H?O?~?`{?v?fDp?g?\]?Q?D?5?%??]?,>> }>C>K=H>ʫ>2T>P>&<?]!?g2?%A?AN?}Z?oe?~Jn? hu?+z?=~???w}?qy?1s??l?}b?{ X?K?=?G'.?? ?>>w%>C>fn>,>"!=%m]ڽC_p⵾H޾PCx%6D_Qĵ]g'?pv{d~%I^|"Kx-rj_` U$H9*s!3H込8XdY.Z/= >u> >Z>F?%? *?D9?H?U?h`?j?gr?Ox?Q|?H?I?~?{?v?Cp?rg?1]?kQ?yD?%5?%??[?u(>z>x>pC>=ǁ>ߒ>rX>U>>?,!?2?D'A?N?Z?pe?XKn?hu?z?/:~??¡?$}?y?zs?>l?ib?:X?|K?=?%.?D? ?>,!>>>]n>>}=fpڽCPd浾~޾R?%?68DQ]g?p#v {~,I|ZRxkrj|^`U#H9*7h4eYش4./=N>EY>>9%>>B?? *?9?H?6U?i`?j?*r?\Px?|?H?B?g~?{?Lv?Bp?tg?]?Q?D?5?%?ȭ?Y?@$>>t>EC>$=l<͂`\nkLʾ x. =KXbs;ls8yp}%;~Kz kuVNnuteZuN,A!2!g*+-ԾMց1.஽QQ;,=.>ˁ>F>u">Y>@?!?2?(A?N?Z?qe?2Ln?`iu?z?u:~???҆}?fy?s?=l?Tb?X?K?=?#.?m}?̰ ?n>W>2:>Tn>w>=ڽICh+뵾޾T%6D Q]g@pvy{~2[I|Qxr"j\]`uU!H9'*; 0.w\Y*./=>NY>u>)>>> ??*?{9?jH?U?[`?j?r?Px?|?I?<?.~?{?v?Ap?wg?ܹ]?Q?|D?5?W%??W? >>o>C>=""<߂iFnBp7Qʾ:٭ zF!.=KXbYЁ>>&>m%>A?!?o2?U*A?bN?Z?re? Mn? ju?z?:~??8?}?y? s?cS>r>Kn>un>2=K'ڽtCKmﵾ޾Vp%55DaQD]gAp^v{~9.I@|7QxNr$j<\`)U' HL9h*? 羿+VSYC!/Y/=%>WY>>->>: ??E*?9? H?U?\`?j?r?Qx?o|?DI?6?~?{?v?,Ap?yg?]?Q?xD?75?%??U?>a>k>C>=kׯԁ>>*>)>m)?!?!2?+A?N?UZ?se?Mn?ju?z?;~? ??}?\y?Ws?;l?+b?xX?;K?ց=?n .?y? ?2>O>n>n>8e>ւ=GڽCq"޾XҬ8%59DQo]gaBpvQ{J~?I|Pxr2jj`UH9 *Ck'A5JY/&!.=/>`Y>b>62>>6 ??*?9?T"H?U?]`?j?r?Rx?ι|?qI?/?~?D{?sv?^@p?{g?]?bQ?D?6?%??S?>>f>ûC>iy=< A|"Ynb<ʾwñ V~$.=ĄKXb&>lsy}R:~z iuKnZqePZTN (A2!?W[ ԾQɁ*.8=S6.>ف>y>5/>->[+?!?"2?f-A?#N?Z?te?Nn?_ku?z?G;~???H}?y?s?;l?b?7X?K?D=?.?w? ?>J>i>n>>Â=OڽCGvDS&޾Z%P5DQ]g/Cpv{~FH|PxrAjdi`PU=H9 *Gv#AYC/{F.=k>jY>>6>,>2? ?*?M9?#H?dU? _`?j?r?Jx?.|?I?)?~?{?v??p?~g?[]? Q?{D?p6?_%?-?Q?j>>b>C>f=A<~8bn@J#ʾ(񾸳 -i&.R=/KXb ?ls-yM}ҡ :~hzbhuJnQpeZN&AA2H! = SYVԾā ._LF8=?.>݁>ਫ>u3>1>I-?l!?{ 2?.A?N?Z?ve?On? lu?z?;~?0?آ?}?qy?s?:l?b?X?f~K?~=?.?v? ?>F>4e>ˬn>Q>=qܰڽCz*޾\%56DQŬ]gCp7v){~LH"|OxrOjDh`U/Hy9+ *8KLTꖾ7Yxx/k.=>$X>O>:>V>-?`"?*?9?=%H? U?*``?~j?r?jKx?q|?I?"?H~?l{?7v?>p?g?0]?Q?D?6?%?S?O?5>H>]>lC>BT=E#>F>7>5>7/?;!?(2?vA?N?Z? we?wPn?lu?wz?;~?C??}?y?s?El?b?X?|K? }=?K.?8t? ?ة>9B>`>n>>=d'vڽ"CC.޾^%5DjQ]YgDpv{~R|H·|NxEr]j$g`UG.H9m*YO"n喾.Y4S/&.=>EX>Ζ>3?> >)??$?@*?9?&H? U?Ja`?pj?Pr?Kx?ѵ|?G??~?{?v?=p?g?]?`Q?~D?'6?%?l?/i? >۵>Y>@C>A=<<dtnI+ʾeќ j).v=KZ Xb@lAs7y}@=~zgu7In>neZ2Nr#A2!D9JMԾ2ī-$q^19!=Q.>>>;>9>%1? !?2?A?gN?,Z?xe?QQn?]mu?z?<~?V??O}?gy?@s?Dl?b?tW?{K?{=?.?ar? ?>=>V\>n>ؾ>r=rٽMC]2޾`lU%=54DQ]Wg:psv{0~YOHc|`Nxrkjf`nU,HG9*zSfᖾ%YC./{.=6>fY>Ӗ>5>>%?&?*?9?'(H?F U?ib`?bj?r?Lx?1|?G?m?~?{?v?$=p?g?ڲ]? Q?D?5? %??-g?s@>׵>T>C>/=a,>>6@>=>3?ڹ!?2?A?N?Z?ye?+Rn?nu?hz?`<~?i?x?}?y?s?Cl?b?_X?&zK?y=?.?p? ?>9>W>n>>x=ӼڽԂC> (7޾bS%5DQF]Ug\;pvm{i~_"H|Mxryjd`#U^+H9*@*WܖY/.=z>Y>ז> >>!?'?*?9?)H? U?c`?Tj?r?Mx?|?G?g?~?({?]v?U<>> P>C>=>z>vD>A>5?!?12? A?(N?Z?ke?Sn?nu?z?<~?}?Y?}?]y?s?Bl?}b?X?%K?jx=?(.?n?# ?}>Z5>yS>tn>^>(f=ڽC1O^;޾d:%51DmQq]Rg*Y>ܖ>>>?)?}*?V9?+H?U?d`?Fj?r?Mx?|?H?`?u~?{?v?;p?g?]?^Q?D?95?{%??(c? 8> >.>C> =g̭AԾ쁾].\8^Y=m.>5>ྫ>H>E>6?y!?2?!A?N?8Z?le?/Hn?[ou?Yz?<~??9?W}?ؔy?s?Al?hb? X?K?\=?r.?l?. ?_>1> O>^n>!>S=BR:+ڽ+CSֵ?޾f %+5DQ]Pg#Y>x>2>>??;*?9?,H?)U?e`?8j?Zr?ANx?O|?FH?Z?<~?{?v?:p?g?Y]?Q?D?5?%?Ҵ?%a?3>F>>6C>_=<nj[ =ʾޤ񾥤 q:.:{=E{K]XlbrDlsKy>}Z(<~ zmu~QnKxemZNPA02k!1:<Ծ灾S.%)9Bm=v.>>Gë>L>J>8?H!?2? #A?N?nZ?ne? In?fu?z?2=~???}?Sy?gs? Al?Tb? X?OK?ʊ=?1*.?k?9 ?A>,>J>Ivn>>@==ڽWC,X۵ ޾hr%6.DQdz]Ng=pxv{~G|Lxyrja`@ U'H9*$^ @ϖ-Y.K/=F>,Y>>>D>??*?9?-H?tU?f`?*j?r?Nx?|?rH?T?~?{?v?Dp?g?.]?Q?D?5?%??#_?/>>3> C>U=6<4'Сn_TAʾ񾚦 s.|=|KrXbXElsЖy}G;~zluPnBwe7Z-NA2!/68Ծ1まJ.!=.>>>ǫ>6Q> N>:?!?:2?$A?IN?Z?oe?In?gu?ֺz?x=~???}?Γy?s?"@l??b?\ X?K?8=?{(.?g?D ?#>z(>,F>3mn>>9.=箼bPڽC\_ߵT޾pvU{<~!I|Kxrjf`` U%H>9*"4;= Xs.%q/=> 6Y>e>>n>?? *?$9?n/H?U?h`?j?r?dOx?|?H?M?~?@{?Xv?)Dp?$g?]?\Q?D?L5?%%?? ]?i+>>{>C>=<٬dnGdEʾ񾏨 u.^~=~KXb>FlsUy}Ң4;~z,luOn9veZN@/A 2̴!-}2X4Ծ˩ށsA.ܸ}= .>Á>̫>wU>2R><?!?2?1&A?N?Z?pe?Jn??hu?Oz?9~??١?_}?Iy?s?/$>A>dn>k>=h2bڽC(a㵾޾?Qȥ%6+DQ]Ige?pv{v~'IA|JxrjF_`U$H9 *  r7lYYDN.z/= >-?Y>>/">>?? *?9?H? U?(i`?j?r?Ox?m|?H?G?~?{?v?ZCp?&g?ث]?Q?D?5?^%??[?4'>->7w>C>.=N<nhIʾ8񾄪 w\.=KXb:l=sڗy6}!V;~zkuNn0ueZlN-A$#2!+k.0Ծd ځ?8. =?.>`ȁ>/>Y>DV>>?!?2?'A? N?Z?#qe?Kn?hu?Ȼz?C:~??? }?Ēy?Ds?V>l?b?X?K?=?%.?~?, ?R>>O=>[n>.~>=}uڽٹCe赾޾ASi%6DQH]Gg3@pRv-{~.zI|.Rx1rj&^`^U"H9a* 3PbY1(.ϻ/=>NHY>R>&>>??L *?Z9?dH?U?Hj`?j?dr?Px?͸|?H?A?V~?h{?v?Bp?)g?]?Q?D?5?%?7?Y?">>r>C>=V<҂Kcn%m3NʾVy \y .=K5Xb;l1s_y};~'zjuNn&teZ N/,Av!2!)Y*+ԾՁ /.Iۮ=s.>́>>#>VZ>@?!?B2?A)A?kN?EZ?,re?tLn?iu?@z?:~??N?}??y?s?p=l?b?X?K?=?X#.?|?7 ?4>fV>8>Qn>t>I=ǯڽC$jx쵾޾DU1%5)DqQs]DgApv{~4NI|Qxrj]`U-!Hl9*& .YY'"0$/=U>oQY>>*>> ?r? *?9?H?U?\`?j?&r?Qx?,|?%I?:?~?{?v?Ap?+g?]?Q? D?^5?%?P?W?>r>;n>^C>= iс>>'>&>B?U!?2?*A?N?{Z?5se?NMn?=ju?z?:~??.?Ԋ}?y?s?R>.q>Hn>k>=ڽ0Cn*޾GW|%5,DQ]BgApv{"~;!I$| Qxrj[`UH9*G u*cPY/.=(>ZY>@>,/>> ?Q?*?9?N!H?0U? ]`?j?r?Qx?|?RI?4?~?{?v?@p?-g?X]?RQ?D?5?%?j?U?>>i>2C>t=(Ձ>b>9,>*>*?%!?!2?R,A?+N?Z?>te?(Nn?ju?1z?;~???}?Sy?!s?;l?b?X?πK?_=?.?2y?L ?>M>l>An>xb>Ђ=E]Dڽ[C s4_#޾IYc%(5DQȺ]?gBp+vq{[~AHĸ|zPxRrj.j`{UCH69$ *hb &}GY=x/F,.=>cY>>3>@> ?0?*?,9?"H?{U?@^`?j?Br?;Rx?|?~I?-?~?${?Cv?!@p?0g?-]?Q?D?6?A%??S?_>>?e>C>s=qv< [n=G ʾX ~5%.8=0KX/bj>lTsВy}=:~zhuKn qeZN'An2!{>UUYԾʓǁl.pΘ8=9.>rځ>ɥ>z0>.>+?&!?J#2?-A?N?Z?Gue?On?ku?z?\;~?#??/}?Ηy?,s?:l?b?X?eK?=?5.?Zw?W ?ڰ>I>Qh>+n>>Z=ؿڽCw'޾L[I%5)D$Q]=gmCpv{~GHe|Oxrji`UH9e *8!v햾\>Y #/Q.=->lY>->7>i>?!?H*?9?8$H?U?`_`?j?r?Kx?J|?I?'?p~?{?v?R?p?2g?]?Q? D?6?%??Q?)>Y>`>ܯC>La=+<>>dn#B$ʾcM &.ʇ=K8 XDbQ?l sUyf}ۡ9~Dz/huJnpeZN&A2!<QUԾ˫tÁ7 .Ӑ8.=FB.>ށ>/>4>2>-?!? 2?c/A?N?Z?Pve?On?c>n>>.=kڽC|+޾N]0N%q5DzQ]g;DpfvI{~NH|WOxrjg`UM/H9 *x薾;5Ym/v.=q>X>>)<>>?"?*?c9?%H? U?``?j?r?Kx?|?I? ?7~?L{?v?>p?5g?״]?PQ?D?N6?%?½?O? >޵>D\>C>N=|>>8>6>/?Ŷ!?2?A?LN?SZ?Ywe?Pn?lu?z?;~?I??}?Ŗy?s?CEl?hb?UX?|K?|=?.?s?m ?>@>s_>n>T>==ڽCM/޾Q_%5'DQI]g9pv{~TnH|Nx rjf`WU-Hg9*#䖾,YryH/E.=>Y>ϖ>}@> >?$?*?9?!'H?^ U?a`?j?r?'Lx?|?G??~?{?jv?=p?7g?]?Q? D?6?I%?ۻ?h? >ڵ>W>C>%<=K>>:=>:>1?!?V2?sA?N?Z?bxe?Qn?mu?z?/<~?\??7}?@y? s?]Dl?Sb?@X?${K?{=?.?q?x ?><>[>n>>䅃=^ٽC44޾Sa%5D&Qt]g:p/v!{A~[BHF|4NxIr#je` Ud,H9*"Y.$#/.=> Y>hԖ> >>?&?*?9?(H? U?b`?j?Lr?Lx?M|?G?k?~?s{?v?@ֵ>HS>YC>)=K<.U.noOq1ʾ[ m.=ڊK XbBl.sy_};<~NzLouHnleZiNt!A2O!6EUHԾ|󁾼l. Xa9:=].>>c>zA>?>3?d!?2?A?0N?(Z?kye?lRn?:nu?z?u<~?o?o?}?y?Ts?wCl??b?X?#K?y=?\.?o? ?a>]8>V>Վn>ڲ>?s=ӭ ڽC i8޾Vc%_5$D}Q]g;pv{z~aH|Mxr1jd`U*H19U*){ۖY..==>@Y>ؖ> >>?(?C*?59? *H? U?c`?j?r?JMx?|?G?e?~?{?.v? >N>.C>= >ɻ>E>!C>5?4!?2? A?N?^Z?Dle?GSn?nu?z?<~??O?}?6y?s?Bl?*b? X?K?v=?.?%n? ?C>4>'R>n>>`=0ڽCPf<޾Xe˸k%5DQʱ]ghaY>Vݖ>(>->?k*?*?9?+H?@U?d`?j?r?Mx? |?&H?^?d~?c{?v?I;p?>g?+]?Q?D?5?%?(?b?6>W >؇>C>j=$>0>I>3G>7?!?_2? "A?N?Z?Mme?pHn?ou?}z?=~??/?>}?y?s?Al?b?~ X?NK?=?d+.?Nl? ?%>/>M>|n>a>M=h0ڽCU׵@޾[g2%5"D)Q]g6=p v{~mG(|LxrMjPb`) U(H9*%JҖYb$.1/=>&Y>>|>W>??*?k9?,H?U?f`?j?r?mNx?k|?SH?X?+~?{?ev?{:p?@g?]?Q?D?5?,%?A?`?2>>Z>{C>=mk<on\Q>ʾ: r.{={KWbDlPssyW}U<~zNmu=QnweZGNA2!0j9;ԾH@恾Q.3 v.r=_->>ī>;N>EK>p9?ҿ!? 2?#A?RN?Z?Vne?KIn?gu?z?G=~???}?,y?1s?@l?b?= X?K?R=?).?? ?>}+>II>sn>$>P;=pv {~Gȵ|Kx?r[j0a` U&H_9*$ >7ΖtXύ.V/=>/Y>C>>>}??*?9?i.H?U?>g`?rj?Vr?Nx?˷|?H?R?~?{?v?Dp?Bg?խ]?LQ?D?s5?e%?Z?^?^.>>~>PC>= <Ÿn+aBʾ6/ btr.D}=}KXbElsy}A;~lzlucPnveZNRA2! /X5T7Ծ⬫ၾG. k=.>>ȫ>{R>WO>^;?!?2?%A?N?Z?_oe?%Jn?gu?z?=~???}?y?zs??l?b? X?yK?=?'.?ځ? ?>3'>D>~jn>>(=Uڽ>C^ൾ޾O%6DQK]g>pEvv{M~#Ii|]Kx|rhj`` U%H9Y*5"|:SXzh.D|/=L>8Y>>%>>y?c?S *?9?/H?"U?^h`?dj?r?Ox?*|?H?K?~? {?)v?Cp?g?]?Q?D?5?%?t?\?(*>>>^z>$C>9=հ.rƸ = .>4Ł>>V>iS>L=?q!?g2?&A?N?6Z?hpe?Kn?qhu?sz?:~??ϡ?F}?!y?s?>l?b?X?K?.=?B&.?? ?6>">k@>han>>=H~hڽiCb 嵾޾QY%6D+Qv]g?pv{~)I%|Jxrvj^`FU#H(9*V '6rIiY%C./=>AY>0>y#>>u?B? *?:9?^H?nU?~i`?Vj?r?!Px?|?H?E?~~?{?v?Cp?g?]?Q?D?*5?%??Z?%>>u>C>= <łanj0Kʾr x.h=KSX/b;lsyO}A;~{zPkuNnteoZNB-A"2s!/+4-.Ծ؁5.Z讽iw=.>Ɂ>~> >zW>:??A!?2?.(A?sN?lZ?rqe?Kn?iu?z?X:~???}?y?s?>l?b?{X?K?=?$.?+~? ?>iY>;>RXn>n{>`=b{ڽCfh鵾޾S@%:6DQ]gp@pvN{~0mIƹ|Rxrj]`U2"H9*w 1(`YF../=>KY>>'>>q?"? *?9?H?U?j`?Hj?r?Px?|?I???E~?H{?v?NBp?g?T]?Q?D?5?%??X?!>>bq>C>=T@<8؂ fƿnwn{Oʾ y .=\KXDb;lgshy}:~zjuMnse9ZN+A 2q!A)")*Ծ.ԁL,.ծķD=2 .>=΁>噫>$>#>(A?!?2?)A?N?Z?{re?Ln?iu?dz?:~??E?}?y?Ws?+=l?b?:X?9K? =?".?T|? ?>U>7>=On>1r>=ޯڽC{k5޾U&%\5DQ̸]g?Apv{~6@If|rQxrj\`U H9* y-WY%/C/=">'TY>>",>)>m ??*?p9?H H?GU?V\`?:j?`r?DQx?H|?2I?8? ~?{?Pv?Ap?g?*]?BQ?D?5?H%??V?>%>l>C>~=<ꂽIoaLnrSʾ {L".=ǂKXXbҁ>L>=)>'>(?!?o 2??+A?4N?Z?se?Mn?pju?ݼz?:~??%?}?y?s?EP>o>'Fn>h>ނ=(9ڽCo#k ޾W %5D-Q]g Bpv&{3~=I|Pxrj[`dUIHV9^* O+)MY/.=[+>H]Y>>v0>S>h ??O*? 9?!H?U?v]`?8j?"r?Qx?|?_I?2?~?p{?v?@p?g?]?Q?D?6?%?٨?}T?S>>gh>wC>=媯Fׁ>>~->+>*?!?"2?,A?N?Z?te?jNn?ku?Uz?+;~???i}?,y?s?^;l?b?X?cK?=?i.?x? ?>L>mk>n>_>q˂=sͲڽCvt$޾YG%5D4Q!]gBpZv{l~CH|OPxrji`UH9 *%$DYzY/e7.=>ifY> >4>}>d??*?9?2#H?U?^`?*j?|r?gRx?|?I?+?~?{?v??p?g?Զ]?Q?D?6?%??zR?>j>c>LC>Wn=.`<'^n?!ʾ n%.=KWXb>lsy,}š(:~zhuDKnpeZN!'A2!=TXԾzƁ.䝮@8=;.>ہ>>1>/>,?!? 2?O.A?N?CZ?ue?DOn?ku?νz?q;~?(??}?y?s?x:l?rb?xX?~K?U=?.?v?© ?>?H>f>vn> ≯=?aڽBCx(޾[گ%J5DQL]gCpv{~IHH|OxVrjh`U_H 9 *羂 !얾;Y7 /\.=>tX>>9>>`?!?*?B9?$H?) U?_`?j??r?/Kx?f|?I?%?_~?{?wv??p?g?]?@Q?D?u6?P%??wP?> >k_> C>[=v<"gnuC%ʾ Fn'.B=K Xb?lAs}y}=~ zgujJnoeaZ!N%AA24!;PSԾ_ʫy.G8=E.>P>>5>4>p.?!?{2?A?UN?yZ?ve?Pn?nlu?Gz?;~?;?Ţ?ĉ}?"y?@s?El?]b?7X?}K?}=?.?t?ͧ ?>C>b>an>>=ڽmCr}< -޾]%5DQw]gyDpvi{~PH|,Oxrjg`?U.H9! *.疾2Yb/.=4>X>̖>s=> >\?}#?*?9?&H?u U?``?j?r?Kx?|?I??&~?+{?v?F>p?g?~]?Q?D?6?%?1?i? >ݵ>Z>C>0I=ʮ>毫>>:>"8>^0?O!?(2?_A?N?Z?we?Pn?mu?z?;~?O??q}?y?s?Dl?b?W?#|K?1|=?F.?s?إ ?d>?>!^>Kn>>=SڽC@1޾_%5D6Q]g::p3v{~VaH|Nxrjyf`Ui-H9b*<!4㖾a)YY=/e.=x>Y>Fі>u> >X?\%?J*?y9?'H? U?a`?j?r?RLx? |?G??~?{?;v?w=p?g?S]?Q?D?,6?%?J?g?'B>Pٵ>oV>ɚC>6=<HyynSLn.ʾٖ k*.f=܉K XbbAlsy$}%=~zouHnmeZ`N"A2!8{HQKԾ2s. fY>L>~>>4<>L2?!?2?A?9N?Z?xe?Qn?mu?8z?C<~?b??}?y?s?Dl?b?X?zK?z=?.?Hq? ?E>`;>Y>5n>V>V=ٽCnu5޾ad%85DQͯ]g;p^vA{R~\4H*| NxrjYe`U+HR9*\%}羅ޖ@ Yk/.=> Y>Ֆ> >>T?;'? *?9?)H? U?c`?j?r?Lx?i|?G?i?~?S{?v?Q?D?5?%?d?e?=>>Q>C>$=P5>>B>F@>:4?!?2?pA?N?Z?ye?Rn?lnu?z?<~?u?e?ˈ}?y?s?2Cl?b?X?K? y=?.?po? ?'>7>CU> n>>m=Y魼%ڽKC슌U 9޾cu+%5DQ]g;pv{~cH˶|xMxLrj:d`]U*H9*"))S0GږY'..=>Y>4ږ>>A> ?)?*?9?z*H?WU?5d`?j?Ir?uMx?ɶ|?H?c?~?{?v?;p?g?]?Q?D?5?3%?}?c?9>h >>sC>t=b>>F>XD>(6?!?12? A?N?Z?le?Sn?ou?(z?<~??F?y}?y?gs?LBl?b?_ X?MK?=?#.?m? ? >2>P> n>ݦ> [=4#ڽwCQ=޾e\%5D9Q#]g Y>ޖ>r>k>?T?*?K9?+H?U?Te`?j? r?Nx?(|?4H?\?S~?C{?av? ;p?g?ү]?Q?D??5?l%??a?5> >>C>=៭</nYN;ʾ4ۣ @q.z=zKXbDlsy}bE<~:zmuQnxeZ?NA2&!T2F<>Ծ_l遾W.D-(CHe= s.>>>?K>jH>8?!?2?"A?ZN?Z?me?Hn?ou?z?=~??&?&}?y?s?fAl?b? X?K?l=?*.?k? ?>.>fL>yn>>gH=~L6ڽC\V>ٵB޾gB%%6DQN]gt=p8v{~G |ULxrja` U'H9R*d%` 辇YіY.:)Y>!>>>?4?[*?9?c-H?U?tf`?j?r?Nx?|?`H?V?~?{?6v?=:p?g?]?>>C>=*Uk>ū>O>{L>:?\!?2? $A?N?&Z?ne?In?Pgu?z?\=~???Ӈ}?y?s?@l?b? X?wK?ۉ=?,).?%? ?͒>6*>G>pn>c>5=ɮHڽΣCZݵ ޾i)%6DQy]gC>pv*{%~I|Kxrj``{ U"&H9*#e 辆=̖X\.b/=>[2Y>>>>?? *?}9?.H?:U?g`?j?r?*Ox?|?H?P?~?k{?v?|Dp?g?|]?Q?!D?5?%?ɱ?]?->O>}>C>D=6 >Lʫ>S>P>;?,!?92?%A?N?\Z?oe?fJn?gu?z?=~???}?y?Ds??l?b? X? K?I=?v'.?N? ?>%>C>gn>'>#=6t[ڽCX_ᵾ޾oPH%n6D;Q]g?ptv{^~%Ih|1KxBr j_`/ U$HI9*!i29XZ].d/= >};Y>>o >>?? *?9?YH?U?h`?j?Sr?Ox?G|?H?I?~?{?v?Cp?g?Q]?Q?D?Q5?%??[?(>>y>iC>=<|Onf-Hʾ񾺩 v.N=~KrXmbt:lsy})r;~нzkuHOnueIZNV.A 2!,01Ծ+ہ;.lS=.>Ɓ>g>W>T>=?!?2?'A?|N?Z?pe?AKn?hu?z?':~??š?-}?y?s?>l?b?\X?K?=?%.?v? ?>!>?>^n>>w=^nڽ$CcW浾 ޾qR%6DQ϶]g?pv{~+I |iRxr.j^`U8#H9*m4fYԵ8./=S>DY>>$>> ?? *?9?H?U?i`?j?r?LPx?|?H?C?m~?{?]v?Bp?g?&]?:Q?#D?5?O%??Y?$>>t>>C>=tˁ>Ζ>">X>??!?2?(A?N?Z?qe?Ln?Niu?z?m:~???چ}?uy?s?=l?rb?X?7K?%=? $.?}? ?޾>"X>:>Un>x>=ڽPCSh굾A޾tTѨy%6DQ]g@pvn{~2`I|Qx%r<jz]`U!H9V*q e羉0o]Y+./=>MY>>)>=> ??V*?P9?BH?^U?[`?j?r?Px?|?I?=?4~?'{?v?Bp?g?]?2Q?D?5?%??W?} >6> p>C>=*<݂hFnoPʾ˷񾤭 uz!.r=ȁKXbAS>r>Ln>po>-=\/ڽ{Clﵾv޾wV@%5 D=Q%]g|ApMv{ ~83IJ|FQxcr>j[\`LUN Hw9* u ;5,1NTY?"/c/=$>VY>r>l->g> ??*?9? H?U?\`?j?r?oQx?e|?@I?6?~?{?!v?BAp?g?Ѹ]?Q?D?d5?%?.?U?G>>k>C>=Y߯ԁ>>*>)>9)?i!? 2?+A?N?4Z?se?Mn?ju?z?:~???}?jy?js?O>n>n>3f>؂=?¥ڽCOqp󵾬!޾yX%~5DQO]gKBpvF{D~?I|PxrLjj`UH9 **y'-KY/0.=.>`Y>>1>> ?o?*?9?,"H?U?]`?j?r?Rx?Ĺ|?lI?0?~?O{?v?t@p?g?]?Q?"D?A6?%?H?S?>z>g>C>b{=<F{,Xn;WYʾ񾎱 $~$.=KvXb >l sy}Z:~ziuKnvqeqZyN5(A2H!B?W ԾɁ$.7u8 =Y5.>؁>>.>#->'+?k!?"2?<-A?N?jZ?te?Nn?Mku?yz?@;~???P}?y?s?;l?4b?YX?K?o=?.?x?" ?>CK>j>׶n>>ł=ˉVڽCu%޾|Z%#5DQz]gCpv{~~EH|$PxrZji`sUeH@9 *J}羌#C BY9/B.=o>!iY>_>6>>?N ?*?"9?#H?AU?^`?rj?r?Jx?#|?I?)?~?{?v??p?g?{]?0Q?D?6?%?a?Q?>>b>C>h=I<AanX@"ʾ%񾃳 ;&.(=KXb>lsyE}Ρ:~uzthuKnmpe;ZN&An2y!T=zSVԾ+GŁ .YW8=>.>$݁>h>3>51>-?:!?M 2?.A?^N?Z?ue?On?ku?z?;~?.?ܢ?}?y?s?3:l?b?X?~K?~=?0.?Bv?- ?f>F>e>n>L>=԰ڽCKz+*޾~\k%5 DQ]gCp'v{~KH,|Oxrhjch`(U/H9[ *k8ꖾ8Yt|/g.=>,X>>i:>>?-"?R*?9?%H? U? ``?dj?yr?ZKx?g|?I?#?N~?w{?Hv?>p?g?P]?Q?%D?6?%??O?>>^>eC>:V=3<[(WjnD 'ʾ׏x ҁ'.=sK Xb?lwsy}=~zgu)JndoeZN$%A2!f;hORԾɫ. 9F =G.>>Ϭ>B7>G5>/? !?2?LA?N?Z?ve?_Pn?lu?jz?;~?A??}?y? s?El? b?X?"}K?K}=?z.?jt?8 ?H>B>>a>n>>=v}ڽ(C~L.޾^R]%l5DFQЭ]>gDpv{~RH̷|OxZrvjCg`Uo.H9*V斾/Y0W//.=>MX>$Ζ>>> >? $?*?X9?&H? U?+a`?Vj?;r?Kx?ǵ|?G??~? {?v?>p?g?%]?Q?D?S6?%??fi?r >aܵ>Y>9C>C=|<;msn6Ik+ʾ񾛜 ).L=݈K8 Xb@l.s)y}H=~z guNIn[neZXN#A2ڿ!y9VKMNԾī&-sg-9=P.>->5>;>Y9>0?ٷ!?2?A?AN? Z?we?:Qn?Kmu?z?<~?T??X}?uy?Ss?Dl?b?W?{K?{=?.?r?C ?*>c>>\>n>ӿ>m=-jٽTCG2޾`9$%5 DQ]nY>Җ>>8>?%?*?9?'H?# U?Kb`?Ij?r?}Lx?&|?G?m?~?{? v?:=p?g?]?.Q?(D?5?:%??cg?@>ص>U>C>1=i>>?>k=>2?!?V2?]A?N?Z?ye?Rn?mu?[z?X<~?g?|?}?y?s?Cl?b?X?LzK?'z=? .?p?N ? >:>`X>n>>z=䴭ڽہCćD 6޾b%5DQ&]:gF;pva{c~^'H|Mxrje`FU+H9 *s*?;iݖY /.=~>Y>ז> >T>?'?*?9?t)H?o U?kc`?;j?r?Mx?|?G?g?~?3{?nv?kx>P>C>= 6>>D>|A>4?x!?2?A?N?Z?ke?Rn?nu?Կz?<~?{?\?}?ky?s?Bl?b?@X?KK?x=?W.?n?Y ?>5>S>kn>Y>#h=ڽCN :޾d%Z5DHQQ]7gY>ۖ>h>~>?)?M*?*9?*H?U?d`?-j?r?Mx?|?H?a?{~?{?v?;p?g?]?Q?+D?f5?%??^c?{8> >>C> =Vԭ>i>CH>E>6?H!?2?n!A?cN?Z?le?Hn?Iou?Lz?<~??<?`}?y?1s?Bl?b? X?K?=?.? m?c ?ϙ>1>O>Un>>}U=SJB)ڽ2C4S-ֵ ?޾fz%5DQ|]5g"Y>ߖ>>>?? *?9?],H?U?e`?j?Er?2Nx?E|?AH?[?B~?#{?2v?:p?g?y]?,Q?D?5?%??\a?F4>>*>/C>X=<ėnZ<ʾnp q .{={K;XObYDls=y5}\0<~zmuQngxeZNzA]2!1;L=Ծ聾T.' =Hk=u.>?>«>L>I>8?!?^2?"A?N?MZ?me?Hn?fu?z?*=~??? }?ay?zs?!Al?qb? X?vK?=?_*.?5k?n ?>9->K>?wn>>B= ;ڽ^CWڵ ޾hӻA%6DQ]3g=pgv{~G|)Lxrja`c U''H9*$ 辐@Ж%Y.G/=J>+Y>u>>>??*?`9?-H?QU?f`?j?r?Nx?|?nH?T?~?{?v?:p?g?N]?Q?-D?5?%??Y_?0>_>>C>N=><9,٠n`_@ʾe s.|=|KPXcb?Els–y}I;~zluPn^weXZRNA2Ͷ!/6 9ԾまK.}=.>>6ǫ>P>M>:?!? 2?$A?$N?Z?ne?In?gu?ɺz?p=~???}?ܓy?s?;@l?]b?~ X? K?c=?(.??y ?>(>F>*nn>>30=߮iNڽC0\޵ ޾O%G6DJQҴ]0g>pvJ{6~ I|Kxrj`` U%Hj9*"<<Xw..m/=>5Y>>e>>?? *?9?G/H?U?g`?j?r?UOx?|?H?N?~?K{?iv?>Dp?g?#]?Q?D?x5?U%?8?W]?+>>/|>C>=<ުinc*EʾZ {ux.4~=}KXb%FlssGyۉ}΢6;~%z>luOnUve"ZNi/A2!-24ԾB ߁mB.~~七= .>`Á>˫>U>Q><?!?2?&A?N?Z?oe?Jn?-hu?Bz?9~??ܡ?g}?Wy?s?U?l?Hb?= X?K?ч=?&.??V ?t>$>6B>en>f>=y*`ڽC`F㵾޾Q%6DQ].gO?pv{o~'IL|Kxrjd_`U>$H9O*!{7@XU;R./= >5>Y>c>!>'>??^ *?9?H?U? i`?j?r?Ox?c|?H?H?~?{?v?pCp?Ag?]?*Q?0D?5?%?R?T[?'>>w>C>'=<< n>htIʾȰO Sw..=_KXb:l)s̗y.}#];~zkuOnLueZN-AQ#2.!+.0Ծܥځ99.﮽!=E.>ǁ>>CY>U>s>?!?g2?'A?N?Z?qe?Kn?hu?z?<:~???}?Ғy?Ws?n>l?4b?X?6K??=?=%.?~?a ?>Y >=>[n>)> =1usڽC,e絾L޾ S{9%6DQ(],g@pAv"{~-I|>RxFrjE^`U"H39*8 Q输3cY,.ط/=>VGY>>&>Q>?`? *?/9?=H?uU?)j`?j?Or?xPx?ø|?H?A?\~?s{?.v?Bp?Cg?ͺ]?Q?D?/5?%?k?RY?q#>F>3s>C>=^<ЂPbnlMʾD *y.X=ɀKXb;lsQy};~3zju,NnCteZ1NY,A!2,!**K,Ծuց0.Cݮ=y.>j́>>E#>Y>`@?U!?2?)A?EN?%Z?re?\Ln?iu?3z?:~??Q?†}?My?s?=l?b?X?˃K?=?#.?}?l ?>V>X9>Rn>u>D=迯$ڽ Ci쵾޾ Ub%5DLQS])g@pv{~4RI|Qxrj%]`5UT!H9*Y '?/SZY(.-/=Y>wPY>P>b*>{> ???*?9?H?U?[`?j?r? Qx?"|? I?;?#~?{?v?Ap?Fg?]?Q?2D?5?%??OW?<>>n>WC>=Ё>>'>5&>NB?$!?2?*A?N?ZZ?se?7Mn?+ju?z?:~??2?݊}?ȑy?s?R>q>In>l>= ڽ7C(n_𵾷޾WH%W5DQ~]'gAp|v{~:&I.|Qx)rj\`UH9*z *QY}/0='>YY>>.>> ??*?e9?&!H? U?]`?j?r?Qx?|?MI?4?~?{?v?Ap?Hg?x]?vQ?/D?5?8%??MU?>>7j>,C>l=ɯsՁ>렫>+>G*>)?!?o!2?(,A?N?Z?"te?Nn?ju?%z?;~? ??}?ay?4s?;l?b?:X?K?=? .?dy? ?h>FN>8m>8n>sc>҂=WUKڽbCr"޾Y/%5DQ]$gBpvf{U~@Hθ|PxgrjLj`UjHa9T *羖&fuHY9o/O(.=0>bY>=> 3>> ??Y*?9?"H?XU?!^`?j?.r?,Rx?|?zI?.?~?/{?Tv?6@p?Kg?M]?!Q?D?6?q%??JS?>->e>C>u=_~<~Zn<=ʾA# ~%.= KXbR>lAs’y }E:~ʻzhuKn'qeZN'A2!>UVYԾBsȁf.j48=8.>ف>Q>0>Y.>+?!?#2?-A?fN?Z?+ue?Nn?ku?z?U;~? ??8}?ݗy?@s?:l?b?X?K?=?d.?w? ?J>I>h>"n>>T=߽ڽC$w"'޾[V%5DQӻ]"gWCpv{~GHo|Oxrj-i`UH9 *B"햾T?Y /M.=2>kY>>_7>>? ?*?9?$H?U?A_`?j?r?Jx?@|?I?'?w~?{?v?h?p?Mg?"]?Q?2D?6?%?Х?GQ?>>հC>Ec=3|ށ>>F4>k2>-?Ŵ!? 2?9/A?N?Z?4ve?On?)lu?z?;~?4?Ң?}?Xy?s?BFl?b?X? ~K?e~=?.?u? ?,>E>Zd> n>>)=갼rڽC{xW+޾]%E5DVQ]g%DpVv>{~MH|gOxr j h`Ut/H*9 *x閾36Yq/r.=v>X>*>;>">?"?*?79?%H? U?a``?j?r?Kx?|?I?!?=~?W{?v?>p?Pg?]?uQ?D?{6?@%??EO?f>rߵ>\>C>P=<- mnFh(ʾ< _s(.1=߇KW X;b@ls̓y}y=~غzguInoeZON$AA2!:2NIQԾǫR./+9=J.>>>8>}6>/?!?{2?A?'N?2Z?=we?Pn?lu?z?;~?G??}?Ӗy?s?\El?b?xX?|K?|=?.?s? ?>fA>_>n>O>=5ڽC/޾_%5DQ)]gDpv{~TsH|Nx r.jf`zU.H9*U羙喾-YmoL/O.=>Y>yϖ>@>L >?$?*?9?&H?; U?a`?j?ur?Lx?|?G??~?{?{v?=p?Rg?̳]?Q?5D?6?y%??h?1 >۵>@X>~C>>=9<@"vnJ,ʾ/1 j**.Ê=IK XObAldsQy}3=~zfu In nesZN&#A2P!8 J MԾZëv.m89o%=S.>>><>:>1?c!?(2?IA?N?hZ?Fxe?{Qn?~mu?z?'<~?Z??@}?Ny?s?uDl?qb?bX?K{K?A{=?A.?r? ?>=>}[>n>>߇=pٽC43޾aʴ%5}DQT]g:pv{;~ZFHQ|DNx]r<je`.U,H9C*+E#Y*'/.=>' Y>Ӗ> >v>?z&?U*?n9?n(H? U?b`?j?8r?Lx?C|?G?l?~?{?v?ֵ>S>SC>+=S<3S7nN0ʾM& lk.U=K XdbAls֔yV}8<~[z^ou3Hnme=ZN!A2!6FHԾ󾫾I􁾶m.Z]9 8=\.> >붫>A>>>r3?3!?2?A? N?Z?Oye?URn?(nu?z?m<~?m?r?}?ɕy?gs?Cl?\b?!X?JK?y=?.?/p? ?Ѡ>8>W>̏n>ճ>9u=(˭ ڽC 7޾cs%25DXQ]g;pv{t~`H|MxrJjd`U+H]9*)ܖY/.=A>HY>fؖ>^ >>?Y(?*? 9?)H? U?c`?j?r?:Mx?|?G?e?~?{??v?.+>DO>'C>=>R>GE>B>`5?!?2?Z A?kN?=Z?'le?/Sn?nu?z?<~??R?}?Dy?s?Bl?Hb? X?ߋK?x=?.?Wn?à ?>4>R>n>>b=7ڽC P,<޾"e:%5zDQ]gRiY>ܖ>>>O?8*?*?9?X+H?U?d`?uj?r?Mx?|?!H?_?j~?o{?v?_;p?Yg?K]?Q?D?5?$%?[?b?:7> >R>C>b=<}xscnW9ʾ p.y= zKZXbClsy}xja<~jz nu/Rn!yeZNA2!3=H@Ծ&?끾M[.4\W6^=Ro.>>>I>F>N7?ҽ!?12?!A?N?sZ?1me?YHn?|ou?pz?<~??2?G}?y?s?Al?3b? X?tK?=?.?l?Ξ ?><0>0N>}n>\>O=`.ڽCTz׵a@޾$g~%{5DQղ]g!=pv{~mG2|Lxrfjnb`L U-(H&9*&&.G'ӖY^.-/=>%Y>S>>>K?r?*?@9?,H?hU?f`?gj?r?]Nx?a|?NH?Y?1~?{?vv?:p?[g? ]?Q?:D?D5?\%?u?`?3>p>ԃ>tC>=[s<"xnC\=ʾ Yr.{={KoWbDl=seyN}W<~z`muUQnxe1ZlNA2!-19<Ծ恾R.-"1p=e->>ī>M>J><9?!?2?k#A?,N?Z?:ne?3In? gu?z??=~???}?:y?Ds?@l?b?_ X? K?}=?).?j?ٜ ?w>+>I>tn>>J==N^AڽC Y۵ ޾'id% 6xDZQ]~g=pv{~Gӵ|KxSrtjNa` U&H9H*G$2 F?ΖlXƑ.R/= >.Y>>[>>G?Q?e*?9?A.H?U? g`?Yj?Br?Nx?|?{H?R?~?{?v?Dp?]g?]?pQ?D?5?%??^?.>>V>IC>=(<ǝn`'BʾƩ 0tD.}=|KXbElsy}D;~yzluzPnweZN|A02C!?/57ԾY6⁾H. q=.>4>ȫ>R>N>*;?q!?2?$A?N?Z?Coe?Jn?gu?z?=~???}?y?s??l? b? X?K?=?'(.? ? ?X>'>SE>ukn>>*=SڽDC]6ൾ#޾OK%6DQ+]|g>p4vj{G~"Is|lKxrj/`` UC%H9*h"6h:bKXpl.Nx/=P>7Y>@>>:>C?0?$ *?s9?/H?U??h`?Kj?r?Ox? |?H?L?~?+{?:v?Dp?g?ʬ]?Q?=D?5?%??\?*>>z>C>2=ݰā>>GV>R>=?@!?92?|&A?N?Z?Lpe?Jn?_hu?fz? :~??ҡ?O}?/y?s??l?b?X?5K?Y=?p&.?5? ?:>]#>@>_bn>>=@fڽpCb䵾X޾Q%W%i6uDQV]zg?pv{~)I/|Jxrj_`iU#HT9* :>辝6AjYG./=>@Y>>#>d>??? *?9?7H?KU?_i`?<j?r?Px?|?H?F?~?{?v?3Cp?g?]?Q?D?W5?%??Z?e&>W>Zv>C>=<ÂfniJʾ w.>=K1Xb:lsyF}I;~zbkuNnteZ)Nl-A"2!c+-G/Ծ-فz6.Tꮽhʃ=.>>Ɂ>>Z> W>??!?2?(A?NN?KZ?Vqe?Kn? iu?߻z?Q:~???}?y?!s?*>l?b?X?ʄK?Dž=?$.?]~?˱ ?>>u<>IYn>i|>[=tyڽCf赾޾S % 6D\Q]wg[@ppvB{~/rIй|Rx rj]`UZ"H9 *> I2u aYA/!./=>JY>.>X'>>;?? *?9?H?U?j`?.j?r?Px?߸|?I???K~?S{?v?dBp?g?t]?Q??D?5??%?ڬ?X?0">>q>C> =BH<=ւeϾnmOʾ!٬ yg .Ё=5KrX&b;lTsZy} ;~zjuMnseZZN+A$!2!u))+Ծ&ԁF-.׮:J=7.>́>m>$>[>@?!?2?)A?N?Z?_re?Ln?iu?Wz?:~??H?}?%y?ks?C=l?b?\X?_K?5=?#.?|?֯ ?j>U>8>3Pn>,s>=+֯ڽCkO޾U%05rDQ]ug)Apv{~6EIq|Qxrj\`U H9L*B -WY%/M/=!>/SY>>+>>7 ??a*?E9?! H?$U?7\`? j?Kr?4Qx?>|?.I?9?~?{?av?Ap?g?I]?gQ?>_m>C>w=<肽NnjKnmrQSʾ?ή {".a=KX;bGҁ>ԝ>(>l'>B?!?B 2?+A?N?Z?hse?xMn?^ju?мz?:~??(?Ċ}?y?s?]IQ>Up>Gn>i>= AڽCo޾W٫O%5uDQ׹]rgApv{-~<I|Pxrj[`UpH9*F 羠)NY/.=`*>P\Y>>0>>3 ?? *?9?!H?oU?W]`?j? r?Qx?|?ZI?2?~?{{?v?@p?g?]?Q?D?6?%? ?T?>>>h>pC>=Ӳց>:> ->~+>_*?}!?!2?,A?oN?Z?qte?RNn?ku?Iz?$;~???r}?:y?s?w;l?b?X?K?=?.?x? ?.>L>k>n>`>k͂=k԰ڽCs .$޾Y%y5DQ]pgBpIv{f~BH|^Px-rji`;UH9 * JL%񖾽EYvO/o3.=>qeY>>U4> >.??*?{9? #H?U?w^`?j?hr?WRx?|?I?,?~?{?%v??p?g?]?Q?>D?F6?G%?&?R?>>cd>EC>Pp=h<-ǀ]n>!ʾ{񾸲 <%.=uK5Xdb>lwsy#}¡0:~zhu\KnpeZNK'A24!>UXԾ򒫾ǁ.ޟ$8"=:.>Pہ>>J1>/>M,?!?#2?&.A?N?#Z?zue?-On?ku?z?j;~?&??}?y? s?:l?b?X?K?=?.?w? ?>H>wg>mn>>ƺ=QhڽICzxhc(޾[%5sDfQ,]mgCpv{~IHR|Oxjrjh`UHK9 *-Nl 얾|X>>8>6>*?k!?*?9?$H? U?_`?j?*r?Kx?\|?I?&?e~?{?v?*?p?g?ɵ]?eQ?D?6?%?K?P?Z>>_>C>]=d< fnBd%ʾ-񾭴 @'.=Ku Xyb}?l.snyv}9~-zhuJnoeZGN%An2e!.< QETԾʫs.AJ8= D.>߁>>5>3>;.?O!?M2?/A?0N?XZ?ve?Pn?\lu?:z?;~?9?ɢ?̉}?0y?Ss?El?zb?YX?}K?}=?+.?)u? ?>jD>c>Xn>>=ڽtC|,޾]%5DQW]gcDpv^{~OH|;Oxrjg`bU/H9Q *NSB羣$薾{3Yf/~.=8>X>V̖><>` >&?J#?\*?9?%H?R U?``?j?r?Kx?|?I??,~?7{?v?\>p?g?]?Q?AD?6?%?e?6j?% >%޵>g[>C>(K=ҮM.>Y>n>9>7>)0?!?2?6A?N?Z?we?Pn?mu?z?;~?M??z}?y?s?El?3b?X?J|K?[|=?u.?Qs? ?ԧ>@>^>Bn>>=KڽCv#0޾_tl%g5pDQ]g$:p"v{~UfH|Nxrjf`U-H9*nWO㖾Z*YPA/o.=|>Y>Ж>> >"?)%?*?M9?i'H? U?a`?j?r?CLx?|?G??~?{?Lv?=p?g?s]?Q?óD?Y6?%?~?3h?B>ٵ>V>ÛC>8=<F~xnK-ʾiƝ k*.;=K XbIAlsyy}"=~zfuHnmeZN"A2ƾ!R8HKԾ «u,t.hC9*=sV.>>ճ> >>;>2?!?2?A?N?Z?xe?Qn?mu?+z?<<~?`??'}?&y?s?1Dl?b?X?zK?z=?.?zq? ?>;>+Z>,n>Q>P=ٽC􅌾5޾a[4% 5DhQ]g:pNv6{L~\9H4|Nx#rjxe`U,H}9*[7ߖ8!Yg/.=> Y>DՖ>T >>?'?*?9?(H? U?b`?j?rr?Lx?_|?G?j?~?_{?v?><>kR>C>&=>=c>;>KB>?>4?!?V2?GA?tN?cZ?ye?Rn?Znu?z?<~?s?i?Ԉ}?y?1s?KCl? b?X?ތK?7y=?.?o?# ?>7>U>n>>o=k᭼,ڽRCr 89޾cA%5nDQذ]g;pv{~b Hն|MxarjXd`U*H9*U)_羦ږY#..=>Y>ٖ>>>?(?*?9?R*H?4U?d`?j?4r?fMx?|?H?c?~?{?v?;p? g?]? Q?ŰD?5?c%??.d?/:> >y>lC>m=>>F>C>5?!?2? A?N?Z?vle?pSn?ou?z?<~??I?}?y?zs?dBl?b? X?sK?)=?R.?m?. ?y>@3>MQ>n>ا>]=",!ڽ~CdQ<m=޾e(%T5DQ]g!Y>1ޖ>>>?!?W*?9?+H?U?6e`?j?r?Mx?|?/H?]?Y~?O{?rv?";p? g?]?Q?GD?k5?%?ʵ?,b?5>>>C>=ϧ< ~4n'Y:ʾĢ񾥣 qZ.mz=zKXbClsy}dL<~FzmuQnxetZdNA 2X!2<?Ծ״遾X.>/:Lc=r.>l>>J>G>7?\!?2?X"A?5N?Z?me?Hn?ou?z?=~??)?/}?y?s?~Al?b?@ X?K?=?+.?k?9 ?[>.>L>zn>>aJ=vT4ڽCUصA޾g%5kDjQ.]g^=p'v{~G|dLxrjb` U'H9*%~іY.8/=>B(Y>>Q>$>??+*?9?;-H?U?Vf`?j?r?Nx?~|?\H?W? ~?{?Gv?S:p?g?Ǯ]?`Q?ȭD?5?%??)`?1>#>}>C>F=]>nū> O> L>9?+!?^2?#A?N?Z?ne?uIn?>gu? z?T=~?? ?܇}?y?s?@l?b? X?K?=?Z).?W?D ?<>*>oH>qn>^>7=FڽԢC`Z%ݵ. ޾iP%6DQY]g->pv{~I|Kxr,j`` UI&H9*#T =\͖XW.^/=>c1Y>>>N>??*?R9?.H?U?ug`?j?|r?Ox?ݷ|?H?Q?~?w{?v?Dp?g?]? Q?ID?"5? %??'^?->>}>C><=a;~Uzlu9PnveZNA2!.46Ծ &F. ~=X.>>ɫ>KS>P>;?!? 2?h%A?N?;Z?oe?OJn?gu?z?=~???}?y?Ws??l?b? X?3K?s=?'.?? ?>`&>D>hn>">%=H {YڽC^ᵾd޾8Pܾ%A6hDQ]g>pcv{X~$Ir|AKxWr:j_`R U$Hu9*!*辧9XQa.m/=>:Y>>>x>?? *?9?1H?bU?h`?j?>r?Ox?=|?H?J?~? {? v?Cp?g?q]?Q?ʪD?~5?F%??$\?Z)>h>y>bC>=mǰ<YnsfGʾ񾅩 v}.#=~KPXPb\:lsy }+z;~ݽzku_OnueiZ N.A 2!,~0C2ԾY܁<.fA=.>Ɓ>>W>0T>=?!?2?&A?VN?qZ?pe?*Kn?hu?z? :~??ɡ?6}?y?s?>l?b?~X?ɅK?=?%.??+ ?l>">?>_n>>r=Wlڽ+C\c嵾޾;R%6DlQ]g?pv{~+I|xRxrHj^`U`#H9E*S5gYж;.¨/=W>CY> >N$>>??h *?9?H?U?i`?j?r?=Px?|?H?D?s~?{?mv?Bp?g?F]?^Q?LD?5?%?0?"Z?$%> >u>7C>=|<&ɂ'nnjLʾ=z kx3.=7KXdbB;lsy_}4;~dz/kuNnte4ZN,AQ"2!*l,.Ծ<ׁ3.䮽 [8=.>ʁ>V>!>BX>??!?g2?y(A?N?Z?qe?Ln?X>#;>Vn>y>=~ڽWCg>굾޾=TH%6eDQڷ]g@pvb{~1dI|Qx:rVj]`U!H>9* 0 g^Y,./=>LY>>(>>?}?'*?$9?H?;U?m[`?vj?r?Px?|?I?=?:~?3{?v?'Bp?g?]?WQ?ͧD?55?%?I?X? >>p> C>=1<ۂgnQoMPʾ[o Cz .G=KXyb(ρ>>%>$>A?i!?2?*A?N?Z?re?Ln?iu?{z?:~??>?}?y?4s?LT>qs>Mn>kp>(=n쯼6ڽCWl޾@V%5DQ]ggAp=v{~78IT|VQxxrXjy\`pUv H9*< 羪,FUY;#/l/=#>UY>>,>> ?]?*?9? H?U?\`?hj?r?`Qx?[|?;I?7?~?{?2v?XAp?g?]?Q?ʺD?5?%?b?V?>O>l>C>=GӁ>$>*>(>)?8!? 2?+A?xN?Z?se?Mn?ju?z?:~???}?xy?~s?P>o>n>.g>ڂ=&7ʣڽCp9!޾CXj%R5DnQ0]g5Bpv:{>~> I|Pxrfjj`$UH9*\V(3%LY/9.="->_Y>o>K1> > ?<?*?[9?"H?U?]`?fj?Gr?Qx?|?gI?1?~?[{?v?@p?g?ŷ]?Q?KD?m6?)%?{?T?>>g>C>Z}=<Kz5Wnq;XʾY }V$.k=wKSXb=lsy}a:~z0iuKnqeZN^(AI2y!w?WB!Ծ Fʁ.𬮽PZe8=_4.>$؁>>N.>,>*?:!?o"2?-A?N?IZ?te?Nn?;ku?mz?8;~???Y}?y?s?2;l?Qb?{X?K?=?.?Kx?W ?>K>j>ηn>>ǂ=݁]ڽCSuWo%޾EZQ%5fDuQ[]gCpxv{w~DH|3Pxrtji`UHl9I *}X$CY//>.=s>)hY>>5>J>? ?d*?9?y#H?U?^`?Yj?r?Rx?|?I?*?~?{?v??p?g?]?UQ?̷D?6?%??R?O>> c>C>j=Q<J`n?a"ʾN  &.=KXb>lsy<}ˡ:~zhuKnpe\Z>N&A2!=S@WԾŁ.Rh8==.>܁>>2>0>,? !? 2?.A?8N?Z?ue?nOn?ku?z?;~?,?ߢ?}?y?s?L:l?mG>%f>n>G>=̰ڽCy)޾H\8f%5DQ]gCpv{~KH6|Ox1rjh`KU 0H9 *.羭F떾9Ypڀ/c.=>4X>\>9>t>?!?"*?9?$H?i U?_`?Kj?dr?KKx?y|?I?$?T~?{?Xv?>p?g?p]?Q?ND?$6?%??P?>6>^>^C>3X=!<`&Ō`inOD&ʾgC '.=LK Xb?ldsy}=~ zgu@Jnoe&ZNM%A2!;OSԾɫ=.Q9L =F.>->W>6>4>.?ٵ!?2?"A?N?Z?ve?HPn?lu?^z?;~????}?y?s?El?(b?X?H}K?v}=?.?t?m ?>"C>a>n> > =ڽ/CO~-޾J^-%?5dD"Q]#gDpv~{~QH׷|Oxnrjbg`U.H99*Y斾0Y,[/9.=>UX>͖>H>> >?#?*?-9?c&H? U? a`?=j?'r?Kx?|?I??~?{?v?>p?g?E]?Q?ϴD?6?1%?Լ?i? >ܵ>Z>3C>E=j<9vrnH*ʾf xx).!=K Xb@lsy} O=~z2gufInwneZ}N#AA2 !9KNԾ!ū-u0p)9=O.>>>;>8>0?!?{2?A?N?Z?we?#Qn?9mu?־z? <~?R??a}?y?gs?Dl?b?W?{K?{=?.?r?x ?>>>G]>n>>g=?bٽ[C͂p2޾M`%5DxQܮ]!ga:pQv{#~WXHw|NxrjBf`U"-H9 *Y▾'Y06/.=?>vY>!Җ>J>>?%?*?9?'H? U?,b`?/j?r?nLx?|?G??~?{?v?P=p?g?]?SQ?QD?5?j%??g?XA>zص>U>C> 3=q{n,MA/ʾ[ l/+.=!KW XbAlsy4}+ =~zouHnmmeZN="A27>$>O?><>2?x!?(2?3A?|N?Z?xe?Qn?mu?Oz?Q<~?e??}?y?s?Cl?b?X?szK?Rz=?<.?p? ?{>:>X>wn>>|=!ڽCJD6޾Ob%5aDQ]g0;p}vV{]~^,H|Mxrj"e`iU+H99*羰ݖY/.=>Y>֖> >>?'?_*?c9?L)H?L U?Lc`?!j?r?Mx?||?G?h?~?>{?v?>Q>܏C>x =&>>C>A>4?G!?2?A?N?Z?ke?Rn?nu?ǿz?<~?y?_?}?yy?s?Cl?b?bX?rK?x=?.?o? ?]>C6>jT>bn>T>j=ڽCY>ۖ>> >?v)?*?9?*H?U?ld`?j?nr?Mx?۶|?H?b?~?{?v?;p?g?İ]?Q?SD?5?%? ?c?8> >">C> =Dܭ@>>G> E>6?!?2?D!A?=N?Z?le?Hn?7ou?@z?<~????i}?y?Ds? Bl?b?" X?K?=?.?>m? ??>1>O>Ln>>xW=eBI'ڽ9CRյ>޾TfJ%5^DzQ]]g Y1./= >!Y>ߖ>G>7>~??*?9?6,H?U?e`?j?1r?#Nx?;|?4>>)C>P=<͖nyZ <ʾ; q.z=zKX1bADls/y-}^7<~"zmuQnxeZNA2θ!1~;=Ծ聾U.)VANi=t.>>X«>L>1I>t8?!?12?"A?N?,Z?me?Hn?fu?z?#=~???}?oy?s?:Al?b? X?K?=?*.?gk? ?!>->K>6xn>ۛ>D=9ڽdC8Wڵ: ޾Wh%v6ݳDQ]g=pWv{~G|9Lxrja` UO'H19*%@ 辳~ЖYܠ.C/=N>*Y>>>a>z??*?59?-H?.U?f`?j?r?Nx?|?iH?U?~?{?v?:p?g?n]?Q?VD?J5?M%?S?_?0>>'>C>G=FI>ƫ>OP>CM>b:?!?2?U$A?N?bZ?ne?In?pgu?z?i=~???Ç}?y?s?S@l?zb? X?2K?=?(.?˂? ?>c)>G>!on>>.2=׮pLڽC[r޵o ޾Yj%6\D&Q]gj>pv>{0~I|Kxrj``; U%H9=*)# 辱<̖X{.8i/=>4Y>s>>>v?o?o *?̿9?/H?yU?g`?j?r?EOx?|?H?O?~?W{?zv?TDp?g?C]?Q?׫D?5?%?l?]?N,>x>|>C>=<䨃nnWcDʾ:% IuI. ~=}KoXb Fl`s9y҉}ˢ8;~1zPluOnqveCZN/A02/!.Z3?5Ծ߁gC.w1츉= .>>$˫>T>UQ>P<?!?2?%A?_N?Z?oe?Jn?hu?5z?9~??ߡ?p}?ey?!s?m?l?fb?_ X?džK?=?!'.?? ?>%>B> fn>a>="_ڽC4`⵾޾Pm%6ڶD|Qݵ]g9?pv{i~&IV|Kxrj_`Ue$H9~*J!]8XQ1V./= >==Y>>D!>>r?N?. *?h9?H?U?h`?j?xr?Ox?Y|?H?H?~?{?v?Cp?\g?]?NQ?XD?5?%??[?(>>+x>C> =*<ngIʾY !w.=8KXb:lsy%}%e;~zkuOnhue ZN .A#2_!+,H/0ԾSہ3:.t'=J.>jǁ>@>X>gU>>>?T!?92?f'A?N?Z?pe?kKn?hu?z?5:~???}?y?ks?>l?Qb?X?\K?j=?k%.?? ?2> >?>>\n>$> =CmqڽCd-絾޾RGf%c6YDQ]g@p0v{~,I|MRxZrjc^`U"H_9*k  4CdY 0./=>^FY>`>%>>m?-? *?9?H?RU? j`?j?:r?hPx?|?H?B?b~?{?>v?Bp?^g?]?Q?ڨD?\5?%??Y?#>>s>{C>=sf<΂Ua#n4lJMʾw x.-=KXb;l sCyw} ;~@zjuCNn_teZWN,A!2]!=*6+,Ծ|ց0.<߮n.ij=.>ˁ>>">yY>,@?$!?2?(A? N?Z?qe?ELn?oiu?'z?{:~??U?ʆ}?[y?s?=l?OW>9>Sn>v>?=+ڽC0i뵾޾T.%6׹D(Q3]g@pv{~3WI|QxrjC]`XU|!H9* 羴/[Y) .7/=]>OY>>)> >i ? ?*?9?H?U?[`?j?r?Px?|?I?;?)~?{?v?Ap?ag?¹]?Q?[D?5?0%??W?>_>/o>PC>=sЁ> >'>%>B?!?2?v*A?N?:Z?re? Mn?ju?z?:~??5?}?֑y?s?S>r>Jn>m>=ڽ=CmﵾE޾V%*5VD~Q^] gAplv{~9+I8|*Qx>rj#\` U H(9B* o`+URYx //=&>XY>M>A.>3>e ??k*?:9? H?U?\`?j?r?Qx?w|?HI?5?~?{?v?Ap?cg?]?Q?XD?5?i%?ѩ?U?y>>j>%C>e=ѯ$Ծ ŕ. 7خ=-.>ԁ>s>R+>)>)?!?B!2?+A?N?oZ?te?Mn?ju?z?;~? ??}?Qy?Gs?;l?b?\X?K?=?I .?y? ?ص>N>m>/n>nd>Ԃ=iMRڽiC,rFz"޾X_%5YDQ] grBp v[{O~@Hظ|Px{rjkj`UH9 *E 'mIY5e/Y$.=/>aY>>2>]>a ??**?9?t"H?5U?^`?j?r?Rx?ֹ|?uI?/?~?;{?ev?L@p?fg?l]?EQ?ٸD?6?%??S?C>>4f>C>w=M< }Yn<^ʾ ~~$.=KXb:>l.sy}L:~ֻzhuKnCqe6Z5N'A2!>V}ف>ڤ>/>->+?IJ!?"2?-A?AN?Z?ue?Nn?mku?z?M;~???A}?y?s?:l?b?X?K?"=?.?w?ª ?>pJ>Bi>n>>O‚= ڽCv&޾Z&%t5ةDQ]gACpv{~FHy|Pxr,jKi`4UH9 *羷"hL@Y /I.=6>jY>:>6>>]? ?*?p9?#H?U?#_`?j?r?Jx?6|?I?(?}~?{?v?~?p?hg?A]?Q?ZD?L6?8%??~Q?>F>a>αC>>e=;8:=R@.>ށ>@>3>1>s-?!? 2?/A?N?Z?ve?On?lu? z?;~?2?բ?}?fy?s?:l?b?X?G~K?~=?.?u?ͨ ?>%F>d>n>>#=ⰼzڽC({*޾\ɰ%5WD2Q߬]gDpEv2{~LH|vOxr:j,h`U/HV9 * c閾+7Yu/o.=z>X>>>;>>Y?"?*? 9?]%H? U?B``?j?r?vKx?z|?I?"?C~?c{?)v?>p?jg?]?Q?ܵD?6?q%?)?{O?>ߵ>8]>C>R=<+lnE'ʾ -E(.=K5 Xb@lsy}=~zguIn1oeZtN$An2Q!;NQԾ8ȫ.)}49=I.>>>8>6>a/?c!?M2?A?N?Z?!we?Pn?lu?z?;~?E??}?y?s?tEl?b?X?|K?|=?&.?t?ئ ?~>A>d`>n>J>~=- ڽC_/޾^%5֬DQ ]ogDpv{~SxH|Nx4rHj g`U'.H9F*0${喾 .YifP/Y.=> Y>Ζ>?> >U?h$?f*?9?&H? U?ba`?j?ar?Lx?ٵ|?G?? ~?{?v?=p?mg?]?CQ?]D?6?%?C?i? >۵>X>wC>@='<>˜+unJ>,ʾ j).=#Ku X2b@lQsCy}:=~zfu$In(neZNP#A2!9J|MԾëHw.o\49u#=R.> > >S<> :>O1?2!?2? A?N?GZ?*xe?dQn?lmu?z? <~?X??H}?\y?0s?Dl?b?YW?q{K?l{=?o.?8r? ?_>=>[>ؙn> >ى=xٽC#O3޾`|%a5TDQ5]mg:pv {5~YKH[|SNxrrVje`RU,H#9r*Q(羺ᖾ$Y%+/.=>/ Y>vӖ>>>Q?G&?%*?B9?G(H?c U?b`?wj?#r?Lx?9|?G?l?~?{?v?=p?og?]?Q?߲D?^5?%?\?g?@>-׵>LC>-=p[<8QA~nN0ʾޘ l<.*=K XFbAlsȔyM}5<~hzpouJHnme^ZN!A2!,7}F>t>@>2>>=3?!?2?A?N?Z?3ye?>Rn?nu?sz?f<~?k?v?}?וy?zs?Cl?zb?CX?zK?y=?.?ap? ?A>F9>W>n>д>4w=9íڽC 7޾b}C%5ӯD4Q`]jgn;pvv{n~_H|Mxrdjd`U>+H9**,rfܖY/.=E>PY>ז> >!>M?&(?*?9?)H? U?c`?ij?r?+Mx?|?G?f?~?{?Pv?D>O> C>=5kBDԾ?{e.aIN9H=$e.>>ں>D>DB>+5?ѻ!?V2?1 A?FN?Z? le?Sn?nu?z?<~?~?V?}?Ry?s?Bl?eb?X?K?Hx=?.?n? ?#>4>S>n>>d= >ڽɌCOx;޾dc %5RDQ]hg<qY>cܖ>=>K>?*?*?y9?0+H?U?d`?[j?r?Mx?|?H?`?p~?z{?v?u;p?tg?k]?AQ?D?5?T%??b?7>D >̈>C>[=ƭ@Ծ끾G\.6T[M[=Xn.>>A>I>VF>7?!?2?!A?N?RZ?me?BHn?jou?cz?<~??6?P}?͔y?s?Al?Qb? X?K?9=?L.?l? ?>0>N>~n>W>Q=X,ڽCT׵?޾fJ%O5вDQ]fg =pv{~lG<|Lx*rjb`o UU(HR96*Y&d-辽Ӗ YZ.)/=>$Y>>>u>???b*?9?,H?EU?e`?Mj?kr?NNx?W|?IH?Y?7~?{?v?:p?vg?@]?Q?cD?q5?%??`?w3>>N>mC>=I{<(n[h=ʾ8Ф 'r_.]{=d{KMWbDl*sWyE}Y"<~zrmulQn4xeRZN.A 2D!b1G:|<Ծ76灾S.&$*5n=w.>>ë>TM>hJ>9?p!?2?A#A?N?Z?ne?In?fu?z?8=~???}?Hy?Ws?@l?f,>:J>un>>E?=`f?ڽ CXa۵{ ޾h1%6OD6Q]cg=pv{~Gݵ| Lxhrjma`$ U&H9w*z$h 辻?*ϖdY.O/=>-Y>Q>>>??6*?9?.H?U?g`??j?-r?Nx?|?vH?S?~?{?v?Dp?xg?]?Q?D?5?%?²?^?B/>>>BC>=0<͛n:`AʾVŦ s.|=|KXbkElsܖy}F;~zluPn+weZNA]2t!t/56;8Ծѭ⁾I.Kx=.>>ȫ>Q>zN>:??!?^2?$A?gN?Z?'oe?In?gu?z?~=~???}?Óy?s?@l?(b?A X?ƇK?=?U(.?>? ?Ȑ>(>E>lln>ݏ>,=QڽKC ]ߵ޾hO`%6εDQ ]ag>p#v_{A~!I}||KxrjM`` Uk%H9*"lg;CXgp.Wt/=U>6Y>>:>> ?? *?G9?/H?U?!h`?1j?r?qOx?|?H?M?~?6{?Kv?Dp?g?]?>Q?eD?(5?%?۰?\? +>+>R{>C>+=>ā>t̫>U>R><?!? 2?R&A?N?Z?0pe?Jn?Mhu?Yz?:~??֡?X}?>y?s?(?l?b? X?[K?=?&.?g? ?>#>\A>Vcn>>=8dڽwCa䵾޾kQ'%<6LDQ6]_gv?pv{{~(I9|Jxrj-_`U#H9* p7e9kYK./= >?Y>>>">> ?? *?9?H?'U?Ai`?#j?r?Px?u|?H?F?~?{?v?ICp?g?]?Q?D?5?7%??Z?&>>v>C>=皰ȁ>>Z>V>>?!?2?'A?(N?*Z?9qe?Kn?hu?һz?I:~???}?y?4s?B>l?b?X?K?=?$.?~? ?>><>@Zn>d}>U=!wڽC fz赾޾mSا%6˸D8Qa]\gE@p_v7{~.vIڹ|"Rx rj ^`AU"H9:*t 羾2bY=0%./=>IY>>&>>??r *?~9?H?U?`j`?j?tr?Px?ո|?H?@?Q~?_{?v?zBp?g?]?Q?hD?5?p%??X?">p>Wr>C>=0PǴ>>$>Z>@?!?g2?c)A?N?`Z?Cre?Ln?iu?Kz?:~??K?}?3y?~s?\=l?b?~X?K?`=?2#.?|? ?ڼ>V>~8>*Qn>'t>==ίڽCj쵾Q޾pUX%5IDQ]ZgApv{~5JI{|Qxrj\`U !HI9|*x [j.xXY&/W/= >7RY>+>7+>G> ??1*?9?H?U?\`?j?7r?%Qx?4|?)I?:?~?{?rv?Ap?g?i]?Q?dD?:5?%?'?V?m>>m>C>p=y<悽SmsJnqRʾϹ񾙮 \{!.7=zKXbс>\>V(>&>B?}!? 2?*A?N?Z?Lse?aMn?Lju?üz?:~??+?͊}?y?s?uQ>p>Hn>j> =HڽCo6񵾆޾sW%5MDQ]WgApv{'~;I|Pxrj[`UH9*| 1*OY/# .=d)>X[Y>>/>q> ?z?*?9?n!H?LU?9]`?j?r?Qx?|?UI?3?~?{?v?@p?g?>]?5Q?D?6?%?@?T?8>>[i>iC>܄=@Y"ԾЗ́.v8(8ޮ=0.>Qց>á>,>+>+*?L!?!2?t,A?JN?Z?Ute?;Nn?ju?sM>^l>zn>a>fς=cۮڽ$Cs#޾uY%L5˨DQ]UgBp9v{{`~BH|nPxBrjj`^U#H9 *?%񖾵FYrE/y/.=>ydY>>3>> ?Y?*?P9?"H?U?X^`?j?Sr?HRx?|?I?-?~?{?6v?@p?g?]?Q?gD?s6?w%?Y?R?>W>d>>C>Hr= p<2 \n> ʾ 񾃲 [%.[=OKXGb~>ldsےy}7:~zhusKnpeZNt'AI2e!P>UXԾiǁ.ء58)=9.>ځ>)>0>!/>,?N!?o#2?-A?N?Z?^ue?On?ku?z?b;~?$??(}?×y?s?:l?b?X?FK?=?.?2w?- ?>)I>g>dn>>=coڽOCx'޾x[s%5JDAQ ]Rg~Cpv{~HH]|Oxrjh`UHw9? *`m!햾=Y. /T.=>X>>48>>?8!?n*?9?W$H?U?x_`?j?r?Kx?R|?I?&?l~?{?v?@?p?g?]?Q?D?6?%?s?P?>>_`>C>_=S%< enB$ʾx '.=KS X[bd?ls`ym}ޡ9~:z!huJnoeZlN%A2!c<|QTԾN˫Ám .;8=C.>Z߁>>5>33>.?!? 2?/A? N?7Z?gve?On?Jlu?-z?;~?7?̢?Չ}?>y?gs?Fl?b?{X?}K?~=?Y.?[u?7 ?b>D>c>Nn>>=ڽ{C~|O&,޾z]Zu%5ɫDQ8]gMDptvS{~NH|KOxrjg`U-/Hܿ9 *薾s4Yj/#z.=<>X>˖><>>?#?-*?9?%H?/ U?``?j?r?Kx?|?I? ?2~?B{?v?r>p?g?]?3Q?jD?*6?%??N? >޵>[>C>!M=ڮ<|1FnnF:)ʾۑ񾜛 (.~=$K XpbK@lsy}l=~zwguInnemZ Nd$A2!u:jMxPԾƫt9.|V9d=DL.>>>W9>E7>/?!?2? A?kN?mZ?pwe?Pn?lu?z?;~?K??}?y?s?/El?Pb?:X?p|K?|=?.?s?B ?C>@>_>9n>>= DڽC[0޾}_@<%:5HDQc]g:pv{ ~UkH|Nxrjf`:U-HD9*'䖾R+YFE/x.=>Y>TЖ>> >?$?*?"9?A'H?z U?a`?j?r?3Lx?|?G??~?{?\v?=p?!g?]?Q?D?6?"%??jh?b >>ڵ>cW>C>:=䏮c>]>=>W;>1?!?{2?A?N?Z?yxe?Qn?mu?z?5<~?^??0}?4y?s?IDl?I<>Z>#n>L>K=ŎٽCz 4޾a'%5ƮDDQ]g:p=v*{F~[>H>|(Nx8rje`UD,H9*_pߖ1"Yc/.=> Y>Ԗ> >4>?&?*?9?(H? U?b`?j?]r?Lx?U|?G?j?~?j{?v?>յ>R>C>'=-E<~Dz=ou HnleZJNS!A2(!6FEGԾkk.sVge9;=^.>>÷>A>i?>3?!?(2?A?NN?BZ?ye?Rn?Hnu?z?{<~?q?l?݈}?y?Ds?cCl?'b?X?K?by=?6.?o?X ?>7>4V>n>>q=|٭3 ڽYCh 8޾c%5EDQ]g;pv{~aH߶|Mxurjwd`U*H9.*)59ۖY.".=>Y>Aٖ>3>^>?(?i*?X9?**H?U?c`?j? r?VMx?|?G?d?~?{?!v?U >gN>eC>f=ul>*>F>{C>5?[!?2? A?N?xZ?Zle?YSn?nu?z?<~??L?}?*y?s?}Bl?b? X?K?T=?.?m?c ?>3>Q>n>Ө>_=4$ڽCP<޾e%'5ıDQ]gz)Y>ݖ>>>?*?(*?9?+H?]U?e`?j?r?Mx?|?*H?^?_~?Z{?v?8;p?(g?]?Q?oD?5?%??bb?l6>>u>9C>=<|9!nXd:ʾTp p+.Cz=ezKXbClsy }~fT<~SzmuRnxeZNBA82!2#=w?ԾNbꁾY.811Pa=q.>>>XJ>G>7?+!?2?."A?N?Z?dme?Hn?ou?z?=~??,?7}?y?s?Al?b?b X?/K?‹=??+.?&l?n ?˗>j/>WM>{n>>\L=n[2ڽChUPص0A޾gۺY%5BDFQ]gH=pv{~G |sLxr8j7b` U'H9*%sLҖY.4/=>J'Y>.>>>??*?9?-H?U?7f`?j?r?yNx?t|?WH?X?&~?{?Wv?i:p?*g?]?Q?D?5?%??``?72>>>C>>=eʾre r.{={KWbDl`sy^}S <~۾z?mu+QnweZ)NA2!097;Ծ谫偾TP.*ft=)->v>ī>N>K>9?!?12?#A?pN?Z?mne?]In?,gu?z?M=~?? ?}? y?!s?@l?b?" X?ĈK?0=?).??y ?>+>H>rn>Y>9=DڽۡCYܵ ޾i¼ %p6DQ:]g>pv{~I|Kx.rFja` Uq&H<9*# q>͖XS."Z/=>k0Y>>0>>??*?*9?.H?U?Wg`?j?gr? Ox?ӷ|?H?Q?~?{?v?Dp?-g?]?.Q?rD?O5?>%?1?]^?.><>z~>C>5=O<[LnaBʾZ t.g}=;}KXbElsy}@;~bzluPPnveZN1A2!.46ԾXၾ G. v=].>>]ɫ>R>O>;?!?2??%A?N?Z?voe?8Jn?gu?z?=~???}?y?ks??l?b? X?ZK?=?'.??U ?>&>yD>in>>'=ZWڽCd^ ᵾ޾P%6@DQe]g>pRv{R~#I||PKxkrTj_`u U$H93* ":XGe.w/=>9Y>>>>??z *?9?/H??U?wh`?yj?)r?Ox?2|?H?K?~?{?v?Cp?g?]?Q?D?5?v%?J?[\?)>>y>[C>=\ϰ<bneDGʾO bvN.~=~K.X2bC:lsy}ޢ-;~zkuvOnueZEN.A0 2!,02Ծ܁=.`0=.>Ł>x>W>S>v=?!?2?&A?1N?PZ?pe?Kn?hu?}z?:~??̡??}?y?s?>l?b?X?K? =?&.??` ?>"> @>`n>>l=Ojڽ2Cbj嵾'޾R%6DHQ]g?pv{~*I|Rxrbj^`*U#H9t*- q5hY˷?.̤/=[>BY>>#>1>?k?9 *?]9?~H?U?i`?kj?r?.Px?|?H?D?z~?{?~v? Cp?g?f]?Q?tD?5?%?c?XZ?%>>~u>0C>=<,ǂ,wnijKʾͲD 9x.=KoXGb);ls yV};;~qzAkuNnteUZN!-A"2K!+,w.ԾO؁4.殽j?=.>ʁ>ߕ>!>W>d??h!?92?P(A?N?Z?qe?Kn?*iu?z?^:~???}?y?s?=l?b?_X?K?z=?f$.?~?k ?> Y>;>Wn>z>=ə|ڽ^C_g鵾\޾Ti%^6=DQ]g@pvW{~0iI|Qxrpj]`U"Hj9*N Gt1__Yz-.!/=>KY> >-(>[>?K? *?9?H?U?j`?]j?r?Px?|? I?>?@~?>{?v?=Bp?g?;]?{Q?D?a5?%?|?VX?a!>#>q>C>z=9<قfnnOʾ: z .={KX[b΁>E>Z%>"$>RA?8!?2?)A?N?Z?re?Ln?iu?oz?:~??B?}? y?Hs?=l?b?X?K?=?".?,|?v ?>T>s>uNn>fq>"=䯼=ڽCk%޾ VP%5DQ]gQAp,v{~7=I^|eQxr}j\`U H9*n  -#>VY7$/v/=">TY>>,>> ?*?*?9?h H?cU?n\`?Oj?pr?PQx?Q|?6I?8?~?{?Cv?nAp?g?]?%Q?D?5?!%??SV?,>>l>C>=6%Ӂ>>)>4(>(?!? 2?`+A?RN?Z?se?Mn?~ju?z?:~??"?}?y?s?1vP>{o>n>)h>}܂=7/ѡڽC[p ޾ X7%%5DJQ]gBpv/{8~=I|Pxrjx[`GU)H398*(MY{/C.=',>^Y>>0>> ? ?u*?/9?!H?U?]`?Mj?3r?Qx?|?cI?1?~?f{?v?@p?g?]?Q?tD?6?Y%??QT?>h>h>C>S=~<Py>Vn:nXʾ'$ }'$.A=PK1Xb=ls~y}h:~zCiu LnqeZN(Aw2!?iX!Ծʁ.ꮮ|U8=e3.>ׁ>>->F,>*? !?A"2?,A?N?(Z?te?|Nn?)ku?`z?1;~???b}? y?s?J;l?nb?X?DK?Ā=?C.?}x? ?d>,L> k>Ÿn>>ɂ=ydڽCt$޾Zn%5=DQQ;]gBphv{q~DH|BPxrji`UH9y *w$6CY&/:.=w>1gY>l>*5>>??4*?9?R#H?U?^`??j?r?sRx?|?I?+?~?{?v??p?g?]?yQ?D?6?%?Ȧ?NR?> >c>C>l=Y<T_ng?!ʾE %.҆=KrXb>lsy3}ȡ":~zhu2Knpe}ZcN&A2!=WTWԾ=Ɓ.L2z8=<.>.܁>y>2>X0>,?س!? 2?q.A?N?^Z?ue?WOn?ku?ؽz?w;~?*??}?y?s?d:l?Zb?\X?~K?2=?.?v? ?F>G>f>n>B>=İڽ CWy>2)޾\5%n5DQf]gCpv{~JH@|OxErjh`nU?H9 *# 떾:Ykф/_.=>>~9>>?!?*?f9?$H?F U?_`?1j?Pr?;Kx?o|?I?$?Z~?{?iv??p?g?]?#Q?vD?Q6?)%??KP?>>_>WC>,Z=>૫>[6>j4>.?!?2?A?sN?Z?ve?1Pn?}lu?Qz?;~?=?¢?}?y?0s?El?Eb?X?o}K?}=?.?t? ?(>C>/b>n>>=]ڽ6C}g-޾^%5;DQ]gDpvs{~PH| Oxrjg`#U.Ha9*uI疾1Y(|_/B.=>]X>1͖>=>, >?#?*?9?;&H? U?``?#j?r?Kx?|?I??!~?"{?v?4>p?g?d]?Q?D?6?a%??i?V >Nݵ>Z>,C>G=XĮ< 7qnEH*ʾ1 EJ).=K Xb@ls yه}W=~zDgu}InneZN#An2=!94L4OԾū{-wx%9=O.>7>F>:>{8>0?w!?M2?A?N?Z?we? Qn?'mu?ɾz?<~?P??j}?y?zs?Dl?b?W?|K?|=?!.?r? ? >L?>]>n>>b=QZڽaCS1޾`ѳ%5DTQ]gK:pAv{~W]H|Nxrj`f`UI-H9<*Kz▾(Y':/.=C>~Y>і>>V>?%?q*?9?'H? U?b`?j?r?_Lx?|?G??~?{?-v?f=p?g?:]?wQ?yD?6?%?!?g?A>ص> V>C>5=y>>>><>v2?F!?2? A?WN?iZ?xe?Qn?mu?Bz?I<~?c??}? y?s?Dl?b?X?zK?|z=?j.?q? ?>;>QY>nn>>~=)ڽCІW5޾b%\58DQ]g;plvK{W~]0H"|MxrjAe`U+H.9h*3!&[ޖxY/.=>Y>֖>( >r>?d'?/*?79?%)H?( U?.c`?j?r?Lx?r|?G?i?~?J{?v?e>Q>ՐC>q"=.@>>C>@>d4?!?2?A?N?Z?ke?Rn?{nu?z?<~?w?c?Ĉ}?y?s?Cl?b?X?K?x=?.?Ho?á ?͞>6>T>Yn>O>l=ﭼڽCN :޾dR%5DQ]g;p v{~cH¶|kMx<rj!d`AU`*H9*(ٖWY\|.B.=>Y>ږ>}>>L?C)?*?9?*H?tU?Md`?j?Zr?Mx?Ѷ|? H?b?~?{?v?;p?g?]?Q?|D?5? %?T?c?`9> >>C>=2mjS=j.>>z>\G>D>R6?!?V2?!A?N?Z?le?Gn?%ou?3z?<~??C?r}?y?Ws?8Bl?b?D X?-K?܌=?.?pm?Ο ?>m2>sP>Cn>>sY=w:P%ڽ@C@R<>޾f%56DVQ=]g Y> ߖ>>>H?}?*?n9?,H?U?me`?j?r?Nx?1|?7H?\?N~?:{?Tv?:p?g?]?uQ?D?5?E%?m?a?+5>>>"C>I={<֕nZ;ʾ hq.z=zKXb(Dls!y$}`?<~/zmuQnxeZ NA2!)2;3>Ծ 遾V.+ETg=s.>J>>K>H>@8?!?2?"A?xN? Z?me?Hn?fu?z?=~??#?}?~y?s?RAl?b? X?ÉK?J=?*.?k?ٝ ?>".>L>-yn>֜>F=.7ڽkCVٵqB޾ hl%I6DQh]g=pFv{~G|HLxrja` Uv'H]9,*;%5 )ЖYҤ.?/=R>*Y>>&>>D?]?*? 9?-H? U?f`?j?r?Nx?|?dH?V?~?{?(v?,:p?g?]?Q?D?v5?}%??_?0>M>>C>@=N>Fƫ>O>L>.:?!?2?+$A?N?AZ?ne?In?^gu?$z?b=~???̇}?y?s?l@l?b? X?XK?=?).?? ?r>)>G>pn>>)4=ϮwJڽC<[ݵ ޾#jS%63DQ]gT>pv3{*~I|Kxrj``^ U&H9m*\#9 '=̖X}.Ae/=>$3Y>>z>>@?<?@ *?9?.H?VU?g`?j?r?6Ox?|?H?O?~?b{?v?jDp?g?c]?Q?D?5?%??]?,>>#}>C>=<馃snbADʾ˫ u.}=}KMXpbElMs+yɉ}Ǣ:;~>zbluPnvedZ=N/A]2`!M.35Ծ1bD.q=.>k>ʫ>T>P><?T!?^2?%A?9N?wZ?oe?yJn?hu?)z?=~???y}?sy?4s??l?b? X?K?&=?P'.?%? ?T>%>'C>gn>\>!= ]ڽ­C_Y⵾2޾P9o%6DXQ]g#?pv{c~%I`|%Kx1r j_` U$H&9*}!=^82XM(Z./= >Ep> >D><?? *?<9?yH?U?h`?j?cr?Ox?O|?H?I?~?{?v?Cp?wg?8]?rQ?D?-5?%??[?(>>x>C>=<nMgHʾ v.p=KXb:lsy}'l;~ƽzku5Onue.ZN4.A#2!_,/s1Ծ˦{ہ-;.(쩸-=P.>Ɓ>Ȓ>\X>T> >?#!? 2?<'A?N?Z?pe?TKn?hu?z?-:~??á?&}?y?~s?>l?nb?AX?K?=?%.?N?˲ ?>C!>>>]n>>=TeoڽC8d浾h޾R6%660DQ]g?pv {~,I|]Rxorj^`U#H9*A4~4eY 4./=>fEY>>#%>n>8?? *?9?H?/U?i`?j?&r?YPx?|?H?C?h~?{?Ov?Bp?yg? ]?Q?D?5?(%?ҭ?Y?V$>4>'t>uC>=an<̂Z`,nkLʾګ x.=|KXbn;ls5yo}&;~MzkuZNn{teZ|N,A!2!q*+2-Ծdց1.6ᮽ`>˱=.>tˁ>/>^"> Y>??!?2?(A?N?Z?qe?.Ln?]iu?z?s:~???ӆ}?iy?s?=l?Zb?X?K?=?#.?w}?ְ ?>W>I:>Tn>w>9= 2ڽCh뵾޾T%6DQ]g@pvw{~2\I|Qxr'jb]`|U!H90*E  *0E\Y*}.A/=b>NY>]>w)>>3 ??}*?s9?bH?zU?[`?j?r?Px?|?I?<?/~?{?v?Ap?|g?]?Q?D?5?`%??W? >>o>IC>=#<_߂iFn*p Qʾ%ϭ z=!.=KXbTρ>>&>X%>A?!?g2?M*A?[N?Z?re?Mn?ju?z?:~??8?}?y?s?yS>r>Kn>n>=ƔڽDC4mrﵾ޾Vg%5-DZQ>]gAp[v{~9/IB|:QxRr)jB\`0U. HT9q*J +SYt!//=%>WY>>->>/ ??<*?9? H?U?\`?j?r?|Qx?m|?CI?6?~?{?v?1Ap?~g?]?Q?D??5?%??U?>x>+k>C>^=د<rOn7jUʾCį u|".&=RKPXb;=lds y}G:~\ziuLnireZN)A2!A#$Ծ́.?7׮=,.>}ԁ>>*>j)>c)?!?!2?+A?N?OZ?se?Mn?ju? z?;~? ??}?_y?[s?;l?1b?~X?CK?ށ=?w .?y? ?H>/O>)n>%n>ie>ւ=zEZڽpCq"޾XȬ.%51DQi]g]BpvO{I~?I|Pxr7jj`UH9 *N羁'XeJY0[/b .=.>`Y>J> 2>>+ ??*?9?L"H?U?]`?j?r? Rx?̹|?pI?/?~?F{?vv?b@p?g?]?iQ?D?6?%??S?>>f>C>y=;<|XnK<ʾa񾹱 L~$.=KXb!>lsy}T:~ziuKn_qeVZ[N(A2!!?3Wr Ծ1iɁZ.^8=#6.>ف>b>/>|->Q+?!?"2?]-A?N?Z?te?Nn?[ku?z?F;~???I}?y?s?;l?b?=X?K?M=?.?w? ?*>J>i>n>>JĂ=2ڽC0v.=&޾Z%G5DQ]g+Cpv{~EH|PxrEjji`WUEH9 *!R-#DAY/E.=:>iY>>t6>>'?w ?*?E9?#H?]U?_`?j?r?Jx?,|?I?)?~?{?v??p?g?a]?Q?D?x6?h%?7?Q?>>0b>DzC>7g=CX>7>:>@>#?V"?x*?9?6%H? U?$``?yj?r?gKx?p|?I?"?I~?n{?:v?>p?g?6]?Q?D?6?%?]?O?K>_>]>C>T=<)kn(E~'ʾ1њ (.܈=K Xb?lsy}=~zguJnMoeZN%A2!<;O0RԾȫ_.#$= 9=H.> >/>7>5>-/?2!? 2?nA?N?Z?we?rPn?lu?uz?;~?C??}?y?s?El?b?X?}K?)}=?T.?Bt? ?>PB>`>n>E>y=%ڽC+.޾^|%5DcQ]TgDpv{~R}Hķ|NxIrbj*g`UO.H9v*cZ8羄喾/Ye\T/b.=>X>Ζ>?>j >?5$?7*?{9?&H? U?Da`?kj?Lr?Kx?ϵ|?G??~?{?v?=p?g? ]?gQ?D?/6?%?v?:i? >ܵ>4Y>pC>B=<<Ǘ4tnI+ʾOƜ j).n=KS Xb@l=s5y}B=~zgu>>;>9>1?!?2?A?_N?&Z?xe?LQn?Ymu?z?<~?V??Q}?jy?Ds?Dl?b?{W?{K?{=?.?jr? ?ϥ>>>n\>Ϛn>>ԋ=pٽCF2޾`bK%55,DQ]Rg:ppv{.~XPHe|cNxrpj f`uU,HO9*^0~ᖾ%Y!//.=>7Y>Җ>>>?&?*?9?(H?@ U?db`?]j?r?Lx?/|?G?m?~?{?v?(=p?g?]?Q?D?5?%??7g?@>׵>T>EC>|/=^c<>OJ}nN0ʾn񾻞 nl+.=gK X)bAlsyD}1<~uzouaHn;meZN!AA2!`7FIԾ⿫>o.^U94=Z.>>> @>=> 3?ѹ!?{2?~A?N?Z?ye?'Rn?nu?fz?^<~?i?y?}?y?s?Cl?b?eX?-zK?z=?.?p?# ?>9>W>n>˵>/y=KڽC' 7޾bI%5DQ@]OgX;pvk{h~_#H|Mxr~jd`)Uf+H9*J*bݖY / .=J>XY>sז>s >>?'?*?9?)H? U?c`?Oj?r?Mx?|?G?g?~?*{?`v?Z>8P>C>=bBls?y}Q<~znu8Sn1leIZxNi A2!r5BoEԾ|vf.[KV{9F=*d.>>c>`D>A>4?!?(2? A? N?Z?ke?Sn?nu?޿z?<~?|?Y?}?`y?s?Bl?b?%X?,K?rx=?1.?n?. ?>p5>S>n>>f=EڽЋCOH;޾d0%~5)DfQk]Mg&yY>ۖ>>>?)?s*?M9? +H?U?d`?Aj?r?Mx?|?H?`?v~?{?v?;p?g?]?eQ? D?B5?%?ö?2c?8> >F>C>T =ͭ/AԾ5쁾A].8bK_SY=^m.>>ɾ>H>E>6?o!?2?!A?N?1Z?le?+Hn?Xou?Wz?<~??9?Y}?۔y?!s?Al?nb? X?K?d=?{.?l?8 ?u>&1>!O>n>R>S=P*ڽCSֵ}?޾f%"5DQ]Kg#Y>a>>>? ?2*?9?},H?"U?e`?3j?Vr?>Nx?M|?EH?Z?=~?{?v?:p?g?`]?Q?D?5?%?ܴ?0a?3>]>Ȅ>fC>=8<-nS[<ʾȤ񾛤 q1.2{=={KVXfbmDlsIy=}[*<~ zmuQnPxesZNXA82u!1:<Ծ灾 T. &9l=v.>>0ë>L>I>8??!?2?#A?N?gZ?ne?In?fu?z?0=~???}?Vy?ks? Al?Zb? X?WK?Ҋ=?:*.? k?C ?V>,>J>xvn>>?A=qm=ڽ'CXڵ ޾hh%6&DQ]Hg=puv{~G|Lx}rja`G U'H9*$t 1@ϖ\Y. K/=>,Y>>p>.>??*?9?-H?mU?f`?%j?r?Nx?|?qH?T?~?{?v?Dp?g?5]?Q? D?5?%??-_?/>>J>;C>=8<ҙn_>Aʾ񾐦 s.|=|KlX{bSElsΖy}H;~zluPnGwe=Z4NA2!/68ԾH,まJ.~=.>'>ǫ> Q> N>:?!?12?$A?BN?Z? oe?In?gu?Ժz?v=~???}?ѓy?s?'@l?Eb?c X?K?@=?(.?p?N ?8>(>DF>cmn>ؐ>.=)殼PڽRC\Hߵ>޾2O/%k6DhQ]Fg>pvS{;~!I|Kxrjl`` U%HG9*"J;T;X]t.ap/=Y>5Y>N>>X>?? *?9?g/H?U?h`?j?r?aOx? |?H?M?~?B{?\v?-Dp?g? ]?cQ?D?T5?.%??+]?+>>{>C>#=veZNH/A 2ִ!-2o4Ծ⩫ށA.c޸= .>Á>˫>`U>R><?!?2?)&A?N?Z?pe?Jn?;hu?Lz?9~??١?`}?Ly?s?A?l?1b?" X?K?=?&.??+ ?>F$>A>Mdn>>=0bڽ~Ca㵾s޾4Q%6$DQ]Dg`?pv{t~'IC|JxrjL_`U$H9)*  辈71lYO./= >>Y>>">>?? *?9?H?U?"i`? j?r?Ox?k|?H?G?~?{?v?^Cp?+g?ޫ]? Q?D?5?g%?(?([?J'>D>Nw>C>=֢Hȁ>>Y>/V>>?!?2?'A?N? Z?qe?Kn?hu?Żz?B:~??? }?ǒy?Hs?[>l?b?X?K?=?%.?~?6 ?h>>f=>7[n>_~>P ={(uڽCe赾޾7S`%6DQB]Ag/@pNv+{~.{I|1Rx5rj,^`dU"H9j* 43gcY91). /=>HY>;>m&>>??C *?R9?]H?U?Bj`?j?`r?Px?˸|?H?A?W~?j{? v?Bp?.g?]?Q?D? 5?%?A?&Y?#>>r>C>=X́>~>#>@Z>@?|!?92?9)A?cN??Z?&re?oLn?iu?>z?:~??O?}?Ay?s?t=l?b?X?K?=?a#.?|?A ?J>|V>8>!Rn>"u>=OƯڽC ja쵾޾9U'%5!DjQl]?g@pv{~4OI|Qxrj ]`U4!Hu9*0 .YY'0`/=$>?QY>>*>> ?h?*?9?H?U?[`?j?"r?Qx?*|?$I?:?~?{?v?Ap?0g?]?Q?D?g5?%?Z?#W?>>Sn>C>i=g <䂽Xl|In|qgRʾ_d *{!. =SKoXbQс>圫>'>&>yB?L!?2?*A?N?uZ?0se?JMn?:ju?z?:~??/?֊}?y?s?2R>Eq> In>k>=OڽCn޾`ZY>(>/>> ?G?*?9?F!H?)U?]`?j?r?Qx?|?QI?4?~?{?v?@p?3g?^]?YQ?D?5?%?t? U?>+>i>cC>Ն=¯Ձ>K>#,>*>)?!?!2?J,A?$N?Z?9te?$Nn?ju?/z?;~???}?Vy?$s?;l?b?X?׀K?g=?.?;y?W ?>M>l>pn>b>aт=[ڽ+CsI#޾?YY% 5DQº]:gBp(vo{Z~AHƸ|}PxVrj4j`UKH>9- *rx7&򖾭GYncY>>j3>*> ?&?*?$9?"H?tU?:^`?j?>r?8Rx?|?}I?-?~?&{?Gv?%@p?5g?3]?Q?D?6?J%??S?u>>We>7C>At=w<7 ~[n=0 ʾN ~,%.0=(KX)bf>lQs͒y}?:~zhuKnqeZN'Aw2!>UlYԾᓫȁ.ң%G8/=8.>[ځ>>c0>.>+?!?A#2?-A?N?Z?Bue?Nn?ku?z?[;~?"??1}?їy?0s?:l?b?X?lK?=?>.?dw?b ?>I>hh>[n>>=uvڽVCw{~'޾A[?}%5"DQ]8ghCpv{~GHg|Oxrji`UH9n *N!햾>Y* /P.=>lY>>7>T>?!?>*?9?0$H?U?Z_`?j?r?Kx?H|?I?'?r~?{?v?V?p?7g?]?Q?D?6?%??Q??>p>`> C>a=A-<dn B{$ʾMC &.‡=K1 X>bL?lsRyd}ۡ9~Gz3huJnpeZN&A2!<Q,UԾ˫Áh .48=B.>ށ>>4>2>-?!? 2?[/A?N?Z?Kve?On?8lu? z?;~?5?Ϣ?މ}?Ly?zs?.Fl?b?X?~K?C~=?.?u?m ?Ҭ>SE>c>En>>=, ڽC|+޾D]&D%i5DsQ]g7DpcvG{~NH|ZOxr jg`UU/H9 *$美閾k5Yn/,v.=A>X>><>~>?"?*?[9?%H? U?z``?j?r?Kx?|?I? ?8~?N{? v?>p?:g?ݴ]?WQ?D?W6?%?̽?O? >ߵ>[\>C>O=d>>8>6>/?!?2?A?EN?LZ?Twe?Pn?lu?z?;~?I??}?ǖy?s?HEl?mb?\X?|K?|=?.?s?x ?>A>_>0n>>똃=<ڽC6/޾F_  % 5DQC]g9pv{~ToH|Nxrjf`]U-Hp9*:䖾J,Y=I/.=>Y>ϖ>g@> >?$?*?9?'H?W U?a`?j?r?$Lx?|?G??~?{?mv?=p?ڵ>W>C><=җ<'BvnJ-ʾ\ #kO*.=hK XgbAlts\y }-=~zfuHnmeXZN#An2(!8ILԾ«j v.k.;9'=T.>>岫>$=>:>1?!?M2?kA?N?Z?]xe?Qn?mu?z?-<~?\??9}?By?s?bDl?Yb?GX?,{K?{=?.?q? ?><>[>n>G>F=׆ٽC4޾Ia%5DQn]g:p,v{@~ZCHH|7NxMr(je`Uk,H9*))#Y^#/.=> Y>QԖ>h >>?&?{*?9?(H? U?b`?j?Ir?Lx?K|?G?k?~?v{?v?g?]?Q?D?5?%??f?I?>Wֵ>_S>C>)=Mm>L>dA>>>3?[!?2?A?)N?"Z?fye?hRn?6nu?z?s<~?o?p?}?y?Ws?{Cl?Eb?X?+K?y=?e.?p? ?w>s8>V>n> >s=ѭ; ڽ`C~ S8޾Kcڶ%V5DvQ]g;pv{y~aH|Mxr6jd`U*H99^*)羑ۖY.,.= >Y>ؖ> >>?(?:*?-9?*H? U?c`?j? r?GMx?|?G?e?~? {?1v? >N>^C>_=cK4XbBlsfy}[{<~ؿznuRnkeZNA2!4A+DԾ,ac.EyBL=f.>>>E> C>5?*!?2?| A?N?XZ?>le?BSn?nu?z?<~??P?}?8y?s?Bl?0b? X?K?~=?.?/n? ?Y>)4>>R>n>Ω>`=FڽCpPO<޾Nea%5DQı]gd1Y>>ݖ>>>z?a*?*?9?x+H?9U?d`?j?r?Mx? |?%H?^?e~?e{?v?N;p?Cg?1]?Q?D?5?%?2?b?6>n >>3C>=<z>*n6X9ʾ; p.z=?zKuXbClsy}{h[<~`zmuRn yeZNkAf2!2=?ԾƵꁾZ.236)T_=p.>v>>I>G>x7?!?V2?"A?N?Z?Gme?lHn?ou?{z?<~??0?@}?y?s?Al?b? X?UK?=?m+.?Xl? ?;>/>M>|n>>VN=fb0ڽCT׵@޾Pg)%5D"Q]g2=pv{~mG*|LxrRjVb`0 U (H9*%`ҖY.0/=>R&Y>>f>A>v??*?c9?,H?U?f`?{j?r?jNx?j|?RH?X?,~?{?hv?:p?Eg?]?Q?D? 5?5%?K?`?2>>q>C>7=l<{@n\:>ʾ0 r.{={KWbDlMspyU}U<~zQmuBQnxeZNNA2!19;Ծ_X恾NQ. W.lr=/->>ī>$N>0K>f9?ɿ!?2?#A?KN?Z?Qne?FIn?gu?z?E=~???}?.y?4s?@l?b?D X?K?Z=?).?? ?>+>`I>sn>T>;=BڽClY8ܵJ ޾Si%D6DxQ]g>pv{~Gʵ|KxCr_j6a` U&Hg9!*$6 >OΖXO.+V/=>s/Y>,>>k>r?z?*?9?a.H?U?8g`?mj?Rr?Nx?ɷ|?H?R?~?{?v?Dp?Hg?ۭ]?SQ?D?|5?n%?d?^?t.>>~>C>.=="<`UnaBʾ!% Yti.<}=}KXbElsy}B;~ozlugPnveZNZA 2!/m5k7ԾၾH. ym =c.>>ȫ>dR>BO>T;?!?2?%A?N?Z?Zoe?!Jn?gu?z?=~???}?y?~s??l?b? X?K?Ɉ=?(.?? ?>I'>D>jn>> )=lUڽC]ൾ޾Ou%6DQE]g>pBvs{L~#Ik|`Kxrmj`` U$%H9b*?"  辒:X >i.{/=>8Y>>>>n?Y?J *?9?/H?U?Xh`?_j?r?Ox?(|?H?L?~?"{?-v?Cp?g?]?Q?D?5?%?~?\?>*>U>vz>TC>=Jװ<kneFʾ? 0v .~=~K Xb+:lszy}ڢ/;~zkuOnueZkN.A] 2L!'-\1*3ԾO݁>.Y4ȸ= .>Ł>>V>SS>B=?h!?^2?&A? N?0Z?cpe?Jn?nhu?pz?:~??С?H}?$y?s?>l?b?X?K?7=?K&.? ? ?L>">@>an>ۄ>g=#Ghڽ9Cgb䵾޾QO~%6D$Qp]g?pv{~)I'|Jxr{j^`MU#H19*` >6xiYǸC.֠/=_>AY>>c#>>j?9? *?19?WH?gU?xi`?Qj?r?Px?|?H?E?~?{?v?!Cp?g?]?Q?D?35?%??Z? &>>u>)C>=<1ł1niKʾ] x.`=KMX)b;lsyM}B;~~zSkuNnteuZ NJ-A"2|!9+J-.Ծ,؁5.讽zE=.>Ɂ>g> >eW>0??7!? 2?&(A?lN?eZ?lqe?Kn?iu?z?W:~???}?y?s?>l?b?X?K?=?$.?5~? ?.>><>Xn>{>=ڑzڽdCfQ鵾޾S6%16DzQ]gl@p}vK{~0nIȹ|Rxrj]`U:"H9* 1W`Yv..+/=>JY>>'>>f?? *?9?H?U?j`?Cj?r?Px?|?I???F~?J{?v?SBp?g?[]?Q?D?5?%??X?!>>zq>C>s=A<ׂen`ndOʾ{ y .=TKX>b;ldsey}:~zjuMnse@ZN+A 2{!K)8)*ԾşEԁ|,.֮ʷ⼮= .>%΁>Ι>$>#>A?!?2?)A?N?Z?ure?Ln?iu?bz?:~??E?}?y?[s?0=l?b?AX?@K?=?".?^|? ?>5U>7>lOn>ar>=ܯDڽCck޾U%T5DQŸ]g;Apv{~6AIh|uQxrj\`U H9&* 羖-6WY2%//=!>SY>> ,>>b ??*?h9?A H?@U?P\`?5j?\r?AQx?F|?1I?8? ~?{?Sv?Ap?g?0]?IQ?D?5?Q%?ɪ?V?><>l>C>=$<{ꂽo1LnrSʾ {C".=KXSbҁ>4>')>'>(?!?f 2?7+A?-N?Z?se?Mn?lju?ڼz?:~??%?}?y?s?IP>o>VFn>$i>xނ=I'؟ڽCo U ޾Wv%5D&Q]g Bpv#{2~<I |Pxrj[`jUPH_9g* eA)&NYq/L.=++>]Y>}>`0>=>^ ??F*?9?!H?U?p]`?3j?r?Qx?|?^I?2?~?r{?v?@p?g?]?Q?D?6?%??T?i>>~h>C>L=m/ׁ>>g->+>*?ױ!?"2?,A?N?Z?te?eNn?ku?Sz?*;~???k}?.y?s?c;l?b?X?kK?=?r.?x? ?Գ>L>k>n>_>˂=rlڽC_tj$޾Y>%5D-Q]gBpWv{k~CH|RPxrji`UH9 *;$DY/6.=|>9fY>>4>g>Z??*?9?*#H?U?^`?%j?xr?dRx?|?I?+?~?{?v??p?g?ڶ]?Q?D?"6? %??R?4>>d>|C>n=a<]^n>x!ʾ e%.=KPX|b>lsy*}ġ*:~zhuIKnpeZN)'A2 !=T'XԾƁ.F~8=;.>ہ>>1>/>w,?!? 2?G.A?N?=Z?ue??On?ku?˽z?p;~?(??}?y?s?}:l?wb?~X?K?]=?.?v?̩ ?>VH>g>n>=>-=ڽCx(޾[Я%B5DQF]gCpv{~IHJ|OxZrjh`UgH(9 *#羙 9얾;Yg Lj/[.=>DX>j>9>>V?!?*?:9?$H?# U?_`?j?;r?,Kx?d|?I?%?a~?{?zv??p?g?]?GQ?D?~6?Y%?"?P?>#>_>PC>%\=8>h>5>3>e.?v!?r2?/A?NN?sZ?ve?Pn?klu?Dz?;~?;?Ƣ?ʼn}?%y?Ds?El?cb?=X?}K?}=?.?u?ק ?> D>b>n>>=oڽ=C[}%,޾]%5DQq]gtDpvg{~PH|/Oxrjg`FU.H9* *%'D疾2Y#rc/L.=>eX>̖>]=> >R?s#?*?9?&H?n U?``? j?r?Kx?|?I??'~?.{?v?J>p?g?]?Q? D?6?%?;? j? >ݵ>[>%C>I=G̮<5 pnG *ʾ ).̉=jK Xbw@lsyЇ}^=~zVguInne2ZN$A2n!:LOԾƫu- y|!9=N.>>ϯ>(:> 8>S0?F!? 2?WA?N?Z?we?Pn?mu?z?;~?N??s}?y?s?El?b?W?*|K?9|=?O.?)s? ?y>?>8^>{n>>]=bR&ڽhC؁*1޾_%5D/Q]g6:p0v{~VbH|Nxrjf`Uq-H9k*E+K㖾)Y>/.=G>Y>/і>^> >N?R%?A*?q9?'H? U?a`?j?r?OLx?|?G??~?{?>v?|=p?g?Y]?Q?D?56?%?T?h?=B>gٵ>V>C>6=A>5>h>><>A2?!?2?A?1N?Z?xe?Qn?mu?5z?B<~?a?? }?y?s?Dl?b?X?zK?z=?.?Qq? ?[>v;>Y>en>>=0ٽCV_5޾a[%/5DQǯ]g;p[v?{Q~\5H,| Nxrj_e`U+HZ9*f/羛ޖp Y/.=> Y>Ֆ> >>I?2'?*? 9?(H? U?c`?j?r?Lx?h|?G?i?~?U{?v?>> R>ΑC>j$=6>>B>1@>/4?!?{2?hA?N?~Z?ye?Rn?inu?z?<~?u?f?͈}?y?!s?7Cl?b?X?K?y=?.?zo? ?=>,7>[U>On>J>n=筼ڽCԊ> 9޾ck"%5DQ]g;pv{~cHͶ|{MxPrj?d`dU*H9*,)3hG^ږOYXs.L.=>Y>ږ>>+>?)?*?9?r*H?QU?/d`?j?Er?rMx?Ƕ|?H?c?~?{?v?;p?g?]?Q?D?5?<%??d?9> >>C>= J>>F>BD>6?!?(2? A?N?Z?le?Sn?ou?&z?<~??F?z}?y?ks?QBl?b?f X?TK?=?,.?m? ?>2>P>:n> >m[=2W#ڽGCQ=޾eR%x5 D2Q]g Ֆ.Y./=>Y>ޖ>\>U>?K?~*?B9?+H?U?Oe`?j?r?Nx?&|?3H?]?T~?E{?dv?;p?g?د]?Q?&D?G5?u%??b?5>!>>C>B=i<ߔnY7;ʾУ 6q.z=zKXbDlsy}bF<~Ծv遾W.- I[e=r.>>h>(K>TH> 8?!?2?y"A?SN?Z?me?Hn?ou?z?=~??&?'}?y?s?jAl?b?% X?K?u=?*.?k? ?>.>}L>$zn>ѝ>H=@}5ڽrCDV'ٵA޾g8%6DQH]gp=p5v{~G|WLxr jb` U'H9[*n%k#辞qі YȨ.;/=W> )Y> >>>?*?R*?9?[-H?U?nf`?j?r?Nx?|?_H?V?~?{?9v?A:p?g?]?CQ?D?5?%??_?h1>>>C>9=VS>ū>hO>fL>9?S!?2?$A?N? Z?ne?In?Lgu?z?Z=~???Շ}?y?s?@l?b? X?K?=?5).?/? ?>L*>H>qn>>#6=ǮHڽCZݵ ޾iw%6 DQs]g>>pv'{$~I|Kx rj`` U)&H9*#o 辜=̖Xs.Ka/=>,2Y>>>> ? ? *?u9?.H?3U?g`?j?r?'Ox?|?H?P?~?n{?v?Dp?g?]?Q?(D?5?%?ӱ?]?3->f>}>C>= <x nfbCʾ[񾺧 t.}=}K+XSbEl9sy}Ģ<;~Kzulu&PnveZbNA2!.74&6Ծ{\E.k=!.>>5ʫ>S>xP>;?"!?12?%A?N?VZ?oe?bJn?gu?z?=~???}?y?Hs??l?b? X?K?Q=?'.?W? ?Ď>&>C>gn>W>~#=[ڽɬC@_ᵾ޾dP?%e6D4Q]g ?pqv{]~%Ij|4KxFr%j_`6 U$HR9*!sH9XH^./=>M;Y>>Y >>?? *?9?QH?~U?h`?j?Or?Ox?E|?H?J?~?{?v?Cp?g?W]?Q?D?Z5?%??[?(>>y>C>=< nfHʾy񾰩 v.F=~KlXgbo:lsy})t;~ҽzkuLOnueOZN^.A 2³!,%01ԾCہ'<.ڱ3=V.>uƁ>P>W>T>=?!?2?'A?tN?Z?pe?l?b?cX?K?=?%.?? ?>!>0?>^n>>=f]mڽCc@浾޾gR% 6DQɶ]g?pv{~+I |lRxr3j^`U@#H9*w45fY8./=">nDY>m>$>>?? *?9?H? U?i`?j?r?IPx?|?H?C?o~?{?`v?Bp?g?,]?AQ?+D?5?X%??Y?$>>t>nC>~=Pv<ʂ__5nCkaLʾ񾥫 xY.؀=VKX|bV;ls'yf}.;~Zz kurNnteZN,A-"2!*,-Ծܢqׁ2.0㮽<>Nѯ=.>ʁ>>!>X>??!?2?(A?N?Z?qe?Ln?Kiu? z?l:~???܆}?wy?s?=l?wb?"X??K?-=?$.?}? ?>8X>:>Un>x>4=:ڽ CMY>>)>'>??M*?G9?;H?WU?[`?j?r?Px?|?I?=?5~?*{?v?Bp?g?]?9Q?D?5?%??W? >M>#p>BC>=+S>s>Ln>o>=͒ڽKCl`޾lV7%5D6Q]gxApJv{ ~84IL|IQxgrCj`\`SUV H9* QK,H~TYp"//=$>VY>[>V->Q> ?? *?9? H?U?\`?j?r?lQx?c|??I?6?~?{?$v?GAp?g?׸]?Q?D?l5?%?8?U?]>>k>C>W=< qNn!tTʾӻ񾏯 C|".=+K.Xb"=lPsy}C:~iziuLnreZN)A2!!:A#&%Ծh΁ .qa7 ծ=+.>ԁ>>k*>(>.)?`!? 2?+A?N?.Z?se?Mn?ju?z?:~???}?my?ns?O>n>n>df>؂==aڽvC8qY󵾖!޾oX%v5DQI]gGBpvD{C~>I|PxrQjj`UH9 *3'']KY,R/l.=->_Y>>1>{> ?e?*?~9?$"H?U?]`?{j?r?Qx?¹|?kI?0?~?R{?v?x@p?g?]?Q?*D?I6?%?R?S?(>>(g>C>{=*<{Wn;@Yʾ񾄱 ~{$.=KoXb >lsy}[:~z"iuKn|qewZN=(A$2R!L?W ԾɁU.X3(r8=)5.>؁>룫>.>->+?a!?"2?4-A?N?dZ?te?Nn?Iku?wz?>;~???R}?y?s?;l?9b?_X?K?w=?.?#x?, ?>YK>2j>n>>DƂ=CڽCu%޾qZ{%5DQt]gCpv{|~EH|&Pxr_ji`zUlHI9# *T羣#[>hY>H>5>>?D ?*?9?#H?:U?^`?mj?r?Jx?"|?I?*?~?{?v??p?g?]?7Q?D?6?%?k?Q?>4>b>C>/i=rKlsyC}Ρ:~wzxhuKnrpeAZ N&Aw2!_=SVԾB_Ł .8G=]>.> ݁>Q>2>1> -?1!?E 2?.A?VN?Z?ue?On?ku?z?;~?.?ܢ?}?y?s?8:l?%b?X?~K?~=?9.?Kv?7 ?{>G>e>n>|>=ҰڽC3z*޾t\a%5DQ]gCp$v{~KH.|Ox rmjih`/U/H9d *uNꖾ9Y}/g.=>X>>S:>>?#"?I*?9?%H? U?``?_j?ur?WKx?e|?I?#?O~?z{?Kv?>p?g?V]?Q?-D?6?%??O?>>,^>C>V=<''jnD 'ʾn Ɂ'.=kK Xb?ltsy}=~zgu-Jnioe ZN,%A2!q;~ORԾ'ɫ.E9 =G.>>>,7>15>.?!?2?DA?N?Z?ve?[Pn?lu?hz?;~?A??}?y? s?El?b?X?)}K?S}=?.?tt?B ?]>B>Ua>ۤn>@>s=ڽC~r5.޾v^HT%c5D?Qʭ]9gDpv{~QHη|Ox^r{jIg`Uv.H9*n斾/YaSX/l.=>X> Ζ>>> >?$?*?P9?&H? U?%a`?Rj?7r?Kx?ŵ|?I??~? {?v? >p?g?+]?Q?D?\6? %??pi? >xܵ>Y>jC>D=<:̖=snIT+ʾߓ񾑜 ).C=ֈK1 Xb@l*s'y}I=~z#guSIn`neZ_N#A2!9lKcNԾī>-s,9=P.>>>l;>C9>0?з!?2?A?:N?Z?we?5Qn?Gmu?z?<~?T??Z}?xy?Ws?Dl?b?W?{K?{=?.?r?M ??>z>>\>ƛn>>΍=h%ٽ$C/k2޾y`/%5DQ]7gs:p_v{(~XUHo|rNxrj)f`U-H{9*羦ᖾ&Y2/.= >>Y>Җ>>#>?%?*?9?'H? U?Eb`?Dj?r?zLx?$|?G??~?{?v?>=p?g?]?5Q?0D?5?C%?ú?ng?@>ص>0U>>C>t1=Lk>>?>U=>2?!?M2?UA?N?Z?xe?Rn?mu?Yz?W<~?g?}?}?y?s?Cl?b?X?TzK?/z=?.?p?X ?!>/:>wX>n>ƶ>){=]ڽC- 6޾{b%5DQ ]4gB;pv_{b~^(H|Mxrj e`LU+H9*}*UQݖY /.=N>`Y>֖> >>>?'?*?9?l)H?h U?ec`?6j?r? Mx?|?G?g?~?5{?qv?p>P>C>= <_FinQ3ʾ{ n.g=K X bBls1y}N<~ znuOSnMleiZN A2E!5HCEԾ󻫾4pg.UMe_w9D=0c.>>빫>C>gA>4?o!?2?A?N?Z?ke?Rn?nu?ѿz?<~?z?]?}?ny?s?Bl?b?GX?SK?x=?`.?n?c ?>5> T>n>>h=Mڽ׊CN :޾~d%Q5DAQK]2gY>qۖ>Q>i>?)?D*?"9?*H?U?d`?(j?r?Mx?|?H?a?|~?{?v?;p?g?]?Q?2D?o5?%??ic?8>2 >>C>M =խ>R>,H>yE>6?>!?2?f!A?\N?Z?le?Hn?Eou?Jz?<~??=?b}?y?4s? Bl?b? X?K?=?.?m?n ?>1>O>n>M>U=H(ڽCSֵ ?޾fq%5DQv]0g"Y>ߖ>>>??*?9?V,H?U?e`?j?Ar?/Nx?C|?@H?[?C~?%{?5v?:p?g?]?3Q?D?5?%??fa?\4>>B>`C>=&<2nZ~<ʾXf q.{={K4XIbTDls;y4}]1<~zmuQnlxeZNAf2!1$;c=Ծ&+聾U.(=j=u.>'>«>mL>I>8?!?V2?"A?N?FZ?me?Hn?fu?z?)=~???}?dy?~s?&Al?wb? X?}K?=?h*.??k?y ?ƕ>P->+K>own>>:C=t;ڽ.CWtڵ ޾hɻ8%6DQ].g=pdv{~G|,Lxrja`j U/'H9*$ 辧@ЖUY .G/=>+Y>^>>>??*?X9?-H?JU?f`? j?r?Nx?|?mH?T? ~?{? v?:p?g?T]?Q?5D?&5?&%?)?d_?'0>v>Ā>4C>=n@<חnI_@ʾw[ s.|=|KJX^b;Elsy}J;~zluPncwe^ZZNA2ֶ!/7"9ԾまK.}}=.>>ǫ>P>M>:?!?2?w$A?N?|Z?ne?In?gu?Ǻz?o=~???}?ߓy?s?@@l?bb? X?K?k=?(.?? ?>)>F>Ynn>ӑ>0=:ޮNڽYC\޵ ޾N%>6|DCQ̴]+g|>pvH{5~ I|Kxrj`` U%Hr9*#R<˖3XTx.jl/=]>4Y>>O>>?? *?9??/H?U?g`?j?r?ROx?|?H?N?~?M{?lv?CDp?g?)]?Q?D?5?_%?B?a]?+>>F|> C>={<|8ncEʾP ruo.,~=}KXb!FlosEyى}΢6;~'zBluOnZve(ZNq/A 2!-34ԾY"߁B.@R"= .>IÁ>˫>T>Q>z<?!?2?%A?}N?Z?oe?Jn?)hu?@z?9~??ݡ?i}?Zy?s?Y?l?Nb?D X?K?ه=?&.?ˀ?` ?>$>MB>Den>>=(`ڽC`/㵾޾P%6DQ])gJ?pv{n~'IN| Kx rjj_`UE$H9X*!!7WXR./= >>Y>K>!>>?w?U *?9?H?U?i`?j?r?Ox?a|?H?H?~?{?v?tCp?Fg?]?1Q?8D?5?%?\?_[?'>>w>C>=Īǁ>>-Y>U>h>?|!?^2?'A?N?Z?qe?}Kn?hu?z?;:~???}?Ւy?[s?s>l?9b?X?=K?G=?F%.?~?k ?>p >=>.\n>Z>K =s/sڽCe絾6޾Sq0%6zDQ"]&g@p>v {~-I|ARxJrjJ^`U"H<9*B g辪3dYB-./=>&GY>>%>;>?V? *?&9?5H?nU?#j`?j?Kr?uPx?|?H?A?]~?u{?1v?Bp?Ig?Ӻ]?Q?D?85?%?u?\Y?#>]>Ks>C>= `Ŕ>>/#>Y>V@?K!? 2?)A?>N?Z? re?XLn?}iu?1z?:~??R?Æ}?Py?s?=l?%b?X?ӃK?=?#.?}?v ?>V>o9>Sn>v>=aÅڽCi뵾l޾UX%5DEQM]$g@pv{~3SI|Qxrj+]`<U\!H9*c =U/jZY(T.j/=)>GPY>8>L*>e> ?5?*?9?H?U?[`?j? r?Qx? |?I?;?$~? {?v?Ap?Kg?]?Q?:D?5? %??ZW?R>>n>C>a=U<₽]kHnqQʾ/ z!.=-KMXbЁ>m>o'> &>DB?!?2?*A?N?TZ?se?2Mn?(ju?z?:~??2?ߊ}?ʑy?s?R>q>Jn>l>= VڽCnI𵾡޾W>%N5DQx]"gApyv{~:'I0|Qx-rj \`UH9* +QY/0=l'>hYY>>.>> ??*?]9?!H?U?\`?j?r?Qx?|?LI?5?~?{?v? Ap?Ng?~]?}Q?7D?5?B%??WU?>>Oj>\C>Έ=ʯ[Ձ>Ԡ>+>2*>)?!?f!2? ,A?N?Z?te? Nn?ju?"z? ;~? ??}?dy?8s?;l?b?AX?K?=?# .?ny? ?~>\N>Om>gn>c>[ӂ=Sڽ2Cr"޾Y%%5zDQ]gBpvd{T~@Hи|Pxkr jRj`UrHj9] *羭&}򖾥HYi2/'.=0>bY>%>2>> ??P*?9?"H?QU?^`?j?*r?)Rx?߹|?yI?.?~?1{?Wv?;@p?Pg?S]?(Q?D?6?z%??TS?>D>e>0C>:v=<=}Zn$=ʾ+ ~$.=KX bM>l=sy }F:~̻zhuKn-qeZN'A2!>kVYԾYȁ.̥rX85=7.>ف>:>/>D.>+?!?#2?-A?_N?Z?&ue?Nn?|ku?z?S;~? ??9}?ߗy?Ds?:l?b?X?K?=?m.?w? ?`>J>h>Rn>>=}ڽ]C w '޾ [ M%5DQͻ]gSCpv{~GHq|Oxrj3i`UH9 *X"?Y& ݗ/L.=>kY>>H7>>? ?*?9?$H?U?;_`?j?r?Jx?>|?I?(?x~?{?v?l?p?Rg?(]?Q?:D?(6?%?ڥ?RQ?>>Sa>C>c=/5<cnA$ʾ݌ ~&.=mK X!b4?lsDy\}ס:~SzEhuJn#peZN?&A2!<YRUԾ=̫āb ../8=A.>dށ>>04>V2>-?!? 2?1/A?N?Z?/ve?On?&lu?z?;~?3?Ӣ?}?Zy?s?FFl?b?X?(~K?m~=?.?u? ?A>E>rd>>=>鰼ڽC{bA+޾ ]%<5xDOQ]g!DpSv<{~MH|jOxr%jh`U|/H39 *閾c6Yr/6r.=E>X>>;> >?"?*?/9?}%H? U?[``?j?r?Kx?|?I?!?>~?Y{?v?>p?Ug?]?|Q?D?6?J%??OO?|>ߵ>\>ڧC>Q=x<-PlnFQ(ʾ1 Uj(.)=ׇKP X5b@lsɓy}z=~ۺzguInoeZVN$AJ2)!:GN_QԾǫi-.g9p=PJ.>>>p8>h6>/?!?r2?A? N?,Z?8we?Pn?lu?z?;~?F??}?Ֆy?s?`El?b?~X?|K?|=?.?s? ?#>}A>`>'n>>嚃=14ڽCv/޾_ٲ%5DQ#]gDpv{~StH|Nx$r3jf`U.H9 *k羰喾B-Y3M/.=>Y>aϖ>?>6 >?$?*?9?&H?4 U?{a`?j?qr?Lx?|?G??~?{?~v?=p?Wg?ҳ]?%Q?+۵>WX>C>>=<,@unqJ,ʾ& j!*.=BK XJbAl`sNy}4=~zfuInneyZN.#A2Z!85JMԾqëw.m79 %=S.>n>n><>z:>z1?Z!? 2?AA?N?aZ?Axe?vQn?zmu?z?&<~?Z??A}?Py?!s?zDl?vb?iX?R{K?I{=?J.?r? ?>2=>[>n>B>@=~ٽC3޾a%5uDQN]g:pv{9~ZGHS|GNxarAje`5U,H9L*(A[!$YZ'/.=> Y>Ӗ>>`>|?p&?K*?f9?g(H? U?b`?j?4r?Lx?A|?G?l?~?{?v?=p?Yg?]?Q?D?:5?%?2?f??>ֵ>S>C>+= U>Զ>@>>>h3?)!?2?A?N?Z?Jye?QRn?$nu?}z?l<~?m?s?}?˕y?ks?Cl?bb?(X?yK?y=?.?8p?â ?>8>%W>n>>u=ɭB ڽgCz 7޾cj%*5DQQy]g;pv{s~`H|MxrOjd`U+He9*),ܖY/6.=>Y>Nؖ>G >|>x?O(? *?9?)H? U?c`?~j?r?7Mx?|?G?e?~?{?Bv?2B>[O>WC>X=R w>;>1E>B>V5?!?{2?R A?dN?7Z?"le?+Sn?nu?z?<~??S?}?Fy?s?Bl?Nb? X?K?%x=?.?an?͠ ?ɜ>4>R>n>ɪ>b=WڽCO<޾e1%5rDQ]~gN9Y>ܖ>>>E?.*?*?9?P+H?U?d`?pj?r?Mx?|?!H?_?k~?q{?v?d;p?^g?Q]?#Q?D?5?-%?e?b?P7> >i>,C>=<xC3nW{9ʾt xp.y=zKSXbClsݕy}wjb<~mz nu3Rn&yeZNA2!&3>^@Ծ=W끾}[.+5 X]="o.>>>qI>F>D7?Ƚ!?(2?!A?N?mZ?+me?THn?xou?nz?<~??3?I}?y?s?Al?9b? X?|K?=?'.?l?؞ ?>S0>HN>}n>>QP=_i.ڽCtTc׵K@޾gt%s5DQϲ]{g=pv{~mG4|Lxrkjtb`S U5(H.9*0&8^?ӖY޷.,/=>Z%Y><>>>@?h?*?79?,H?bU?e`?bj?{r?ZNx?_|?MH?Y?2~?{?yv?:p?`g?&]?Q?BD?M5?f%??`?3>>냌>C>0=t<In,\=ʾ Or.{={KhWbDl9sbyL}W<~zcmuYQnxe8ZtN A2!819<Ծױ恾HR."2rp=4->>ī>M>J>29?!?2?c#A?%N?Z?4ne?/In?gu?z?>=~???}?,>I>tn>O>==Ʃ@ڽCX۵ ޾iZ%6pDSQ]yg=pv{ ~Gյ|LxWryjTa` U&H9Q*Q$< \?ΖXK.5R/=>{.Y>>D>><?G?\*?9?9.H?U?g`?Tj?>r?Nx?|?zH?S?~?{?v?Dp?cg?]?wQ?ìD?5?%??^?.>)>n>yC>'=+*>nȫ>Q>N> ;?g!?2?$A?N?Z?>oe? Jn?gu?z?=~???}?y?s??l?b?% X?K?=?0(.?? ?n>'>jE>kn>>+=}SڽCo]ൾ ޾OA%6DQ%]wg>p1vh{F~"Iu|oKxrj4`` UK%H9*q"@};y{X4m.w/= >7Y>)>>$>8?&? *?j9?/H?U?:h`?Fj?r?}Ox?|?H?L?~?-{?=v?Dp?g?Ь]?!Q?DD?5?%??\?*>>z>NC>=8߰< tn e[Fʾϭ u.~=X~KXb:lsly}ע1;~zluOn veZN.A 2}![-13Ծ ݁?.S и= .>ā>̫>1V>R>=?7!?12?t&A?N?Z?Gpe?Jn?\hu?dz? :~??ӡ?P}?2y?s??l?b?X??˳ ?P>s#>@>bn>օ>b=5?$fڽ@Ca|䵾B޾QN%`6mDQP]tg?pv{~(I1|Jxrj_`pU#H]9* DT辴6pjYùG.ߜ/=d>@Y>>">N>4?? *?9?/H?DU?Yi`?8j?r?Px?~|?H?F?~?{?v?7Cp?g?]?Q?ƩD?_5?%?ˮ?Z?{&>n>rv>"C>=<6Â6nyiJʾڪ w.5=K+X b:lsyE}J;~zekuNnueZ0Nt-A"2!m+-^/ԾEف6.ꮽ*RK=.>&Ɂ>>qZ>V>>?!?2?'A?FN?EZ?Pqe?Kn?iu?ܻz?P:~???}?y?%s?.>l?b?X?фK?υ=?$.?g~?ֱ ?>(><>yYn>|>=쉯xڽkCkf赾w޾S%6DUQ{]rgV@pmv@{~/sIҹ|Rxrj]`%Ub"H9*I *`2OaYr/".4/=>IY>>A'>x>0?? *?9?H?U?yj`?)j?r?Px?ݸ|?I???L~?U{?v?hBp?g?z]?Q?GD?5?I%??X?F">>q>C>l=I<ՂdnmNʾ Ϭ y^ .ǁ=.KlX!b;lPsWy} ;~zjuMnse`ZN+A-!2!))+Ծ=ԁv-.خY躮=.>́>V>s$>[>@?!?2?)A?N?{Z?Yre?Ln?iu?Uz?:~??I?}?(y?ns?H=l?b?cX?gK?>=? #.?|? ?>U>8>cPn>\s>=ԯLڽCj8޾U%'5jDQ]pg%Ap v{~5FIs|Qxrj\`U H&9U*M  ./XY.&//= >RY>>+>>, ??X*?<9? H?U?1\`?j?Gr?1Qx?<|?-I?9?~?{?dv?Ap?g?O]?nQ?CD?5?%??V?>>vm>C>ؕ=<肽n:KnVr:Sʾ)Į {".Y=KX5b/ҁ>>(>V'>B?!?9 2? +A?N?Z?bse?sMn?Zju?μz?:~??)?Ɗ}?y?s?b_Q>lp>MGn>j>r=[ߝڽCgo޾WϫF%5mDQѹ]mgApv{,~<I|Pxrj[`UxH9*Q 羷)OYh/V .=/*> \Y>>/>>( ??*?9?!H?hU?Q]`?j? r?Qx?|?YI?3?~?}{?v?@p?g?%]?Q?ŹD?6?%??T?>U>h>C>E=[<&ZwPTn:WʾG񾹰 [}#.=KXJb=lsayΆ}w:~!zgiu;LnqeZN(A2 !@FY"Ծpˁ .ݲ58#=p1.>ց>#>,>h+>U*?t!?!2?,A?hN?Z?lte?NNn?ku?Fz?";~?? ?s}?=y?s?{;l?b?X?K?=?.?x? ?D>M>k>n>`>͂=jsڽCs$޾Y %p5D Q]kgBpFv{e~BH|aPx1rji`BUH9 *Uc%)EY/2.=>AeY>z>>4>>$??*?s9?#H?U?q^`? j?dr?TRx?|?I?,?~?{?(v??p?g?]?Q?FD?O6?P%?0?R?>>zd>uC>p=i< f]nv>!ʾe񾮲 3%.}=nK.X^b>lssy!}1:~zhu`KnpeZNS'A$2>!&>4UXԾ 2ǁ.@ʜ8=:.>8ہ>>41>z/>C,?v!?#2?.A?N?Z?uue?(On?ku?z?h;~?&??!}?y? s?:l?b?X?'K?=?.? w? ?%>H>g>n>8>(=ɴڽCcxQM(޾[%5kD_Q&]hgCpv{~IHT|Oxnrjh`UHT9 *7Y!얾LX>>8> > ?a!?*?9?w$H?U?_`?j?&r?Kx?Z|?I?&?g~?{?v?/?p?g?ϵ]?lQ?ȶD?6?%?U?P?q>>_>JC>^=

߁>>t5>3>1.?E!?D2?/A?(N?RZ?~ve?Pn?Ylu?7z?;~?9?ɢ?Ή}?3y?Ws?Fl?b?_X?}K?}=?4.?2u? ?>D>c>n>>=ڽDC|,޾]%5DQQ]g^Dpv\{~OH|>Oxrjg`iU /H9Z *W]X羺;薾3Yig/V}.=>mX>?̖><>J >?A#?S*?9?%H?K U?``?j?r?Kx?|?I??-~?9{?v?`>p? g?]?Q?ID?6?%?o?@j?; ><޵>[>C>K=5Ԯ<3onTG)ʾ5Ǜ (.=CK Xb^@lsyLJ}f=~zhguInneSZNB$A2!J:MPԾƫo-{"9=M.>B>W>9>7>0?!?2?.A?N?Z?we?Pn?mu?z?;~?L??{}?y?s?El?8b?X?Q|K?d|=?~.?[s? ?>6@>^>rn>>W=tJ-ڽoC^ 0޾_jc%^5hD Q|]g :pv{~UgH|Nxrjf`U-H!9*xa.f㖾*YB/.=L>Y>Ж>>t >? %?*?E9?a'H? U?a`?j?r?@Lx?|?G??~?{?Ov?=p? g?y]?Q?ʳD?a6?%??>h?B>ٵ>W>C>8=}>>=>;> 2?!?2?A? N?Z?xe?Qn?mu?(z?;<~?_??)}?)y?s?6Dl?$b? X?zK?z=?.?q?" ?ˣ>;>BZ>\n>>=+7ٽC܅j4޾aQ*%5DaQ]g:pJv4{K~\:H6|Nx'rj~e`U$,H9*eNߖh!Y/.=> Y>,Ֆ>= >>?&?*?9?(H? U?b`?j?nr?Lx?]|?G?j?~?a{?v?>S>R>ǒC>b&=><_Xn2P-2ʾr񾱟 Um.Ō=K1 Xb+BlMsym}A<~:z/ouGnleZ,N1!Ao2!n6DGԾ(k.TEh97==w_.>K>$>5B>?>3?!?M2??A?mN?]Z?ye?Rn?Wnu?z?<~?r?j?ֈ}?y?4s?OCl?b?X?K?@y=?.?o?- ?>7>U>Fn>E> p=߭ڽ"CZ "9޾c7%5fDQҰ]g;pv{~b H׶|Mxerj^d`U*H9*_)i羽ږGYTi.U.=>Y>ٖ>>>?(?*?{9?J*H?-U?d`?j?0r?cMx?|?H?d?~?{?v?;p?g?#]?Q?ͰD?5?l%??9d?E:> >N>C>=<kǮҊnTx6ʾ񾦡 -o.x=KrXbClsy}ax<~znuRnkeZNA21!4@ZCԾTa.=BB\rO=h.>>>uF>C>5?!?2? A?N?Z?qle?lSn?ou?z?<~??J?}?y?~s?iBl?b? X?zK?1=?[.?m?8 ?>V3>dQ>1n>>h]=*^!ڽNCLQ%W=޾e%K5D Q]gc`; U:)HO9I*'h a֖&Y./=>Y>ޖ>>>??N*?9?+H?yU?0e`?j?r?Mx?|?.H?]?Z~?Q{?uv?&;p?g?]?Q?ND?t5?%?Ե?6b?6>>>pC>;=W<}nY:ʾ񾛣 qQ.ez=zKXbClsy}eN<~IzmuQnxe{ZkN A2a!2<?Ծ遾X./cLac=q.>T>>J>G>7?R!?2?P"A?.N?Z?zme?Hn?ou?z? =~??*?0}?y?s?Al?b?G X?K?=?+.?k?C ?p> />L>{n>̞>J=Ru3ڽyCUصA޾g%5cDcQ(]gZ=p$v{~G|gLxr#jb` U'H9*%іY.7/=[>(Y>>:>>??"*?9?4-H?U?Pf`?j?r?Nx?||?[H?W?!~?{?Jv?W:p?g?ͮ]?gQ?ЭD?5?%??4`?1>:>>C>=^>Wū>N>K>9?"!?V2?#A?N?Z?ne?pIn?:gu? z?S=~?? ?݇}?y?s?@l?b? X?K? =?c).?a?N ?R>*>H>rn>>8= FڽCHZݵ ޾iG%6DQS]g(>pv{~I|Kxr1j`` UQ&H9*#j >s͖Xj.T]/=>41Y>>>8>??*?I9?.H?U?pg`?j?xr?Ox?۷|?H?Q?~?y{?v?Dp?g?]?Q?QD?+5?%??1^?->>~>C>=<}naXCʾ񾅧 t.}=Z}K X5bEl&sy}>;~Xzlu>PnveZNA2µ!.46Ծ!VF.e B='.>u>ɫ>5S> P>;?!?2?`%A?N?5Z?oe?KJn?gu?z?=~???}?y?[s??l?b? X?;K?|=?'.??* ?4>v&>D>hn>R>y%= YڽЫC^lᵾN޾.PҾ%96`DQ~]g>p`v{W~$It|DKx[r?j_`Y U$H}9 *!@达9%XDb./=>U:Y>}>>b>?? *?9?)H?[U?h`?j?:r?Ox?;|?H?J?~? {?v?Cp?g?w]?Q?ҪD?5?O%? ?/\?p)>>y>C> =Ȱ<)n\fGʾ z vt.=~KJXJbW:lsy }+{;~߽zkucOnuepZ'N.A 2!,0Z2Ծq܁!=.ɹ9=\.>Ł>ّ>uW>T>=?!?2?&A?ON?kZ?pe?%Kn?hu?z?:~??ʡ?8}? y?s?>l?b?X?ЅK?=?%.??5 ?>,">?>_n>>=xUkڽCDc嵾޾0R%6߷DeQ]g?pv{~*I|{RxrMj^` Ug#H9N* j5gY<./=&>vCY>>7$>>??_ *?9?H?U?i`?j?r?:Px?|?H?D?u~?{?qv?Bp?g?L]?eQ?TD?5?%?:?,Z?:%>!>u>gC>w=>~<Ȃ?njKʾ'o bx*.=/KX_b=;lsy]}5;~gz2kuNnte:ZN,AZ"2#!*,.ԾTׁ3.*宽^׭=.>~ʁ>?>w!>-X>??!?^2?q(A?N?Z?qe?Ln?9iu?z?d:~???}?y?s?=l?b?DX?eK?X=?A$.?}?@ ?d>X>:;>Vn>y>.=/A~ڽ'Cg'굾޾3T?%6^DQԷ]g@pv`{~1eI|Qx>r[j]`U!HG9*$ 18^Y,j.T/=j>LY>k>(>>?t?*?9?H?4U?j`?rj?r?Px?|? I?>?;~?5{?v?+Bp?g?!]?^Q?էD?=5?%?S?*X?!>>p>=3ρ>>%>{$>}A?_!? 2?)A?N?Z?re?Ln?iu?yz?:~????}?y?8s?=l?b?X?K?ƃ=?".?|?K ?F>cT>s>Mn>p>=꯼ՐڽRC@l޾5Vz%5ܺDQ]gbAp9v{~79IV|YQx|r]j\`vU~ H9*E ,vUYl#//=#>UY>>,>> ?S?*?9? H?U?\`?cj?r?]Qx?Y|?:I?7?~?{?5v?]Ap?g?]?Q?ѺD?5?%?l?'V?>f> l>C>O=<pMnsTʾcY |".у=K Xb =l=sy}@:~uziuLnreZN)A2R!oA^$%Ծ΁!.○7Ӯ=*.>Ӂ> >)>(>(?/!? 2?+A?pN? Z?se?Mn?ju?z?:~???}?{y?s?P>o>n>_g>ڂ=5hڽ}Cp#!޾8X`%I5DgQ*]g1Bpv8{=~> I|Pxrkjj`+U H9*fm(KULY(H/v.=,>^Y>X>41> > ?2?*?R9?!H?U?]`?bj?Cr?Qx?|?gI?1?~?]{?v?@p?g?̷]?Q?SD?v6?2%??$T?>>g>C>}=<zWnZ;XʾN }M$.c=oKMXb=lsy}b:~z4iuKnqeZNf(AR2!?XY!Ծ ^ʁO.QJb8=/4.> ؁>s>8.>,>*?0!?f"2? -A?N?CZ?te?Nn?7ku?jz?7;~???[}?y?s?7;l?Wb?X?%K?=?.?Ux?a ? >K>j>n>>?Ȃ=UڽCgY>>5>4>? ?Z*?9?r#H?U?^`?Tj?r?Rx?|?I?*?~?{?v??p?g?]?\Q?ԷD?6?%??"R?e>>$c>C>(k=`Slsy:}ʡ:~zhuKnpebZEN&A2!=SWWԾŁ.#8M=c=.>܁>ڧ>x2>0>,?!? 2?.A?1N?xZ?ue?iOn?ku?z?};~?,??}?y?s?P:l?Bb?AX?~K?=?h.?}v?l ?>G>n>w>= ˰ڽCy)޾=\.\%5ݪDQ]gCpv{~JH8|Ox5rjh`RU0H9 *D]떾:Y/ c.=>X>E>9>^>?!?*?9?$H?b U?_`?Fj?`r?HKx?w|?I?$?U~?{?\v?>p?g?v]?Q?VD?-6?%?ľ?P?/>L>^>C>X=<%1in7D&ʾQ8 '.=EK Xb?l`sy}=~ zguEJnoe,ZNU%A2!;OSԾɫU.pN9 =F.>>@>6>4>.?ϵ!?2?A?N?Z?ve?DPn?lu?[z?;~????}? y?!s?El?-b?X?P}K?~}=?.?t?w ?ͪ>9C>a>ҥn>;>n=#ڽC7~-޾@^#%75\DQ]gDpv|{~QHٷ|Oxrrjgg`U.H>9*p斾0Y\I\/u.=>%X>͖>1>> >?#?*?$9?[&H? U?a`?8j?#r?Kx?|?I??~?{?v?#>p?g?K]?Q?״D?6?:%?޼?i? >ܵ>(Z>cC>F=<8ѕFrnH*ʾp\ no).=K Xb@lsy} Q=~z5gujIn|neZN#AJ2!9KNԾ8ū-yuO(9=O.>>>:>8>0?!?r2?A?N?Z?we?Qn?5mu?Ծz? <~?R??c}?y?ks?Dl?b?W?{K?{=?.?r? ?>>>_]>n>>ɏ=`,ٽ+CY1޾B`%5ڭDqQծ]g]:pNv{"~WYHy|NxrjHf`U)-H9*p▾'Y6/ʭ.=>FY> Җ>3>>?%?*?9?'H? U?&b`?*j?r?kLx?|?G??~?{? v?T=p?g? ]?ZQ?XD?5?s%??g?nA>ص>U>7C>m3=:s> >9?><>2?n!? 2?+A?uN?Z?xe?Qn?mu?Lz?O<~?e??}?y?s?Cl?b?X?zzK?Zz=?E.?p? ?>:>X>n>>$}=oڽC3.6޾Eb%5YDQ]g,;pzvT{\~]-H|Mxrj(e`pU+H 9B* ݖY/ .=R>hY>֖> >>?'?V*?[9?E)H?E U?Fc`?j?r?Lx?z|?G?h?~?A{?v?>,Q> C> =(<]KrnQu3ʾF mg.<=K XbpBls#y}J<~znufSnjleZN A2v!5CVFԾkjh.OO hs9B=5b.>>t>yC>@>4?>!?2?A?N?Z?ke?Rn?nu?ſz?<~?x?`?}?|y?s? Cl?b?iX?yK?x=?.? o? ?s>Y6>T>n>>j=&TڽމC%N c:޾Gdȷy%$5ذDQ+]g;pv{~dH|_Mx+rjd`$U@*Hp9*(rٖYJ.u.=>Y>ږ>>>w?l)?*?9?*H?U?fd`?j?jr?Mx?ٶ|?H?b?~?{?v?;p?g?ʰ]?Q?[D?5?%?*?c?9> >:>C>F=ݭ(>ڽ>G> E>|6? !?{2?2>P>|n>H>W=@&ڽ CRյ>޾Jf@%5WDsQV]g!Y>nߖ>0>!>s??*?9?.,H?U?e`?j?-r? Nx?9|?;H?[?I~?1{?Fv?:p?g?]?WQ?ܮD?5?%?C?a?4>K>>YC>=<8ĺnbZ <ʾ0 q.z=zKX,b>A«>K>I>j8?ܾ!?(2?"A?N?%Z?me?Hn?fu?z?"=~?? ?}?ry?s?>Al?b? X?K?(=?*.?qk? ?6>->K>fxn> >5E={9ڽ4C!WٵB޾Lh%m6ճDQ]g=pSv{~G|*Y>>>L>o??*?,9?-H?'U?f`?j?r?Nx?|?hH?U?~?{?v?:p?g?t]?Q?^D?R5?V%?]?_?0>>>>-C>=]H<ݕn^T@ʾ% hs.o|=[|K'X@b"Elsy~}L;~zluPnweZN#A2!079Ծ7!䁾L.vX~{=->1>ƫ>9P>.M>X:?!?2?M$A?N?[Z?ne?In?mgu?z?h=~???Ň}?y?s?X@l?b? X?9K?=?(.?Ԃ? ?>z)>4G>Pon>Β>2=L֮Lڽ`C[[޵Y ޾Oj|%6TDQ]gf>pv<{/~I|Kxrj``B U%H9F*3#, <̖+XJ|.th/=a>3Y>[>>v>k?e?f *?Ŀ9?/H?sU?g`?j?r?BOx?|?H?O?~?Y{?}v?YDp?g?I]?Q?߫D?5?%?v?]?d,>>|>C>=i<=Ȩn?cDʾ% ?u@.~=}KhXbFl\s6yЉ}ʢ8;~4zTluOnvveIZN/A828!#.o3V5ԾѪ߁C.@(=.>> ˫>yT>@Q>F<?{!?2?%A?XN?Z?oe?Jn?hu?3z?9~???r}?hy?%s?r?l?kb?f X?φK?=?*'.?? ?>/%>B>;fn>>=!^ڽC`⵾޾Pc%6ҶDuQ׵]g4?pv{h~&IX|Kx!rj_`Um$H9*T!t8 XV.ɍ/= > =Y>>-!>>g?D?% *?_9?H?U?h`?j?tr?Ox?W|?H?H?~?{?v?Cp?ag?]?UQ?`D? 5?%??[?/(>2>Cx>C>=Rǁ>(>X>QU>4>?K!?02?^'A?N?Z?pe?fKn?hu?z?3:~???}?y?ns?>l?Wb?%X?dK?r=?t%.?&? ?H> >W>>%]n>U>E =k6qڽCd絾޾R=]%Z6QDQ] g@p-v{~,I|PRx^rji^`U"Hg9*u4ZeY=1./=>.FY>I>%>>c?#? *?9? H?KU?j`?j?6r?ePx?|?H?B?d~?{?Bv?Bp?dg?]?Q?D?e5?%??Y?#>>s>C>=gˁ>>">cY>"@?!?2?(A?N?Z?qe?ALn?kiu?$z?y:~??U?̆}?^y?s?=l?Bb?X?K?=?#.?N}? ?*>fW>9>Tn>w>=rʃڽCit뵾޾T$%6йD!Q-] g@pv{~3XI|QxrjI]`_U!H9 * /[Y)J .s/=->OOY>>)>>_ ??*?9?H?U?[`?j?r?Px?|?I?<?*~?{?v?Ap?fg?ȹ]?Q?cD?5?9%?«?W?>v>Go>C>Z=C\Ё>>&>%>B?!?2?n*A?yN?3Z?re?Mn?ju?z?:~??6?y}?ّy?s?S>6r>Jn>m>=*]ڽ Cmﵾ/޾V %"5NDwQX]gAphv{~9+I:|-QxBrj)\`U H19K* w+mRY ~//=q&>pXY>6>*.>>[ ??b*?19? H?U?\`?j?r?Qx?u|?GI?5?~?{?v?Ap?hg?]?Q?_D?5?r%?۩?U?>>j>UC>Ɗ=ү<󂽞sPn=8Uʾ |#.I=qKlXbO=lss,y}I:~RziuLnRrerZNz)A2!@ZU$Ծ7́.c7خ=-.>ԁ>\><+>)>)?!?9!2?+A?N?iZ?te?Mn?ju?z?;~? ??}?Sy?Ks?;l?b?cX?$K?=?R .?y? ?>N>m>^n>d>VՂ=Kڽ9Cr0d"޾XU%5RDQ]gnBpvX{N~@Hڸ|Pxr#jqj`UH9 *"Z"'򖾝IYe)/#.=/>aY>>2>G>W ??!*?9?l"H?.U?]`?j?r?Rx?չ|?tI?/?~?={?hv?Q@p?kg?r]?LQ?D?6?%??S?Y>>Kf>)C>3x=Շl*sy}N:~ٻziuKnIqeVSZԾДɁ.Ƨi8;=6.>eف>ä>|/>->{+?!?"2?-A?:N?Z? ue?Nn?jku?z?L;~???B}?y?s?:l?b?"X?K?*=?.?w?̪ ?ϱ>J>Yi>In>>‚=ڽdCv&޾Zخ%k5ЩDQ]g=Cpv{~FH{| Pxr1jQi`;U%H9 *&0"|@Y!ԛ/H.=>jY>#>6>q>S? ?*?h9?#H?zU?_`?j?r?Jx?4|?I?(?~~?{?v??p?mg?H]?Q?bD?T6?A%??Q?$>]>a>C>e==<bnA#ʾmٳ L&.m=FKXb?ls6yS}ԡ:~`zWhuJn?peZNi&A%2*!=RVԾ̫ā\ .({%8=!@.>݁>)>3>1>i-?!? 2?/A?N?Z?ve?On?lu?z?;~?1?֢?}?hy?s? :l?b?X?N~K?~=?.?u?ר ?>d>3n>>=P᰼ڽC{*޾\%5OD+Qج]g DpBv0{~LH|yOxr?j1h`U/H_9 **z ꖾ[7Y~v/@n.=I>X>>';>>O?"?*?9?V%H? U?=``?j?r?sKx?x|?I?"?D~?e{?-v?>p?pg?]?Q?D?6?z%?3?O?>ߵ>O]>ӨC> S=f<+UknE'ʾ #<(.=K. Xb@lsy}=~zguJn6oeZ|N$Aw2Z!;NQԾOȫ'.p9v=VI.>n>>7>5>W/?Y!?D2?A?N? Z?we?Pn?lu?z?;~?D??}?y?s?yEl?b?X?|K?}=?/.?t? ?>A>{`>n>z>=C,ڽCI/޾^%5άDQ]jgDpv{~SyH|Nx8rMjg`U/.H9O*:.%喾:.Y)Q/.=>X>Ζ>{?> >J?^$?]*?9?&H? U?\a`?j?]r?Lx?׵|?G?? ~?{?v?=p?rg?]?JQ?eD? 6?%?M?i? >۵>X>C>x@=<2>tnI',ʾ j).=Ko X,b@lMs@y}<=~zgu)In-neZNX#A2!$9JMԾë`-o{39#=R.>>>=<> :>E1?)!?2?A?~N?@Z?%xe?_Qn?hmu?z?<~?X??J}?_y?4s?Dl?b?_W?y{K?t{=?x.?Br? ?u>=> \>n>=>;=vٽC 93޾`r%Y5LDQ/]gg:p}v{3~YLH]|VNxvr[je`XU,H,9{*[2ᖾ%YV+/.=>Y>_Ӗ>}>>F?=&?*?:9??(H?\ U?|b`?rj?r?Lx?7|?G?l?~?{?v?=p?tg?Dz]?Q?D?g5?%?f? g?-@>D׵>ST>|C>-=\x>]>}@>>>33?!?2?A?N?Z?.ye?9Rn?nu?pz?d<~?k?v?}?ڕy?~s?Cl?b?JX?zK?y=?.?kp? ?W>\9>W>n>>w=IڽmC o7޾bs:%5˯D-QZ]egi;pvt{m~_H|Mxrijd` UF+H9*!*6}ܖY/?.=> Y>ז> > >B?(?*?9?)H? U?c`?dj?r?(Mx?|?G?f?~? {?Sv?H>O>PC>P=@<|c 'nR4ʾܠ nn.1x=K XUbBlsJy}T<~znu%Snle.ZZNG Ao2!H5BEԾWe.I8~9NH=d.>>ú>D>/B>!5?Ȼ!?M2?) A??N?Z?le?Sn?nu?z?<~?~?V?}?Uy?s?Bl?kb? X? K?Px=? .?n? ?9>5>/S>܇n>ī>d=i ڽC|Oa;޾dY%5JDQ]cg8AY>Lܖ>&>5>?)?*?p9?(+H?U?d`?Vj?r?Mx?|?H?`?q~?|{?v?y;p?yg?q]?HQ?D?5?]%??c?7>[ >㈌>%C>=ǭ@Ծ끾w\.%7\Z=(n.>>*>H>AF>7?!?2?!A?N?LZ?me?=Hn?fou?az?<~??7?R}?Дy?s?Al?Vb? X?K?B=?U.?l? ?>0>N>~n>>LR= Wp,ڽĕCSֵ?޾f@%F5ɲDQ]ag=pv{~lG>|Lx.rjb`v U\(HZ9?*c&nBӖ Yջ.(/=>b$Y>>z>_> ?5?X*? 9?,H?>U?e`?Hj?gr?KNx?U|?IH?Z?8~?{?v?:p?{g?F]?Q?jD?y5?%??a?3>>e>C>)=|<ƈRn[Q=ʾ#Ƥ rV.U{=\{KFW~bDl&sTyD}Y$<~zumupQn9xeYZN6A2M!l1]:<ԾNM灾CS.$ 6yn=]w.>>ë>=M>SJ>8?g!?2?9#A?N?Z?ne?In?fu?z?6=~???}?Jy?[s?@l?Bb? X?8K?=?*.?j? ?>},>QJ>un>J>?=ء?ڽCwXJ۵e ޾h'%6GD/Qڳ]^g=pv{~Gߵ|Lxlrjsa`* U&H9*$r ?AϖYF.?N/=>-Y>9>>>??,*?9?.H?U?f`?:j?)r?Nx?|?uH?S?~?{?v?Dp?~g?]?Q?D?5?%?̲?_?X/>>>rC>=2>ǫ>}Q>dN>:?6!?V2?$A?`N?Z?"oe?In?gu?޺z?|=~???}?œy?s?@l?-b?G X?͇K?=?^(.?H?# ?ސ>2(>E>ln>>-=쮼QڽC\ߵ޾^O V%6ƵDQ]\g>p v\{@~!I|KxrjS`` Us%H$9*"v~;sX+q.s/=$>6Y>>#>>?? *?>9?/H?U?h`?,j?r?nOx?|?H?M?~?9{?Nv?Dp?g?]?EQ?mD?05?%??\?#+>B>j{>GC>=&<}ndEʾ_񾰨 u.y~=2~KXbMFls^y}Ԣ3;~z!luOn'veZN&/A 2!-924ԾDށ@.Msonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/testfiles/44100-2.flac0000644000175000017500000025625212252354725026046 0ustar miramirafLaC" Y BXmaoptF) reference libFLAC 1.2.1 20070917ALBUM=Album Full Of Test TracksTITLE=Test Track TRACKNUMBER=5COMMENTS=None worth speaking ofARTIST=Test Artist DATE=2013 GENRE=Top 40N  z*5>H ?O>goLlg8H<ܗj#+*j%vj}c}G5WhYIzZDeeuծIO88)l[QbyOw% cUq%a%-jW$%ەHGYl[ByD^]\T (4N4AYĘj"Ӊh!i EJ3bԔmLEz?в8ɮZ"%ZӋH$Őz5湮iEi&{jjj1<ƑW,U,ޞR5)Onz?,$ZiŊ,C]xe[ 8a.ZKRjO <ns   )N!%,::KhKA IƔ}F(J s4pЁbQӕUЯ!,Vf0h9Qfa.OVX#$瘳q  C`P$ B@T, CA`d* l8t8C!x>lP, $ `.`5y4s߬׎~<>=P SB t*V*7=VzXZ{k۳n՛^~nH]#vBBJ K:G 4StARM PEG,GU4IPAACQ-GDqQMKD0$GQKuOMN54C4KQ ,6[u5K S%4EQE=4ESKDS ST1AMPPEPEPAE4A-DK$4K41M],GDqCDK$rC4-PE[T0-4K-PA4qA UtGQL7:M6Q Ia׈rNFEHBRF褺lވ1XE*Jrv%M4MHEISnE3D8*2R8S*Vtos.̭RS)'"]e$H#}$I%")]!Hۤvk9''vt۵Ɯ"gM%rXGȝM4\GTsNLJOZLrZ4KYIt+':1BӑHM! k)-!ĥv9>I72蝔KMҵKQ%N\LII$"nEkI2v7INHOL.7Rz39.g%oI;II&S;!MB|IȤ"o(" KI9IkDvG"rE L(eOn8B:1DvP[).ݤIvTlzG&( k9!DrZE%ۓ1Ma Kj$iL&ݮݮ)nO"'Kɾe1ɮH䱾եjӑY>:eFR91R7̤cn\R'NG$|"7)&!Ķ鴒7Ѕ5ƕ:$ODRNMJaM*n)'"ejK#92ZCy>oR"Gɥq#N{'EdV#];VD%! KAB-4Q7̦s:1"+nbtkOT܎"+]47J 䛴K 8K*2vg$RV7'sZ̤ThPrNM#|KII29I9ʓnr*R8D(#]#})ΓV(M4R.!|BI)|),ovY:vvDJG2]q>K}+KTR]cvLpApF1vV8!SveiґS8aQ3Iȭ.LQLI$I%"5GMѕ$ot#I9>I˙IҵOk" 'ɾo5n.nMnH&s-3^c8I;I$I2)ړLr!tinƺhK[.o%ې-Q7ڑ:G%x2*X"nM4Ed)%"8aLYRnEi-#s>3$L)sXI+KK2RiQ&伜3k+L(p5DR]Mu"#]ZXex5ec#)>I&R]Yk\EIHs^ :M#}3;nmcTʙMnճKS)/mI$JEemtnSNO)''ZԊnL" #re1Fz0}[]oTJEInӵƖ̸%HkiItM4"*<:MƜK"qRNI&R]$..e̤"oLeӴI%" +'D鶱eL-iHɾgvړ*'ot][9sERikke(5).m2|Osk[.oQ2t''#K&RNS.ID47̤"e$giRMRtr;p"9G89Teiȹke2V2vIH#vGI!DD(nE$RNGvcjBIґRBkb'edMNG$Vc&ZI$J2(Bg]є ɘsF pXS^ 4UxgHErD !B t}5I$PpX}eA'xPL98gEa`Ht9>x`$?!zmj-z+J$q4)VcD;Yx%E5KbuFo|JLX1ӽ{,vs]-,(q Ʃ%t$JtWr,d;Y=*Qb nB,RQ Ar $y:+ݞ!h07H& +.{$ }RXK-)d0‰ yc$DK6v*Q.'E!G˅4ardD?\r緮PE&R1DĊxZ4ʟܹ a5_/ a/T-Nf*;)q$qdRu \ބ6TY B%JH@H %ݎxˆ$b"( SB\J7PZxCȂJ,*SBV*ȜdB T% (kjHͻ[<& /!,!bTv,sJ -Lk96P Cm M)˶Yv!](_{WK* $ I Qln_x@[0h8H~dndvR-NXϑM)*iBHyA!'baJXM-HEN2ƘBNYYf$ㄘMqKNSq\fj.d GXIQ,{8ܛ6.&12RZSAaGV3U=sڄ76vB퉴U$z"tc\/ ,!0q%Z*yadQ@Чd.焐Sm ?)nZ RA& (0@HβS†Bזե SI[/H%vP$ȣgxWf"^SᄋKؘ@B=UcNXae9[ $Xb%axPHFDVO. * S%Yr4b)D  C%Iנx~$U4qtbADY!,cYFuqеJ= )pǑ)`H-3Шjz1Mwby1Ad-%ה L01}ȉ2tbR%ф4 l9ڦ9 8CJQ5ָ !ȁp2s(Nȃ B!)9@"94)9(S2hdC&s9B'(s)9)Ù·?")<̔,(XPM2S333!)Iɡ@ PS)4(JPzB!I̔IL9IB d)I9I)rD44,"))PL`y2PaIBRLP,(Y̤LffLHRJf,(XS&hNxg2g fpfJP,L|BPps(s$C3 B4)(p ))IB)(RIBIBP2g(xS8P(st)ɜ&CBr8D)' M |Ii)?(RgJy)(pfpr\ɜL9HD9LL9C3&Re P>C)$I3$RL B&D3ٙ%$ frJP)) 3>>7J-L%ʲ xDž$dJ) BrJ{?l|K7"d$r;C*HV&tZp$ `8iMJä)! C4E!ǐyek.u0XLW9L9c v:LYK"&V/[e.yF,SKʓDE3 :cbJ['6y|\/u)p.>%5IJ"a1Jw2N!91{6}tl6>z̹ͭK)!#W(CUH= L/' i4JSVEsIPBB* :,ApAqe4Fr a!g*$A,Al-Ԛm,6 PZNk"!QE,FxB$!(i{l.iNɶ͓7-ʅI!aO X3!b)wav-Jmt{~]K=ڦh<)v|fHsN,]MoP ~pQTA"xnG.)4v Qz-ɪi^Yt1Hw9X*H/L^lvl%\&U cDr+iPAuc%Ny8Mշ 4m7G!TF 3!JC$1 ;6~-^W$4_ 1hKC9RYX5B㚇Ox~65OJP,4TV#dnvd5ZCoFѼzA poM"$B!Fq*yhPLJ'"S[pZiл5""s8R"L5T~7J׃\~7aRؖ;H:b!)UWXi=qt\n2rH31 gfY Ӌ8JޛMW$j5_b$njY2)XwyS:|j(]`h]muW5x+Fh + 4fR4(kN%_>1,vbsQCX䘒!(]&_aozGAxGw+BDBY(ةMۺO pIA&r q<(#VB,V1#9tz|}G?'iiXo&..՜*J!8c8"ȬbiMDMC6K5ݢ+E;huבSr/S$JzeJ 栘Jbʗcvb; R]4\`Zc~/BD4bNwXBB"Vl/^϶>e5@’9abfE5-KsO{ӱ҅X3S1PЈg3 䤠XtᜡI̡ЦLI3zL;)IBy4L2,̡I4 JfPL))!̦ɒ2'(rP2$$e& I,)3&P2S%3fi!2C(POC9ph@L)C))9C(PXS̠XSP(g&g2!((fg fd))S&)=39HS”fd2 s9̦NDLIC|9IIC@NS&RPS 42RPO:C%$ȒJa?39P%9LIB  fr`P:JIL̔)2) &R)Iaa@@Ф&| !PI)"(e2PJH faa)2%2S%0С)HD O3 ̑ 2)B4Jd Rt9HD2re&Rz̦Oe' %)2% IL)HS I䤡Ie'P"BIfM0S3'32:X~RfffR~S$NP)"38s%33S339)" (J"y2!)N!C3&PDYI’9'gLB!I̡e8f̦OL,0)?) g3(J̜9@$BD)B sC B9)= @:DS0I NdC39t2sД348S2e NO>s9,RRaȁ9 d2 p&%eB!(Bd"Bg8S&PB3 J2x/Nu y |&~^j}y*ϟd5iLR!-!`pQ98AV*MD=$YJFl@SAÈ(Q!@Sa: !m=鰹<$Ĭ։PM5H9Ta` ((r !H!K;e!:-)-E|Čq0S8F6/ jIV7ĒI /yxOzkL)qL QG8Q @ta̅Sg-&Œ~$Ԗ}KŊ`e0A @0cahUf +Ҕ %HִZ7ŗv&S8QC a C#eɉZt[bl7ż|h-9qH(R(c`tR Iֳ p*iԞ~?tRjQ9!r<2=U!\7K$$ZKIi`K6<⎀;90*H + .mլ֒kIh8b0P !L8W)XrZ'з[O5"V{M6Oo93JpB(0aB!gDʕ5tZoؗkOh JMJ`Nke"W@Dq p2Z<Ŵ5$i!ԉ7-zsTR2P(+P0AQ* 4&mixii6]%iQ|ҝ8LG((t"fxװۂik,ԍ-礓_|1t"q 1 !AHqU*m[$ZY$o&v򋂲9a\ (8Q0fǐSyri"|I"Iki-6_T);  0A`t8Kؙ$IX^Y*~,aa @(A 0r!;z\-զF֟6V%M{w\;ĂQ81•! $oZFtkyyXl0B a8`@8¤_2kI$I5割tF9È9GQIE@9AJ0QJ+"+y}}JB7ұkMޙ˝* 1s PR)C)Gv՚ѫ,􍐽y/Փ_O! 8Bq!@B%:^׵|nigԋI' ˋfjQC(ŽPe MGJOJBIo4-&w&5c4! @8q S2vX6 ]-5eZĒ[D斶zrW4C)B p0pc0cwg=rR-rjE^%b{Ge-q,}1ԡP G !@Ì"ϙA &74Y"zIHػj)}9 @8q YdoegXs c8S 0!(gT_m[,ZE_!i%3+pR  CSEx_jX>aFœ10QNPC)CtJ.\ƧI+hY-$?TJ8 AFP( \l9 C9XPg9g"(r(d'd"L̜S 9I39C 0pp!B&rRPɡ>S2P2g9СRD92™BS"SL2t3'I%092' ye3&Jf̞|af3%fdJffRL pdaCD2S32PB )ϡ'0LCJ(P" JfP% :(dII)9tIL L(RfS R daH ’B!NH (r39aPL J)2dLNJd3s3)2HD&Rd@C2e OC 94ß49L(s",̡IL ')),&r'0r!9fg3Le ̔")PB) ̤I'Be394B$)C3'2D@0 Hp fPfPLIRD%9PBI̔% Je39IXr4)&RO)'0LI42 )@3( pС ™29)(LIRe Ȅ8D3338RRhPgL9C9P)(%!% <% LJRNP 9B$$g= 8D9)094̖a4)(Xt“(s ()fK0 aȁI,(S8RrH 3̦Lœ=zfJdC%(ffaY&ROOPRe%e3@ &D3̙@ PJ@L~D&rK2C&D2y)%$̔d"L):p$$(Y(pfL’fs)(ᤡaL8P̔8YCB))BR:9Chdȓ4) CfffdHP,>Yg?I@e ɤfrR2r s,'faIfd'0OI92I@)I)$fO&yCLBdC I3ȄIJ"d/3(d'L,)))))(r P"œdppRP)32s8YCXPr@IHD .INrtɘhD>a2i U(>I>jR&-a)f;VfS wC3QU>K\ Z[-{}q8()hGvt!{{ݗeMm(6%9; BB qs1V rVm֯&mK[^;oUS!QB%2LjW~OLA'0's󋱂Z&KqR3DG)݆Uvbep%+еJ>Ԙbب39G4#!ʶs.֐N6IO&hs c !+1L f 9Ԇm)r?[n[':`@#)jGqVԥ[wvU 1#3YaQ SeQEmuΡ`[O&ޓ۶ "Uvt㰢01^񕺁=ԷtٓQwęECR(+9Br,Mn-L+/+yQ 1غM/[wV bnZ!HA\1W #9SMe~͔ǷkTLVqh u#(cU&ܦ"lF1g9J "3iKξKҽo4:)# ARf`dX֥~+Z%սTYЃNg1 2q Q38Y Fq$VYV8*9crQN1Df(VN1vQmEɰ\KoE,*0DS;L!vsV!R}o}mNLT-V\K'1r9!9wf3qZ~I׭>{.o#:Ύ2W(1SdOl=xNzoM,:X,FA J*<ƳRZ>~V{ӋS`g+Y,2e 19$c"wk?+/S&B,A CXardqMtr$-ڔ%65Z5d  !eAS%?0OZ şDҕTQn1".sH+b IK }k -z?k#9)a9 2t{I/af{L6VgDt AADqL94D/d}& nz&)<"D'sSH:0ldY|kzh\ dcT)AP!#v R !g OޗD%-m/YA 0"^ C̉Bpݕl%v_p7 ESGw&"B*fr2XߵI֯HcnNV1!c t۾& 6iJ[&IF)X9AFAq\uQRU>-ilo= Rjj%D-4*8)E9)!\dD殓]0lO3"Zk*Dt93 aA "F4" e_Ex(&Z;ZZق q0G[% &6 m ǧҔiǣ=("ufIR4V'=hNx~])YrTNr¶LT A;bc OJSI5v_2Jes|,R#Ld81B C␦:&>ەԬ-2/= oSa Re!q aR#PYZY(m2MKlЙJ};MgآD xh`q Q!Pf*bˋJcoIwQ+Wb!+\w809\c3e).+Pi|.ɸB1+ JCCH˨p\/ 5 ؒF҉ %Y#:„c x,3Ie|kh֮oS∣QVNAj-]^ie/^AZi6s B,BÑF* O*-Fk\iL撋ط72g3 Bt fjQqoJZ6t[STCJFP!b0:Vsqe'V]_>7-):aL*W|1&{+O.6te:+,TQXA3R$"H"VOWIl߃5t|g}|٭GW+\9Q p3Țq/F˵{ףs[Afq,t2Nk#yS0`R% C39I" z% L !S ϡf3B,ffs33(raȇ (>C :9ɑ L ’%(g2"(NII22&NgXD% LL9C8S2eyL)C &g= BaB3CC9)Y)™2PL,"!2~g39@%yȄ(O NP9̦(y&PhRs :Ie I r2s333(sByCILBJ% PA LS&PPLy P)ɔ90Lg)9Iȃ $B3(PI,)(fPB(O9IICfJaBR9)S'̞(M'"sDRR33(gL<3Lɔ2S3)2IC@II3'ϙI)(I@P332@&s,L)3)>Y@8S)9%$PffJPN̔ɔB= e(aɘRpC8D8RPONz pJ(s)pL"2D(С)By.9J(*C3%39gL)9! 3@L"I)Rs%3)BRLNB s2RL4LLNH% dO Jp&s<)Bœ(S''Bt2)D8RPLrr C)3A% fL)9:aNN~zs(eL)(Re&PNBə2JLdIRPJСL(Rs)YL СL2? NPaPS!NH%$S%%339̡IrJgffJ(ffORaO8ɘoFe$xS g(!#2)D %0,bېQqQsV'{w>vC iLh0I)2si" HH9PY!%[Ï)[r5], L!lTUqdIjYFHp_Cm ޥxıWG#B΂!(h` j0ԎyCD?kK 1CQI2y҄bS}<ƜK= Ѐ\/pX}ʋ#Aq'M!Aq#ƬBq-*WVI>Dh`[A9FPObfe8A5͚HRL4 vN4$!d1"5P[$6,@[f2%oZ 4`H D @.L0<P 05 l86 @6| 8 (a@ * @t6, DFDG ,.|2 :x2g[>pZ~aㆪRRґbHMV#Y0Ki>!Ԗ0<%ڕ,p LSxa)D,(QC:Kʷ6PM[oj&aQ*;戬r&1wD6='YMX `~45FBTFC1&$L IA0h]̯}դ5hgQ"=3]hW*E2zd#aPa~(<=j}^6P|Kgd1Dłf1hwa8[ 8]P]dJHAb2V T2eGٞu \ArZPin$N޹0a:eD!U,Q#X,CCRYJc0,,b>a߶%jn{dIsb]4Bq"N.)pL=(CYA>SG'O!\ `a}fu׫nj7KuOܘ%<8΁GZFfTXa[G /JJJHq-UJQg˫(NuB 5{7,J_-jV b@ySOCMqH`4F(U1@B \.>._j-`Yh0+わg$îE)e"/Q'0$}6y1Qjz/F%#U(U H(}{eTL]BɬY0N;`ZіDIiBj5E$e%j/-j  9/h X DE_D(먉B_rZ""G !4sYS]躞j5Ag.8$8h""cTd-Z\Xڞs]zCHkM40Y^Ej.΅YQ(J+(ӞQb YؒqdltCD|uj5M8/YѪiƈ-#],!}vC]za !ڊ Z\DEkBW^pƔ XH4BkAt3Ieg:cC">fӥJX|/tKzJpgҝY^K+ Ⲅ|^3HB2J7}n̡y줊C|.*^Zϯt3O*Ac1;Fҍ F-i}LnM%TaVaVB&\Wq\WiҎ FU*s7W!J mk!ByדŶPCx!BqB}Jޫ2mM  oՔ%uiUrq7l&xn*o*auՕaV,Mꦦj 8YƜFQqhN]vZ7H,A5WZPG-^搴EkBZA-mDVhj5F_VYEZ=W-i VZ5iő(hc"_ry4 hQ=pcӋ#cKv6EWhgmxp,86luDDEkQb,CQy!}(цQCHi !BݱR86"P,p&aF!8H*ѽWhbը  DZ.\XF 86\IE\!(XȘqg.XK8ӗ]ZG 4qzC,"*!4Nrhj.\XD Ez"+Yh-^Ab xb!.Z{BS  BiE-^CHi !h^̺sHZ*ѽgUk]MvQEiQsQWhj5FQޫFEi4z.z. 8=Ag5}ZAg R}o$0±FX!pa"ꉣ~SMh\&E1ȊaO\)ctl'E&yH5CS||Y'W>U!(R! cҽ 3;Hm=kjyzp%xkjKdb!};+U`Gg젤Gڱ%!q*&֝J٨A:X^"HF29UfPGA!B)&۩plroi"}1TN1!s0%1pЦًpfEǬidH"X1+R\IVF%\l>`IPK%A 81XT!R;c L S/ 0v8dk.F(*b$G4# SSΟK^ا*p1!R$rd*+T f ?jov^|>N54\" :" )$ )'eڌY>?" Ruy5ՃXDrT)##Tm[< CO ɤXG=RArq"eU#i2'[i[^lngf))aR­y@C&Sn.wܴj&>wBc%"i,8HW(,sH[mpj D{X5 r[%EqwgVcM$"Bg6 50l]Sy P+u!cSoIށ# =B'4jL?M(R+cB83 (BGacjZp^$ &NB;#J UqbN(\U/c9|<)ᜱ!d9Lg0;g*Fi^2K d$>9,)c [6Gbe+zľNO('brG(AG)AEVؾ3J zV|5N6YBn<e4PcqÕBL,A*yڂvFCd qg!LB,r" +DP^DvzNZ40`8I(Rb$ f)P̱>Z}+`rP](Q`a2q$9#||p ҁa ]DNE3EJ,)d*r7|{:I#Hs;(qcRC-mj . >*)(GAI s$'|%ȩjX&t.h\J,PXc\b9IJB" 7,cjaM'JiePL4Ҹ#'bgN,?)(᜙L9CBfJdJaBaLϒ)(RP"L)(L38DCB r% "L̡’@"'y&SRS& $(DbY9HD9Rd@I %8S )8PД"!JL(2~S8Ss9B32s39C9g)̳ 39L L,"O9PdIa,)(LNRe PfNaIBɞg,(RaI4"LN%333%2RP΅ dg“48S2Ф ) !IB!(D'Ia2gsgRafg3(Pe&J0'0S2hrB9JdC9™%JLLL9BSBeD)9ɔ)&R9Bhrp9 p L BPa'aNJ(J!П)( p(sЙL)!JB)'9IfJ29),B!2' L4&|2P BÙ):aȄD%2D93 Xs3LfdffPgJ"L"LФffP"@fJdLPrRP?Re&P$aLCg9PЈ LL&Ʌ%%2t:aL†C)&ffy4™NfRe$̔(p( $aIC9С(y3I&yBL’L)3 PHHPY`gf(肒Y0iY0TԼ iL9U՟0gtEYu9g9+'icEcZYeP!EAQ ݚ_]5}۱mUQOrVF喕ȰD2c H->KU-~ts^EZ5ך(}:Q/ۿUvzݛ8_XD5r[e"!HBeL@K,V֋㶯2z2~lG}e~/ٔ^%q "BN)ĈLYE*civ3"ح~(6Ԧlzi}="$c$9f9хH شz5Ayp7cT Z=d8D0QE;Pd;1C x.M)=f?Oh$(iK$ap)q(8b$gGZ $l ZF>%2x2Qf'|Ih~PM7(|~G12 @PR {"CH/Pؽ4[Lϙ],B0,T  R(adD4o5 \KVDIk{n+uj*{JcI4)p9(s:OrqfQ)pFveu>}KQ{J/1)m*YgE"=G꺻Z۸nuː!d8Yȉtԁnf#&SWt~U-bi 8Jy%4I)g_кn1v'G^P9m*D{.|q1xPwt tV g,O:B>؁I4Hz5Q1*,umi#|k5~qrG!G0hA/4ɔ͋u{/^Gx,û'LtԵؕ\RrK9H8,Cc8qFkwN_y38) ՟E2!Hif z<~UʤEz6V N^jR8K(֚ 0IF!YH˸w'4Ygg:n#'r[S kL-Y 5%eo?seX;_i)rFXR= Zio5_Ԯ?Y{*ucUb|2qTJIhyEQn4M{ A%2ݼizs4JIa)Iqb~\f`6ş>m)$\„r0àÈ-ɦ٤7R\ {ɝnT2S0Q0g QbBP. iElKBp>A)74*1QsP,(R@Qd+.PKJ^I$ڻ}1吢Xd8rqG!B5KṡY,7p%5!3z%B0ApB()DEF-J)~։,N]zM8%&Q=*ɔ߷$)Ta4נ4ߊVˠ'%Ȥf/&Ulk&l0ՈH{k9%"t 1=7GBjI+]I@YFK ,ZSK)q7yFB]2 [w0v]cC:!QB`Zִ=51^[F#"ezh謁eշ%CMaAo RS Qf呲3>eX74n3}/YPڈH4)(s'(A 8##$茧<4WUу}E$h[.%Ҙ@bR:K -c/^ ;3;v8 L$<ab =#s>,fw\}ٮ* T /JQ(A$D9YB;` C2o_ܜ?F>e"VId 眢h-Df^"q/իug=v4{b(&'=AM!sAcO_]5W@a rYBPLLM IЙ)9B=%S3C33&Re L2Is2&fd$"4S32Ri JyC NPP%%RzJ)&dLL)IL)(Y39CLd!'J)(Y2!e&PL,3$СCd酒DPB%'%P̔ BP'30S3)ɜ(d4”)2P)C̑2:JÔ9LB RPs3' 8D)3(PL䤡)a&' '(rfJffdI:aIÔ9L3R̈P43)Ȋ !̤B!"S8e38Sy&P”RI4C'2|B$S% hdg9I2Jd3LI%̤(Cn$33%39Bhare'p= B)ML zJIRs8P'@C̙))34 )(rJJ\ff4(y)!4(rg%8S2P9fO(RrP,RCS'(p0%%2S )3I% Lf p2s(D  R(Xe0L"da,(YLLLC$9C9%338D8S(g3Ie!* &e'=%2S2DDD399y 9O33 ddP"C C9>| RII!JI$IP""" D% 3ChL(ffg))"&rD4 s)Ja=P"LϠYN|Pr BaCg2D3̡C(r rpJ IIC,ϔ D%f J)3I@$BDPK2D8D3C" dK2RRP))P3ФS99Ls""Naɞg%&P fdLII4"&yB(Xb J9C 3!BD(xP") JRO IBY'& BIg='9 B$(Dds<̤"@̡IÔ9B2),2&BD!HdC&S B&RP"L)L)'2…% P3'I򙙔3) 3')HP)IhRP`P(Rs"S)!Z4ǻ*B r8s-#rntL&T'Ob]uh+2Hc4BLYFE,?MԯsԒPB/jYEkhR %{$)hR$Ckuӭ]i gf.H%⩔1̤w=Oq+Qwfa0-G/VtLyEHSD$U+iNbDyCq㇊{PLֆViI+sdRα RYȍO$T/MjjC9\ *HrhyBvԼfI4>%T%S *N9Hic+"R:>H=<$@4(%Г ķ(%Ģʷ5HUr)ѐ"L*[" 4605b5:B~ţ S%َsWʨ;"Q1j ޥzM'*ؖAV"T HHgiģYٿRJSrݜjQU:¥dG)rt'=6cM5Us%RA+EX XG,N#e^Mzw\Q 2exA&<13je7ĸ{f SLƭ;TmSi)g<(*1F<ĔW',?IOnߨ%sn,猅KBUr!"(cMJr`bӽ\ĢJ"E+Jtf,3\y`O`SwVyca4cHj\v9p.aa$sqA9w-lڋjf$x"$#XXFǢZ-_/M@|R|G!Q82H cƇR^K]xԯIDnOKԷb`aZd!s8bU;ױnߋJ Sxڷ滙=Bҩ+ 3IP1>?miL rE4#1bn™dRw1u{i_[ bvL0bCzB21ғ{ B4,ĺ8B0RHSQ#BSmP_ ZgHc]=bECYTu EOlr0kq7J u( ɔbRWb)DPb#>Swe 8,cQ˒B b0F3 Em2##_LEwRe%L i^9xҐSeT'F]'6ɡ(_. NR^rrh*!REI\ xFܿd.7ZS3U'YYES 2B;"έ܋L[?.!iK= R΄m#S" eXL+EB6yu/W+}f= F,Ĺb΢We1ٙeYޅƈ%%G=H//_5D1O1 G2+bf.X\aiW EE+bR"LP)*IRR8)$JHLɔœ)C%2D JBIB!9 L.aN3% C2$Y?S)2S39BP939̔ y)aRP3 3(rRPJN")2D2 r2(s3"BP"98IC% HJ"g9,9HPM ɔ(s2YC)DBe&P>H 9ȇ sp2)(O‡ LB…9œC!̡C(Rae M(P~S2yg$rPd:9ÑB3,(s4)(9C)8S%32RRRD9D J"I3)0rJR rSe& dФ$3)!NI@ ȆJ32P"S J% 9g,) IJ%2YBNP98D4)(g=Pt$!!C% J!B’!$$”(Jsg9B9(sC<3t(9I(Rfg0N9%3 JfM BPOC9O)(Re CLg0 IL)(y!Bp$t9Iy򙆔 0rIA PRPC9! fs9IrsKO'2+.P1 QAE!GuiNJW]&qg))X QBYwt'bY+I)Z4z-$h2V]Z9Hsqq\`B_ ד~$O򊧗FLwSp)Rn@%je ?XԒZm-$ON/H:#u)HQG9b;pfZQEͻ+(yIdDñ,0Q Csa"Wֱsjw7+4MWKhJ׋ Fpq P\AJBM$ridI5>pO' Ǧ^ @1N1(BA)8<۴)f%"w+GYf X(9c B`$۩b-;{I.yQAnVd 8D)CxΤ5ihYfهB1P˜ Ap WcYZ^> eir,ը$\;ҁ)9r0#8]QE-+Yd͍?#.*Oe)s1D)14=sXjMO%)E%3 R8ŒQ(J:lb L4m[Rd&cdI-)b1Hg8A0D E6~!>Jץo\bRRȂ98)L@ s3)+R &!DYv {KjIlI4ȒRf) Q (Gp VIRy:֒'ܯII ē%G_@ (1!1,S[=yM.a8!)Hc4HOSZ:I~aPhE!G00Qf`E?!F5}eWDˌC_*(9Q1D*!;Kvn;Ė^ZPmqJ)(RP0 fg 2Re)2e )' s3L(rPЧ9I O"% )=3(JR} @L)™ (g2$BD2P 33B C%0RN̤(s9rM2e2S0fNaBL8Y@%33(r&S%$C s NRyP9&PHRsI΅ tL)rJdRP)")C9ICy9ar`Y'I))CL9S'33ɔC)()С̤C(JP)<œ(S'2St39Ii$Ri,>e'R&S dJ(dd: JI rfJs0II3 NJPfRe'(fJ@̤’ “(Phfy(P2yL3)&P“ M  "L2D'(rdp2 PB P̡I&DB3C<2RPI9IC)2PЈJrI3 I)ä33) Rfr!C)> 'Bt)(P2r s)(Rd@LC8RP4)2@rfs9'&RfRJLP ̔ ™% ٟ)C s2Y))LJB r$i)C,2…Ys) rRs'C%)RP) 3frP,3L0Jh&Jaɔ) &g d2)>S0䡜I(yIB3B(P)Bs%2bHYS'H&Nadg2S% ɑR| fJ(faЦ @ 2C >XS)(39s2s3RP0aB4(JD)2΅&S0tIfe  LI̖4= H%!3)%$ B!yN) Pg(sI&(h!t'Ir' ̤M Lfe0)(@I< IL3C'IfJ8P(r"""''BIaee2PC2 B!ÔIД“,œ&S L$D|%(g?Q D}{ux"ibf[%e'Y*RA 8‚80«;<^iZ5ĭ~U{ @3hG `S :0#|}6dn6`xI-i"aډi)* q qq8c-"=tRYeI-%OGA)@a08p(EJH4HĬ+KeUAL@@B 0 ! T^lzKM,i藽_0%A)L@ 0 $AؗDrLLi/,^XRI&ޙJF0Rq0pP3i hiZy'/{-u&E_;90(Ä8Q19CV,ZDx|JSn9p8 0A aA1NQ)5~.%bG%]/R&!QÜ8 *S#6sBIKlJI+4Kƽ$?TJ A# 1(c +""&cO}X-پ֒I c@P8d ⹈)}R^N[y^Y&$L4$1 ABq((Cbܣ8C{``d{=c^y%ѫ^Y^e;0cAN1qK}յi$%x. O5F)J!C@A 0wb&Rp{^IjŒ~D$kBW둨U+T 0D0A( "c)JKHI^KX_4Lh@ pIPd6Si֖K$4*'K2ؖ A 1BQÔAA\0qJaLG(p]>t4KM,G{"aJ( `8‚bP^b,I~ĖK,DIge跞ƦR39@ @b38LWdY/$--ifX0 (F02e$O7GH=$mqwIVP8q 8Q( d0lO/ )4+B.ƠGr0PÊ p*! )4I,$Yo&]ZzӖ38qpEaQCeGHHI>yiYfIdnccA Rp9*捧blyy&i`3G:N(A8P pqBW>q52-ijHmY|JEipZЪcA8AB `ŒpB؆1D] [A6y="D)o/9aY´qq (Qa|k^Zy"t46ڒRE.xRT08GP av&佫?E+z!'8ПK"rqC † 00S҈uzTmjĥՋy}%fD(p E(0QÊa 1Q6m䴓$KJY&n%ej)1(00SaAQE12UzE|zżDgK})p 0Q,+_[Ĭ?Ŗ%/-f̟EWb A81C8a 8!ȢnhKM'RHI礒RX^tva(Qœ0C f0 EFK|I%Hh6jMHVJ9ʒ,0 p;ᕰ׶i%y,{Zt?wE3@P p9œg }!mkl,_yg%5~mWИxu Q890@ÈA U0~h %!p<^"ue%lbA`  Re0IAW5pظ -bZ$Zy#[ei?6lqX`ˆA8Ps,PѶtO?Cl-/VԻg!h () (@pA01QJ=FIjKkě+,.->V/"О00!P PP;!JK ՄYzDHžiɩLQLs@ 8Qug)\n4Jѭ4Ս5e/ko S8q8(H`3*EI4%D-dX,4Ԅ6]Q 0 QÌQ1E{-4^x^,+i/$Z0 ((B1 [1q+=&h kI/4Ix09()9CIiXKۻO), 8PQ @+sR`tVY%hX<^*G*4!F( Ì8 ;WyZ&Z{^7BZ4JڷiyJQN0qB8  C [[So{O5b^HlvR18(a0 8)JA!FʼMI弲ĤIkKTM1R(Ž 0A(QXPGozֱdI%"Ũ^]C0p 8@Gq2̡[)z^$"[zD=+fq(E [t>//IXkZye%>GwP (a((w" jtN?lg@ ZQ蚌gQyMfJ5M9ꚌȊ{уB whL,nYFsy !jSHk+,LIg$J_VհQ6 !hˤ-Č!=IbHzTvUz&{ܞb[6\CLyOtʗܖ%Y('\g&2{ű*{Gj'#H,QRYsFzh%.,ǻz, 5XK+Q__Ln[ʯ0Hˉ8 +jչZŢ5!|nSN%Y(ID58H@FSY:-l[BiKr{.DciƘEob<(xĪjA%lYd-^E*ҍ_!gVžqgcKS\)B%T>giڗR;Jv<_۴-e!*K.D )ʉ)b5 GW4Է%G4(Na$n]u$Dɥ5BK}\t]QlV2wr#YrJ=L|63/ǿe0l2jx#:nSaRBv"qEG>]eoJtg^űggSH) QD_+bD{ ž Me[\r w)b(aȎC$f-%KRZ}kmӈY+$#vBlעMƶ/vj+P )%UEc)@ÌuD#D[%uw鏈&%O9LB"̓,?zaSE|;__FR$qVqttAɑ &Tw_i{!1X,6W?e5kߵIn.m3rCRe)FKūD!6kfJut Rbz߈wB)B B9HQ!&3hޮzZ%J_'p&q7lf<.GBtgxR;YE %Z= ݾ{)|IӲg!)Ў#uɉQ]kN'pO"f12olJ2"Da**j9gV.<\-0NiNY2D^. VJw9﴿]-&;jG*r! `+]|L@|Bq?KNN>6ȝW{) ܆Q#;Psٝ@> BoǮ[vlMhT,V"pRF#\om/% \.>fUUf1 :'C]m=?o5>̟J. t; ;*>QJ'B &Z|ktvWZ"OPŞs+uPVv?5qPކ{??+[C;QR9E1I\Le#LHmBװ\XNKPر U(Tt !38]HWD0J- ѩ*>H:#)J S2]Y ꘺7῍],onZKHdVVS%kC'3%2S2OLBrC(Re 4% 2RP h2K fP@d"!JOIIL IBC33(S9(y2e% dI™%0S3332yI L2t9I,"S% (Pf'$@(s)aaNS2d2Jd)C9)IB&>Re$I9S Jp9f$“iC9B '39CpfR$)2D&Y<es9)4™%% (Jfafr!3<(S%3%2S&&rRP̡L̡IC%% P"S9%% Jd2JfadrS3''$8PC'C39)g2e&S IPD)%0,; HPLfg(y2 Y L 2RS% (Y3B)!Iy3(g&e PaL)'(L LС·)))(rrs(R“))(r&~)38D3(g2P)3L9ILs332 ɔ8D9)` d̡Ns IIJ2fyNDIL)(hS3s2OI33%32hg0&s2pg3CN(g(e&hpJhp&g(&e3NIC9)!g2Y)3(rP"g(Re%BfR2y>P33,?"̤LNrRIL9·"aLBC'@ С†d2e$33 (d,˒43 œ)% @I RROC3BRfJ3(d)̡HPK̔SIB<’%)&r2PN]ɘ PNK` xlε+Z|hpnIDO]0+ ^4Aj}sUx,h8$Ȍzȡvd (Ds]B‹(l//>Γr{,!) v*]$SJ('"-)b0?&hZ-ba.ތPicq" MFL,y{s$ I Ƅ4: v#NJ$1^3hfCޙIBJn-w)@#EX$[⅌pĥ/N, |D J\-m3¨GW[Ԍ̷oG1ݚDF/Zj3=uq:zQ YY,[5Bh{Mbk1 0%RD0BLXXfwB-Zc1*U`V+ͣHi6\cTY p-4`"WRjXg9qk9z*K.)(IĹka]5n\5 d-[APzܶmS&Y+(Hu#VyG (k/(\d$.&5_97?m^aVMCW7jQS$ n2" *FQL5p1}Ⱙ" fO< &I&CzF͌Z$-q´ Xi&5a֩4Q$D|$040,h5Bk؈튜c*UQ 9,e:,@[DuQ9MĔ_B&c?R 蚌E%s {1\&H Cѽc:9nu$BG +i E *Q*}\ﲀYPJ%#BFkGPP6qZGP yIbX(2QJ+YR U9ᚁ6\5MadZ\I G=H;5^Qa@I "^\2ٹ>MOFm-[@ZJnjۓ RD!&#<Ϣ "h3KoK3bkc'yckf $A':p9{мXlgohs\lr0R{"BzSTgZĝ9T"݌ҒRX eM5W!XxB턈q9(Yt9֪!lX$liEnm BPG; 8 b(eeB%P"UDz„ 0.MijY!ҋd(tiD4Œi)= p_ #e? jHIApd tj䊒F,e{hl/婬*Iǜ[.׊w,FZ#$d5lLY-0I lqP0% VEXFZ'M9SpyvnFvDP fe$*j޺$搜j۔?œH!FBr#(R$c1c]YBnZ/=ń=E (mߘdVCQ6%#fYt,X!G{7$aD۸Ϩ౉īQ(3Q4v,D4(l=a&UQ_R>W\DG%̣ɬyI!Z8.t`4͊8ٺzIGc_L25UB^"X҉9EjZ 5!n7?6q+[J8>$°p"MISCDa&5cnO s=S!iCQ Dbc] ^z9&5HN\NBeqMHr|I)(e ̔\ɦffd B!)S&D2SJdLy"IC%9JI%4i=%$@Ȇ΅rRNaL.|XP"Jg338RD'LBS'3Ce)(S)%0JdRLC% JRNg&eg򔒓xPBP,JNd

SCC3&Re NI2PL’23CC2S&hO(RP@pLM Pd“)4ILaL9fN$' 0СC9J%gIPɔL%3923~S32IB% 42&t% B dœBNf(O?"(y:DR3&g8SCI32)…(rs(ad̖fC9fffsCC9i)))(Rs0) OBzYC8Dΐ$P2PLdfs$HPS%9@aI!9C(3I '(Y haJ(BRRg L"r8Sa(RNfrfg(ffrg0K2DCY0aL‡9(D)r"I"d)C&RP phsC@(LJ2t)&rRaPs(PBe7ɘ WD! ,s ™00ExDPxQlEjZBzD$WDfKy sK<&߭jru @a BP)g! $-bn>J$-Ad6'[fX"H20,)[ӿ)bKԿLVl9ME(@D(e c Yj-!T:AaQ QTPV"u ?JkEù=Y#D*I h y!Koe)a?ˣJ%񖀳upA !Lav yƌ/6ZZ[d3Ζ8Dr( $GTxM&RoOߢRն<1Y(TE0 dOcT&}L=a t: HQVv"C&w QiP|=GYzS˜AQ\©s)>%Cp' 4>G^"H̪`+!"HR9Z clMI;cT7^s=\y )!"J"t IA[JMMAb`lJi7Cl+gl@1:QW&6 50Jɒ_%Ab0yAV+ bP)*hCq>֧_l^%]lRSɪ (V:·)Q) 'E#؞ I4kwIcam75R]#D]"TI 3 .7ypi:n+Ŝ޹B (*i\0)(IIj'sΐ,_}v선F8Ha*B( W3Ea6hydɶ`ԬψkP9 CGaaXDXs8Tˍ0YK+p}km&- vnwp0FhRJb\d _m2_vA^w'*EAAFaq`UjB<'|k~\FR"2R*\̌PK; >VLm65D e "0 Qw?:EͶ~i \*)آ$UQuX9 ,E2a-Pj%mdZ``SsbyRAI(99J!c Y1q_v,珁|`ɽgPlzk>ɰD!Tq3Ad;:l уJ80mr/z!p+SfPBTq$FbD=[^)b]=*s0Qw g*yiZɂRt^&ahF0ȑ ! sv ri/*iLR.Ro_WXH)BqΡPF*$rƮIklH-I?Q#HE2*QL"b.BM2J}__ s4Ļȅ1D11Qc*HWɍmקN= aME =ÕN# @ !aݲMdy0Kln B`|%Ej0!aXHPRB1SV ϔe 39 LO|02!BP9)K(s(Ra 釘XD s9Pi DR9B)= ,3CS2P)332PaCRg22Y%SL)К8S&!C%yr&NLd &g3̡!œ̑ !<| fg = D2S(xprg(rB4)2"B(S9Y)C4"'p))&P̡CB))8ea'2~|)fs(xs3 pM 9C9ϔfg paC9LhRaz)Β(s9INdLaC 2t)!ϟ) 9)I™PfH9CfII,yB< Nad ̡I$NP,S 3s'0~D2S"̤ILgba4D9&IB"!>e)2fJ% fd RNPPJOC(Ps8S% (fr)$9(spIBY33%38D%2RS! C3')3a,&fB!,(y$BP(Y2D2g2P,xfp% 0dLd&S$(Rf|(PRe N339I)'2Jfg()„ LfPLL̔B(fIB)43Ig(y4™Re B)Rri8S) Rg%3 fdO(ra“)(Y3)='L3%)0Nafɑ<(he ?9%(B' O)D 0 (d$|)(xPC33(e Lr?)39C p 2S!B))(hS2Hœfs s%332s 3sC3 Ld$fs9,L0!Pe2)&sg2y4B93@ aPO')0$B3&S d,?"(ɔ 9'2D8RS%2S2D32e (s>fprPI9fpfdILB)(SPJP™9(RP'J93 dJM CHL9&'2D8D98D8sr$M% ,fPg 9IS$g)2 XR)(RfadI@Ne2P)9)3)(Re39C33(fpf|2S$Be ɔIB)(PBP%3RNfaIB:9))&HIHS393ؿHw)z}^! YWKHf9d9g:]G ) ~m-$rp4^>bgB aE F E΋ɑL~miL+5k8Db98rJ? |[}ij[ڒE^D;d( )BtIb(= m'DZ-ûRRaGC \@*F=7l-:\~MLAo^GFo1G(QCu>`g9O{!z^ei}>o”IT ! q 9 e;)SE+LiZ!xI a -88w 8e/HROY,MC1JRcB8sc1SB[+l' KIRfKB5Iva1;@bbZ:"KS׿OVY2]ׅ"jr1NA 808U##4|Ƭi|'1fpD9 "[ߗ|-%k)P!!N99϶̬6ޟ7^_KhI!=jT950)B 9 2jpQѻ/K4-7{{1 A1  'K5^[_WH7U|"\S )F8 0!c{%zj5~|RH]MV#!)2Ac# f$N RYA7pk~ٯx>LG%EbCa+Bu Oe޶'R--.EK<&XRD I"1QH%0:.'RֽdԖ%J3䗈!rw1DC(jF8;%he; gBALaGÌK::㇮8}I{KI6ZSV #2Xw E)AYR?u:֥lAk o7ħ 00@)#Ny 'ԓnz6˲ufLʧIN 1C0d0^mZS$kYzO e/iDqq Sq1sA% EҒ|5 I&i]s<꺕AF1a 1|8PB"[؁ImZk%/}8rl.Ðd a!N!;5 ȔƐ\䤖 _:DA"lrc(S)2ΕO (}OKp\ Zy%B99 a0(9I/=M-iX۫LR(ZJ)SRQLCHsczJ_ɫSULMGq¶59"Q/1AӰĠzZZKň9l$`3Cq l8qE:SH1ZIIJ9 %(WRs9jqB{ 'I?SIti%Б"SiSdRaV!88Pq@fR&{|Zխ~CͦUq}\S );أ(9 `_ݶfd4A*т)J:sbasÅ3!oHo,lhVi!*i@wy0R0P)v̈2u:y4L,o&/x^]3`!:JBpVE%L`Kc9-K%KWXU@}!ȢSPj0pF*-NzNz_ԛ$wyucRc(bn`Ʌ+.^R$&㜖꒭!T A  ӻҷk(cxzt. cx^ᛤEV#eh)0qD9c.h(Dy%?\-&k\Ծ_daBFAF`Ul0@dB20n [Sۦ(׍D+Y )A”"a BUml֤%$i YXSCC A(B35"b'ɷd_}"&,8A 9L;B*sWOIki]ˊ q6%rBgf7(c1Y "ͣx,ioEe699a (!l@9!A-?Ơ}%/t,ѿkx"䪊(aJ-{_P?}LO^ he NK! Ξc#}pSS-5נ[ֽ$2xM1Tqsp0B%OfFQ&ks^Oh0IP&~S0O)39(s9CIȆO'BL4(fRaL(p(ddg4"S LaLD2s%2P%i%(JГ@)@ rs dph% ffJ>xg= BRrD8YC93(s3)$d<)fH Å% fpaCRP$D32JdsIg(OLL<3&D2S39!42PBrg dI9C8r>|IB!IC4ICR C(pIdLPhfdRPXzffJJ(8RȒJ3p JJBPre% 硜P",ICBP)22xig9g) B.I))C &rg(RPP)BD0JfJ @ə(PJ II3&RS%33&P~Rg(S"PBy'΄g9I(P'0aL̙CL))CLe&S$OȆNdBPfM0RD sC2P%2D(g ФC$CLC%3JP NPP 4932Rr!ɜ&$B(s$$JD2d̚!aLIBy)C98S fL?C% IdC2fre LI@ ™(PBRaC'ϙC9>z,<>(S2e S!L,(Rd@P(Xfe |':8e&POPB(y'I(Rae!'Bɑ,B<9)'9s ra"̤"IC9B&)2)4(KPJd2s3$CII332y2D% JP)H|PB!33(sJ,$<“49Cɡ9L™3 $)a@fO=P)@L)sNO BLC~RyɘYHrzQݫ}62tahLcB=*x;䔓UҚBUʪJIhQJ j P$ٹ1 #BC0e[,F}LBjan'lPYzv 3Pp|*Rp;Q^C0 G#aq I xUSV*`"YX^U3iw6nm!mSiLl";Bܠv!REXĕQh}P0,'MJ*DW$ ̴%{|qW[7  O~%JNVAE\ fg1i( ̈́ZFמ.7U!57Je0be8̵ՈDrP0B>8bW>d (&HTtE)ArP2lԑAV$5(Bs)e%kx@+Ȏu  fe"SrbBgn~՘RH %eG#4 #ըr/S3 %_<_%"Ya,,'u!#bDliEg#YJ5$nKrO([`C*HE/@!deQ3+B4=.|;O]BU{3I2J<'f#/R hn0 {GiiL7.grHE`s-QjlwEnnB0<5=9,IG!ҫx *eݰ}  j RR W<-T"UXZ.Dy(=ҊD6>cap #Ǯ>_]eeviFSI!]$%K$ DAN"GPx&|lN,(HAAuw:(x[Ri+% "FqS,Y G%)p;ȶ2P,N.Bl15v, vڞB($+E8-( ^+\޹b2_˯ A&H3M.:rި" BJ;Z @ȴ| NR J2Gf'FW pG"ՃwgR߰^|7hU+ќV(!C4}AWK )1HV5okSI01"ъ*XqE%Ƌ̍O~<ݛUfwkxĔ5b4`u3 f"kwmPj>`Ô==`#3#p XUk RP"(S')()PP9NL̚y8D9,9fadaBRz9," (P礡I9 i@3'DRRPL339XPӔ39C2J8D NL9@s44)))% 2$2g% NM%$̡I)С(Yg?C9B0LL yJ%,(XNg?3LI@>~s)(r)= )2r NRJS$22 Dff%(prffffL% <330 f aIdI9 dȓ 9C )rt(y:OD98eBN)IB)4N̦J(IC@I )R"" 8~Yrr)LB!)$,'̦O)0g&s93%(Jp s9CCdJ )"L"% s9C8S30&rD Rr&s"Be3'̤(Re3"ɜ"B̞P)9I@s(PaI J LJfrɔ| :44ɡI(p",HdC3% eP 8P99CC3%3)&PÞsC B< BP!(r4Jxfy9@IIBr JD$  IÔ9B&aaNss)2aÔ9C9 Y'IC32JLəI,) )3 <)3)3…S@'NBO)%2dC D R2S3%%SRg̦L’ i0s% LL s)9L )Lɦ,(S&P)(Xe'LL4$Bp̡IBg&yC39ILr2P?(pg= Ni()&PByC$BP X ILe&RyB̠s49C !BP"JfRe3% 礡L)C%)32 f 0RNLJ œ<ɔ9LL)'39'2D%srffg: RC49:hRifLPS' d JJB!3)(RNPСC$BaI’)2$)L pPJPJ% 2Rz)("Ls2D2Y"D3C8S$dI)2e L2Jd")'2y)BrRe338S2RP)(P,H pH:݆a&g,(gcSC8h{?U2?[KRzۛg0E)/(@#9pPD{s Pt ,Hp*ȲDAXwhB*:Z~7"Zڽ\@)=Si0Pf3A  r8Iͤ.xI ܳ`Fb ☧qT) `C[9Q+ě?5lvl,}̩ꥐQgr (qEd@N.V׿ XBs1[91g3 9E{i{& ,'ep (V#Q"1S5v5+6\?d4{F ]'-Av9r;S$0bOde\Y\ee{j'<$^ɬC7Q )X0 `lef I)L'oG)ձ6PaH#aG!\p"EDdl˹"۶7y_ >J!EcS9389ǭEV g}&}}mӏ.Q$3NU qK!TF*J ?2oy?밒D\ Yَabb e`6&[ni(huj"mqΧY @ÊuPP1{]~'2rvi*.vtcPÞ4Mݥok0`:.\@qHF3aNrA}D%D%\/#B/9XJ(#c ?ګ뢌ήD&iX(@S1@%lBRy3*zRL׺M}a5r :ʆA2ҩS89m $&ѩD} v;ؔK) +NRqHD(4o^/'oNl4%"j~B9C!BLOmCnYf ۱0*&-9 w0 cFulmz="S#. ATHVn @,܊͋+,kwčK2>"%ԈCQG)K# anm&fW$+}35!Nڪs@\2pR/b(yuif{˴ݚ?ΦP" g: ꬖhR oP_~Jͬv+N bCyIwBĬ Q=P%**!D)VcnEe"Eitnݾv!)0?B) !0Ա\GPHi+N>}8Y1Iͫo_rcf# p!^CX$,\Oy?vM =9P¹E& CجSHO\=L$3|| ece3QD,YB+M~|kEKqѾ :"7c)JŽLdA5'EZ$?N3CQ%wrS9JV! P'E ir,L\.~xՃU% SVP0iZ"2 Q(L_ϥiMD[-byNj-qQA$SF(01%r󾰤& M|y䈘m|$.j,U2!A5=aA^,mN[w?ikbؼF-PԤbpg!%Ad \{6%iGim/[Cba !Hv8pcz!CIwz?)8+>7O#HGAjHR$j..[ Hk0շqr4Ut;31X( 1FGMG *ͫݹkmܦ υI(b9NB!ViBsᷫ2nflI!tr)DQF1\p":a]Al&~[Kl7!ReViK 3AqAMb9K@YW_ou7:QI՞nv(#G0p2SB1@ ϒ5(O oTu;ˆaD01KK;9T<%ri0/޻^v<%fLP-6!B (u1XT:aכ$2B^l&6hM|6pYC] v3P aFJb$0DBs0&KNx:6j^MF+b+2J L&a:Za2"GKi0U(*,J+PI>] B1y|Z0B9U (b[9Ae9 lcFδ?E@u.R9)X,Tpn$wS/ $E|ZӋ{ r( E~cJ;rquh7wS?cyZA"kHRSX2%Wd*xQTlm-pNW0Fzjq'S2BXDڭM~D+៊jU9SQ1bQ1!yQ(8X4ao_NVҾQsJT-1(>!6 KؗzB >/Rnd/*3iIRU}yj%!/3 GJ9d5ƺ%=hlɌ)R[A&5Ugnܷru!50bQSyWz"j*{QŪ##kaf-^䢩$<ЕyE]Е$սi̦=3֤sf]ie./h|>6(Kx_n]e *Q\C[Bc y|BrPE i*|Fp d<vz7X^jx{_tfhoW?nVG4oWn66No joO`p;p(.3TV.JܗۙR,֢6a2HA.],[V-N!_kBձRKk䯍-֧|< PeӅ'IJ*NԶ◇I8+*BUm*PV%xm Rry.+86 }g;c|'F[Jo“+sM} h&&GsjJ물,UJ2QfS]U̔k##&!ĔF^f.d'*%-=(i˗4XAcG3{M(lV""+hIMB}prXB>JD'$ae\J.zВۙbza$mF_nwf8H=פ&Q$5QDO%\z- 9niO#Q[Z=~"agRQ5qlDLYUyĔ ign܍dtEЄC 0B!99(OG^TDnyK DšgؾRa_չ $bqF]1 k&Y}==Q*Z !n[幧fUҞBӍtԨ"5C:D%[(Y#b2jr*ZFW=Bu*%Z1c "GֆIţe&\E%WNz9,ș0"gE]{UCF.zp>cܒ0ܞU. k&q v:űnܞq,<0ab.rg )YOw%baIFes ;{u^M9r1$Vd-͒ $ňs$L,YI8I RB"l0 ]4!H] iOtŸ/B{^M[A$~G,D})e=#XIDTUDKr]QŻb*RH,Jsz%IJ"s76yMV+y RWn܋br9fFkV\g.Z5RY3֥]9ҍ1lJfU=51b_s\nE9yIiWVC{ʭ(6!j鬛g*GZD(DգT]DFLTdEsU\ !h5!D酙N,[/!<ƪd\h%tFQ4D8IU5,,˘BiRUzs&J*|R0Ok ,F hZ'N\j%5*iD,5ZLuYj5}h\dE{% )˪ŔI4T *6_JsQ=jJ"5ѬZ"8J"9g [Q%㮲tȻ foLI4BNZ5_҉~tϵNjIF{7#&3Q1z=w BYK!*܌̼NYĔ҉#ɊE#{6}=SQ,Dz5Sϒ )TZGmBŔޔ_z멢HL)t+jXI ksTDJ_L,V8M6ٸ4cLt檒$Q*']1,iOGFZB,Bܖ= fɘL- KFMjb5&4%1;40۟̅Y=agNqKmet" KLߍ$ Le4%E)'$RvQZqJF<8 N0+( _bce'uFBlj# u^"f}[;CWxuuPPANH@f*YUz4$0T6f a@\e:Hz!̦j< ԸWev|5[ْPA7*ٓF ;QfTME \t*_ī^ꪘE#xドSvx&0i۸IKZ'w"X1u2VoHX@@ݟK1ٷ100ǖ"H Ė<"M"Ѽ4\(@Ghۜ%DԤDf[cOB‚%JEkm6~``8JmL}_XP@ab_JD1Q=J'fGM A_)EuP0,G3@6aЌ yB غra2}'+QNf}$ rHS ơ8EELkL.EÝrKjqS ' ,z H =!۱nNurn&"Hf$Q[vJE aAW^OC#BO!\pϞ+h}~`c!=yR*0-1 ,ҡ锽B""4,4 9;+۶ͻڂ[׈Rœ$Edz3!V& s \(@߽UM7=U*8_rX_l։*?hW[!Yw=·rD^H/ P'$^0n# (80dXlr+dnSu mf3cbd`:.P#%cԩ#95 OPeLnz9^XR3 A'4*]_SwA!& Y(ۆ kvժUw+A n(]Ђ5KNVV|VPtaI@soXj'efbАl&基 3Vw R br:/溲"onh5)IJї(SYE: B^^2 |#hL`$h Kt(Zh$8+X!gEUZ;K I'8d&>Xk}>{w9Uq5(Pᙧ#NŽ:nڐT+g3[Aba|_]lĜ(D˴P`(耶ó"#}w8Ğz}-C*Bͦ*az9y:(G׍P2I%sDr1 ɮT.e8u%CR2vK-M/eHR''8A$jHC)Gl=Jֶ J<,W;}.&9Z%S(p9IWfUE墲2$XAX\1OM~t}p@@(B4X!HcVŠJZPֹ^/[ʉJE`$I4:]w1E'f'asza jQQ:W_FJ4i?0(d6mx%,⛗q`"&L;Ȍ[-Yj{rXB7ҋ*[+! ~2 -F3!}}m>]{Z6hB9)2B ܊GOaa*|ݱU bŗR@TbRTQsM8]uԨ 2hkmh8E,kT[!=cB L.Ą>v!E!"E!E#9cԠA?뙩rt) 8RgП33 fffsa& 充% @"&g(H$(S&RRD2YS 0S )y&R%g)(SS dPffffJ%2 ɔJP̔9By>fbɔ(aaB,ffd!e'I0ФI38D9P)2)22?&I̜L)HR2r%2rY3 IP%3 NOC9d8S33"J49I&s B0'39L)"(Pr hC̙IINP IᜡL2e JLC3@ g3I̔)%  C̡Ir|!C s fdB4(s4)CD4  J̟9BJfg8RPPIg pI99B &,3 L L L3(fp%9CB!)'3Y2’)"@̞P,RPLɔ9 s2 Д2PɔPpe 硙8PS39Cg$Be&4L30L")L̡™2B he 2xɘ N&DC˝&AsTAyϪRtiNEQs,@*E<58P9Zaz`7M@(d󣙅7S1B"RIJPܤ=[J3`u$y\(ؽ'Fo” 0)\sHܤ8 }*Ъ*bBL*yv1"q8="s,dz0K֜M4%_# rɾC3ut8c#H]"j1U.pCVưწ-ZWf-C1=":( 1&Rhwc/0D*aJ9Pv.V\*PD 0!-󭈮jAxأEo^`F) Vx@XI D.*Vsg4ϐ G!J 9C{ˬ`NYUr%r@F$Ţ)F8q[i$)4$֦qتI+ T30AC%ƐݕoQ"0ԋ?rrOkŧ,ĕS g1P[b )9VeA&q0S=iH*J, 31օ /6-H{AY!CP( ,VXy5* A i/uCe2 ^A`igwY'څQ7CH@u ya*8DlTr+Ah0zBϘ,)AKi-uJSH!fs(CP(A ZR,gJa:CA=6{ T BѵN/쀆O"7C')$eF=qR0paYU?t(a.QС(7IF4R0ԈI,E$BʠQBJa4zUhDr>?ʑ RXZpᓕqD6"l&QV|o,Qơ >S,Y|PC{:J6HвiEY?1tn#aA!ArOjZIt#Hk5u h_rw(ha^*p 5 2e< T Xy7Q@%g*E2HZg)$ ,l*k&j8TjqmQMySU"NRVJZƨCBHݵo .t%:5 v0$PaӞ]2pakݛrE[5fMQAk=` %z0cyveZtm&t @ovEBSDˌB$iQAGTOC{ш]h$ՋNGR)KBȦ35(WX'EGƦ)̉WM#x!Eo}QE*x_p!;B}^'@AHQ K%yEd" ;G68T3I(o'}7?0 yeN-Œ\ p1YH[|0vmGˏGDg ,H|)ZjOJ:>j \X P9LV1|iJ# { xL28QEm !\q5MA {ʼnVBraT @ÂLno#[J9L!?Ny6A:B"~ # E(ܖUv$CoZJ\i $E1pԥGc Hfm,`|%h2T%QcN04@jС mJDj5ƒY# jɍ+J`y0f"I qBͩܙ]"hMa }2ՕҫWd] 20k>0A5MS.y$Ջ 10069EÌQ"kAd 9KbPU' Q# 7Mjg g eYjgeDLVV'Dq<؂'`$XIfW(JYR+DN(" R B=b{ [DW8ya/҂_N/i;D4(`E%wwkr$q$I 0IB r0b0))jTYud]7rVӾXIڮ&USd`pf)GiyHiT.Mr*n\~~$Bq-ž4a,ÖI[j>do뺻/QfdkSLyh R<<ㄌsMIK[OMUU5wgz2'' NZn]DYĚ ӂRxE8Ɖ̆3F0غem:f_nӢ/s+Yd`0y# !:SJ)NE,.4ʳUˤ]~&rf1#R1^ gZ-OoZYtYmdgdYQ9y-) 8'hb5eoFR!Sm̜ ܋[]6e^+֬Kfs-y,簱{N$43?]/7wz۬H);(ys qa'E~L&ՕO?nUt8]_v˅BFQq1ƍ +(Vf_wNdD=o[E]2ܦ_Oyib, 4" @D)Y+SxL9IJ,no$WYRֹL $D<@XyjR#ר铸H&*+̈P(qbRe % IfPNffg3Re )%(d9CCII@ LB 9RffJfPÚ9…i(sCɔRO22Y=''Rg3@I3%hfP(RNe$Y2& L‡ ?32P)2 p4)S&e'C% C&"2 H'HRpJM2RPLɔC pIšdBxhPg rS0fPJRgRP% JNhD&YfLC‡8e$P"L)XP 4g,p2œ!ɜ g=% d(S0s&,(d(sB' IȁIL2IC)$̔ pdL!e$ g=%9 JI$LI !$LM% fJJL9C9C&)!I$d0f9OC3&RffJ I)3(P<2,B9gJzBPd9CCC,03(g!NÔ9M2S9C!)aNt(XS3%PeJLRPRJ9R\IBS<)4J Ù:aCФa9C8D8P@gPD JaZ(XyyS\Gk.)nTqj*H-JY EZq" ,_;c?GȈbqUJX@"֫EVJ&Vm("g5,㿯F1Q9CI!9Uӑtī,pEM+&*2eDm.!d Y*[!>MU&2$=u3%(nÄ`2QI U0?31SW' Ԣ7UUAX]uQfS91Se1q$] $TB?G˽ i鬴/vyqt,& F{*:P5Y*h u/2fz}jĻ=3fU䢱cܕU@@Ttnj1{\$v2BCEy +1ct@-Xޜ;Q7Z :^]C0DdRAW#Gbr&TB#ʄ^Vp梨2v{Qq_h]8:/?2\`̶uJ/  [D^*75$LSG#!iJrEr2V'"Gу*2aAUkSxWJѨ T- 3{rH1uةDےʰaJ,jIg&KZPz(;Ԝ%]?t`H#ț]DM 104M.J7+Q,꫄Kazi6ɜlYkhj7pHgzL*QX{/ը]7{wUZ40S.Ꙥ)5@,-ꮱwҖ5'MȭBp)z/@Ӓ*e)ܺb=zЁYu4»v; #њVD<މM<7 RQ>":zs(`$NEuuCUݱ Ț|PEIpWF_nzzU`$JTKQ7If7܉BؘjVxP^9,;љ}Ⱥ0tM?ae0goz-_0cy !.4/SY*y*O &bcUPV)/-@iw9bމMLEzFUUZ3ꌵ`X]T"2i҂br`ɩȚ2;쬔_QUWQ5[!#RrjqN*K$@<.8T9=qZx0ULDW[d@Ds1T#zjh~"0ADpgcx޻? 61Ȕx㹭L#<reOLgȘ^2#&zѬgVNd+C)`M#nQ4{m= jE\UD61z'zBP#Xׇ*aڴmEV|YY'!ST2>z$8bDet ]uw9ث6%Zs*z֭dV@@e&%&dg"I̥ D%4 >S&N"")(D&rRP%  xL999C)'(rPd L)!Rr'0ӟ9CBPLC"̳C8D2S)3ᔙLg)̡NRP% )2PhP")(i)’I̝?(JP ))Y%!% %aPpB(Pdp&fse$"d)” N&LrdȄS2e O>rs)33P,XP)ɜ)S&sd d(RNP硞aL)(iÑ(S 9BsI@LO3C8SL2hS3(ffda,I9O(RPI rD 2yB$LCɖ4pL)% &g8D\ɔ'RP"NdLS3fy Jr‡"32œ"g H )2DXP!C8Y4"P4fe ̡̔t'39C)2s%9% g3%2hRe$C%0g'(Rg33&(y):NfLyP|yv pyHhGP8țd.tmzjv̟jiuݨu_<2>EJPy ̾QN|6m\3([ts`"x*ٞܪeKrŞ*5 B6ڱ7.L'8F]?^ާe8% ?qkߪk\hpWD=FyXMQ6#QM$:Uv_c1ܩSVԯW=$S*m#6(J>2Gl dFAk!/ƃ<(y_J|icW7an(Q6\* 8u%4MDV1ּ"U济uZ!e7#/Z)mKuWfu$$YqvSU{Ķ'rCiϧ++;ylw 뢷J[Q86񗏵 P2ġ;(j}^o'v[wv[9fSP$/,L2}ϺLTAH!N[Ԯ'h-΢|5v}6Od pX>䬯 N{oB6lQSUz'2%lPb Uesn`2ȘxFR$U&mZ<v{B|8_zrҵOH4hbH"⡖->I7Tզ}{FigZ-d) ۥtjwlJ[䟝vMn ߾Mo"@VCE!|^Xj,GEl]JСz1撞Mg8LE%.Ԃ6G݊Gmcw}xJSfD0W^!MBX)+6mhWfDIQ?^{\kާyսj,4ƙaQV #include int main(int argc, char *argv[]) { int good = 0, bad = 0; QCoreApplication app(argc, argv); app.setOrganizationName("Sonic Visualiser"); app.setApplicationName("test-fileio"); { AudioFileReaderTest t; if (QTest::qExec(&t, argc, argv) == 0) ++good; else ++bad; } if (bad > 0) { cerr << "\n********* " << bad << " test suite(s) failed!\n" << endl; return 1; } else { cerr << "All tests passed" << endl; return 0; } } sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/AudioFileReaderTest.h0000644000175000017500000001440312252354725026371 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2013 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef TEST_AUDIO_FILE_READER_H #define TEST_AUDIO_FILE_READER_H #include "../AudioFileReaderFactory.h" #include "../AudioFileReader.h" #include "AudioTestData.h" #include #include #include #include #include using namespace std; static QString audioDir = "testfiles"; class AudioFileReaderTest : public QObject { Q_OBJECT const char *strOf(QString s) { return strdup(s.toLocal8Bit().data()); } private slots: void init() { if (!QDir(audioDir).exists()) { cerr << "ERROR: Audio test file directory \"" << audioDir << "\" does not exist" << endl; QVERIFY2(QDir(audioDir).exists(), "Audio test file directory not found"); } } void read_data() { QTest::addColumn("audiofile"); QStringList files = QDir(audioDir).entryList(QDir::Files); foreach (QString filename, files) { QTest::newRow(strOf(filename)) << filename; } } void read() { QFETCH(QString, audiofile); int readRate = 48000; AudioFileReader *reader = AudioFileReaderFactory::createReader (audioDir + "/" + audiofile, readRate); QStringList fileAndExt = audiofile.split("."); QStringList bits = fileAndExt[0].split("-"); QString extension = fileAndExt[1]; int nominalRate = bits[0].toInt(); int nominalChannels = bits[1].toInt(); int nominalDepth = 16; if (bits.length() > 2) nominalDepth = bits[2].toInt(); if (!reader) { #if ( QT_VERSION >= 0x050000 ) QSKIP("Unsupported file, skipping"); #else QSKIP("Unsupported file, skipping", SkipSingle); #endif } QCOMPARE((int)reader->getChannelCount(), nominalChannels); QCOMPARE((int)reader->getNativeRate(), nominalRate); QCOMPARE((int)reader->getSampleRate(), readRate); int channels = reader->getChannelCount(); AudioTestData tdata(readRate, channels); float *reference = tdata.getInterleavedData(); int refFrames = tdata.getFrameCount(); int refsize = refFrames * channels; vector test; // The reader should give us exactly the expected number of // frames, except for mp3/aac files. We ask for quite a lot // more, though, so we can (a) check that we only get the // expected number back (if this is not mp3/aac) or (b) take // into account silence at beginning and end (if it is). reader->getInterleavedFrames(0, refFrames + 5000, test); int read = test.size() / channels; if (extension == "mp3" || extension == "aac" || extension == "m4a") { // mp3s and aacs can have silence at start and end QVERIFY(read >= refFrames); } else { QCOMPARE(read, refFrames); } // Our limits are pretty relaxed -- we're not testing decoder // or resampler quality here, just whether the results are // plainly wrong (e.g. at wrong samplerate or with an offset) float limit = 0.01; float edgeLimit = limit * 10; // in first or final edgeSize frames int edgeSize = 100; if (nominalDepth < 16) { limit = 0.02; } if (extension == "ogg" || extension == "mp3" || extension == "aac" || extension == "m4a") { limit = 0.2; edgeLimit = limit * 3; } // And we ignore completely the last few frames when upsampling int discard = 1 + readRate / nominalRate; int offset = 0; if (extension == "aac" || extension == "m4a") { // our m4a file appears to have a fixed offset of 1024 (at // file sample rate) offset = (1024 / float(nominalRate)) * readRate; } if (extension == "mp3") { // while mp3s appear to vary for (int i = 0; i < read; ++i) { bool any = false; float thresh = 0.01; for (int c = 0; c < channels; ++c) { if (fabsf(test[i * channels + c]) > thresh) { any = true; break; } } if (any) { offset = i; break; } } // std::cerr << "offset = " << offset << std::endl; } for (int c = 0; c < channels; ++c) { float maxdiff = 0.f; int maxAt = 0; float totdiff = 0.f; for (int i = 0; i < read - offset - discard && i < refFrames; ++i) { float diff = fabsf(test[(i + offset) * channels + c] - reference[i * channels + c]); totdiff += diff; // in edge areas, record this only if it exceeds edgeLimit if (i < edgeSize || i + edgeSize >= read - offset) { if (diff > edgeLimit) { maxdiff = diff; maxAt = i; } } else { if (diff > maxdiff) { maxdiff = diff; maxAt = i; } } } float meandiff = totdiff / read; // cerr << "meandiff on channel " << c << ": " << meandiff << endl; // cerr << "maxdiff on channel " << c << ": " << maxdiff << " at " << maxAt << endl; if (meandiff >= limit) { cerr << "ERROR: for audiofile " << audiofile << ": mean diff = " << meandiff << " for channel " << c << endl; QVERIFY(meandiff < limit); } if (maxdiff >= limit) { cerr << "ERROR: for audiofile " << audiofile << ": max diff = " << maxdiff << " at frame " << maxAt << " of " << read << " on channel " << c << " (mean diff = " << meandiff << ")" << endl; QVERIFY(maxdiff < limit); } } } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/AudioTestData.h0000644000175000017500000000521512252354725025241 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2013 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef AUDIO_TEST_DATA_H #define AUDIO_TEST_DATA_H #include /** * Class that generates a single fixed test pattern to a given sample * rate and number of channels. * * The test pattern is two seconds long and consists of: * * -- in channel 0, a 600Hz sinusoid with peak amplitude 1.0 * * -- in channel 1, four triangular forms with peaks at +1.0, -1.0, * +1.0, -1.0 respectively, of 10ms width, starting at 0.0, 0.5, * 1.0 and 1.5 seconds; silence elsewhere * * -- in subsequent channels, a flat DC offset at +(channelNo / 20.0) */ class AudioTestData { public: AudioTestData(float rate, int channels) : m_channelCount(channels), m_duration(2.0), m_sampleRate(rate), m_sinFreq(600.0), m_pulseFreq(2) { m_frameCount = lrint(m_duration * m_sampleRate); m_data = new float[m_frameCount * m_channelCount]; m_pulseWidth = 0.01 * m_sampleRate; generate(); } ~AudioTestData() { delete[] m_data; } void generate() { float hpw = m_pulseWidth / 2.0; for (int i = 0; i < m_frameCount; ++i) { for (int c = 0; c < m_channelCount; ++c) { float s = 0.f; if (c == 0) { float phase = (i * m_sinFreq * 2.f * M_PI) / m_sampleRate; s = sinf(phase); } else if (c == 1) { int pulseNo = int((i * m_pulseFreq) / m_sampleRate); int index = (i * m_pulseFreq) - (m_sampleRate * pulseNo); if (index < m_pulseWidth) { s = 1.0 - fabsf(hpw - index) / hpw; if (pulseNo % 2) s = -s; } } else { s = c / 20.0; } m_data[i * m_channelCount + c] = s; } } } float *getInterleavedData() const { return m_data; } int getFrameCount() const { return m_frameCount; } int getChannelCount() const { return m_channelCount; } float getSampleRate () const { return m_sampleRate; } float getDuration() const { // seconds return m_duration; } private: float *m_data; int m_frameCount; int m_channelCount; float m_duration; float m_sampleRate; float m_sinFreq; float m_pulseFreq; float m_pulseWidth; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/test/test.pro0000644000175000017500000000253512252354725024100 0ustar miramira TEMPLATE = app LIBS += -L../../.. -L../../../../dataquay -L../../../release -L../../../../dataquay/release -lsvcore -ldataquay win32-g++ { INCLUDEPATH += ../../../../sv-dependency-builds/win32-mingw/include LIBS += -L../../../../sv-dependency-builds/win32-mingw/lib } exists(../../../config.pri) { include(../../../config.pri) } win* { !exists(../../../config.pri) { DEFINES += HAVE_BZ2 HAVE_FFTW3 HAVE_FFTW3F HAVE_SNDFILE HAVE_SAMPLERATE HAVE_VAMP HAVE_VAMPHOSTSDK HAVE_RUBBERBAND HAVE_DATAQUAY HAVE_LIBLO HAVE_MAD HAVE_ID3TAG HAVE_PORTAUDIO_2_0 LIBS += -lbz2 -lrubberband -lvamp-hostsdk -lfftw3 -lfftw3f -lsndfile -lFLAC -logg -lvorbis -lvorbisenc -lvorbisfile -logg -lmad -lid3tag -lportaudio -lsamplerate -llo -lz -lsord-0 -lserd-0 -lwinmm -lws2_32 } } CONFIG += qt thread warn_on stl rtti exceptions console QT += network xml testlib QT -= gui TARGET = svcore-test DEPENDPATH += ../../.. INCLUDEPATH += ../../.. OBJECTS_DIR = o MOC_DIR = o HEADERS += AudioFileReaderTest.h \ AudioTestData.h SOURCES += main.cpp win* { //PRE_TARGETDEPS += ../../../svcore.lib } !win* { PRE_TARGETDEPS += ../../../libsvcore.a } !win32 { !macx* { QMAKE_POST_LINK=./$${TARGET} } macx* { QMAKE_POST_LINK=./$${TARGET}.app/Contents/MacOS/$${TARGET} } } win32:QMAKE_POST_LINK=./release/$${TARGET}.exe sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/DataFileReaderFactory.h0000644000175000017500000000571712252354725025722 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _DATA_FILE_READER_FACTORY_H_ #define _DATA_FILE_READER_FACTORY_H_ #include #include "CSVFormat.h" #include "MIDIFileReader.h" class DataFileReader; class Model; class DataFileReaderFactory { public: enum Exception { ImportCancelled }; /** * Return the file extensions that we have data file readers for, * in a format suitable for use with QFileDialog. For example, * "*.csv *.xml". */ static QString getKnownExtensions(); /** * Return a data file reader initialised to the file at the * given path, or NULL if no suitable reader for this path is * available or the file cannot be opened. * * Caller owns the returned object and must delete it after use. * * Note that this function is non-interactive -- the user is not * asked for file format preferences. */ static DataFileReader *createReader(QString path, MIDIFileImportPreferenceAcquirer *, size_t mainModelSampleRate); /** * Read the given path, if a suitable reader is available. * Return NULL if no reader succeeded in reading this file. * * Note that this function is non-interactive -- the user is not * asked for file format preferences. If the CSV file reader is * used, it is with default format. */ static Model *load(QString path, MIDIFileImportPreferenceAcquirer *acquirer, size_t mainModelSampleRate); /** * Read the given path, if a suitable reader is available. * Return NULL if no reader succeeded in reading this file. * Do not attempt the general CSV reader. */ static Model *loadNonCSV(QString path, MIDIFileImportPreferenceAcquirer *acquirer, size_t mainModelSampleRate); /** * Read the given path using the CSV reader with the given format. * Return NULL if it failed in reading this file. */ static Model *loadCSV(QString path, CSVFormat format, size_t mainModelSampleRate); protected: static DataFileReader *createReader(QString path, bool csv, MIDIFileImportPreferenceAcquirer *, CSVFormat format, size_t mainModelSampleRate); }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/CachedFile.h0000644000175000017500000000311012252354725023526 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _CACHED_FILE_H_ #define _CACHED_FILE_H_ #include #include #include #include class ProgressReporter; class CachedFile { public: CachedFile(QString fileOrUrl, ProgressReporter *reporter = 0, QString preferredContentType = ""); CachedFile(QUrl url, ProgressReporter *reporter = 0, QString preferredContentType = ""); virtual ~CachedFile(); bool isOK() const; QString getLocalFilename() const; protected: QString m_origin; QString m_localFilename; QString m_preferredContentType; ProgressReporter *m_reporter; bool m_ok; void checkFile(); bool retrieve(); QDateTime getLastRetrieval(); void updateLastRetrieval(bool successful); static QString getCacheDirectory(); static QString getLocalFilenameFor(QUrl url); typedef std::map OriginLocalFilenameMap; static OriginLocalFilenameMap m_knownGoodCaches; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/CSVFormat.cpp0000644000175000017500000002156112252354725023730 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "CSVFormat.h" #include "base/StringBits.h" #include #include #include #include #include #include CSVFormat::CSVFormat(QString path) : m_separator(""), m_sampleRate(44100), m_windowSize(1024), m_allowQuoting(true) { guessFormatFor(path); } void CSVFormat::guessFormatFor(QString path) { m_modelType = TwoDimensionalModel; m_timingType = ExplicitTiming; m_timeUnits = TimeSeconds; m_maxExampleCols = 0; m_columnCount = 0; m_variableColumnCount = false; m_example.clear(); m_columnQualities.clear(); m_columnPurposes.clear(); m_prevValues.clear(); QFile file(path); if (!file.exists()) return; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QTextStream in(&file); in.seek(0); int lineno = 0; while (!in.atEnd()) { // See comment about line endings in CSVFileReader::load() QString chunk = in.readLine(); QStringList lines = chunk.split('\r', QString::SkipEmptyParts); for (size_t li = 0; li < lines.size(); ++li) { QString line = lines[li]; if (line.startsWith("#") || line == "") continue; guessQualities(line, lineno); ++lineno; } if (lineno >= 50) break; } guessPurposes(); } void CSVFormat::guessSeparator(QString line) { char candidates[] = { ',', '\t', ' ', '|', '/', ':' }; for (int i = 0; i < sizeof(candidates)/sizeof(candidates[0]); ++i) { if (StringBits::split(line, candidates[i], m_allowQuoting).size() >= 2) { m_separator = candidates[i]; return; } } m_separator = " "; } void CSVFormat::guessQualities(QString line, int lineno) { if (m_separator == "") guessSeparator(line); QStringList list = StringBits::split(line, m_separator[0], m_allowQuoting); int cols = list.size(); if (lineno == 0 || (cols < m_columnCount)) m_columnCount = cols; if (cols != m_columnCount) m_variableColumnCount = true; // All columns are regarded as having these qualities until we see // something that indicates otherwise: ColumnQualities defaultQualities = ColumnNumeric | ColumnIntegral | ColumnIncreasing; for (int i = 0; i < cols; ++i) { while (m_columnQualities.size() <= i) { m_columnQualities.push_back(defaultQualities); m_prevValues.push_back(0.f); } QString s(list[i]); bool ok = false; ColumnQualities qualities = m_columnQualities[i]; bool numeric = (qualities & ColumnNumeric); bool integral = (qualities & ColumnIntegral); bool increasing = (qualities & ColumnIncreasing); bool large = (qualities & ColumnLarge); // this one defaults to off float value = 0.f; //!!! how to take into account headers? if (numeric) { value = s.toFloat(&ok); if (!ok) { value = (float)StringBits::stringToDoubleLocaleFree(s, &ok); } if (ok) { if (lineno < 2 && value > 1000.f) large = true; } else { numeric = false; } } if (numeric) { if (integral) { if (s.contains('.') || s.contains(',')) { integral = false; } } if (increasing) { if (lineno > 0 && value <= m_prevValues[i]) { increasing = false; } } m_prevValues[i] = value; } m_columnQualities[i] = (numeric ? ColumnNumeric : 0) | (integral ? ColumnIntegral : 0) | (increasing ? ColumnIncreasing : 0) | (large ? ColumnLarge : 0); } if (lineno < 10) { m_example.push_back(list); if (lineno == 0 || cols > m_maxExampleCols) { m_maxExampleCols = cols; } } // cerr << "Estimated column qualities: "; // for (int i = 0; i < m_columnCount; ++i) { // cerr << int(m_columnQualities[i]) << " "; // } // cerr << endl; } void CSVFormat::guessPurposes() { m_timingType = CSVFormat::ImplicitTiming; m_timeUnits = CSVFormat::TimeWindows; int timingColumnCount = 0; for (int i = 0; i < m_columnCount; ++i) { ColumnPurpose purpose = ColumnUnknown; bool primary = (i == 0); ColumnQualities qualities = m_columnQualities[i]; bool numeric = (qualities & ColumnNumeric); bool integral = (qualities & ColumnIntegral); bool increasing = (qualities & ColumnIncreasing); bool large = (qualities & ColumnLarge); bool timingColumn = (numeric && increasing); if (timingColumn) { ++timingColumnCount; if (primary) { purpose = ColumnStartTime; m_timingType = ExplicitTiming; if (integral && large) { m_timeUnits = TimeAudioFrames; } else { m_timeUnits = TimeSeconds; } } else { if (timingColumnCount == 2 && m_timingType == ExplicitTiming) { purpose = ColumnEndTime; } } } if (purpose == ColumnUnknown) { if (numeric) { purpose = ColumnValue; } else { purpose = ColumnLabel; } } setColumnPurpose(i, purpose); } int valueCount = 0; for (int i = 0; i < m_columnCount; ++i) { if (m_columnPurposes[i] == ColumnValue) ++valueCount; } if (valueCount == 2 && timingColumnCount == 1) { // If we have exactly two apparent value columns and only one // timing column, but one value column is integral and the // other is not, guess that whichever one matches the integral // status of the time column is either duration or end time if (m_timingType == ExplicitTiming) { int a = -1, b = -1; for (int i = 0; i < m_columnCount; ++i) { if (m_columnPurposes[i] == ColumnValue) { if (a == -1) a = i; else b = i; } } if ((m_columnQualities[a] & ColumnIntegral) != (m_columnQualities[b] & ColumnIntegral)) { int timecol = a; if ((m_columnQualities[a] & ColumnIntegral) != (m_columnQualities[0] & ColumnIntegral)) { timecol = b; } if (m_columnQualities[timecol] & ColumnIncreasing) { // This shouldn't happen; should have been settled above m_columnPurposes[timecol] = ColumnEndTime; } else { m_columnPurposes[timecol] = ColumnDuration; } --valueCount; } } } if (timingColumnCount > 1) { m_modelType = TwoDimensionalModelWithDuration; } else { if (valueCount == 0) { m_modelType = OneDimensionalModel; } else if (valueCount == 1) { m_modelType = TwoDimensionalModel; } else { m_modelType = ThreeDimensionalModel; } } // cerr << "Estimated column purposes: "; // for (int i = 0; i < m_columnCount; ++i) { // cerr << int(m_columnPurposes[i]) << " "; // } // cerr << endl; // cerr << "Estimated model type: " << m_modelType << endl; // cerr << "Estimated timing type: " << m_timingType << endl; // cerr << "Estimated units: " << m_timeUnits << endl; } CSVFormat::ColumnPurpose CSVFormat::getColumnPurpose(int i) { while (m_columnPurposes.size() <= i) { m_columnPurposes.push_back(ColumnUnknown); } return m_columnPurposes[i]; } CSVFormat::ColumnPurpose CSVFormat::getColumnPurpose(int i) const { if (m_columnPurposes.size() <= i) { return ColumnUnknown; } return m_columnPurposes[i]; } void CSVFormat::setColumnPurpose(int i, ColumnPurpose p) { while (m_columnPurposes.size() <= i) { m_columnPurposes.push_back(ColumnUnknown); } m_columnPurposes[i] = p; } sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/AudioFileReaderFactory.cpp0000644000175000017500000002300212252354725026430 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "AudioFileReaderFactory.h" #include "WavFileReader.h" #include "DecodingWavFileReader.h" #include "OggVorbisFileReader.h" #include "MP3FileReader.h" #include "QuickTimeFileReader.h" #include "CoreAudioFileReader.h" #include #include #include QString AudioFileReaderFactory::getKnownExtensions() { std::set extensions; WavFileReader::getSupportedExtensions(extensions); #ifdef HAVE_MAD MP3FileReader::getSupportedExtensions(extensions); #endif #ifdef HAVE_OGGZ #ifdef HAVE_FISHSOUND OggVorbisFileReader::getSupportedExtensions(extensions); #endif #endif #ifdef HAVE_QUICKTIME QuickTimeFileReader::getSupportedExtensions(extensions); #endif #ifdef HAVE_COREAUDIO CoreAudioFileReader::getSupportedExtensions(extensions); #endif QString rv; for (std::set::const_iterator i = extensions.begin(); i != extensions.end(); ++i) { if (i != extensions.begin()) rv += " "; rv += "*." + *i; } return rv; } AudioFileReader * AudioFileReaderFactory::createReader(FileSource source, size_t targetRate, ProgressReporter *reporter) { return create(source, targetRate, false, reporter); } AudioFileReader * AudioFileReaderFactory::createThreadingReader(FileSource source, size_t targetRate, ProgressReporter *reporter) { return create(source, targetRate, true, reporter); } AudioFileReader * AudioFileReaderFactory::create(FileSource source, size_t targetRate, bool threading, ProgressReporter *reporter) { QString err; SVDEBUG << "AudioFileReaderFactory::createReader(\"" << source.getLocation() << "\"): Requested rate: " << targetRate << endl; if (!source.isOK()) { cerr << "AudioFileReaderFactory::createReader(\"" << source.getLocation() << "\": Failed to retrieve source (transmission error?): " << source.getErrorString() << endl; return 0; } if (!source.isAvailable()) { SVDEBUG << "AudioFileReaderFactory::createReader(\"" << source.getLocation() << "\": Source not found" << endl; return 0; } AudioFileReader *reader = 0; // Try to construct a preferred reader based on the extension or // MIME type. if (WavFileReader::supports(source)) { reader = new WavFileReader(source); int fileRate = reader->getSampleRate(); if (reader->isOK() && (!reader->isQuicklySeekable() || (targetRate != 0 && fileRate != targetRate))) { SVDEBUG << "AudioFileReaderFactory::createReader: WAV file rate: " << reader->getSampleRate() << ", seekable " << reader->isQuicklySeekable() << ", creating decoding reader" << endl; delete reader; reader = new DecodingWavFileReader (source, threading ? DecodingWavFileReader::ResampleThreaded : DecodingWavFileReader::ResampleAtOnce, DecodingWavFileReader::CacheInTemporaryFile, targetRate ? targetRate : fileRate, reporter); if (!reader->isOK()) { delete reader; reader = 0; } } } #ifdef HAVE_OGGZ #ifdef HAVE_FISHSOUND if (!reader) { if (OggVorbisFileReader::supports(source)) { reader = new OggVorbisFileReader (source, threading ? OggVorbisFileReader::DecodeThreaded : OggVorbisFileReader::DecodeAtOnce, OggVorbisFileReader::CacheInTemporaryFile, targetRate, reporter); if (!reader->isOK()) { delete reader; reader = 0; } } } #endif #endif #ifdef HAVE_MAD if (!reader) { if (MP3FileReader::supports(source)) { reader = new MP3FileReader (source, threading ? MP3FileReader::DecodeThreaded : MP3FileReader::DecodeAtOnce, MP3FileReader::CacheInTemporaryFile, targetRate, reporter); if (!reader->isOK()) { delete reader; reader = 0; } } } #endif #ifdef HAVE_QUICKTIME if (!reader) { if (QuickTimeFileReader::supports(source)) { reader = new QuickTimeFileReader (source, threading ? QuickTimeFileReader::DecodeThreaded : QuickTimeFileReader::DecodeAtOnce, QuickTimeFileReader::CacheInTemporaryFile, targetRate, reporter); if (!reader->isOK()) { delete reader; reader = 0; } } } #endif #ifdef HAVE_COREAUDIO if (!reader) { if (CoreAudioFileReader::supports(source)) { reader = new CoreAudioFileReader (source, threading ? CoreAudioFileReader::DecodeThreaded : CoreAudioFileReader::DecodeAtOnce, CoreAudioFileReader::CacheInTemporaryFile, targetRate, reporter); if (!reader->isOK()) { delete reader; reader = 0; } } } #endif // If none of the readers claimed to support this file extension, // perhaps the extension is missing or misleading. Try again, // ignoring it. We have to be confident that the reader won't // open just any old text file or whatever and pretend it's // succeeded if (!reader) { reader = new WavFileReader(source); int fileRate = reader->getSampleRate(); if (reader->isOK() && (!reader->isQuicklySeekable() || (targetRate != 0 && fileRate != targetRate))) { SVDEBUG << "AudioFileReaderFactory::createReader: WAV file rate: " << reader->getSampleRate() << ", seekable " << reader->isQuicklySeekable() << ", creating decoding reader" << endl; delete reader; reader = new DecodingWavFileReader (source, threading ? DecodingWavFileReader::ResampleThreaded : DecodingWavFileReader::ResampleAtOnce, DecodingWavFileReader::CacheInTemporaryFile, targetRate ? targetRate : fileRate, reporter); } if (!reader->isOK()) { delete reader; reader = 0; } } #ifdef HAVE_OGGZ #ifdef HAVE_FISHSOUND if (!reader) { reader = new OggVorbisFileReader (source, threading ? OggVorbisFileReader::DecodeThreaded : OggVorbisFileReader::DecodeAtOnce, OggVorbisFileReader::CacheInTemporaryFile, targetRate, reporter); if (!reader->isOK()) { delete reader; reader = 0; } } #endif #endif #ifdef HAVE_MAD if (!reader) { reader = new MP3FileReader (source, threading ? MP3FileReader::DecodeThreaded : MP3FileReader::DecodeAtOnce, MP3FileReader::CacheInTemporaryFile, targetRate, reporter); if (!reader->isOK()) { delete reader; reader = 0; } } #endif #ifdef HAVE_QUICKTIME if (!reader) { reader = new QuickTimeFileReader (source, threading ? QuickTimeFileReader::DecodeThreaded : QuickTimeFileReader::DecodeAtOnce, QuickTimeFileReader::CacheInTemporaryFile, targetRate, reporter); if (!reader->isOK()) { delete reader; reader = 0; } } #endif #ifdef HAVE_COREAUDIO if (!reader) { reader = new CoreAudioFileReader (source, threading ? CoreAudioFileReader::DecodeThreaded : CoreAudioFileReader::DecodeAtOnce, CoreAudioFileReader::CacheInTemporaryFile, targetRate, reporter); if (!reader->isOK()) { delete reader; reader = 0; } } #endif if (reader) { if (reader->isOK()) { SVDEBUG << "AudioFileReaderFactory: Reader is OK" << endl; return reader; } cerr << "AudioFileReaderFactory: Preferred reader for " << "url \"" << source.getLocation() << "\" (content type \"" << source.getContentType() << "\") failed"; if (reader->getError() != "") { cerr << ": \"" << reader->getError() << "\""; } cerr << endl; delete reader; reader = 0; } cerr << "AudioFileReaderFactory: No reader" << endl; return reader; } sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/BZipFileDevice.cpp0000644000175000017500000001256412252354725024713 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "BZipFileDevice.h" #include #include #include "base/Debug.h" BZipFileDevice::BZipFileDevice(QString fileName) : m_fileName(fileName), m_file(0), m_bzFile(0), m_atEnd(true), m_ok(true) { } BZipFileDevice::~BZipFileDevice() { // SVDEBUG << "BZipFileDevice::~BZipFileDevice(" << m_fileName << ")" << endl; if (m_bzFile) close(); } bool BZipFileDevice::isOK() const { return m_ok; } bool BZipFileDevice::open(OpenMode mode) { setErrorString(""); if (m_bzFile) { setErrorString(tr("File is already open")); return false; } if (mode & Append) { setErrorString(tr("Append mode not supported")); m_ok = false; return false; } if ((mode & (ReadOnly | WriteOnly)) == 0) { setErrorString(tr("File access mode not specified")); m_ok = false; return false; } if ((mode & ReadOnly) && (mode & WriteOnly)) { setErrorString(tr("Read and write modes both specified")); m_ok = false; return false; } if (mode & WriteOnly) { m_file = fopen(m_fileName.toLocal8Bit().data(), "wb"); if (!m_file) { setErrorString(tr("Failed to open file for writing")); m_ok = false; return false; } int bzError = BZ_OK; m_bzFile = BZ2_bzWriteOpen(&bzError, m_file, 9, 0, 0); if (!m_bzFile) { fclose(m_file); m_file = 0; setErrorString(tr("Failed to open bzip2 stream for writing")); m_ok = false; return false; } // cerr << "BZipFileDevice: opened \"" << m_fileName << "\" for writing" << endl; setErrorString(QString()); setOpenMode(mode); return true; } if (mode & ReadOnly) { m_file = fopen(m_fileName.toLocal8Bit().data(), "rb"); if (!m_file) { setErrorString(tr("Failed to open file for reading")); m_ok = false; return false; } int bzError = BZ_OK; m_bzFile = BZ2_bzReadOpen(&bzError, m_file, 0, 0, NULL, 0); if (!m_bzFile) { fclose(m_file); m_file = 0; setErrorString(tr("Failed to open bzip2 stream for reading")); m_ok = false; return false; } // cerr << "BZipFileDevice: opened \"" << m_fileName << "\" for reading" << endl; m_atEnd = false; setErrorString(QString()); setOpenMode(mode); return true; } setErrorString(tr("Internal error (open for neither read nor write)")); m_ok = false; return false; } void BZipFileDevice::close() { if (!m_bzFile) { setErrorString(tr("File not open")); m_ok = false; return; } int bzError = BZ_OK; if (openMode() & WriteOnly) { unsigned int in = 0, out = 0; BZ2_bzWriteClose(&bzError, m_bzFile, 0, &in, &out); // cerr << "Wrote bzip2 stream (in=" << in << ", out=" << out << ")" << endl; if (bzError != BZ_OK) { setErrorString(tr("bzip2 stream write close error")); } fclose(m_file); m_bzFile = 0; m_file = 0; m_ok = false; return; } if (openMode() & ReadOnly) { BZ2_bzReadClose(&bzError, m_bzFile); if (bzError != BZ_OK) { setErrorString(tr("bzip2 stream read close error")); } fclose(m_file); m_bzFile = 0; m_file = 0; m_ok = false; return; } setErrorString(tr("Internal error (close for neither read nor write)")); return; } qint64 BZipFileDevice::readData(char *data, qint64 maxSize) { if (m_atEnd) return 0; int bzError = BZ_OK; int read = BZ2_bzRead(&bzError, m_bzFile, data, maxSize); // SVDEBUG << "BZipFileDevice::readData: requested " << maxSize << ", read " << read << endl; if (bzError != BZ_OK) { if (bzError != BZ_STREAM_END) { cerr << "BZipFileDevice::readData: error condition" << endl; setErrorString(tr("bzip2 stream read error")); m_ok = false; return -1; } else { // SVDEBUG << "BZipFileDevice::readData: reached end of file" << endl; m_atEnd = true; } } return read; } qint64 BZipFileDevice::writeData(const char *data, qint64 maxSize) { int bzError = BZ_OK; BZ2_bzWrite(&bzError, m_bzFile, (void *)data, maxSize); // SVDEBUG << "BZipFileDevice::writeData: " << maxSize << " to write" << endl; if (bzError != BZ_OK) { cerr << "BZipFileDevice::writeData: error condition" << endl; setErrorString("bzip2 stream write error"); m_ok = false; return -1; } // SVDEBUG << "BZipFileDevice::writeData: wrote " << maxSize << endl; return maxSize; } sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/AudioFileReader.h0000644000175000017500000000713712252354725024560 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_FILE_READER_H_ #define _AUDIO_FILE_READER_H_ #include #include "FileSource.h" #include #include typedef std::vector SampleBlock; class AudioFileReader : public QObject { Q_OBJECT public: virtual ~AudioFileReader() { } bool isOK() const { return (m_channelCount > 0); } virtual QString getError() const { return ""; } size_t getFrameCount() const { return m_frameCount; } size_t getChannelCount() const { return m_channelCount; } size_t getSampleRate() const { return m_sampleRate; } virtual size_t getNativeRate() const { return m_sampleRate; } // if resampled /** * Return the location of the audio data in the reader (as passed * in to the FileSource constructor, for example). */ virtual QString getLocation() const { return ""; } /** * Return the title of the work in the audio file, if known. This * may be implemented by subclasses that support file tagging. * This is not the same thing as the file name. */ virtual QString getTitle() const { return ""; } /** * Return the "maker" of the work in the audio file, if known. * This could represent almost anything (band, composer, * conductor, artist etc). */ virtual QString getMaker() const { return ""; } typedef std::map TagMap; virtual TagMap getTags() const { return TagMap(); } /** * Return true if this file supports fast seek and random * access. Typically this will be true for uncompressed formats * and false for compressed ones. */ virtual bool isQuicklySeekable() const = 0; /** * Return interleaved samples for count frames from index start. * The resulting sample block will contain count * * getChannelCount() samples (or fewer if end of file is reached). * * The subclass implementations of this function must be * thread-safe -- that is, safe to call from multiple threads with * different arguments on the same object at the same time. */ virtual void getInterleavedFrames(size_t start, size_t count, SampleBlock &frames) const = 0; /** * Return de-interleaved samples for count frames from index * start. Implemented in this class (it calls * getInterleavedFrames and de-interleaves). The resulting vector * will contain getChannelCount() sample blocks of count samples * each (or fewer if end of file is reached). */ virtual void getDeInterleavedFrames(size_t start, size_t count, std::vector &frames) const; // only subclasses that do not know exactly how long the audio // file is until it's been completely decoded should implement this virtual int getDecodeCompletion() const { return 100; } // % virtual bool isUpdating() const { return false; } signals: void frameCountChanged(); protected: size_t m_frameCount; size_t m_channelCount; size_t m_sampleRate; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/CachedFile.cpp0000644000175000017500000001754612252354725024103 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "CachedFile.h" #include "base/TempDirectory.h" #include "base/ProgressReporter.h" #include "base/Exceptions.h" #include "FileSource.h" #include #include #include #include #include #include #include "base/Profiler.h" #include CachedFile::OriginLocalFilenameMap CachedFile::m_knownGoodCaches; QString CachedFile::getLocalFilenameFor(QUrl url) { Profiler p("CachedFile::getLocalFilenameFor"); QDir dir(getCacheDirectory()); QString filename = QString::fromLocal8Bit (QCryptographicHash::hash(url.toString().toLocal8Bit(), QCryptographicHash::Sha1).toHex()); return dir.filePath(filename); } QString CachedFile::getCacheDirectory() { QDir dir = TempDirectory::getInstance()->getContainingPath(); QString cacheDirName("cache"); QFileInfo fi(dir.filePath(cacheDirName)); if ((fi.exists() && !fi.isDir()) || (!fi.exists() && !dir.mkdir(cacheDirName))) { throw DirectoryCreationFailed(fi.filePath()); } return fi.filePath(); } CachedFile::CachedFile(QString origin, ProgressReporter *reporter, QString preferredContentType) : m_origin(origin), m_preferredContentType(preferredContentType), m_reporter(reporter), m_ok(false) { Profiler p("CachedFile::CachedFile[1]"); SVDEBUG << "CachedFile::CachedFile: origin is \"" << origin << "\"" << endl; checkFile(); } CachedFile::CachedFile(QUrl url, ProgressReporter *reporter, QString preferredContentType) : m_origin(url.toString()), m_preferredContentType(preferredContentType), m_reporter(reporter), m_ok(false) { Profiler p("CachedFile::CachedFile[2]"); SVDEBUG << "CachedFile::CachedFile: url is \"" << url.toString() << "\"" << endl; checkFile(); } CachedFile::~CachedFile() { } bool CachedFile::isOK() const { return m_ok; } QString CachedFile::getLocalFilename() const { return m_localFilename; } void CachedFile::checkFile() { //!!! n.b. obvious race condition here if different CachedFile // objects for same url used in more than one thread -- need to // lock appropriately. also consider race condition between // separate instances of the program! OriginLocalFilenameMap::const_iterator i = m_knownGoodCaches.find(m_origin); if (i != m_knownGoodCaches.end()) { m_ok = true; m_localFilename = i->second; return; } m_localFilename = getLocalFilenameFor(m_origin); if (!QFileInfo(m_localFilename).exists()) { SVDEBUG << "CachedFile::check: Local file does not exist, making a note that it hasn't been retrieved" << endl; updateLastRetrieval(false); // empirically! } QDateTime lastRetrieval = getLastRetrieval(); if (lastRetrieval.isValid()) { SVDEBUG << "CachedFile::check: Valid last retrieval at " << lastRetrieval.toString() << endl; // this will not be the case if the file is missing, after // updateLastRetrieval(false) was called above m_ok = true; if (lastRetrieval.addDays(2) < QDateTime::currentDateTime()) { //!!! SVDEBUG << "CachedFile::check: Out of date; trying to retrieve again" << endl; // doesn't matter if retrieval fails -- we just don't // update the last retrieval time //!!! but we do want an additional last-attempted // timestamp so as to ensure we aren't retrying the // retrieval every single time if it isn't working if (retrieve()) { SVDEBUG << "CachedFile::check: Retrieval succeeded" << endl; updateLastRetrieval(true); } else { cerr << "CachedFile::check: Retrieval failed, will try again later (using existing file for now)" << endl; } } } else { SVDEBUG << "CachedFile::check: No valid last retrieval" << endl; // there is no acceptable file if (retrieve()) { SVDEBUG << "CachedFile::check: Retrieval succeeded" << endl; m_ok = true; updateLastRetrieval(true); } else { cerr << "CachedFile::check: Retrieval failed, remaining in invalid state" << endl; // again, we don't need to do anything here -- the last // retrieval timestamp is already invalid } } if (m_ok) { m_knownGoodCaches[m_origin] = m_localFilename; } } bool CachedFile::retrieve() { //!!! need to work by retrieving the file to another name, and //!!! then "atomically" moving it to its proper place (I'm not //!!! sure we can do an atomic move to replace an existing file //!!! using Qt classes, but a plain delete then copy is probably //!!! good enough) FileSource fs(m_origin, m_reporter, m_preferredContentType); if (!fs.isOK() || !fs.isAvailable()) { SVDEBUG << "CachedFile::retrieve: ERROR: FileSource reported unavailable or failure" << endl; return false; } fs.waitForData(); if (!fs.isOK()) { SVDEBUG << "CachedFile::retrieve: ERROR: FileSource reported failure during receive" << endl; return false; } QString tempName = fs.getLocalFilename(); QFile tempFile(tempName); if (!tempFile.exists()) { SVDEBUG << "CachedFile::retrieve: ERROR: FileSource reported success, but local temporary file \"" << tempName << "\" does not exist" << endl; return false; } QFile previous(m_localFilename); if (previous.exists()) { if (!previous.remove()) { cerr << "CachedFile::retrieve: ERROR: Failed to remove previous copy of cached file at \"" << m_localFilename << "\"" << endl; return false; } } //!!! This is not ideal, could leave us with nothing (old file //!!! removed, new file not able to be copied in because e.g. no //!!! disk space left) if (!tempFile.copy(m_localFilename)) { cerr << "CachedFile::retrieve: ERROR: Failed to copy newly retrieved file from \"" << tempName << "\" to \"" << m_localFilename << "\"" << endl; return false; } SVDEBUG << "CachedFile::retrieve: Successfully copied newly retrieved file \"" << tempName << "\" to its home at \"" << m_localFilename << "\"" << endl; return true; } QDateTime CachedFile::getLastRetrieval() { QSettings settings; settings.beginGroup("FileCache"); QString key("last-retrieval-times"); QMap timeMap = settings.value(key).toMap(); QDateTime lastTime = timeMap[m_localFilename].toDateTime(); settings.endGroup(); return lastTime; } void CachedFile::updateLastRetrieval(bool successful) { //!!! note !successful does not mean "we failed to update the //!!! file" (and so it remains the same as before); it means "the //!!! file is not there at all" QSettings settings; settings.beginGroup("FileCache"); QString key("last-retrieval-times"); QMap timeMap = settings.value(key).toMap(); QDateTime dt; if (successful) dt = QDateTime::currentDateTime(); timeMap[m_localFilename] = dt; settings.setValue(key, timeMap); settings.endGroup(); } sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/CodedAudioFileReader.h0000644000175000017500000000524312252354725025513 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _CODED_AUDIO_FILE_READER_H_ #define _CODED_AUDIO_FILE_READER_H_ #include "AudioFileReader.h" #include #include #include class WavFileReader; class Serialiser; class Resampler; class CodedAudioFileReader : public AudioFileReader { Q_OBJECT public: virtual ~CodedAudioFileReader(); enum CacheMode { CacheInTemporaryFile, CacheInMemory }; virtual void getInterleavedFrames(size_t start, size_t count, SampleBlock &frames) const; virtual size_t getNativeRate() const { return m_fileRate; } /// Intermediate cache means all CodedAudioFileReaders are quickly seekable virtual bool isQuicklySeekable() const { return true; } signals: void progress(int); protected: CodedAudioFileReader(CacheMode cacheMode, size_t targetRate); void initialiseDecodeCache(); // samplerate, channels must have been set // may throw InsufficientDiscSpace: void addSamplesToDecodeCache(float **samples, size_t nframes); void addSamplesToDecodeCache(float *samplesInterleaved, size_t nframes); void addSamplesToDecodeCache(const SampleBlock &interleaved); // may throw InsufficientDiscSpace: void finishDecodeCache(); bool isDecodeCacheInitialised() const { return m_initialised; } void startSerialised(QString id); void endSerialised(); private: void pushBuffer(float *interleaved, size_t sz, bool final); void pushBufferResampling(float *interleaved, size_t sz, float ratio, bool final); void pushBufferNonResampling(float *interleaved, size_t sz); protected: QMutex m_cacheMutex; CacheMode m_cacheMode; SampleBlock m_data; mutable QReadWriteLock m_dataLock; bool m_initialised; Serialiser *m_serialiser; size_t m_fileRate; QString m_cacheFileName; SNDFILE *m_cacheFileWritePtr; WavFileReader *m_cacheFileReader; float *m_cacheWriteBuffer; size_t m_cacheWriteBufferIndex; size_t m_cacheWriteBufferSize; // frames Resampler *m_resampler; float *m_resampleBuffer; size_t m_fileFrameCount; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/OggVorbisFileReader.h0000644000175000017500000000551512252354725025416 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _OGG_VORBIS_FILE_READER_H_ #define _OGG_VORBIS_FILE_READER_H_ #ifdef HAVE_OGGZ #ifdef HAVE_FISHSOUND #include "CodedAudioFileReader.h" #include "base/Thread.h" #include #include #include class ProgressReporter; class OggVorbisFileReader : public CodedAudioFileReader { Q_OBJECT public: enum DecodeMode { DecodeAtOnce, // decode the file on construction, with progress DecodeThreaded // decode in a background thread after construction }; OggVorbisFileReader(FileSource source, DecodeMode decodeMode, CacheMode cacheMode, size_t targetRate = 0, ProgressReporter *reporter = 0); virtual ~OggVorbisFileReader(); virtual QString getError() const { return m_error; } virtual QString getLocation() const { return m_source.getLocation(); } virtual QString getTitle() const { return m_title; } virtual QString getMaker() const { return m_maker; } virtual TagMap getTags() const { return m_tags; } static void getSupportedExtensions(std::set &extensions); static bool supportsExtension(QString ext); static bool supportsContentType(QString type); static bool supports(FileSource &source); virtual int getDecodeCompletion() const { return m_completion; } virtual bool isUpdating() const { return m_decodeThread && m_decodeThread->isRunning(); } public slots: void cancelled(); protected: FileSource m_source; QString m_path; QString m_error; QString m_title; QString m_maker; TagMap m_tags; OGGZ *m_oggz; FishSound *m_fishSound; ProgressReporter *m_reporter; size_t m_fileSize; size_t m_bytesRead; bool m_commentsRead; bool m_cancelled; int m_completion; static int readPacket(OGGZ *, ogg_packet *, long, void *); static int acceptFrames(FishSound *, float **, long, void *); class DecodeThread : public Thread { public: DecodeThread(OggVorbisFileReader *reader) : m_reader(reader) { } virtual void run(); protected: OggVorbisFileReader *m_reader; }; DecodeThread *m_decodeThread; }; #endif #endif #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/CSVFormat.h0000644000175000017500000001101612252354725023367 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _CSV_FORMAT_H_ #define _CSV_FORMAT_H_ #include #include class CSVFormat { public: enum ModelType { OneDimensionalModel, TwoDimensionalModel, TwoDimensionalModelWithDuration, ThreeDimensionalModel }; enum TimingType { ExplicitTiming, ImplicitTiming }; enum TimeUnits { TimeSeconds, TimeAudioFrames, TimeWindows }; enum ColumnPurpose { ColumnUnknown, ColumnStartTime, ColumnEndTime, ColumnDuration, ColumnValue, ColumnLabel }; enum ColumnQuality { ColumnNumeric = 0x1, ColumnIntegral = 0x2, ColumnIncreasing = 0x4, ColumnLarge = 0x8 }; typedef unsigned int ColumnQualities; CSVFormat() : // arbitrary defaults m_modelType(TwoDimensionalModel), m_timingType(ExplicitTiming), m_timeUnits(TimeSeconds), m_separator(","), m_sampleRate(44100), m_windowSize(1024), m_columnCount(0), m_variableColumnCount(false), m_allowQuoting(true), m_maxExampleCols(0) { } CSVFormat(QString path); // guess format /** * Guess the format of the given CSV file, setting the fields in * this object accordingly. If the current separator is the empty * string, the separator character will also be guessed; otherwise * the current separator will be used. The other properties of * this object will be set according to guesses from the file. */ void guessFormatFor(QString path); ModelType getModelType() const { return m_modelType; } TimingType getTimingType() const { return m_timingType; } TimeUnits getTimeUnits() const { return m_timeUnits; } size_t getSampleRate() const { return m_sampleRate; } size_t getWindowSize() const { return m_windowSize; } int getColumnCount() const { return m_columnCount; } bool getAllowQuoting() const { return m_allowQuoting; } QChar getSeparator() const { if (m_separator == "") return ' '; else return m_separator[0]; } void setModelType(ModelType t) { m_modelType = t; } void setTimingType(TimingType t) { m_timingType = t; } void setTimeUnits(TimeUnits t) { m_timeUnits = t; } void setSeparator(QChar s) { m_separator = s; } void setSampleRate(size_t r) { m_sampleRate = r; } void setWindowSize(size_t s) { m_windowSize = s; } void setColumnCount(int c) { m_columnCount = c; } void setAllowQuoting(bool q) { m_allowQuoting = q; } QList getColumnPurposes() const { return m_columnPurposes; } void setColumnPurposes(QList cl) { m_columnPurposes = cl; } ColumnPurpose getColumnPurpose(int i); ColumnPurpose getColumnPurpose(int i) const; void setColumnPurpose(int i, ColumnPurpose p); // read-only; only valid if format has been guessed: QList getColumnQualities() const { return m_columnQualities; } // read-only; only valid if format has been guessed: QList getExample() const { return m_example; } int getMaxExampleCols() const { return m_maxExampleCols; } protected: ModelType m_modelType; TimingType m_timingType; TimeUnits m_timeUnits; QString m_separator; size_t m_sampleRate; size_t m_windowSize; int m_columnCount; bool m_variableColumnCount; QList m_columnQualities; QList m_columnPurposes; QList m_prevValues; bool m_allowQuoting; QList m_example; int m_maxExampleCols; void guessSeparator(QString line); void guessQualities(QString line, int lineno); void guessPurposes(); void guessFormatFor_Old(QString path); }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/AudioFileReaderFactory.h0000644000175000017500000000643312252354725026106 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AUDIO_FILE_READER_FACTORY_H_ #define _AUDIO_FILE_READER_FACTORY_H_ #include #include "FileSource.h" class AudioFileReader; class ProgressReporter; class AudioFileReaderFactory { public: /** * Return the file extensions that we have audio file readers for, * in a format suitable for use with QFileDialog. For example, * "*.wav *.aiff *.ogg". */ static QString getKnownExtensions(); /** * Return an audio file reader initialised to the file at the * given path, or NULL if no suitable reader for this path is * available or the file cannot be opened. * * If targetRate is non-zero, the file will be resampled to that * rate (transparently). You can query reader->getNativeRate() * if you want to find out whether the file is being resampled * or not. * * If a ProgressReporter is provided, it will be updated with * progress status. Caller retains ownership of the reporter * object. * * Caller owns the returned object and must delete it after use. */ static AudioFileReader *createReader(FileSource source, size_t targetRate = 0, ProgressReporter *reporter = 0); /** * Return an audio file reader initialised to the file at the * given path, or NULL if no suitable reader for this path is * available or the file cannot be opened. If the reader supports * threaded decoding, it will be used and the file decoded in a * background thread. * * If targetRate is non-zero, the file will be resampled to that * rate (transparently). You can query reader->getNativeRate() * if you want to find out whether the file is being resampled * or not. * * If a ProgressReporter is provided, it will be updated with * progress status. This will only be meaningful if threading * mode is not used because the file reader in use does not * support it; otherwise progress as reported will jump straight * to 100% before threading mode takes over. Caller retains * ownership of the reporter object. * * Caller owns the returned object and must delete it after use. */ static AudioFileReader *createThreadingReader(FileSource source, size_t targetRate = 0, ProgressReporter *reporter = 0); protected: static AudioFileReader *create(FileSource source, size_t targetRate, bool threading, ProgressReporter *reporter); }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/WavFileReader.h0000644000175000017500000000453512252354725024253 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _WAV_FILE_READER_H_ #define _WAV_FILE_READER_H_ #include "AudioFileReader.h" #include #include #include /** * Reader for audio files using libsndfile. * * This is typically intended for seekable file types that can be read * directly (e.g. WAV, AIFF etc). * * Compressed files supported by libsndfile (e.g. Ogg, FLAC) should * normally be read using DecodingWavFileReader instead (which decodes * to an intermediate cached file). */ class WavFileReader : public AudioFileReader { public: WavFileReader(FileSource source, bool fileUpdating = false); virtual ~WavFileReader(); virtual QString getLocation() const { return m_source.getLocation(); } virtual QString getError() const { return m_error; } virtual bool isQuicklySeekable() const { return m_seekable; } /** * Must be safe to call from multiple threads with different * arguments on the same object at the same time. */ virtual void getInterleavedFrames(size_t start, size_t count, SampleBlock &frames) const; static void getSupportedExtensions(std::set &extensions); static bool supportsExtension(QString ext); static bool supportsContentType(QString type); static bool supports(FileSource &source); virtual int getDecodeCompletion() const { return 100; } bool isUpdating() const { return m_updating; } void updateFrameCount(); void updateDone(); protected: SF_INFO m_fileInfo; SNDFILE *m_file; FileSource m_source; QString m_path; QString m_error; bool m_seekable; mutable QMutex m_mutex; mutable float *m_buffer; mutable size_t m_bufsiz; mutable size_t m_lastStart; mutable size_t m_lastCount; bool m_updating; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/CSVFileWriter.cpp0000644000175000017500000000517212252354725024554 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "CSVFileWriter.h" #include "model/Model.h" #include "model/SparseOneDimensionalModel.h" #include "model/SparseTimeValueModel.h" #include "model/NoteModel.h" #include "model/TextModel.h" #include "base/TempWriteFile.h" #include "base/Exceptions.h" #include "base/Selection.h" #include #include CSVFileWriter::CSVFileWriter(QString path, Model *model, QString delimiter) : m_path(path), m_model(model), m_error(""), m_delimiter(delimiter) { } CSVFileWriter::~CSVFileWriter() { } bool CSVFileWriter::isOK() const { return m_error == ""; } QString CSVFileWriter::getError() const { return m_error; } void CSVFileWriter::write() { try { TempWriteFile temp(m_path); QFile file(temp.getTemporaryFilename()); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { m_error = tr("Failed to open file %1 for writing") .arg(temp.getTemporaryFilename()); return; } QTextStream out(&file); out << m_model->toDelimitedDataString(m_delimiter); file.close(); temp.moveToTarget(); } catch (FileOperationFailed &f) { m_error = f.what(); } } void CSVFileWriter::writeSelection(MultiSelection *selection) { try { TempWriteFile temp(m_path); QFile file(temp.getTemporaryFilename()); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { m_error = tr("Failed to open file %1 for writing") .arg(temp.getTemporaryFilename()); return; } QTextStream out(&file); for (MultiSelection::SelectionList::iterator i = selection->getSelections().begin(); i != selection->getSelections().end(); ++i) { size_t f0(i->getStartFrame()), f1(i->getEndFrame()); out << m_model->toDelimitedDataString(m_delimiter, f0, f1); } file.close(); temp.moveToTarget(); } catch (FileOperationFailed &f) { m_error = f.what(); } } sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/MatchFileReader.h0000644000175000017500000000274512252354725024553 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _MATCH_FILE_READER_H_ #define _MATCH_FILE_READER_H_ #include #include #include "base/Debug.h" class QFile; class Model; class Alignment { public: Alignment(); typedef std::vector FrameArray; double thisHopTime; double refHopTime; FrameArray thisIndex; FrameArray refIndex; double fromReference(double) const; double toReference(double) const; //!!! blah void setMainModel(Model *m) { m_mainModel = m; } bool isMainModel(Model *m) const { return m == m_mainModel; } int search(const FrameArray &arr, int val) const; protected: Model *m_mainModel; }; class MatchFileReader { public: MatchFileReader(QString path); virtual ~MatchFileReader(); virtual bool isOK() const; virtual QString getError() const; virtual Alignment load() const; protected: QFile *m_file; QString m_error; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/WavFileReader.cpp0000644000175000017500000001502012252354725024575 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "WavFileReader.h" #include #include #include WavFileReader::WavFileReader(FileSource source, bool fileUpdating) : m_file(0), m_source(source), m_path(source.getLocalFilename()), m_seekable(false), m_buffer(0), m_bufsiz(0), m_lastStart(0), m_lastCount(0), m_updating(fileUpdating) { m_frameCount = 0; m_channelCount = 0; m_sampleRate = 0; m_fileInfo.format = 0; m_fileInfo.frames = 0; m_file = sf_open(m_path.toLocal8Bit(), SFM_READ, &m_fileInfo); if (!m_file || (!fileUpdating && m_fileInfo.channels <= 0)) { cerr << "WavFileReader::initialize: Failed to open file at \"" << m_path << "\" (" << sf_strerror(m_file) << ")" << endl; if (m_file) { m_error = QString("Couldn't load audio file '%1':\n%2") .arg(m_path).arg(sf_strerror(m_file)); } else { m_error = QString("Failed to open audio file '%1'") .arg(m_path); } return; } if (m_fileInfo.channels > 0) { m_frameCount = m_fileInfo.frames; m_channelCount = m_fileInfo.channels; m_sampleRate = m_fileInfo.samplerate; m_seekable = (m_fileInfo.seekable != 0); // Our m_seekable reports whether a file is rapidly seekable, // so things like Ogg don't qualify. We cautiously report // every file type of "at least" the historical period of Ogg // or FLAC as non-seekable. int type = m_fileInfo.format & SF_FORMAT_TYPEMASK; // cerr << "WavFileReader: format type is " << type << " (flac, ogg are " << SF_FORMAT_FLAC << ", " << SF_FORMAT_OGG << ")" << endl; if (type >= SF_FORMAT_FLAC || type >= SF_FORMAT_OGG) { // cerr << "WavFileReader: Recording as non-seekable" << endl; m_seekable = false; } } // cerr << "WavFileReader: Frame count " << m_frameCount << ", channel count " << m_channelCount << ", sample rate " << m_sampleRate << ", seekable " << m_seekable << endl; } WavFileReader::~WavFileReader() { if (m_file) sf_close(m_file); delete[] m_buffer; } void WavFileReader::updateFrameCount() { QMutexLocker locker(&m_mutex); size_t prevCount = m_fileInfo.frames; if (m_file) { sf_close(m_file); m_file = sf_open(m_path.toLocal8Bit(), SFM_READ, &m_fileInfo); if (!m_file || m_fileInfo.channels <= 0) { cerr << "WavFileReader::updateFrameCount: Failed to open file at \"" << m_path << "\" (" << sf_strerror(m_file) << ")" << endl; } } // SVDEBUG << "WavFileReader::updateFrameCount: now " << m_fileInfo.frames << endl; m_frameCount = m_fileInfo.frames; if (m_channelCount == 0) { m_channelCount = m_fileInfo.channels; m_sampleRate = m_fileInfo.samplerate; } if (m_frameCount != prevCount) { // cerr << "frameCountChanged" << endl; emit frameCountChanged(); } } void WavFileReader::updateDone() { updateFrameCount(); m_updating = false; } void WavFileReader::getInterleavedFrames(size_t start, size_t count, SampleBlock &results) const { if (count == 0) return; results.clear(); results.reserve(count * m_fileInfo.channels); QMutexLocker locker(&m_mutex); if (!m_file || !m_channelCount) { return; } if ((long)start >= m_fileInfo.frames) { // SVDEBUG << "WavFileReader::getInterleavedFrames: " << start // << " > " << m_fileInfo.frames << endl; return; } if (long(start + count) > m_fileInfo.frames) { count = m_fileInfo.frames - start; } sf_count_t readCount = 0; if (start != m_lastStart || count != m_lastCount) { if (sf_seek(m_file, start, SEEK_SET) < 0) { // cerr << "sf_seek failed" << endl; return; } if (count * m_fileInfo.channels > m_bufsiz) { // cerr << "WavFileReader: Reallocating buffer for " << count // << " frames, " << m_fileInfo.channels << " channels: " // << m_bufsiz << " floats" << endl; m_bufsiz = count * m_fileInfo.channels; delete[] m_buffer; m_buffer = new float[m_bufsiz]; } if ((readCount = sf_readf_float(m_file, m_buffer, count)) < 0) { // cerr << "sf_readf_float failed" << endl; return; } m_lastStart = start; m_lastCount = readCount; } for (size_t i = 0; i < count * m_fileInfo.channels; ++i) { if (i >= m_bufsiz) { cerr << "INTERNAL ERROR: WavFileReader::getInterleavedFrames: " << i << " >= " << m_bufsiz << endl; } results.push_back(m_buffer[i]); } return; } void WavFileReader::getSupportedExtensions(std::set &extensions) { int count; if (sf_command(0, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof(count))) { extensions.insert("wav"); extensions.insert("aiff"); extensions.insert("aifc"); extensions.insert("aif"); return; } SF_FORMAT_INFO info; for (int i = 0; i < count; ++i) { info.format = i; if (!sf_command(0, SFC_GET_FORMAT_MAJOR, &info, sizeof(info))) { QString ext = QString(info.extension).toLower(); extensions.insert(ext); if (ext == "oga") { // libsndfile is awfully proper, it says it only // supports .oga but lots of Ogg audio files in the // wild are .ogg and it will accept that extensions.insert("ogg"); } } } } bool WavFileReader::supportsExtension(QString extension) { std::set extensions; getSupportedExtensions(extensions); return (extensions.find(extension.toLower()) != extensions.end()); } bool WavFileReader::supportsContentType(QString type) { return (type == "audio/x-wav" || type == "audio/x-aiff" || type == "audio/basic"); } bool WavFileReader::supports(FileSource &source) { return (supportsExtension(source.getExtension()) || supportsContentType(source.getContentType())); } sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/MP3FileReader.h0000644000175000017500000000621712252354725024114 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _MP3_FILE_READER_H_ #define _MP3_FILE_READER_H_ #ifdef HAVE_MAD #include "CodedAudioFileReader.h" #include "base/Thread.h" #include #include class ProgressReporter; class MP3FileReader : public CodedAudioFileReader { Q_OBJECT public: enum DecodeMode { DecodeAtOnce, // decode the file on construction, with progress DecodeThreaded // decode in a background thread after construction }; MP3FileReader(FileSource source, DecodeMode decodeMode, CacheMode cacheMode, size_t targetRate = 0, ProgressReporter *reporter = 0); virtual ~MP3FileReader(); virtual QString getError() const { return m_error; } virtual QString getLocation() const { return m_source.getLocation(); } virtual QString getTitle() const { return m_title; } virtual QString getMaker() const { return m_maker; } virtual TagMap getTags() const { return m_tags; } static void getSupportedExtensions(std::set &extensions); static bool supportsExtension(QString ext); static bool supportsContentType(QString type); static bool supports(FileSource &source); virtual int getDecodeCompletion() const { return m_completion; } virtual bool isUpdating() const { return m_decodeThread && m_decodeThread->isRunning(); } public slots: void cancelled(); protected: FileSource m_source; QString m_path; QString m_error; QString m_title; QString m_maker; TagMap m_tags; size_t m_fileSize; double m_bitrateNum; size_t m_bitrateDenom; int m_completion; bool m_done; unsigned char *m_filebuffer; float **m_samplebuffer; size_t m_samplebuffersize; ProgressReporter *m_reporter; bool m_cancelled; struct DecoderData { unsigned char const *start; unsigned long length; MP3FileReader *reader; }; bool decode(void *mm, size_t sz); enum mad_flow accept(struct mad_header const *, struct mad_pcm *); static enum mad_flow input(void *, struct mad_stream *); static enum mad_flow output(void *, struct mad_header const *, struct mad_pcm *); static enum mad_flow error(void *, struct mad_stream *, struct mad_frame *); class DecodeThread : public Thread { public: DecodeThread(MP3FileReader *reader) : m_reader(reader) { } virtual void run(); protected: MP3FileReader *m_reader; }; DecodeThread *m_decodeThread; void loadTags(); QString loadTag(void *vtag, const char *name); }; #endif #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/MatchFileReader.cpp0000644000175000017500000001021212252354725025072 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "MatchFileReader.h" #include #include #include #include Alignment::Alignment() : thisHopTime(0.0), refHopTime(0.0) { } double Alignment::fromReference(double t) const { int ri = lrint(t / refHopTime); int index = search(refIndex, ri); return thisIndex[index] * thisHopTime; } double Alignment::toReference(double t) const { int ti = lrint(t / thisHopTime); int index = search(thisIndex, ti); return refIndex[index] * refHopTime; } int Alignment::search(const FrameArray &arr, int val) const { int len = arr.size(); int max = len - 1; int min = 0; while (max > min) { int mid = (max + min) / 2; if (val > arr[mid]) { min = mid + 1; } else { max = mid; } } // max = MIN_j (arr[j] >= val) i.e. the first equal or next highest while ((max + 1 < len) && (arr[max + 1] == val)) { max++; } return (min + max) / 2; } MatchFileReader::MatchFileReader(QString path) : m_file(0) { m_file = new QFile(path); bool good = false; if (!m_file->exists()) { m_error = QFile::tr("File \"%1\" does not exist").arg(path); } else if (!m_file->open(QIODevice::ReadOnly | QIODevice::Text)) { m_error = QFile::tr("Failed to open file \"%1\"").arg(path); } else { good = true; } if (!good) { delete m_file; m_file = 0; } } MatchFileReader::~MatchFileReader() { if (m_file) { SVDEBUG << "MatchFileReader::MatchFileReader: Closing file" << endl; m_file->close(); } delete m_file; } bool MatchFileReader::isOK() const { return (m_file != 0); } QString MatchFileReader::getError() const { return m_error; } Alignment MatchFileReader::load() const { Alignment alignment; if (!m_file) return alignment; QTextStream in(m_file); /* File: /home/studio/match-test/mahler-3-boulez-5.wav Marks: -1 FixedPoints: true 0 0 0 0 0 File: /home/studio/match-test/mahler-3-haitink-5.wav Marks: 0 FixedPoints: true 0 0.02 0.02 12836 */ int fileCount = 0; int state = 0; int count = 0; while (!in.atEnd()) { QString line = in.readLine().trimmed(); if (line.startsWith("File: ")) { ++fileCount; continue; } if (fileCount != 2) continue; if (line.startsWith("Marks:") || line.startsWith("FixedPoints:")) { continue; } switch (state) { case 0: alignment.thisHopTime = line.toDouble(); break; case 1: alignment.refHopTime = line.toDouble(); break; case 2: count = line.toInt(); break; case 3: alignment.thisIndex.push_back(line.toInt()); break; case 4: alignment.refIndex.push_back(line.toInt()); break; } if (state < 3) ++state; else if (state == 3 && alignment.thisIndex.size() == count) ++state; } if (alignment.thisHopTime == 0.0) { cerr << "ERROR in Match file: this hop time == 0, using 0.01 instead" << endl; alignment.thisHopTime = 0.01; } if (alignment.refHopTime == 0.0) { cerr << "ERROR in Match file: ref hop time == 0, using 0.01 instead" << endl; alignment.refHopTime = 0.01; } cerr << "MatchFileReader: this hop = " << alignment.thisHopTime << ", ref hop = " << alignment.refHopTime << ", this index count = " << alignment.thisIndex.size() << ", ref index count = " << alignment.refIndex.size() << endl; return alignment; } sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/MIDIFileWriter.cpp0000644000175000017500000002614012252354725024641 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2007 Richard Bown and Chris Cannam and copyright 2007 QMUL. */ #include "MIDIFileWriter.h" #include "data/midi/MIDIEvent.h" #include "model/NoteModel.h" #include "base/Pitch.h" #include #include using std::ofstream; using std::string; using std::ios; using namespace MIDIConstants; MIDIFileWriter::MIDIFileWriter(QString path, NoteModel *model, float tempo) : m_path(path), m_model(model), m_modelUsesHz(false), m_tempo(tempo) { if (model->getScaleUnits().toLower() == "hz") m_modelUsesHz = true; if (!convert()) { m_error = "Conversion from model to internal MIDI format failed"; } } MIDIFileWriter::~MIDIFileWriter() { for (MIDIComposition::iterator i = m_midiComposition.begin(); i != m_midiComposition.end(); ++i) { for (MIDITrack::iterator j = i->second.begin(); j != i->second.end(); ++j) { delete *j; } i->second.clear(); } m_midiComposition.clear(); } bool MIDIFileWriter::isOK() const { return m_error == ""; } QString MIDIFileWriter::getError() const { return m_error; } void MIDIFileWriter::write() { writeComposition(); } string MIDIFileWriter::intToMIDIBytes(int number) const { MIDIByte upper; MIDIByte lower; upper = (number & 0xFF00) >> 8; lower = (number & 0x00FF); string rv; rv += upper; rv += lower; return rv; } string MIDIFileWriter::longToMIDIBytes(unsigned long number) const { MIDIByte upper1; MIDIByte lower1; MIDIByte upper2; MIDIByte lower2; upper1 = (number & 0xff000000) >> 24; lower1 = (number & 0x00ff0000) >> 16; upper2 = (number & 0x0000ff00) >> 8; lower2 = (number & 0x000000ff); string rv; rv += upper1; rv += lower1; rv += upper2; rv += lower2; return rv; } // Turn a delta time into a MIDI time - overlapping into // a maximum of four bytes using the MSB as the carry on // flag. // string MIDIFileWriter::longToVarBuffer(unsigned long number) const { string rv; long inNumber = number; long outNumber; // get the lowest 7 bits of the number outNumber = number & 0x7f; // Shift and test and move the numbers // on if we need them - setting the MSB // as we go. // while ((inNumber >>= 7 ) > 0) { outNumber <<= 8; outNumber |= 0x80; outNumber += (inNumber & 0x7f); } // Now move the converted number out onto the buffer // while (true) { rv += (MIDIByte)(outNumber & 0xff); if (outNumber & 0x80) outNumber >>= 8; else break; } return rv; } bool MIDIFileWriter::writeHeader() { *m_midiFile << MIDI_FILE_HEADER; // Number of bytes in header *m_midiFile << (MIDIByte) 0x00; *m_midiFile << (MIDIByte) 0x00; *m_midiFile << (MIDIByte) 0x00; *m_midiFile << (MIDIByte) 0x06; // File format *m_midiFile << (MIDIByte) 0x00; *m_midiFile << (MIDIByte) m_format; *m_midiFile << intToMIDIBytes(m_numberOfTracks); *m_midiFile << intToMIDIBytes(m_timingDivision); return true; } bool MIDIFileWriter::writeTrack(int trackNumber) { bool retOK = true; MIDIByte eventCode = 0; MIDITrack::iterator midiEvent; // First we write into the trackBuffer, then write it out to the // file with its accompanying length. // string trackBuffer; for (midiEvent = m_midiComposition[trackNumber].begin(); midiEvent != m_midiComposition[trackNumber].end(); midiEvent++) { // Write the time to the buffer in MIDI format trackBuffer += longToVarBuffer((*midiEvent)->getTime()); if ((*midiEvent)->isMeta()) { trackBuffer += MIDI_FILE_META_EVENT; trackBuffer += (*midiEvent)->getMetaEventCode(); // Variable length number field trackBuffer += longToVarBuffer((*midiEvent)-> getMetaMessage().length()); trackBuffer += (*midiEvent)->getMetaMessage(); } else { // Send the normal event code (with encoded channel information) if (((*midiEvent)->getEventCode() != eventCode) || ((*midiEvent)->getEventCode() == MIDI_SYSTEM_EXCLUSIVE)) { trackBuffer += (*midiEvent)->getEventCode(); eventCode = (*midiEvent)->getEventCode(); } // Send the relevant data // switch ((*midiEvent)->getMessageType()) { case MIDI_NOTE_ON: case MIDI_NOTE_OFF: case MIDI_POLY_AFTERTOUCH: trackBuffer += (*midiEvent)->getData1(); trackBuffer += (*midiEvent)->getData2(); break; case MIDI_CTRL_CHANGE: trackBuffer += (*midiEvent)->getData1(); trackBuffer += (*midiEvent)->getData2(); break; case MIDI_PROG_CHANGE: trackBuffer += (*midiEvent)->getData1(); break; case MIDI_CHNL_AFTERTOUCH: trackBuffer += (*midiEvent)->getData1(); break; case MIDI_PITCH_BEND: trackBuffer += (*midiEvent)->getData1(); trackBuffer += (*midiEvent)->getData2(); break; case MIDI_SYSTEM_EXCLUSIVE: // write out message length trackBuffer += longToVarBuffer((*midiEvent)->getMetaMessage().length()); // now the message trackBuffer += (*midiEvent)->getMetaMessage(); break; default: break; } } } // Now we write the track - First the standard header.. // *m_midiFile << MIDI_TRACK_HEADER; // ..now the length of the buffer.. // *m_midiFile << longToMIDIBytes((long)trackBuffer.length()); // ..then the buffer itself.. // *m_midiFile << trackBuffer; return retOK; } bool MIDIFileWriter::writeComposition() { bool retOK = true; m_midiFile = new ofstream(m_path.toLocal8Bit().data(), ios::out | ios::binary); if (!(*m_midiFile)) { m_error = "Can't open file for writing."; delete m_midiFile; m_midiFile = 0; return false; } if (!writeHeader()) { retOK = false; } for (unsigned int i = 0; i < m_numberOfTracks; i++) { if (!writeTrack(i)) { retOK = false; } } m_midiFile->close(); delete m_midiFile; m_midiFile = 0; if (!retOK) { m_error = "MIDI file write failed"; } return retOK; } bool MIDIFileWriter::convert() { m_timingDivision = 480; m_format = MIDI_SINGLE_TRACK_FILE; m_numberOfTracks = 1; int track = 0; int midiChannel = 0; MIDIEvent *event; event = new MIDIEvent(0, MIDI_FILE_META_EVENT, MIDI_CUE_POINT, "Exported from Sonic Visualiser"); m_midiComposition[track].push_back(event); event = new MIDIEvent(0, MIDI_FILE_META_EVENT, MIDI_CUE_POINT, "http://www.sonicvisualiser.org/"); m_midiComposition[track].push_back(event); long tempoValue = long(60000000.0 / m_tempo + 0.01); string tempoString; tempoString += (MIDIByte)(tempoValue >> 16 & 0xFF); tempoString += (MIDIByte)(tempoValue >> 8 & 0xFF); tempoString += (MIDIByte)(tempoValue & 0xFF); event = new MIDIEvent(0, MIDI_FILE_META_EVENT, MIDI_SET_TEMPO, tempoString); m_midiComposition[track].push_back(event); // Omit time signature const NoteModel::PointList ¬es = static_cast *>(m_model)->getPoints(); for (NoteModel::PointList::const_iterator i = notes.begin(); i != notes.end(); ++i) { long frame = i->frame; float value = i->value; size_t duration = i->duration; int pitch; if (m_modelUsesHz) { pitch = Pitch::getPitchForFrequency(value); } else { pitch = lrintf(value); } if (pitch < 0) pitch = 0; if (pitch > 127) pitch = 127; // Convert frame to MIDI time double seconds = double(frame) / double(m_model->getSampleRate()); double quarters = (seconds * m_tempo) / 60.0; unsigned long midiTime = lrint(quarters * m_timingDivision); int velocity = 100; if (i->level > 0.f && i->level <= 1.f) { velocity = lrintf(i->level * 127.f); } // Get the sounding time for the matching NOTE_OFF seconds = double(frame + duration) / double(m_model->getSampleRate()); quarters = (seconds * m_tempo) / 60.0; unsigned long endTime = lrint(quarters * m_timingDivision); // At this point all the notes we insert have absolute times // in the delta time fields. We resolve these into delta // times further down (can't do it until all the note offs are // in place). event = new MIDIEvent(midiTime, MIDI_NOTE_ON | midiChannel, pitch, velocity); m_midiComposition[track].push_back(event); event = new MIDIEvent(endTime, MIDI_NOTE_OFF | midiChannel, pitch, 127); // loudest silence you can muster m_midiComposition[track].push_back(event); } // Now gnash through the MIDI events and turn the absolute times // into delta times. // for (unsigned int i = 0; i < m_numberOfTracks; i++) { unsigned long lastMidiTime = 0; // First sort the track with the MIDIEvent comparator. Use // stable_sort so that events with equal times are maintained // in their current order. // std::stable_sort(m_midiComposition[i].begin(), m_midiComposition[i].end(), MIDIEventCmp()); for (MIDITrack::iterator it = m_midiComposition[i].begin(); it != m_midiComposition[i].end(); it++) { unsigned long deltaTime = (*it)->getTime() - lastMidiTime; lastMidiTime = (*it)->getTime(); (*it)->setTime(deltaTime); } // Insert end of track event (delta time = 0) // event = new MIDIEvent(0, MIDI_FILE_META_EVENT, MIDI_END_OF_TRACK, ""); m_midiComposition[i].push_back(event); } return true; } sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/PlaylistFileReader.h0000644000175000017500000000235112252354725025311 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PLAYLIST_FILE_READER_H_ #define _PLAYLIST_FILE_READER_H_ #include "FileSource.h" #include #include #include class QFile; class PlaylistFileReader { public: typedef std::vector Playlist; PlaylistFileReader(QString path); PlaylistFileReader(FileSource source); virtual ~PlaylistFileReader(); virtual bool isOK() const; virtual QString getError() const; virtual Playlist load() const; static void getSupportedExtensions(std::set &extensions); protected: void init(); FileSource m_source; QFile *m_file; QString m_basedir; QString m_error; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/DataFileReader.h0000644000175000017500000000404212252354725024360 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _DATA_FILE_READER_H_ #define _DATA_FILE_READER_H_ #include #include class Model; class DataFileReader : public QObject { public: /** * Return true if the file appears to be of the correct type. * * The DataFileReader will be constructed by passing a file path * to its constructor. If the file can at that time be determined * to be not of a type that this reader can read, it should return * false in response to any subsequent call to isOK(). * * If the file is apparently of the correct type, isOK() should * return true; if it turns out that the file cannot after all be * read (because it's corrupted or the detection misfired), then * the read() function may return NULL. */ virtual bool isOK() const = 0; virtual QString getError() const { return ""; } /** * Read the file and return the corresponding data model. This * function is not expected to be thread-safe or reentrant. This * function may be interactive (i.e. it's permitted to pop up * dialogs and windows and ask the user to specify any details * that can't be automatically extracted from the file). * * Return NULL if the file cannot be parsed at all (although it's * preferable to return a partial model and warn the user). * * Caller owns the returned model and must delete it after use. */ virtual Model *load() const = 0; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/FileFinder.h0000644000175000017500000000355012252354725023576 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _FILE_FINDER_H_ #define _FILE_FINDER_H_ #include class FileFinder { public: enum FileType { SessionFile, AudioFile, LayerFile, LayerFileNoMidi, SessionOrAudioFile, ImageFile, AnyFile, CSVFile, }; virtual QString getOpenFileName(FileType type, QString fallbackLocation = "") = 0; virtual QString getSaveFileName(FileType type, QString fallbackLocation = "") = 0; virtual void registerLastOpenedFilePath(FileType type, QString path) = 0; virtual QString find(FileType type, QString location, QString lastKnownLocation = "") = 0; static FileFinder *getInstance() { FFContainer *container = FFContainer::getInstance(); return container->getFileFinder(); } protected: class FFContainer { public: static FFContainer *getInstance() { static FFContainer instance; return &instance; } void setFileFinder(FileFinder *ff) { m_ff = ff; } FileFinder *getFileFinder() const { return m_ff; } private: FileFinder *m_ff; }; static void registerFileFinder(FileFinder *ff) { FFContainer *container = FFContainer::getInstance(); container->setFileFinder(ff); } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/fileio/WavFileWriter.cpp0000644000175000017500000001227712252354725024662 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "WavFileWriter.h" #include "model/DenseTimeValueModel.h" #include "base/Selection.h" #include "base/TempWriteFile.h" #include "base/Exceptions.h" #include #include WavFileWriter::WavFileWriter(QString path, size_t sampleRate, size_t channels, FileWriteMode mode) : m_path(path), m_sampleRate(sampleRate), m_channels(channels), m_temp(0), m_file(0) { SF_INFO fileInfo; fileInfo.samplerate = m_sampleRate; fileInfo.channels = m_channels; fileInfo.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT; try { if (mode == WriteToTemporary) { m_temp = new TempWriteFile(m_path); m_file = sf_open(m_temp->getTemporaryFilename().toLocal8Bit(), SFM_WRITE, &fileInfo); if (!m_file) { cerr << "WavFileWriter: Failed to open file (" << sf_strerror(m_file) << ")" << endl; m_error = QString("Failed to open audio file '%1' for writing") .arg(m_temp->getTemporaryFilename()); } } else { m_file = sf_open(m_path.toLocal8Bit(), SFM_WRITE, &fileInfo); if (!m_file) { cerr << "WavFileWriter: Failed to open file (" << sf_strerror(m_file) << ")" << endl; m_error = QString("Failed to open audio file '%1' for writing") .arg(m_path); } } } catch (FileOperationFailed &f) { m_error = f.what(); m_temp = 0; m_file = 0; } } WavFileWriter::~WavFileWriter() { if (m_file) close(); } bool WavFileWriter::isOK() const { return (m_error.isEmpty()); } QString WavFileWriter::getError() const { return m_error; } QString WavFileWriter::getWriteFilename() const { if (m_temp) { return m_temp->getTemporaryFilename(); } else { return m_path; } } bool WavFileWriter::writeModel(DenseTimeValueModel *source, MultiSelection *selection) { if (source->getChannelCount() != m_channels) { SVDEBUG << "WavFileWriter::writeModel: Wrong number of channels (" << source->getChannelCount() << " != " << m_channels << ")" << endl; m_error = QString("Failed to write model to audio file '%1'") .arg(getWriteFilename()); return false; } if (!m_file) { m_error = QString("Failed to write model to audio file '%1': File not open") .arg(getWriteFilename()); return false; } bool ownSelection = false; if (!selection) { selection = new MultiSelection; selection->setSelection(Selection(source->getStartFrame(), source->getEndFrame())); ownSelection = true; } size_t bs = 2048; float *ub = new float[bs]; // uninterleaved buffer (one channel) float *ib = new float[bs * m_channels]; // interleaved buffer for (MultiSelection::SelectionList::iterator i = selection->getSelections().begin(); i != selection->getSelections().end(); ++i) { size_t f0(i->getStartFrame()), f1(i->getEndFrame()); for (size_t f = f0; f < f1; f += bs) { size_t n = std::min(bs, f1 - f); for (int c = 0; c < int(m_channels); ++c) { source->getData(c, f, n, ub); for (size_t i = 0; i < n; ++i) { ib[i * m_channels + c] = ub[i]; } } sf_count_t written = sf_writef_float(m_file, ib, n); if (written < n) { m_error = QString("Only wrote %1 of %2 frames at file frame %3") .arg(written).arg(n).arg(f); break; } } } delete[] ub; delete[] ib; if (ownSelection) delete selection; return isOK(); } bool WavFileWriter::writeSamples(float **samples, size_t count) { if (!m_file) { m_error = QString("Failed to write model to audio file '%1': File not open") .arg(getWriteFilename()); return false; } float *b = new float[count * m_channels]; for (size_t i = 0; i < count; ++i) { for (size_t c = 0; c < m_channels; ++c) { b[i * m_channels + c] = samples[c][i]; } } sf_count_t written = sf_writef_float(m_file, b, count); delete[] b; if (written < count) { m_error = QString("Only wrote %1 of %2 frames") .arg(written).arg(count); } return isOK(); } bool WavFileWriter::close() { if (m_file) { sf_close(m_file); m_file = 0; } if (m_temp) { m_temp->moveToTarget(); delete m_temp; m_temp = 0; } return true; } sonic-visualiser-2.3~repack1.orig/svcore/data/sv.pch0000777000175000017500000000000012252354725022624 2../sv.pchustar miramirasonic-visualiser-2.3~repack1.orig/svcore/data/osc/0000755000175000017500000000000012264464201020722 5ustar miramirasonic-visualiser-2.3~repack1.orig/svcore/data/osc/OSCQueue.h0000644000175000017500000000320212252354725022527 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam and QMUL. */ #ifndef _OSC_QUEUE_H_ #define _OSC_QUEUE_H_ #include "OSCMessage.h" #include "base/RingBuffer.h" #include #ifdef HAVE_LIBLO #include #endif class OSCQueue : public QObject { Q_OBJECT public: OSCQueue(); virtual ~OSCQueue(); bool isOK() const; bool isEmpty() const { return getMessagesAvailable() == 0; } size_t getMessagesAvailable() const; OSCMessage readMessage(); QString getOSCURL() const; signals: void messagesAvailable(); protected: #ifdef HAVE_LIBLO lo_server_thread m_thread; static void oscError(int, const char *, const char *); static int oscMessageHandler(const char *, const char *, lo_arg **, int, lo_message, void *); #endif void postMessage(OSCMessage); bool parseOSCPath(QString path, int &target, int &targetData, QString &method); RingBuffer m_buffer; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/osc/sv-osc-send.c0000644000175000017500000000311512252354725023235 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include #include #include #include #include void usage(char *program_name) { char *base_name = strrchr(program_name, '/'); if (base_name && *(base_name + 1) != 0) { base_name += 1; } else { base_name = program_name; } fprintf(stderr, "\nusage: %s []\n\n", program_name); fprintf(stderr, "example OSC URLs:\n\n" " osc.udp://localhost:19383/path/test 1.0 4.2\n" " osc.udp://my.host.org:10886/3/13/load file\n\n"); fprintf(stderr, "numeric arguments will be treated as OSC 'f' floating point types.\n\n"); exit(1); } int main(int argc, char *argv[]) { lo_address a; char *url, *host, *port, *path; lo_message message; unsigned int i; if (argc < 2) { usage(argv[0]); /* does not return */ } url = argv[1]; host = lo_url_get_hostname(url); port = lo_url_get_port(url); path = lo_url_get_path(url); a = lo_address_new(host, port); message = lo_message_new(); for (i = 0; i + 2 < argc; ++i) { int index = i + 2; char *param; param = argv[index]; if (!isdigit(param[0])) { lo_message_add_string(message, argv[index]); } else { lo_message_add_float(message, atof(argv[index])); } } lo_send_message(a, path, message); if (lo_address_errno(a)) { printf("liblo error: %s\n", lo_address_errstr(a)); } free(host); free(port); free(path); return 0; } sonic-visualiser-2.3~repack1.orig/svcore/data/osc/OSCMessage.h0000644000175000017500000000301312252354725023027 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #ifndef _OSC_MESSAGE_H_ #define _OSC_MESSAGE_H_ #include #include #include #include #include "base/Debug.h" class OSCMessage { public: OSCMessage() { } ~OSCMessage(); void setTarget(const int &target) { m_target = target; } int getTarget() const { return m_target; } void setTargetData(const int &targetData) { m_targetData = targetData; } int getTargetData() const { return m_targetData; } void setMethod(QString method) { m_method = method; } QString getMethod() const { return m_method; } void clearArgs(); void addArg(QVariant arg); size_t getArgCount() const; const QVariant &getArg(size_t i) const; private: int m_target; int m_targetData; QString m_method; std::vector m_args; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/osc/OSCQueue.cpp0000644000175000017500000001327312252354725023073 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam and QMUL. */ #include "OSCQueue.h" #include "base/Profiler.h" #include #include #define OSC_MESSAGE_QUEUE_SIZE 1023 #ifdef HAVE_LIBLO void OSCQueue::oscError(int num, const char *msg, const char *path) { cerr << "ERROR: OSCQueue::oscError: liblo server error " << num << " in path " << path << ": " << msg << endl; } int OSCQueue::oscMessageHandler(const char *path, const char *types, lo_arg **argv, int argc, lo_message, void *user_data) { OSCQueue *queue = static_cast(user_data); int target; int targetData; QString method; if (!queue->parseOSCPath(path, target, targetData, method)) { return 1; } OSCMessage message; message.setTarget(target); message.setTargetData(targetData); message.setMethod(method); int i = 0; while (types && i < argc && types[i]) { char type = types[i]; lo_arg *arg = argv[i]; switch (type) { case 'i': message.addArg(arg->i); break; // This conversion fails to compile in 64-bit environments // at present, and we don't use the h type anyway so we // can safely omit it // case 'h': message.addArg(arg->h); break; case 'f': message.addArg(arg->f); break; case 'd': message.addArg(arg->d); break; case 'c': message.addArg(arg->c); break; case 't': message.addArg(arg->i); break; case 's': message.addArg(&arg->s); break; default: cerr << "WARNING: OSCQueue::oscMessageHandler: " << "Unsupported OSC type '" << type << "'" << endl; break; } ++i; } queue->postMessage(message); return 0; } #endif OSCQueue::OSCQueue() : #ifdef HAVE_LIBLO m_thread(0), #endif m_buffer(OSC_MESSAGE_QUEUE_SIZE) { Profiler profiler("OSCQueue::OSCQueue"); #ifdef HAVE_LIBLO m_thread = lo_server_thread_new(NULL, oscError); lo_server_thread_add_method(m_thread, NULL, NULL, oscMessageHandler, this); lo_server_thread_start(m_thread); cout << "OSCQueue::OSCQueue: Base OSC URL is " << lo_server_thread_get_url(m_thread) << endl; #endif } OSCQueue::~OSCQueue() { #ifdef HAVE_LIBLO if (m_thread) { lo_server_thread_stop(m_thread); } #endif while (m_buffer.getReadSpace() > 0) { delete m_buffer.readOne(); } } bool OSCQueue::isOK() const { #ifdef HAVE_LIBLO return (m_thread != 0); #else return false; #endif } QString OSCQueue::getOSCURL() const { QString url = ""; #ifdef HAVE_LIBLO url = lo_server_thread_get_url(m_thread); #endif return url; } size_t OSCQueue::getMessagesAvailable() const { return m_buffer.getReadSpace(); } OSCMessage OSCQueue::readMessage() { OSCMessage *message = m_buffer.readOne(); OSCMessage rmessage = *message; delete message; return rmessage; } void OSCQueue::postMessage(OSCMessage message) { int count = 0, max = 5; while (m_buffer.getWriteSpace() == 0) { if (count == max) { cerr << "ERROR: OSCQueue::postMessage: OSC message queue is full and not clearing -- abandoning incoming message" << endl; return; } cerr << "WARNING: OSCQueue::postMessage: OSC message queue (capacity " << m_buffer.getSize() << " is full!" << endl; SVDEBUG << "Waiting for something to be processed" << endl; #ifdef _WIN32 Sleep(1); #else sleep(1); #endif count++; } OSCMessage *mp = new OSCMessage(message); m_buffer.write(&mp, 1); SVDEBUG << "OSCQueue::postMessage: Posted OSC message: target " << message.getTarget() << ", target data " << message.getTargetData() << ", method " << message.getMethod() << endl; emit messagesAvailable(); } bool OSCQueue::parseOSCPath(QString path, int &target, int &targetData, QString &method) { while (path.startsWith("/")) { path = path.right(path.length()-1); } int i = 0; bool ok = false; target = path.section('/', i, i).toInt(&ok); if (!ok) { target = 0; } else { ++i; targetData = path.section('/', i, i).toInt(&ok); if (!ok) { targetData = 0; } else { ++i; } } method = path.section('/', i, -1); if (method.contains('/')) { cerr << "ERROR: OSCQueue::parseOSCPath: malformed path \"" << path << "\" (should be target/data/method or " << "target/method or method, where target and data " << "are numeric)" << endl; return false; } SVDEBUG << "OSCQueue::parseOSCPath: good path \"" << path << "\"" << endl; return true; } sonic-visualiser-2.3~repack1.orig/svcore/data/osc/OSCMessage.cpp0000644000175000017500000000206712252354725023372 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Chris Cannam. */ #include "OSCMessage.h" OSCMessage::~OSCMessage() { clearArgs(); } void OSCMessage::clearArgs() { m_args.clear(); } void OSCMessage::addArg(QVariant arg) { m_args.push_back(arg); } size_t OSCMessage::getArgCount() const { return m_args.size(); } const QVariant & OSCMessage::getArg(size_t i) const { return m_args[i]; } sonic-visualiser-2.3~repack1.orig/svcore/data/osc/demoscript.sh0000755000175000017500000003001212252354725023434 0ustar miramira#!/bin/bash audio=/share/music preferred=$audio/free list=audiofiles.txt used=audiofiles-used.txt df=vamp:vamp-aubio:aubioonset:detectionfunction #df=vamp:qm-vamp-plugins:qm-tempotracker:detection_fn onsets=vamp:vamp-aubio:aubioonset:onsets #onsets=vamp:qm-vamp-plugins:qm-tempotracker:beats beats=vamp:vamp-aubio:aubiotempo:beats #beats=$onsets #onsets=$beats chromagram=vamp:qm-vamp-plugins:qm-chromagram:chromagram notes=vamp:vamp-aubio:aubionotes:notes pid=`cat /tmp/demoscript.pid 2>/dev/null` if [ -n "$pid" ]; then kill "$pid" fi echo $$ > /tmp/demoscript.pid trap "rm /tmp/demoscript.pid" 0 sv-command quit sleep 1 killall -9 sonic-visualiser sleep 1 pick_file() { file="" count=`wc -l "$list" 2>/dev/null | awk '{ print $1 }'` if [ ! -f "$list" ] || [ "$count" -eq "0" ] ; then find "$audio" -name \*.ogg -print >> "$list" find "$audio" -name \*.mp3 -print >> "$list" find "$audio" -name \*.wav -print >> "$list" find "$preferred" -name \*.ogg -print >> "$list" find "$preferred" -name \*.mp3 -print >> "$list" find "$preferred" -name \*.wav -print >> "$list" count=`wc -l "$list" 2>/dev/null | awk '{ print $1 }'` fi while [ -z "$file" ]; do index=$((RANDOM % $count)) file=`head -"$index" "$list" | tail -1` [ -f "$file" ] || continue done fgrep -v "$file" "$list" > "$list"_ && mv "$list"_ "$list" echo "$file" } load_a_file() { file=`pick_file` if ! sv-command open "$file"; then pid="`pidof sonic-visualiser`" if [ -z "$pid" ]; then ( setsid sonic-visualiser -geometry 1000x500+10+100 & ) sleep 2 #sudo renice +19 `pidof sonic-visualiser` #sudo renice +18 `pidof Xorg` sv-command resize 1000 500 load_a_file else echo "ERROR: Unable to contact sonic-visualiser pid $pid" 1>&2 exit 1 fi fi } show_stuff() { sv-command set overlays 2 # sv-command set zoomwheels 1 sv-command set propertyboxes 1 } hide_stuff() { sv-command set overlays 0 # sv-command set zoomwheels 0 sv-command set propertyboxes 0 } reset() { for pane in 1 2 3 4 5; do for layer in 1 2 3 4 5 6 7 8 9 10; do sv-command delete layer done sv-command delete pane done sv-command zoom default sv-command add waveform show_stuff } scroll_and_zoom() { sv-command set overlays 0 sv-command set zoomwheels 0 sv-command set propertyboxes 0 # sv-command setcurrent 1 1 # sv-command delete layer # sv-command setcurrent 1 1 sv-command set layer Colour Red sleep 1 sv-command set pane Global-Zoom off sv-command set pane Global-Scroll off sv-command set pane Follow-Playback Scroll for zoom in 950 900 850 800 750 700 650 600 550 512 450 400 350 300 256 192 160 128 96 64 48 32 24 16; do sv-command zoom $zoom sleep 0.1 done } play() { sv-command play "$@" } fade_in() { sv-command set gain 0 sleep 0.5 play "$@" for gain in 0.001 0.01 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1; do sv-command set gain $gain sleep 0.1 done } fade_out() { for gain in 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0.05 0.01 0.001; do sv-command set gain $gain sleep 0.1 done stop sv-command set gain 1 } slow() { # for speed in -1 -10 -20 -30 -40 -50 -60 -70 -80 -100 -140 -200 -250 -300 -400 -500 -700 -800 -900 -1000; do # sv-command set speedup "$speed" # sleep 1 # done for speed in -20 -100 -1000; do sv-command set speedup "$speed" sleep 10 done } stop() { sv-command stop "$@" sv-command set speedup 0 } quit() { sv-command quit } add_melodic_range_spectrogram() { sv-command set propertyboxes 1 sv-command add spectrogram sv-command set layer Window-Size 8192 # sv-command set layer Window-Size 4096 sv-command set layer Window-Overlap 4 # sv-command set layer Window-Overlap 3 sv-command set layer Frequency-Scale Log sv-command set layer Colour-Scale Meter } zoom_in_spectrogram() { sv-command zoomvertical 43 8000 for x in 1 2 3 4 5 6; do max=$((8000 - 1000*$x)) sv-command zoomvertical 43 "$max" sleep 0.5 done for x in 1 2 3 4 5; do max=$((2000 - 100 * $x)) sv-command zoomvertical 43 "$max" sleep 0.5 done } zoom_in_spectrogram_further() { for x in 1 2 3 4 5; do sv-command zoomvertical in done } playback_bits() { sv-command setcurrent 1 sv-command set pane Global-Zoom off sv-command set pane Global-Scroll off sv-command set pane Follow-Playback Scroll sv-command jump 10 sv-command setcurrent 1 1 sv-command delete layer sv-command setcurrent 1 1 # sv-command setcurrent 1 2 sv-command set layer Colour Blue sleep 5 hide_stuff sv-command set overlays 0 sv-command set zoomwheels 0 sv-command set propertyboxes 0 fade_in sleep 10 # sv-command set layer Colour Blue # sleep 1 # sv-command set layer Colour Orange # sleep 1 # sv-command set layer Colour Red # sleep 1 # sv-command set layer Colour Green # sleep 1 # sleep 1 # scroll_and_zoom # sv-command set overlays 0 # sv-command set zoomwheels 0 # sv-command set propertyboxes 0 # sv-command setcurrent 1 1 # sv-command delete layer # sv-command setcurrent 1 1 # sv-command set layer Colour Red # sleep 1 # sv-command set pane Global-Zoom off # sv-command set pane Global-Scroll off # sv-command set pane Follow-Playback Scroll sv-command set zoomwheels 1 sleep 1 for zoom in 950 900 850 800 750 700 650 600 550 512 450 400 350 300 256 192 160 128 96 64 48 32 24 16; do sv-command zoom $zoom sleep 0.1 done sleep 1 sv-command set zoomwheels 0 sv-command zoom 16 sleep 10 #slow #sv-command set layer Normalize-Visible-Area on # for zoom in 15 14 13 12 11 10 9 8 7 6 5 4 ; do # sv-command zoom $zoom # sleep 0.1 # done sleep 1 sv-command set zoomwheels 0 slow sleep 7 fade_out sv-command setcurrent 1 sv-command set pane Follow-Playback Page sv-command set pane Global-Zoom on sv-command set pane Global-Scroll on done_playback_bits=1 } spectrogram_bits() { sv-command set pane Global-Zoom on sv-command zoom 1024 add_melodic_range_spectrogram sv-command zoom 1024 sleep 5 sv-command jump 10 sleep 20 zoom_in_spectrogram sleep 20 sv-command select 7.5 11 fade_in selection sleep 10 sv-command set speedup -200 sleep 10 sv-command setcurrent 1 sv-command delete pane sv-command zoom in sv-command setcurrent 1 2 sv-command set layer Normalize-Columns off sv-command set layer Normalize-Visible-Area on sleep 20 sv-command set speedup 0 sleep 10 sv-command select none # fade_out # if [ -n "$done_playback_bits" ]; then # sv-command setcurrent 1 # sv-command zoom out # sv-command zoom outvamp:qm-vamp-plugins:qm-chromagram:chromagram # sv-command zoom out # sv-command zoom out # sv-command zoom out # sv-command setcurrent 2 # fi # hide_stuff # fade_in sleep 10 # sv-command set layer Bin-Display Frequencies # sv-command set layer Normalize-Columns on # sleep 20 sv-command set layer Bin-Display "All Bins" sv-command set layer Normalize-Columns on sv-command set layer Normalize-Visible-Area off sv-command set layer Colour-Scale 0 sv-command set layer Colour "Red on Blue" sv-command zoomvertical 23 800 sleep 20 sv-command transform $onsets sv-command set layer Colour Orange sleep 20 fade_out sleep 1 # sv-command jump 10 # sv-command setcurrent 1 2 # sv-command set layer Colour "Black on White" # sv-command transform $notes # sv-command set layer Colour Orange sleep 10 # sv-command setcurrent 1 3 # sv-command delete layer sv-command setcurrent 1 3 sv-command delete layer sv-command setcurrent 1 2 sv-command set layer Colour Default done_spectrogram_bits=1 # zoom_in_spectrogram_further } onset_bits() { show_stuff sv-command set zoomwheels 0 sv-command setcurrent 1 sv-command set pane Global-Zoom on sv-command set pane Global-Scroll on sleep 0.5 sv-command set layer Colour Blue sleep 0.5 sv-command set layer Colour Orange sleep 0.5 sv-command set layer Colour Red sleep 0.5 sv-command set layer Colour Green sleep 1 # sleep 1 # if [ -n "$done_spectrogram_bits" ]; then # sv-command setcurrent 2 # sv-command delete pane # fi # sv-command zoom default # sv-command zoom in # sv-command zoom in # sv-command zoom in sv-command zoom 192 sv-command zoom in sv-command add timeruler sv-command jump 0 sv-command transform $df sv-command set layer Colour Black sleep 5 sv-command set layer Plot-Type Curve sleep 5 sv-command jump 30 sv-command setcurrent 1 sv-command set pane Follow-Playback Page sv-command transform $df sv-command set layer Colour Red sleep 5 sv-command jump 30 sleep 5 if [ "$RANDOM" -lt 16384 ]; then sv-command set layer Vertical-Scale "Log Scale" fi sv-command set layer Plot-Type Segmentation sleep 5 # hide_stuff sleep 10 sv-command set overlays 0 sv-command set propertyboxes 0 # sv-command setcurrent 1 1 # sv-command set layer Colour Black # sv-command setcurrent 1 2 sleep 2 fade_in sleep 2 sv-command transform $onsets sv-command set layer Colour Black sv-command setcurrent 2 sv-command transform $onsets sv-command set layer Colour Blue sleep 20 # sv-command setcurrent 2 # sv-command transform vamp:qm-vamp-plugins:qm-tempotracker:beats # sv-command transform $beats sleep 20 # fade_out # show_stuff } selection_bits() { # reset sv-command set overlays 1 sv-command set zoomwheels 0 sv-command resize 1000 500 sv-command zoom default sv-command setcurrent 2 sv-command delete pane # if [ -n "$done_playback_bits" ]; then sv-command setcurrent 1 2 # else # sv-command setcurrent 1 3 # fi sv-command delete layer # if [ -n "$done_playback_bits" ]; then sv-command setcurrent 1 2 # else # sv-command setcurrent 1 3 # fi sv-command delete layer sv-command setcurrent 1 2 sv-command set layer Colour Orange # sv-command transform vamp:qm-vamp-plugins:qm-tempotracker:beats sv-command transform $beats # sv-command setcurrent 1 2 sv-command set layer Colour Black sleep 20 sv-command loop on base=$((RANDOM % 100)) sv-command select $base $base.3 # fade_in selection play selection sleep 8 base=$((base + 4)) sv-command addselect $base $base.1 #sleep 12 base=$((base + 2)) sv-command addselect $base $base.1 #sleep 6 base=$((base + 2)) sv-command addselect $base $base.3 #sleep 6 base=$((base + 3)) sv-command addselect $base $base.3 #sleep 6 base=$((base + 2)) sv-command addselect $base $base.3 sleep 4 sv-command delete layer sleep 16 sv-command set speedup -50 sleep 14 sv-command set speedup 50 sleep 8 sv-command set speedup 100 sleep 5 sv-command set speedup 200 fade_out # sleep 10 sv-command select none sv-command set overlays 2 sv-command set propertyboxes 1 # sv-command setcurrent 1 3 # sv-command delete layer sv-command setcurrent 1 2 sv-command set layer Colour Black } chromagram_bits() { # add_melodic_range_spectrogram # sleep 10 sv-command add timeruler sleep 5 sv-command jump 10 sv-command zoom out sleep 5 sv-command transform $chromagram sleep 40 sv-command zoom out fade_in sleep 20 fade_out } while /bin/true; do sleep 2 load_a_file sv-command loop on sv-command resize 1000 500 show_stuff sleep 5 sleep 20 playback_bits #sleep 10 sv-command resize 1000 700 sv-command zoom default show_stuff onset_bits selection_bits #sv-command resize 1000 700 #sleep 10 sv-command resize 1000 700 #show_stuff spectrogram_bits #sleep 10 #sv-command jump 0 #show_stuff #chromagram_bits sleep 20 #reset killall -9 sonic-visualiser done sonic-visualiser-2.3~repack1.orig/svcore/data/osc/sv-command0000755000175000017500000000302012252354725022715 0ustar miramira#!/bin/sh # # A very simple command shell for Sonic Visualiser. # # This provides a wrapper for the sv-osc-send program, which is a # generic OSC sending program (not specific to SV, despite its name). # This script attempts to guess the OSC port number for an SV # process running on the local host, and then composes a method name # and arguments into a complete OSC call. # # You can either run this with the method and its arguments on the # command line, e.g. "sv-command set layer Frequency-Scale Log", or # you can provide a series of method + argument commands on stdin. # # Unless you use the -q option, this script will echo the OSC URL # and arguments that it is sending for each command. # # Note that the method and arguments may not contain spaces. # # Chris Cannam, Nov 2006 quiet= if [ "$1" = "-q" ]; then quiet=true; shift; fi # The yucky bit port=`lsof -c sonic- | \ grep UDP | \ sed -e 's/^.*[^0-9]\([0-9][0-9]*\) *$/\1/' | \ grep -v ' ' | \ head -1 ` host=127.0.0.1 scheme=osc.udp if [ -z "$port" ]; then echo "Sonic Visualiser OSC port not found" exit 1 fi if [ -n "$1" ]; then command=$1; shift [ -z "$quiet" ] && echo "$scheme://$host:$port/$command" "$@" sv-osc-send "$scheme://$host:$port/$command" "$@" else while read command a1 a2 a3 a4 a5; do [ -z "$command" ] && continue [ -z "$quiet" ] && echo "$scheme://$host:$port/$command" $a1 $a2 $a3 $a4 $a5 sv-osc-send "$scheme://$host:$port/$command" $a1 $a2 $a3 $a4 $a5 done fi exit 0 sonic-visualiser-2.3~repack1.orig/svcore/data/midi/0000755000175000017500000000000012264464201021060 5ustar miramirasonic-visualiser-2.3~repack1.orig/svcore/data/midi/MIDIInput.h0000644000175000017500000000267512252354725023013 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2009 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _MIDI_INPUT_H_ #define _MIDI_INPUT_H_ #include #include "MIDIEvent.h" #include #include "base/RingBuffer.h" #include "base/FrameTimer.h" class RtMidiIn; class MIDIInput : public QObject { Q_OBJECT public: MIDIInput(QString name, FrameTimer *timer); virtual ~MIDIInput(); bool isOK() const { return m_rtmidi != 0; } bool isEmpty() const { return getEventsAvailable() == 0; } size_t getEventsAvailable() const { return m_buffer.getReadSpace(); } MIDIEvent readEvent(); signals: void eventsAvailable(); protected: RtMidiIn *m_rtmidi; FrameTimer *m_frameTimer; static void staticCallback(double, std::vector *, void *); void callback(double, std::vector *); void postEvent(MIDIEvent); RingBuffer m_buffer; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/midi/MIDIEvent.h0000644000175000017500000002150512252354725022766 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ /* This is a modified version of a source file from the Rosegarden MIDI and audio sequencer and notation editor. This file copyright 2000-2006 Richard Bown and Chris Cannam. */ #ifndef _MIDI_EVENT_H_ #define _MIDI_EVENT_H_ #include #include #include #include "base/Debug.h" typedef unsigned char MIDIByte; namespace MIDIConstants { static const char *const MIDI_FILE_HEADER = "MThd"; static const char *const MIDI_TRACK_HEADER = "MTrk"; static const MIDIByte MIDI_STATUS_BYTE_MASK = 0x80; static const MIDIByte MIDI_MESSAGE_TYPE_MASK = 0xF0; static const MIDIByte MIDI_CHANNEL_NUM_MASK = 0x0F; static const MIDIByte MIDI_NOTE_OFF = 0x80; static const MIDIByte MIDI_NOTE_ON = 0x90; static const MIDIByte MIDI_POLY_AFTERTOUCH = 0xA0; static const MIDIByte MIDI_CTRL_CHANGE = 0xB0; static const MIDIByte MIDI_PROG_CHANGE = 0xC0; static const MIDIByte MIDI_CHNL_AFTERTOUCH = 0xD0; static const MIDIByte MIDI_PITCH_BEND = 0xE0; static const MIDIByte MIDI_SELECT_CHNL_MODE = 0xB0; static const MIDIByte MIDI_SYSTEM_EXCLUSIVE = 0xF0; static const MIDIByte MIDI_TC_QUARTER_FRAME = 0xF1; static const MIDIByte MIDI_SONG_POSITION_PTR = 0xF2; static const MIDIByte MIDI_SONG_SELECT = 0xF3; static const MIDIByte MIDI_TUNE_REQUEST = 0xF6; static const MIDIByte MIDI_END_OF_EXCLUSIVE = 0xF7; static const MIDIByte MIDI_TIMING_CLOCK = 0xF8; static const MIDIByte MIDI_START = 0xFA; static const MIDIByte MIDI_CONTINUE = 0xFB; static const MIDIByte MIDI_STOP = 0xFC; static const MIDIByte MIDI_ACTIVE_SENSING = 0xFE; static const MIDIByte MIDI_SYSTEM_RESET = 0xFF; static const MIDIByte MIDI_SYSEX_NONCOMMERCIAL = 0x7D; static const MIDIByte MIDI_SYSEX_NON_RT = 0x7E; static const MIDIByte MIDI_SYSEX_RT = 0x7F; static const MIDIByte MIDI_SYSEX_RT_COMMAND = 0x06; static const MIDIByte MIDI_SYSEX_RT_RESPONSE = 0x07; static const MIDIByte MIDI_MMC_STOP = 0x01; static const MIDIByte MIDI_MMC_PLAY = 0x02; static const MIDIByte MIDI_MMC_DEFERRED_PLAY = 0x03; static const MIDIByte MIDI_MMC_FAST_FORWARD = 0x04; static const MIDIByte MIDI_MMC_REWIND = 0x05; static const MIDIByte MIDI_MMC_RECORD_STROBE = 0x06; static const MIDIByte MIDI_MMC_RECORD_EXIT = 0x07; static const MIDIByte MIDI_MMC_RECORD_PAUSE = 0x08; static const MIDIByte MIDI_MMC_PAUSE = 0x08; static const MIDIByte MIDI_MMC_EJECT = 0x0A; static const MIDIByte MIDI_MMC_LOCATE = 0x44; static const MIDIByte MIDI_FILE_META_EVENT = 0xFF; static const MIDIByte MIDI_SEQUENCE_NUMBER = 0x00; static const MIDIByte MIDI_TEXT_EVENT = 0x01; static const MIDIByte MIDI_COPYRIGHT_NOTICE = 0x02; static const MIDIByte MIDI_TRACK_NAME = 0x03; static const MIDIByte MIDI_INSTRUMENT_NAME = 0x04; static const MIDIByte MIDI_LYRIC = 0x05; static const MIDIByte MIDI_TEXT_MARKER = 0x06; static const MIDIByte MIDI_CUE_POINT = 0x07; static const MIDIByte MIDI_CHANNEL_PREFIX = 0x20; static const MIDIByte MIDI_CHANNEL_PREFIX_OR_PORT = 0x21; static const MIDIByte MIDI_END_OF_TRACK = 0x2F; static const MIDIByte MIDI_SET_TEMPO = 0x51; static const MIDIByte MIDI_SMPTE_OFFSET = 0x54; static const MIDIByte MIDI_TIME_SIGNATURE = 0x58; static const MIDIByte MIDI_KEY_SIGNATURE = 0x59; static const MIDIByte MIDI_SEQUENCER_SPECIFIC = 0x7F; static const MIDIByte MIDI_CONTROLLER_BANK_MSB = 0x00; static const MIDIByte MIDI_CONTROLLER_VOLUME = 0x07; static const MIDIByte MIDI_CONTROLLER_BANK_LSB = 0x20; static const MIDIByte MIDI_CONTROLLER_MODULATION = 0x01; static const MIDIByte MIDI_CONTROLLER_PAN = 0x0A; static const MIDIByte MIDI_CONTROLLER_SUSTAIN = 0x40; static const MIDIByte MIDI_CONTROLLER_RESONANCE = 0x47; static const MIDIByte MIDI_CONTROLLER_RELEASE = 0x48; static const MIDIByte MIDI_CONTROLLER_ATTACK = 0x49; static const MIDIByte MIDI_CONTROLLER_FILTER = 0x4A; static const MIDIByte MIDI_CONTROLLER_REVERB = 0x5B; static const MIDIByte MIDI_CONTROLLER_CHORUS = 0x5D; static const MIDIByte MIDI_CONTROLLER_NRPN_1 = 0x62; static const MIDIByte MIDI_CONTROLLER_NRPN_2 = 0x63; static const MIDIByte MIDI_CONTROLLER_RPN_1 = 0x64; static const MIDIByte MIDI_CONTROLLER_RPN_2 = 0x65; static const MIDIByte MIDI_CONTROLLER_SOUNDS_OFF = 0x78; static const MIDIByte MIDI_CONTROLLER_RESET = 0x79; static const MIDIByte MIDI_CONTROLLER_LOCAL = 0x7A; static const MIDIByte MIDI_CONTROLLER_ALL_NOTES_OFF = 0x7B; static const MIDIByte MIDI_PERCUSSION_CHANNEL = 9; } class MIDIEvent { public: MIDIEvent(unsigned long deltaTime, MIDIByte eventCode, MIDIByte data1 = 0, MIDIByte data2 = 0) : m_deltaTime(deltaTime), m_duration(0), m_eventCode(eventCode), m_data1(data1), m_data2(data2), m_metaEventCode(0) { } MIDIEvent(unsigned long deltaTime, MIDIByte eventCode, MIDIByte metaEventCode, const std::string &metaMessage) : m_deltaTime(deltaTime), m_duration(0), m_eventCode(eventCode), m_data1(0), m_data2(0), m_metaEventCode(metaEventCode), m_metaMessage(metaMessage) { } MIDIEvent(unsigned long deltaTime, MIDIByte eventCode, const std::string &sysEx) : m_deltaTime(deltaTime), m_duration(0), m_eventCode(eventCode), m_data1(0), m_data2(0), m_metaEventCode(0), m_metaMessage(sysEx) { } ~MIDIEvent() { } void setTime(const unsigned long &time) { m_deltaTime = time; } void setDuration(const unsigned long& duration) { m_duration = duration;} unsigned long addTime(const unsigned long &time) { m_deltaTime += time; return m_deltaTime; } MIDIByte getMessageType() const { return (m_eventCode & MIDIConstants::MIDI_MESSAGE_TYPE_MASK); } MIDIByte getChannelNumber() const { return (m_eventCode & MIDIConstants::MIDI_CHANNEL_NUM_MASK); } unsigned long getTime() const { return m_deltaTime; } unsigned long getDuration() const { return m_duration; } MIDIByte getPitch() const { return m_data1; } MIDIByte getVelocity() const { return m_data2; } MIDIByte getData1() const { return m_data1; } MIDIByte getData2() const { return m_data2; } MIDIByte getEventCode() const { return m_eventCode; } bool isMeta() const { return (m_eventCode == MIDIConstants::MIDI_FILE_META_EVENT); } MIDIByte getMetaEventCode() const { return m_metaEventCode; } std::string getMetaMessage() const { return m_metaMessage; } void setMetaMessage(const std::string &meta) { m_metaMessage = meta; } friend bool operator<(const MIDIEvent &a, const MIDIEvent &b); private: MIDIEvent& operator=(const MIDIEvent); unsigned long m_deltaTime; unsigned long m_duration; MIDIByte m_eventCode; MIDIByte m_data1; // or Note MIDIByte m_data2; // or Velocity MIDIByte m_metaEventCode; std::string m_metaMessage; }; // Comparator for sorting // struct MIDIEventCmp { bool operator()(const MIDIEvent &mE1, const MIDIEvent &mE2) const { return mE1.getTime() < mE2.getTime(); } bool operator()(const MIDIEvent *mE1, const MIDIEvent *mE2) const { return mE1->getTime() < mE2->getTime(); } }; class MIDIException : virtual public std::exception { public: MIDIException(QString message) throw() : m_message(message) { std::cerr << "WARNING: MIDI exception: " << message.toLocal8Bit().data() << std::endl; } virtual ~MIDIException() throw() { } virtual const char *what() const throw() { return m_message.toLocal8Bit().data(); } protected: QString m_message; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/midi/MIDIInput.cpp0000644000175000017500000000545112252354725023341 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2009 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "MIDIInput.h" #include "rtmidi/RtMidi.h" #include MIDIInput::MIDIInput(QString name, FrameTimer *timer) : m_rtmidi(), m_frameTimer(timer), m_buffer(1023) { try { m_rtmidi = new RtMidiIn(name.toStdString()); m_rtmidi->setCallback(staticCallback, this); m_rtmidi->openPort(0, tr("Input").toStdString()); } catch (RtError e) { e.printMessage(); delete m_rtmidi; m_rtmidi = 0; } } MIDIInput::~MIDIInput() { delete m_rtmidi; } void MIDIInput::staticCallback(double timestamp, std::vector *message, void *userData) { ((MIDIInput *)userData)->callback(timestamp, message); } void MIDIInput::callback(double timestamp, std::vector *message) { SVDEBUG << "MIDIInput::callback(" << timestamp << ")" << endl; // In my experience so far, the timings passed to this function // are not reliable enough to use. We request instead an audio // frame time from whatever FrameTimer we have been given, and use // that as the event time. if (!message || message->empty()) return; unsigned long t = m_frameTimer->getFrame(); MIDIByte code = (*message)[0]; MIDIEvent ev(t, code, message->size() > 1 ? (*message)[1] : 0, message->size() > 2 ? (*message)[2] : 0); postEvent(ev); } MIDIEvent MIDIInput::readEvent() { MIDIEvent *event = m_buffer.readOne(); MIDIEvent revent = *event; delete event; return revent; } void MIDIInput::postEvent(MIDIEvent e) { int count = 0, max = 5; while (m_buffer.getWriteSpace() == 0) { if (count == max) { cerr << "ERROR: MIDIInput::postEvent: MIDI event queue is full and not clearing -- abandoning incoming event" << endl; return; } cerr << "WARNING: MIDIInput::postEvent: MIDI event queue (capacity " << m_buffer.getSize() << " is full!" << endl; SVDEBUG << "Waiting for something to be processed" << endl; #ifdef _WIN32 Sleep(1); #else sleep(1); #endif count++; } MIDIEvent *me = new MIDIEvent(e); m_buffer.write(&me, 1); emit eventsAvailable(); } sonic-visualiser-2.3~repack1.orig/svcore/data/midi/rtmidi/0000755000175000017500000000000012264464201022350 5ustar miramirasonic-visualiser-2.3~repack1.orig/svcore/data/midi/rtmidi/RtMidi.cpp0000644000175000017500000021751712252354725024267 0ustar miramira/**********************************************************************/ /*! \class RtMidi \brief An abstract base class for realtime MIDI input/output. This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut. RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2009 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**********************************************************************/ // RtMidi: Version 1.0.8 #include "RtMidi.h" #include using std::cerr; using std::endl; //*********************************************************************// // Common RtMidi Definitions //*********************************************************************// RtMidi :: RtMidi() : apiData_( 0 ), connected_( false ) { } void RtMidi :: error( RtError::Type type ) { if (type == RtError::WARNING) { cerr << '\n' << errorString_ << "\n\n"; } else if (type == RtError::DEBUG_WARNING) { #if defined(__RTMIDI_DEBUG__) cerr << '\n' << errorString_ << "\n\n"; #endif } else { cerr << '\n' << errorString_ << "\n\n"; throw RtError( errorString_, type ); } } //*********************************************************************// // Common RtMidiIn Definitions //*********************************************************************// RtMidiIn :: RtMidiIn( const std::string clientName ) : RtMidi() { this->initialize( clientName ); } void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { if ( inputData_.usingCallback ) { errorString_ = "RtMidiIn::setCallback: a callback function is already set!"; error( RtError::WARNING ); return; } if ( !callback ) { errorString_ = "RtMidiIn::setCallback: callback function value is invalid!"; error( RtError::WARNING ); return; } inputData_.userCallback = (void *) callback; inputData_.userData = userData; inputData_.usingCallback = true; } void RtMidiIn :: cancelCallback() { if ( !inputData_.usingCallback ) { errorString_ = "RtMidiIn::cancelCallback: no callback function was set!"; error( RtError::WARNING ); return; } inputData_.userCallback = 0; inputData_.userData = 0; inputData_.usingCallback = false; } void RtMidiIn :: setQueueSizeLimit( unsigned int queueSize ) { inputData_.queueLimit = queueSize; } void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { inputData_.ignoreFlags = 0; if ( midiSysex ) inputData_.ignoreFlags = 0x01; if ( midiTime ) inputData_.ignoreFlags |= 0x02; if ( midiSense ) inputData_.ignoreFlags |= 0x04; } double RtMidiIn :: getMessage( std::vector *message ) { message->clear(); if ( inputData_.usingCallback ) { errorString_ = "RtMidiIn::getNextMessage: a user callback is currently set for this port."; error( RtError::WARNING ); return 0.0; } if ( inputData_.queue.size() == 0 ) return 0.0; // Copy queued message to the vector pointer argument and then "pop" it. std::vector *bytes = &(inputData_.queue.front().bytes); message->assign( bytes->begin(), bytes->end() ); double deltaTime = inputData_.queue.front().timeStamp; inputData_.queue.pop(); return deltaTime; } //*********************************************************************// // Common RtMidiOut Definitions //*********************************************************************// RtMidiOut :: RtMidiOut( const std::string clientName ) : RtMidi() { this->initialize( clientName ); } //*********************************************************************// // API: Macintosh OS-X //*********************************************************************// // API information found at: // - http://developer. apple .com/audio/pdf/coreaudio.pdf #if defined(__MACOSX_CORE__) // The CoreMIDI API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // OS-X CoreMIDI header files. #include #include // A structure to hold variables related to the CoreMIDI API // implementation. struct CoreMidiData { MIDIClientRef client; MIDIPortRef port; MIDIEndpointRef endpoint; MIDIEndpointRef destinationId; unsigned long long lastTime; }; //*********************************************************************// // API: OS-X // Class Definitions: RtMidiIn //*********************************************************************// void midiInputCallback( const MIDIPacketList *list, void *procRef, void *srcRef ) { RtMidiIn::RtMidiInData *data = static_cast (procRef); CoreMidiData *apiData = static_cast (data->apiData); unsigned char status; unsigned short nBytes, iByte, size; unsigned long long time; bool& continueSysex = data->continueSysex; RtMidiIn::MidiMessage& message = data->message; const MIDIPacket *packet = &list->packet[0]; for ( unsigned int i=0; inumPackets; ++i ) { // My interpretation of the CoreMIDI documentation: all message // types, except sysex, are complete within a packet and there may // be several of them in a single packet. Sysex messages can be // broken across multiple packets and PacketLists but are bundled // alone within each packet (these packets do not contain other // message types). If sysex messages are split across multiple // MIDIPacketLists, they must be handled by multiple calls to this // function. nBytes = packet->length; if ( nBytes == 0 ) continue; // Calculate time stamp. message.timeStamp = 0.0; if ( data->firstMessage ) data->firstMessage = false; else { time = packet->timeStamp; time -= apiData->lastTime; time = AudioConvertHostTimeToNanos( time ); message.timeStamp = time * 0.000000001; } apiData->lastTime = packet->timeStamp; iByte = 0; if ( continueSysex ) { // We have a continuing, segmented sysex message. if ( !( data->ignoreFlags & 0x01 ) ) { // If we're not ignoring sysex messages, copy the entire packet. for ( unsigned int j=0; jdata[j] ); } continueSysex = packet->data[nBytes-1] != 0xF7; if ( !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback && message.bytes.size() > 0 ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } } else { while ( iByte < nBytes ) { size = 0; // We are expecting that the next byte in the packet is a status byte. status = packet->data[iByte]; if ( !(status & 0x80) ) break; // Determine the number of bytes in the MIDI message. if ( status < 0xC0 ) size = 3; else if ( status < 0xE0 ) size = 2; else if ( status < 0xF0 ) size = 3; else if ( status == 0xF0 ) { // A MIDI sysex if ( data->ignoreFlags & 0x01 ) { size = 0; iByte = nBytes; } else size = nBytes - iByte; continueSysex = packet->data[nBytes-1] != 0xF7; } else if ( status < 0xF3 ) { if ( status == 0xF1 && (data->ignoreFlags & 0x02) ) { // A MIDI time code message and we're ignoring it. size = 0; iByte += 3; } else size = 3; } else if ( status == 0xF3 ) size = 2; else if ( status == 0xF8 ) { size = 1; if ( data->ignoreFlags & 0x02 ) { // A MIDI timing tick message and we're ignoring it. size = 0; iByte += 3; } } else if ( status == 0xFE && (data->ignoreFlags & 0x04) ) { // A MIDI active sensing message and we're ignoring it. size = 0; iByte += 1; } else size = 1; // Copy the MIDI data to our vector. if ( size ) { message.bytes.assign( &packet->data[iByte], &packet->data[iByte+size] ); if ( !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } iByte += size; } } } packet = MIDIPacketNext(packet); } } void RtMidiIn :: initialize( const std::string& clientName ) { // Set up our client. MIDIClientRef client; OSStatus result = MIDIClientCreate( CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ), NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "RtMidiIn::initialize: error creating OS-X MIDI client object."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; inputData_.apiData = (void *) data; } void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nSrc = MIDIGetNumberOfSources(); if (nSrc < 1) { errorString_ = "RtMidiIn::openPort: no MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nSrc ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIInputPortCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), midiInputCallback, (void *)&inputData_, &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "RtMidiIn::openPort: error creating OS-X MIDI input port."; error( RtError::DRIVER_ERROR ); } // Get the desired input source identifier. MIDIEndpointRef endpoint = MIDIGetSource( portNumber ); if ( endpoint == NULL ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "RtMidiIn::openPort: error getting MIDI input source reference."; error( RtError::DRIVER_ERROR ); } // Make the connection. result = MIDIPortConnectSource( port, endpoint, NULL ); if ( result != noErr ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "RtMidiIn::openPort: error connecting OS-X MIDI input port."; error( RtError::DRIVER_ERROR ); } // Save our api-specific port information. data->port = port; connected_ = true; } void RtMidiIn :: openVirtualPort( const std::string portName ) { CoreMidiData *data = static_cast (apiData_); // Create a virtual MIDI input destination. MIDIEndpointRef endpoint; OSStatus result = MIDIDestinationCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), midiInputCallback, (void *)&inputData_, &endpoint ); if ( result != noErr ) { errorString_ = "RtMidiIn::openVirtualPort: error creating virtual OS-X MIDI destination."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. data->endpoint = endpoint; } void RtMidiIn :: closePort( void ) { if ( connected_ ) { CoreMidiData *data = static_cast (apiData_); MIDIPortDispose( data->port ); connected_ = false; } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } unsigned int RtMidiIn :: getPortCount() { return MIDIGetNumberOfSources(); } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { CFStringRef nameRef; MIDIEndpointRef portRef; std::ostringstream ost; char name[128]; if ( portNumber >= MIDIGetNumberOfSources() ) { ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } portRef = MIDIGetSource( portNumber ); MIDIObjectGetStringProperty( portRef, kMIDIPropertyName, &nameRef ); CFStringGetCString( nameRef, name, sizeof(name), 0); CFRelease( nameRef ); std::string stringName = name; return stringName; } //*********************************************************************// // API: OS-X // Class Definitions: RtMidiOut //*********************************************************************// unsigned int RtMidiOut :: getPortCount() { return MIDIGetNumberOfDestinations(); } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { CFStringRef nameRef; MIDIEndpointRef portRef; std::ostringstream ost; char name[128]; if ( portNumber >= MIDIGetNumberOfDestinations() ) { ost << "RtMidiOut::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } portRef = MIDIGetDestination( portNumber ); MIDIObjectGetStringProperty( portRef, kMIDIPropertyName, &nameRef ); CFStringGetCString( nameRef, name, sizeof(name), 0); CFRelease( nameRef ); std::string stringName = name; return stringName; } void RtMidiOut :: initialize( const std::string& clientName ) { // Set up our client. MIDIClientRef client; OSStatus result = MIDIClientCreate( CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ), NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "RtMidiOut::initialize: error creating OS-X MIDI client object."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; } void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "RtMidiOut::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nDest = MIDIGetNumberOfDestinations(); if (nDest < 1) { errorString_ = "RtMidiOut::openPort: no MIDI output destinations found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nDest ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIOutputPortCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "RtMidiOut::openPort: error creating OS-X MIDI output port."; error( RtError::DRIVER_ERROR ); } // Get the desired output port identifier. MIDIEndpointRef destination = MIDIGetDestination( portNumber ); if ( destination == NULL ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "RtMidiOut::openPort: error getting MIDI output destination reference."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. data->port = port; data->destinationId = destination; connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { CoreMidiData *data = static_cast (apiData_); MIDIPortDispose( data->port ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { CoreMidiData *data = static_cast (apiData_); if ( data->endpoint ) { errorString_ = "RtMidiOut::openVirtualPort: a virtual output port already exists!"; error( RtError::WARNING ); return; } // Create a virtual MIDI output source. MIDIEndpointRef endpoint; OSStatus result = MIDISourceCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), &endpoint ); if ( result != noErr ) { errorString_ = "RtMidiOut::initialize: error creating OS-X virtual MIDI source."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. data->endpoint = endpoint; } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { // The CoreMidi documentation indicates a maximum PackList size of // 64K, so we may need to break long sysex messages into pieces and // send via separate lists. unsigned int nBytes = message->size(); if ( nBytes == 0 ) { errorString_ = "RtMidiOut::sendMessage: no data in message argument!"; error( RtError::WARNING ); return; } if ( nBytes > 3 && ( message->at(0) != 0xF0 ) ) { errorString_ = "RtMidiOut::sendMessage: message format problem ... not sysex but > 3 bytes?"; error( RtError::WARNING ); return; } unsigned int packetBytes, bytesLeft = nBytes; unsigned int messageIndex = 0; MIDITimeStamp timeStamp = 0; CoreMidiData *data = static_cast (apiData_); while ( bytesLeft > 0 ) { packetBytes = ( bytesLeft > 32736 ) ? 32736 : bytesLeft; Byte buffer[packetBytes + 32]; // extra memory for other structure variables MIDIPacketList *packetList = (MIDIPacketList *) buffer; MIDIPacket *curPacket = MIDIPacketListInit( packetList ); curPacket = MIDIPacketListAdd( packetList, packetBytes+32, curPacket, timeStamp, packetBytes, (const Byte *) &message->at( messageIndex ) ); if ( !curPacket ) { errorString_ = "RtMidiOut::sendMessage: could not allocate packet list"; error( RtError::DRIVER_ERROR ); } messageIndex += packetBytes; bytesLeft -= packetBytes; // Send to any destinations that may have connected to us. OSStatus result; if ( data->endpoint ) { result = MIDIReceived( data->endpoint, packetList ); if ( result != noErr ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI to virtual destinations."; error( RtError::WARNING ); } } // And send to an explicit destination port if we're connected. if ( connected_ ) { result = MIDISend( data->port, data->destinationId, packetList ); if ( result != noErr ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI message to port."; error( RtError::WARNING ); } } } } #endif // __MACOSX_CORE__ //*********************************************************************// // API: LINUX ALSA SEQUENCER //*********************************************************************// // API information found at: // - http://www.alsa-project.org/documentation.php#Library #if defined(__LINUX_ALSASEQ__) // The ALSA Sequencer API is based on the use of a callback function for // MIDI input. // // Thanks to Pedro Lopez-Cabanillas for help with the ALSA sequencer // time stamps and other assorted fixes!!! #include #include // ALSA header file. #include // A structure to hold variables related to the ALSA API // implementation. struct AlsaMidiData { snd_seq_t *seq; int vport; snd_seq_port_subscribe_t *subscription; snd_midi_event_t *coder; unsigned int bufferSize; unsigned char *buffer; pthread_t thread; unsigned long long lastTime; int queue_id; // an input queue is needed to get timestamped events }; #define PORT_TYPE( pinfo, bits ) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) //*********************************************************************// // API: LINUX ALSA // Class Definitions: RtMidiIn //*********************************************************************// extern "C" void *alsaMidiHandler( void *ptr ) { RtMidiIn::RtMidiInData *data = static_cast (ptr); AlsaMidiData *apiData = static_cast (data->apiData); long nBytes; unsigned long long time, lastTime; bool continueSysex = false; RtMidiIn::MidiMessage message; snd_seq_event_t *ev; int result; apiData->bufferSize = 32; result = snd_midi_event_new( 0, &apiData->coder ); if ( result < 0 ) { data->doInput = false; cerr << "\nRtMidiIn::alsaMidiHandler: error initializing MIDI event parser!\n\n"; return 0; } unsigned char *buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; cerr << "\nRtMidiIn::alsaMidiHandler: error initializing buffer memory!\n\n"; return 0; } snd_midi_event_init( apiData->coder ); snd_midi_event_no_status( apiData->coder, 1 ); // suppress running status messages while ( data->doInput ) { if ( snd_seq_event_input_pending( apiData->seq, 1 ) == 0 ) { // No data pending ... sleep a bit. usleep( 1000 ); continue; } // If here, there should be data. result = snd_seq_event_input( apiData->seq, &ev ); if ( result == -ENOSPC ) { cerr << "\nRtMidiIn::alsaMidiHandler: MIDI input buffer overrun!\n\n"; continue; } else if ( result <= 0 ) { cerr << "RtMidiIn::alsaMidiHandler: unknown MIDI input error!\n"; continue; } // This is a bit weird, but we now have to decode an ALSA MIDI // event (back) into MIDI bytes. We'll ignore non-MIDI types. if ( !continueSysex ) message.bytes.clear(); switch ( ev->type ) { case SND_SEQ_EVENT_PORT_SUBSCRIBED: #if defined(__RTMIDI_DEBUG__) cout << "RtMidiIn::alsaMidiHandler: port connection made!\n"; #endif break; case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: #if defined(__RTMIDI_DEBUG__) SVDEBUG << "RtMidiIn::alsaMidiHandler: port connection has closed!\n"; // FIXME: this is called for all unsubscribe events, even ones //not related to this particular connection. As it stands, I //see no data provided in the "source" and "dest" fields so //there is nothing we can do about this at this time. // cout << "sender = " << ev->source.client << ", dest = " << ev->dest.port << endl; #endif //data->doInput = false; break; case SND_SEQ_EVENT_QFRAME: // MIDI time code if ( data->ignoreFlags & 0x02 ) break; case SND_SEQ_EVENT_TICK: // MIDI timing tick if ( data->ignoreFlags & 0x02 ) break; case SND_SEQ_EVENT_SENSING: // Active sensing if ( data->ignoreFlags & 0x04 ) break; case SND_SEQ_EVENT_SYSEX: if ( (data->ignoreFlags & 0x01) ) break; if ( ev->data.ext.len > apiData->bufferSize ) { apiData->bufferSize = ev->data.ext.len; free( buffer ); buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; cerr << "\nRtMidiIn::alsaMidiHandler: error resizing buffer memory!\n\n"; break; } } default: nBytes = snd_midi_event_decode( apiData->coder, buffer, apiData->bufferSize, ev ); if ( nBytes <= 0 ) { #if defined(__RTMIDI_DEBUG__) cerr << "\nRtMidiIn::alsaMidiHandler: event parsing error or not a MIDI event!\n\n"; #endif break; } // The ALSA sequencer has a maximum buffer size for MIDI sysex // events of 256 bytes. If a device sends sysex messages larger // than this, they are segmented into 256 byte chunks. So, // we'll watch for this and concatenate sysex chunks into a // single sysex message if necessary. if ( !continueSysex ) message.bytes.assign( buffer, &buffer[nBytes] ); else message.bytes.insert( message.bytes.end(), buffer, &buffer[nBytes] ); continueSysex = ( ( ev->type == SND_SEQ_EVENT_SYSEX ) && ( message.bytes.back() != 0xF7 ) ); if ( continueSysex ) break; // Calculate the time stamp: message.timeStamp = 0.0; // Method 1: Use the system time. //(void)gettimeofday(&tv, (struct timezone *)NULL); //time = (tv.tv_sec * 1000000) + tv.tv_usec; // Method 2: Use the ALSA sequencer event time data. // (thanks to Pedro Lopez-Cabanillas!). time = ( ev->time.time.tv_sec * 1000000 ) + ( ev->time.time.tv_nsec/1000 ); lastTime = time; time -= apiData->lastTime; apiData->lastTime = lastTime; if ( data->firstMessage == true ) data->firstMessage = false; else message.timeStamp = time * 0.000001; } snd_seq_free_event(ev); if ( message.bytes.size() == 0 ) continue; if ( data->usingCallback && !continueSysex ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } } if ( buffer ) free( buffer ); snd_midi_event_free( apiData->coder ); apiData->coder = 0; return 0; } void RtMidiIn :: initialize( const std::string& clientName ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK); if ( result < 0 ) { errorString_ = "RtMidiIn::initialize: error creating ALSA sequencer input client object."; error( RtError::DRIVER_ERROR ); } // Set client name. snd_seq_set_client_name( seq, clientName.c_str() ); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->vport = -1; apiData_ = (void *) data; inputData_.apiData = (void *) data; // Create the input queue data->queue_id = snd_seq_alloc_named_queue(seq, "RtMidi Queue"); // Set arbitrary tempo (mm=100) and resolution (240) snd_seq_queue_tempo_t *qtempo; snd_seq_queue_tempo_alloca(&qtempo); snd_seq_queue_tempo_set_tempo(qtempo, 600000); snd_seq_queue_tempo_set_ppq(qtempo, 240); snd_seq_set_queue_tempo(data->seq, data->queue_id, qtempo); snd_seq_drain_output(data->seq); } // This function is used to count or get the pinfo structure for a given port number. unsigned int portInfo( snd_seq_t *seq, snd_seq_port_info_t *pinfo, unsigned int type, int portNumber ) { snd_seq_client_info_t *cinfo; int client; int count = 0; snd_seq_client_info_alloca( &cinfo ); snd_seq_client_info_set_client( cinfo, -1 ); while ( snd_seq_query_next_client( seq, cinfo ) >= 0 ) { client = snd_seq_client_info_get_client( cinfo ); if ( client == 0 ) continue; // Reset query info snd_seq_port_info_set_client( pinfo, client ); snd_seq_port_info_set_port( pinfo, -1 ); while ( snd_seq_query_next_port( seq, pinfo ) >= 0 ) { unsigned int atyp = snd_seq_port_info_get_type( pinfo ); if ( ( atyp & SND_SEQ_PORT_TYPE_MIDI_GENERIC ) == 0 ) continue; unsigned int caps = snd_seq_port_info_get_capability( pinfo ); if ( ( caps & type ) != type ) continue; if ( count == portNumber ) return 1; count++; } } // If a negative portNumber was used, return the port count. if ( portNumber < 0 ) return count; return 0; } void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nSrc = this->getPortCount(); if (nSrc < 1) { errorString_ = "RtMidiIn::openPort: no MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); std::ostringstream ost; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) == 0 ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } snd_seq_addr_t sender, receiver; sender.client = snd_seq_port_info_get_client( pinfo ); sender.port = snd_seq_port_info_get_port( pinfo ); receiver.client = snd_seq_client_id( data->seq ); if ( data->vport < 0 ) { snd_seq_port_info_set_client( pinfo, 0 ); snd_seq_port_info_set_port( pinfo, 0 ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); snd_seq_port_info_set_name(pinfo, portName.c_str() ); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "RtMidiIn::openPort: ALSA error creating input port."; error( RtError::DRIVER_ERROR ); } } receiver.port = data->vport; // Make subscription snd_seq_port_subscribe_malloc( &data->subscription ); snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { errorString_ = "RtMidiIn::openPort: ALSA error making port connection."; error( RtError::DRIVER_ERROR ); } if ( inputData_.doInput == false ) { // Start the input queue snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if (err) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } } connected_ = true; } void RtMidiIn :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); snd_seq_port_info_set_name(pinfo, portName.c_str()); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "RtMidiIn::openVirtualPort: ALSA error creating virtual port."; error( RtError::DRIVER_ERROR ); } } if ( inputData_.doInput == false ) { // Start the input queue snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if (err) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } } } void RtMidiIn :: closePort( void ) { if ( connected_ ) { AlsaMidiData *data = static_cast (apiData_); snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); // Stop the input queue snd_seq_stop_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); connected_ = false; } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Shutdown the input thread. AlsaMidiData *data = static_cast (apiData_); if ( inputData_.doInput ) { inputData_.doInput = false; pthread_join( data->thread, NULL ); } // Cleanup. if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); snd_seq_free_queue( data->seq, data->queue_id ); snd_seq_close( data->seq ); delete data; } unsigned int RtMidiIn :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, -1 ); } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { snd_seq_client_info_t *cinfo; snd_seq_port_info_t *pinfo; snd_seq_client_info_alloca( &cinfo ); snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) ) { int cnum = snd_seq_port_info_get_client( pinfo ); snd_seq_get_any_client_info( data->seq, cnum, cinfo ); std::ostringstream os; os << snd_seq_client_info_get_name( cinfo ); os << ":"; os << snd_seq_port_info_get_port( pinfo ); std::string stringName = os.str(); return stringName; } // If we get here, we didn't find a match. errorString_ = "RtMidiIn::getPortName: error looking for port name!"; error( RtError::INVALID_PARAMETER ); return 0; } //*********************************************************************// // API: LINUX ALSA // Class Definitions: RtMidiOut //*********************************************************************// unsigned int RtMidiOut :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, -1 ); } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { snd_seq_client_info_t *cinfo; snd_seq_port_info_t *pinfo; snd_seq_client_info_alloca( &cinfo ); snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) ) { int cnum = snd_seq_port_info_get_client(pinfo); snd_seq_get_any_client_info( data->seq, cnum, cinfo ); std::ostringstream os; os << snd_seq_client_info_get_name(cinfo); os << ":"; os << snd_seq_port_info_get_port(pinfo); std::string stringName = os.str(); return stringName; } // If we get here, we didn't find a match. errorString_ = "RtMidiOut::getPortName: error looking for port name!"; error( RtError::INVALID_PARAMETER ); return 0; } void RtMidiOut :: initialize( const std::string& clientName ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result = snd_seq_open( &seq, "default", SND_SEQ_OPEN_OUTPUT, SND_SEQ_NONBLOCK ); if ( result < 0 ) { errorString_ = "RtMidiOut::initialize: error creating ALSA sequencer client object."; error( RtError::DRIVER_ERROR ); } // Set client name. snd_seq_set_client_name( seq, clientName.c_str() ); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->vport = -1; data->bufferSize = 32; data->coder = 0; data->buffer = 0; result = snd_midi_event_new( data->bufferSize, &data->coder ); if ( result < 0 ) { delete data; errorString_ = "RtMidiOut::initialize: error initializing MIDI event parser!\n\n"; error( RtError::DRIVER_ERROR ); } data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { delete data; errorString_ = "RtMidiOut::initialize: error allocating buffer memory!\n\n"; error( RtError::MEMORY_ERROR ); } snd_midi_event_init( data->coder ); apiData_ = (void *) data; } void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "RtMidiOut::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nSrc = this->getPortCount(); if (nSrc < 1) { errorString_ = "RtMidiOut::openPort: no MIDI output sources found!"; error( RtError::NO_DEVICES_FOUND ); } snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); std::ostringstream ost; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) == 0 ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } snd_seq_addr_t sender, receiver; receiver.client = snd_seq_port_info_get_client( pinfo ); receiver.port = snd_seq_port_info_get_port( pinfo ); sender.client = snd_seq_client_id( data->seq ); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, portName.c_str(), SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC ); if ( data->vport < 0 ) { errorString_ = "RtMidiOut::openPort: ALSA error creating output port."; error( RtError::DRIVER_ERROR ); } } sender.port = data->vport; // Make subscription snd_seq_port_subscribe_malloc( &data->subscription ); snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); snd_seq_port_subscribe_set_time_update(data->subscription, 1); snd_seq_port_subscribe_set_time_real(data->subscription, 1); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { errorString_ = "RtMidiOut::openPort: ALSA error making port connection."; error( RtError::DRIVER_ERROR ); } connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { AlsaMidiData *data = static_cast (apiData_); snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, portName.c_str(), SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC ); if ( data->vport < 0 ) { errorString_ = "RtMidiOut::openVirtualPort: ALSA error creating virtual port."; error( RtError::DRIVER_ERROR ); } } } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. AlsaMidiData *data = static_cast (apiData_); if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); if ( data->coder ) snd_midi_event_free( data->coder ); if ( data->buffer ) free( data->buffer ); snd_seq_close( data->seq ); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { int result; AlsaMidiData *data = static_cast (apiData_); unsigned int nBytes = message->size(); if ( nBytes > data->bufferSize ) { data->bufferSize = nBytes; result = snd_midi_event_resize_buffer ( data->coder, nBytes); if ( result != 0 ) { errorString_ = "RtMidiOut::sendMessage: ALSA error resizing MIDI event buffer."; error( RtError::DRIVER_ERROR ); } free (data->buffer); data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { errorString_ = "RtMidiOut::initialize: error allocating buffer memory!\n\n"; error( RtError::MEMORY_ERROR ); } } snd_seq_event_t ev; snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, data->vport); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); for ( unsigned int i=0; ibuffer[i] = message->at(i); result = snd_midi_event_encode( data->coder, data->buffer, (long)nBytes, &ev ); if ( result < (int)nBytes ) { errorString_ = "RtMidiOut::sendMessage: event parsing error!"; error( RtError::WARNING ); return; } // Send the event. result = snd_seq_event_output(data->seq, &ev); if ( result < 0 ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI message to port."; error( RtError::WARNING ); } snd_seq_drain_output(data->seq); } #endif // __LINUX_ALSA__ //*********************************************************************// // API: IRIX MD //*********************************************************************// // API information gleamed from: // http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?cmd=getdoc&coll=0650&db=man&fname=3%20mdIntro // If the Makefile doesn't work, try the following: // CC -o midiinfo -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp midiinfo.cpp -lpthread -lmd // CC -o midiout -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp midiout.cpp -lpthread -lmd // CC -o qmidiin -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp qmidiin.cpp -lpthread -lmd // CC -o cmidiin -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp cmidiin.cpp -lpthread -lmd #if defined(__IRIX_MD__) #include #include #include // Irix MIDI header file. #include // A structure to hold variables related to the IRIX API // implementation. struct IrixMidiData { MDport port; pthread_t thread; }; //*********************************************************************// // API: IRIX // Class Definitions: RtMidiIn //*********************************************************************// extern "C" void *irixMidiHandler( void *ptr ) { RtMidiIn::RtMidiInData *data = static_cast (ptr); IrixMidiData *apiData = static_cast (data->apiData); bool continueSysex = false; unsigned char status; unsigned short size; MDevent event; int fd = mdGetFd( apiData->port ); if ( fd < 0 ) { data->doInput = false; cerr << "\nRtMidiIn::irixMidiHandler: error getting port descriptor!\n\n"; return 0; } fd_set mask, rmask; FD_ZERO( &mask ); FD_SET( fd, &mask ); struct timeval timeout = {0, 0}; RtMidiIn::MidiMessage message; int result; while ( data->doInput ) { rmask = mask; timeout.tv_sec = 0; timeout.tv_usec = 0; if ( select( fd+1, &rmask, NULL, NULL, &timeout ) <= 0 ) { // No data pending ... sleep a bit. usleep( 1000 ); continue; } // If here, there should be data. result = mdReceive( apiData->port, &event, 1); if ( result <= 0 ) { cerr << "\nRtMidiIn::irixMidiHandler: MIDI input read error!\n\n"; continue; } message.timeStamp = event.stamp * 0.000000001; size = 0; status = event.msg[0]; if ( !(status & 0x80) ) continue; if ( status == 0xF0 ) { // Sysex message ... can be segmented across multiple messages. if ( !(data->ignoreFlags & 0x01) ) { if ( continueSysex ) { // We have a continuing, segmented sysex message. Append // the new bytes to our existing message. for ( int i=0; iusingCallback && message.bytes.size() > 0 ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } } } mdFree( NULL ); continue; } else if ( status < 0xC0 ) size = 3; else if ( status < 0xE0 ) size = 2; else if ( status < 0xF0 ) size = 3; else if ( status < 0xF3 ) { if ( status == 0xF1 && !(data->ignoreFlags & 0x02) ) { // A MIDI time code message and we're not ignoring it. size = 3; } } else if ( status == 0xF3 ) size = 2; else if ( status == 0xF8 ) { if ( !(data->ignoreFlags & 0x02) ) { // A MIDI timing tick message and we're not ignoring it. size = 1; } } else if ( status == 0xFE ) { // MIDI active sensing if ( !(data->ignoreFlags & 0x04) ) size = 1; } else size = 1; // Copy the MIDI data to our vector. if ( size ) { message.bytes.assign( &event.msg[0], &event.msg[size] ); // Invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } } return 0; } void RtMidiIn :: initialize( const std::string& /*clientName*/ ) { // Initialize the Irix MIDI system. At the moment, we will not // worry about a return value of zero (ports) because there is a // chance the user could plug something in after instantiation. int nPorts = mdInit(); // Create our api-specific connection information. IrixMidiData *data = (IrixMidiData *) new IrixMidiData; apiData_ = (void *) data; inputData_.apiData = (void *) data; } void RtMidiIn :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } int nPorts = mdInit(); if (nPorts < 1) { errorString_ = "RtMidiIn::openPort: no Irix MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } IrixMidiData *data = static_cast (apiData_); data->port = mdOpenInPort( mdGetName(portNumber) ); if ( data->port == NULL ) { ost << "RtMidiIn::openPort: Irix error opening the port (" << portNumber << ")."; errorString_ = ost.str(); error( RtError::DRIVER_ERROR ); } mdSetStampMode(data->port, MD_DELTASTAMP); // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_RR); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, irixMidiHandler, &inputData_); pthread_attr_destroy(&attr); if (err) { mdClosePort( data->port ); inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } connected_ = true; } void RtMidiIn :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Irix MIDI API. errorString_ = "RtMidiIn::openVirtualPort: cannot be implemented in Irix MIDI API!"; error( RtError::WARNING ); } void RtMidiIn :: closePort( void ) { if ( connected_ ) { IrixMidiData *data = static_cast (apiData_); mdClosePort( data->port ); connected_ = false; // Shutdown the input thread. inputData_.doInput = false; pthread_join( data->thread, NULL ); } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. IrixMidiData *data = static_cast (apiData_); delete data; } unsigned int RtMidiIn :: getPortCount() { int nPorts = mdInit(); if ( nPorts >= 0 ) return nPorts; else return 0; } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { int nPorts = mdInit(); std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } std::string stringName = std::string( mdGetName( portNumber ) ); return stringName; } //*********************************************************************// // API: IRIX MD // Class Definitions: RtMidiOut //*********************************************************************// unsigned int RtMidiOut :: getPortCount() { int nPorts = mdInit(); if ( nPorts >= 0 ) return nPorts; else return 0; } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { int nPorts = mdInit(); std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } std::string stringName = std::string( mdGetName( portNumber ) ); return stringName; } void RtMidiOut :: initialize( const std::string& /*clientName*/ ) { // Initialize the Irix MIDI system. At the moment, we will not // worry about a return value of zero (ports) because there is a // chance the user could plug something in after instantiation. int nPorts = mdInit(); // Create our api-specific connection information. IrixMidiData *data = (IrixMidiData *) new IrixMidiData; apiData_ = (void *) data; } void RtMidiOut :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "RtMidiOut::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } int nPorts = mdInit(); if (nPorts < 1) { errorString_ = "RtMidiOut::openPort: no Irix MIDI output sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } IrixMidiData *data = static_cast (apiData_); data->port = mdOpenOutPort( mdGetName(portNumber) ); if ( data->port == NULL ) { ost << "RtMidiOut::openPort: Irix error opening the port (" << portNumber << ")."; errorString_ = ost.str(); error( RtError::DRIVER_ERROR ); } mdSetStampMode(data->port, MD_NOSTAMP); connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { IrixMidiData *data = static_cast (apiData_); mdClosePort( data->port ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Irix MIDI API. errorString_ = "RtMidiOut::openVirtualPort: cannot be implemented in Irix MIDI API!"; error( RtError::WARNING ); } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. IrixMidiData *data = static_cast (apiData_); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { int result; MDevent event; IrixMidiData *data = static_cast (apiData_); char *buffer = 0; unsigned int nBytes = message->size(); if ( nBytes == 0 ) return; event.stamp = 0; if ( message->at(0) == 0xF0 ) { if ( nBytes < 3 ) return; // check for bogus sysex event.msg[0] = 0xF0; event.msglen = nBytes; buffer = (char *) malloc( nBytes ); for ( int i=0; iat(i); event.sysexmsg = buffer; } else { for ( int i=0; iat(i); } // Send the event. result = mdSend( data->port, &event, 1 ); if ( buffer ) free( buffer ); if ( result < 1 ) { errorString_ = "RtMidiOut::sendMessage: IRIX error sending MIDI message!"; error( RtError::WARNING ); return; } } #endif // __IRIX_MD__ //*********************************************************************// // API: Windows Multimedia Library (MM) //*********************************************************************// // API information deciphered from: // - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_midi_reference.asp // Thanks to Jean-Baptiste Berruchon for the sysex code. #if defined(__WINDOWS_MM__) // The Windows MM API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // Windows MM MIDI header files. #include #include // A structure to hold variables related to the CoreMIDI API // implementation. struct WinMidiData { HMIDIIN inHandle; // Handle to Midi Input Device HMIDIOUT outHandle; // Handle to Midi Output Device DWORD lastTime; RtMidiIn::MidiMessage message; LPMIDIHDR sysexBuffer; }; #define RT_SYSEX_BUFFER_SIZE 1024 //*********************************************************************// // API: Windows MM // Class Definitions: RtMidiIn //*********************************************************************// static void CALLBACK midiInputCallback( HMIDIOUT hmin, UINT inputStatus, DWORD instancePtr, DWORD midiMessage, DWORD timestamp ) { if ( inputStatus != MIM_DATA && inputStatus != MIM_LONGDATA ) return; //RtMidiIn::RtMidiInData *data = static_cast (instancePtr); RtMidiIn::RtMidiInData *data = (RtMidiIn::RtMidiInData *)instancePtr; WinMidiData *apiData = static_cast (data->apiData); // Calculate time stamp. apiData->message.timeStamp = 0.0; if ( data->firstMessage == true ) data->firstMessage = false; else apiData->message.timeStamp = (double) ( timestamp - apiData->lastTime ) * 0.001; apiData->lastTime = timestamp; if ( inputStatus == MIM_DATA ) { // Channel or system message // Make sure the first byte is a status byte. unsigned char status = (unsigned char) (midiMessage & 0x000000FF); if ( !(status & 0x80) ) return; // Determine the number of bytes in the MIDI message. unsigned short nBytes = 1; if ( status < 0xC0 ) nBytes = 3; else if ( status < 0xE0 ) nBytes = 2; else if ( status < 0xF0 ) nBytes = 3; else if ( status < 0xF3 ) { // A MIDI time code message and we're ignoring it. if ( status == 0xF1 && (data->ignoreFlags & 0x02) ) return; nBytes = 3; } else if ( status == 0xF3 ) nBytes = 2; else if ( status == 0xF8 && (data->ignoreFlags & 0x02) ) { // A MIDI timing tick message and we're ignoring it. return; } else if ( status == 0xFE && (data->ignoreFlags & 0x04) ) { // A MIDI active sensing message and we're ignoring it. return; } // Copy bytes to our MIDI message. unsigned char *ptr = (unsigned char *) &midiMessage; for ( int i=0; imessage.bytes.push_back( *ptr++ ); } else { // Sysex message ( MIM_LONGDATA ) MIDIHDR *sysex = ( MIDIHDR *) midiMessage; if ( !( data->ignoreFlags & 0x01 ) ) { // Sysex message and we're not ignoring it for ( int i=0; i<(int)sysex->dwBytesRecorded; i++ ) apiData->message.bytes.push_back( sysex->lpData[i] ); } // The WinMM API requires that the sysex buffer be requeued after // input of each sysex message. Even if we are ignoring sysex // messages, we still need to requeue the buffer in case the user // decides to not ignore sysex messages in the future. However, // it seems that WinMM calls this function with an empty sysex // buffer when an application closes and in this case, we should // avoid requeueing it, else the computer suddenly reboots after // one or two minutes. if ( apiData->sysexBuffer->dwBytesRecorded > 0 ) { //if ( sysex->dwBytesRecorded > 0 ) { MMRESULT result = midiInAddBuffer( apiData->inHandle, apiData->sysexBuffer, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) cerr << "\nRtMidiIn::midiInputCallback: error sending sysex to Midi device!!\n\n"; if ( data->ignoreFlags & 0x01 ) return; } else return; } if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( apiData->message.timeStamp, &apiData->message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( apiData->message ); else cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } // Clear the vector for the next input message. apiData->message.bytes.clear(); } void RtMidiIn :: initialize( const std::string& /*clientName*/ ) { // We'll issue a warning here if no devices are available but not // throw an error since the user can plugin something later. unsigned int nDevices = midiInGetNumDevs(); if ( nDevices == 0 ) { errorString_ = "RtMidiIn::initialize: no MIDI input devices currently available."; error( RtError::WARNING ); } // Save our api-specific connection information. WinMidiData *data = (WinMidiData *) new WinMidiData; apiData_ = (void *) data; inputData_.apiData = (void *) data; data->message.bytes.clear(); // needs to be empty for first input message } void RtMidiIn :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nDevices = midiInGetNumDevs(); if (nDevices == 0) { errorString_ = "RtMidiIn::openPort: no MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nDevices ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiInOpen( &data->inHandle, portNumber, (DWORD)&midiInputCallback, (DWORD)&inputData_, CALLBACK_FUNCTION ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "RtMidiIn::openPort: error creating Windows MM MIDI input port."; error( RtError::DRIVER_ERROR ); } // Allocate and init the sysex buffer. data->sysexBuffer = (MIDIHDR*) new char[ sizeof(MIDIHDR) ]; data->sysexBuffer->lpData = new char[ RT_SYSEX_BUFFER_SIZE ]; data->sysexBuffer->dwBufferLength = RT_SYSEX_BUFFER_SIZE; data->sysexBuffer->dwFlags = 0; result = midiInPrepareHeader( data->inHandle, data->sysexBuffer, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error starting Windows MM MIDI input port (PrepareHeader)."; error( RtError::DRIVER_ERROR ); } // Register the buffer. result = midiInAddBuffer( data->inHandle, data->sysexBuffer, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error starting Windows MM MIDI input port (AddBuffer)."; error( RtError::DRIVER_ERROR ); } result = midiInStart( data->inHandle ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error starting Windows MM MIDI input port."; error( RtError::DRIVER_ERROR ); } connected_ = true; } void RtMidiIn :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "RtMidiIn::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtError::WARNING ); } void RtMidiIn :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); midiInReset( data->inHandle ); midiInStop( data->inHandle ); int result = midiInUnprepareHeader(data->inHandle, data->sysexBuffer, sizeof(MIDIHDR)); delete [] data->sysexBuffer->lpData; delete [] data->sysexBuffer; if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error closing Windows MM MIDI input port (midiInUnprepareHeader)."; error( RtError::DRIVER_ERROR ); } midiInClose( data->inHandle ); connected_ = false; } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. WinMidiData *data = static_cast (apiData_); delete data; } unsigned int RtMidiIn :: getPortCount() { return midiInGetNumDevs(); } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { unsigned int nDevices = midiInGetNumDevs(); if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIINCAPS deviceCaps; midiInGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIINCAPS)); // For some reason, we need to copy character by character with // UNICODE (thanks to Eduardo Coutinho!). //std::string stringName = std::string( deviceCaps.szPname ); char nameString[MAXPNAMELEN]; for( int i=0; i= nDevices ) { std::ostringstream ost; ost << "RtMidiOut::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIOUTCAPS deviceCaps; midiOutGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIOUTCAPS)); // For some reason, we need to copy character by character with // UNICODE (thanks to Eduardo Coutinho!). //std::string stringName = std::string( deviceCaps.szPname ); char nameString[MAXPNAMELEN]; for( int i=0; i= nDevices ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiOutOpen( &data->outHandle, portNumber, (DWORD)NULL, (DWORD)NULL, CALLBACK_NULL ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "RtMidiOut::openPort: error creating Windows MM MIDI output port."; error( RtError::DRIVER_ERROR ); } connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); midiOutReset( data->outHandle ); midiOutClose( data->outHandle ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "RtMidiOut::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtError::WARNING ); } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. WinMidiData *data = static_cast (apiData_); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { unsigned int nBytes = message->size(); if ( nBytes == 0 ) { errorString_ = "RtMidiOut::sendMessage: message argument is empty!"; error( RtError::WARNING ); return; } MMRESULT result; WinMidiData *data = static_cast (apiData_); if ( message->at(0) == 0xF0 ) { // Sysex message // Allocate buffer for sysex data. char *buffer = (char *) malloc( nBytes ); if ( buffer == NULL ) { errorString_ = "RtMidiOut::sendMessage: error allocating sysex message memory!"; error( RtError::MEMORY_ERROR ); } // Copy data to buffer. for ( unsigned int i=0; iat(i); // Create and prepare MIDIHDR structure. MIDIHDR sysex; sysex.lpData = (LPSTR) buffer; sysex.dwBufferLength = nBytes; sysex.dwFlags = 0; result = midiOutPrepareHeader( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "RtMidiOut::sendMessage: error preparing sysex header."; error( RtError::DRIVER_ERROR ); } // Send the message. result = midiOutLongMsg( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "RtMidiOut::sendMessage: error sending sysex message."; error( RtError::DRIVER_ERROR ); } // Unprepare the buffer and MIDIHDR. while ( MIDIERR_STILLPLAYING == midiOutUnprepareHeader( data->outHandle, &sysex, sizeof (MIDIHDR) ) ) Sleep( 1 ); free( buffer ); } else { // Channel or system message. // Make sure the message size isn't too big. if ( nBytes > 3 ) { errorString_ = "RtMidiOut::sendMessage: message size is greater than 3 bytes (and not sysex)!"; error( RtError::WARNING ); return; } // Pack MIDI bytes into double word. DWORD packet; unsigned char *ptr = (unsigned char *) &packet; for ( unsigned int i=0; iat(i); ptr++; } // Send the message immediately. result = midiOutShortMsg( data->outHandle, packet ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI message."; error( RtError::DRIVER_ERROR ); } } } #endif // __WINDOWS_MM__ #ifdef __RTMIDI_DUMMY_ONLY__ void RtMidiIn :: initialize( const std::string& /*clientName*/ ) { } void RtMidiIn :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { } void RtMidiIn :: openVirtualPort( std::string portName ) { } void RtMidiIn :: closePort( void ) { } RtMidiIn :: ~RtMidiIn() { } unsigned int RtMidiIn :: getPortCount() { return 0; } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { return ""; } unsigned int RtMidiOut :: getPortCount() { return 0; } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { return ""; } void RtMidiOut :: initialize( const std::string& /*clientName*/ ) { } void RtMidiOut :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { } void RtMidiOut :: closePort( void ) { } void RtMidiOut :: openVirtualPort( std::string portName ) { } RtMidiOut :: ~RtMidiOut() { } void RtMidiOut :: sendMessage( std::vector *message ) { } #endif __RTMIDI_DUMMY_ONLY__ sonic-visualiser-2.3~repack1.orig/svcore/data/midi/rtmidi/RtError.h0000644000175000017500000000374612252354725024140 0ustar miramira/************************************************************************/ /*! \class RtError \brief Exception handling class for RtAudio & RtMidi. The RtError class is quite simple but it does allow errors to be "caught" by RtError::Type. See the RtAudio and RtMidi documentation to know which methods can throw an RtError. */ /************************************************************************/ #ifndef RTERROR_H #define RTERROR_H #include #include class RtError { public: //! Defined RtError types. enum Type { WARNING, /*!< A non-critical error. */ DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ INVALID_STREAM, /*!< An invalid stream ID was specified. */ MEMORY_ERROR, /*!< An error occured during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ DRIVER_ERROR, /*!< A system driver error occured. */ SYSTEM_ERROR, /*!< A system error occured. */ THREAD_ERROR /*!< A thread error occured. */ }; protected: std::string message_; Type type_; public: //! The constructor. RtError(const std::string& message, Type type = RtError::UNSPECIFIED) : message_(message), type_(type) {} //! The destructor. virtual ~RtError(void) {}; //! Prints thrown error message to stderr. virtual void printMessage(void) { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) { return message_; } //! Returns the thrown error message as a C string. virtual const char *getMessageString(void) { return message_.c_str(); } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/midi/rtmidi/RtMidi.h0000644000175000017500000002520112252354725023717 0ustar miramira/**********************************************************************/ /*! \class RtMidi \brief An abstract base class for realtime MIDI input/output. This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut. RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2009 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**********************************************************************/ // RtMidi: Version 1.0.8 #ifndef RTMIDI_H #define RTMIDI_H #include "RtError.h" #include class RtMidi { public: //! Pure virtual openPort() function. virtual void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi" ) ) = 0; //! Pure virtual openVirtualPort() function. virtual void openVirtualPort( const std::string portName = std::string( "RtMidi" ) ) = 0; //! Pure virtual getPortCount() function. virtual unsigned int getPortCount() = 0; //! Pure virtual getPortName() function. virtual std::string getPortName( unsigned int portNumber = 0 ) = 0; //! Pure virtual closePort() function. virtual void closePort( void ) = 0; protected: RtMidi(); virtual ~RtMidi() {}; // A basic error reporting function for internal use in the RtMidi // subclasses. The behavior of this function can be modified to // suit specific needs. void error( RtError::Type type ); void *apiData_; bool connected_; std::string errorString_; }; /**********************************************************************/ /*! \class RtMidiIn \brief A realtime MIDI input class. This class provides a common, platform-independent API for realtime MIDI input. It allows access to a single MIDI input port. Incoming MIDI messages are either saved to a queue for retrieval using the getMessage() function or immediately passed to a user-specified callback function. Create multiple instances of this class to connect to more than one MIDI device at the same time. With the OS-X and Linux ALSA MIDI APIs, it is also possible to open a virtual input port to which other MIDI software clients can connect. by Gary P. Scavone, 2003-2008. */ /**********************************************************************/ #include #include class RtMidiIn : public RtMidi { public: //! User callback function type definition. typedef void (*RtMidiCallback)( double timeStamp, std::vector *message, void *userData); //! Default constructor that allows an optional client name. /*! An exception will be thrown if a MIDI system initialization error occurs. */ RtMidiIn( const std::string clientName = std::string( "RtMidi Input Client") ); //! If a MIDI connection is still open, it will be closed by the destructor. ~RtMidiIn(); //! Open a MIDI input connection. /*! An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. */ void openPort( unsigned int portNumber = 0, const std::string Portname = std::string( "RtMidi Input" ) ); //! Create a virtual input port, with optional name, to allow software connections (OS X and ALSA only). /*! This function creates a virtual MIDI input port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X and Linux ALSA APIs (the function does nothing for the other APIs). */ void openVirtualPort( const std::string portName = std::string( "RtMidi Input" ) ); //! Set a callback function to be invoked for incoming MIDI messages. /*! The callback function will be called whenever an incoming MIDI message is received. While not absolutely necessary, it is best to set the callback function before opening a MIDI port to avoid leaving some messages in the queue. */ void setCallback( RtMidiCallback callback, void *userData = 0 ); //! Cancel use of the current callback function (if one exists). /*! Subsequent incoming MIDI messages will be written to the queue and can be retrieved with the \e getMessage function. */ void cancelCallback(); //! Close an open MIDI connection (if one exists). void closePort( void ); //! Return the number of available MIDI input ports. unsigned int getPortCount(); //! Return a string identifier for the specified MIDI input port number. /*! An exception is thrown if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Set the maximum number of MIDI messages to be saved in the queue. /*! If the queue size limit is reached, incoming messages will be ignored. The default limit is 1024. */ void setQueueSizeLimit( unsigned int queueSize ); //! Specify whether certain MIDI message types should be queued or ignored during input. /*! By default, MIDI timing and active sensing messages are ignored during message input because of their relative high data rates. MIDI sysex messages are ignored by default as well. Variable values of "true" imply that the respective message type will be ignored. */ void ignoreTypes( bool midiSysex = true, bool midiTime = true, bool midiSense = true ); //! Fill the user-provided vector with the data bytes for the next available MIDI message in the input queue and return the event delta-time in seconds. /*! This function returns immediately whether a new message is available or not. A valid message is indicated by a non-zero vector size. An exception is thrown if an error occurs during message retrieval or an input connection was not previously established. */ double getMessage( std::vector *message ); // A MIDI structure used internally by the class to store incoming // messages. Each message represents one and only one MIDI message. struct MidiMessage { std::vector bytes; double timeStamp; // Default constructor. MidiMessage() :bytes(3), timeStamp(0.0) {} }; // The RtMidiInData structure is used to pass private class data to // the MIDI input handling function or thread. struct RtMidiInData { std::queue queue; MidiMessage message; unsigned int queueLimit; unsigned char ignoreFlags; bool doInput; bool firstMessage; void *apiData; bool usingCallback; void *userCallback; void *userData; bool continueSysex; // Default constructor. RtMidiInData() : queueLimit(1024), ignoreFlags(7), doInput(false), firstMessage(true), apiData(0), usingCallback(false), userCallback(0), userData(0), continueSysex(false) {} }; private: void initialize( const std::string& clientName ); RtMidiInData inputData_; }; /**********************************************************************/ /*! \class RtMidiOut \brief A realtime MIDI output class. This class provides a common, platform-independent API for MIDI output. It allows one to probe available MIDI output ports, to connect to one such port, and to send MIDI bytes immediately over the connection. Create multiple instances of this class to connect to more than one MIDI device at the same time. by Gary P. Scavone, 2003-2008. */ /**********************************************************************/ class RtMidiOut : public RtMidi { public: //! Default constructor that allows an optional client name. /*! An exception will be thrown if a MIDI system initialization error occurs. */ RtMidiOut( const std::string clientName = std::string( "RtMidi Output Client" ) ); //! The destructor closes any open MIDI connections. ~RtMidiOut(); //! Open a MIDI output connection. /*! An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. An exception is thrown if an error occurs while attempting to make the port connection. */ void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Output" ) ); //! Close an open MIDI connection (if one exists). void closePort(); //! Create a virtual output port, with optional name, to allow software connections (OS X and ALSA only). /*! This function creates a virtual MIDI output port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X and Linux ALSA APIs (the function does nothing with the other APIs). An exception is thrown if an error occurs while attempting to create the virtual port. */ void openVirtualPort( const std::string portName = std::string( "RtMidi Output" ) ); //! Return the number of available MIDI output ports. unsigned int getPortCount(); //! Return a string identifier for the specified MIDI port type and number. /*! An exception is thrown if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Immediately send a single message out an open MIDI output port. /*! An exception is thrown if an error occurs during output or an output connection was not previously established. */ void sendMessage( std::vector *message ); private: void initialize( const std::string& clientName ); }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/0000755000175000017500000000000012264464201021236 5ustar miramirasonic-visualiser-2.3~repack1.orig/svcore/data/model/Labeller.h0000644000175000017500000002422312252354725023142 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _LABELLER_H_ #define _LABELLER_H_ #include "SparseModel.h" #include "SparseValueModel.h" #include "base/Selection.h" #include #include #include class Labeller : public QObject { Q_OBJECT public: enum ValueType { ValueNone, ValueFromSimpleCounter, ValueFromCyclicalCounter, ValueFromTwoLevelCounter, ValueFromFrameNumber, ValueFromRealTime, ValueFromDurationFromPrevious, ValueFromDurationToNext, ValueFromTempoFromPrevious, ValueFromTempoToNext, ValueFromExistingNeighbour, ValueFromLabel }; // uses: // // 1. when adding points to a time-value model, generate values // for those points based on their times or labels or a counter // // 2. when adding a single point to a time-instant model, generate // a label for it based on its time and that of the previous point // or a counter // // 3. when adding a single point to a time-instant model, generate // a label for the previous point based on its time and that of // the point just added (as tempo is based on time to the next // point, not the previous one) // // 4. re-label a set of points that have already been added to a // model Labeller(ValueType type = ValueNone) : m_type(type), m_counter(1), m_counter2(1), m_cycle(4), m_dp(10), m_rate(0) { } Labeller(const Labeller &l) : QObject(), m_type(l.m_type), m_counter(l.m_counter), m_counter2(l.m_counter2), m_cycle(l.m_cycle), m_dp(l.m_dp), m_rate(l.m_rate) { } virtual ~Labeller() { } typedef std::map TypeNameMap; TypeNameMap getTypeNames() const { TypeNameMap m; m[ValueNone] = tr("No numbering"); m[ValueFromSimpleCounter] = tr("Simple counter"); m[ValueFromCyclicalCounter] = tr("Cyclical counter"); m[ValueFromTwoLevelCounter] = tr("Cyclical two-level counter (bar/beat)"); m[ValueFromFrameNumber] = tr("Audio sample frame number"); m[ValueFromRealTime] = tr("Time in seconds"); m[ValueFromDurationToNext] = tr("Duration to the following item"); m[ValueFromTempoToNext] = tr("Tempo (bpm) based on duration to following item"); m[ValueFromDurationFromPrevious] = tr("Duration since the previous item"); m[ValueFromTempoFromPrevious] = tr("Tempo (bpm) based on duration since previous item"); m[ValueFromExistingNeighbour] = tr("Same as the nearest previous item"); m[ValueFromLabel] = tr("Value extracted from the item's label (where possible)"); return m; } ValueType getType() const { return m_type; } void setType(ValueType type) { m_type = type; } int getCounterValue() const { return m_counter; } void setCounterValue(int v) { m_counter = v; } int getSecondLevelCounterValue() const { return m_counter2; } void setSecondLevelCounterValue(int v) { m_counter2 = v; } int getCounterCycleSize() const { return m_cycle; } void setCounterCycleSize(int s) { m_cycle = s; m_dp = 1; while (s > 0) { s /= 10; m_dp *= 10; } if (m_counter > m_cycle) m_counter = 1; } void setSampleRate(float rate) { m_rate = rate; } void resetCounters() { m_counter = 1; m_counter2 = 1; m_cycle = 4; } void incrementCounter() { m_counter++; if (m_type == ValueFromCyclicalCounter || m_type == ValueFromTwoLevelCounter) { if (m_counter > m_cycle) { m_counter = 1; m_counter2++; } } } template void label(PointType &newPoint, PointType *prevPoint = 0) { if (m_type == ValueNone) { newPoint.label = ""; } else if (m_type == ValueFromTwoLevelCounter) { newPoint.label = tr("%1.%2").arg(m_counter2).arg(m_counter); incrementCounter(); } else if (m_type == ValueFromFrameNumber) { // avoid going through floating-point value newPoint.label = tr("%1").arg(newPoint.frame); } else { float value = getValueFor(newPoint, prevPoint); if (actingOnPrevPoint() && prevPoint) { prevPoint->label = QString("%1").arg(value); } else { newPoint.label = QString("%1").arg(value); } } } template void labelAll(SparseModel &model, MultiSelection *ms) { typename SparseModel::PointList::iterator i; typename SparseModel::PointList pl(model.getPoints()); typename SparseModel::EditCommand *command = new typename SparseModel::EditCommand (&model, tr("Label Points")); PointType prevPoint(0); for (i = pl.begin(); i != pl.end(); ++i) { bool inRange = true; if (ms) { Selection s(ms->getContainingSelection(i->frame, false)); if (s.isEmpty() || !s.contains(i->frame)) { inRange = false; } } PointType p(*i); if (!inRange) { prevPoint = p; continue; } if (actingOnPrevPoint()) { if (i != pl.begin()) { command->deletePoint(prevPoint); label(p, &prevPoint); command->addPoint(prevPoint); } } else { command->deletePoint(p); label(p, &prevPoint); command->addPoint(p); } prevPoint = p; } command->finish(); } template void setValue(PointType &newPoint, PointType *prevPoint = 0) { if (m_type == ValueFromExistingNeighbour) { if (!prevPoint) { std::cerr << "ERROR: Labeller::setValue: Previous point required but not provided" << std::endl; } else { newPoint.value = prevPoint->value; } } else { float value = getValueFor(newPoint, prevPoint); if (actingOnPrevPoint() && prevPoint) { prevPoint->value = value; } else { newPoint.value = value; } } } bool requiresPrevPoint() const { return (m_type == ValueFromDurationFromPrevious || m_type == ValueFromDurationToNext || m_type == ValueFromTempoFromPrevious || m_type == ValueFromDurationToNext); } bool actingOnPrevPoint() const { return (m_type == ValueFromDurationToNext || m_type == ValueFromTempoToNext); } protected: template float getValueFor(PointType &newPoint, PointType *prevPoint) { float value = 0.f; switch (m_type) { case ValueNone: value = 0; break; case ValueFromSimpleCounter: case ValueFromCyclicalCounter: value = m_counter; incrementCounter(); break; case ValueFromTwoLevelCounter: value = m_counter2 + double(m_counter) / double(m_dp); incrementCounter(); break; case ValueFromFrameNumber: value = newPoint.frame; break; case ValueFromRealTime: if (m_rate == 0.f) { std::cerr << "ERROR: Labeller::getValueFor: Real-time conversion required, but no sample rate set" << std::endl; } else { value = float(newPoint.frame) / float(m_rate); } break; case ValueFromDurationToNext: case ValueFromTempoToNext: case ValueFromDurationFromPrevious: case ValueFromTempoFromPrevious: if (m_rate == 0.f) { std::cerr << "ERROR: Labeller::getValueFor: Real-time conversion required, but no sample rate set" << std::endl; } else if (!prevPoint) { std::cerr << "ERROR: Labeller::getValueFor: Time difference required, but only one point provided" << std::endl; } else { size_t f0 = prevPoint->frame, f1 = newPoint.frame; if (m_type == ValueFromDurationToNext || m_type == ValueFromDurationFromPrevious) { value = float(f1 - f0) / m_rate; } else { if (f1 > f0) { value = (60.f * m_rate) / (f1 - f0); } } } break; case ValueFromExistingNeighbour: // need to deal with this in the calling function, as this // function must handle points that don't have values to // read from break; case ValueFromLabel: if (newPoint.label != "") { // more forgiving than QString::toFloat() value = atof(newPoint.label.toLocal8Bit()); } else { value = 0.f; } break; } return value; } ValueType m_type; int m_counter; int m_counter2; int m_cycle; int m_dp; float m_rate; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/PowerOfTwoZoomConstraint.h0000644000175000017500000000164112252354725026404 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _POWER_OF_TWO_ZOOM_CONSTRAINT_H_ #define _POWER_OF_TWO_ZOOM_CONSTRAINT_H_ #include "base/ZoomConstraint.h" class PowerOfTwoZoomConstraint : virtual public ZoomConstraint { public: virtual size_t getNearestBlockSize(size_t requestedBlockSize, RoundingDirection dir = RoundNearest) const; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/TextModel.h0000644000175000017500000001145412252354725023327 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TEXT_MODEL_H_ #define _TEXT_MODEL_H_ #include "SparseModel.h" #include "base/XmlExportable.h" #include "base/RealTime.h" #include /** * Text point type for use in a SparseModel. This represents a piece * of text at a given time and y-value in the [0,1) range (indicative * of height on the window). Intended for casual textual annotations. */ struct TextPoint : public XmlExportable { public: TextPoint(long _frame) : frame(_frame), height(0.0f) { } TextPoint(long _frame, float _height, QString _label) : frame(_frame), height(_height), label(_label) { } int getDimensions() const { return 2; } long frame; float height; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(height) .arg(encodeEntities(label)).arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, size_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(height); if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const TextPoint &p1, const TextPoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.height != p2.height) return p1.height < p2.height; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const TextPoint &p1, const TextPoint &p2) const { return p1.frame < p2.frame; } }; }; // Make this a class rather than a typedef so it can be predeclared. class TextModel : public SparseModel { Q_OBJECT public: TextModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd) { } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { SparseModel::toXml (out, indent, QString("%1 subtype=\"text\"") .arg(extraAttributes)); } QString getTypeName() const { return tr("Text"); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 4; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Height"); case 3: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseModel::getData (row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 2: return i->height; case 3: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 2) { return SparseModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 2: point.height = value.toDouble(); break; case 3: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { return (column < 2); } virtual SortType getSortType(int column) const { if (column == 3) return SortAlphabetical; return SortNumeric; } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/DenseTimeValueModel.h0000644000175000017500000000616012252354725025253 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _DENSE_TIME_VALUE_MODEL_H_ #define _DENSE_TIME_VALUE_MODEL_H_ #include #include "Model.h" /** * Base class for models containing dense two-dimensional data (value * against time). For example, audio waveform data. */ class DenseTimeValueModel : public Model { Q_OBJECT public: DenseTimeValueModel(); virtual ~DenseTimeValueModel(); /** * Return the minimum possible value found in this model type. * (That is, the minimum that would be valid, not the minimum * actually found in a particular model). */ virtual float getValueMinimum() const = 0; /** * Return the minimum possible value found in this model type. * (That is, the minimum that would be valid, not the minimum * actually found in a particular model). */ virtual float getValueMaximum() const = 0; /** * Return the number of distinct channels for this model. */ virtual size_t getChannelCount() const = 0; /** * Get the specified set of samples from the given channel of the * model in single-precision floating-point format. Return the * number of samples actually retrieved. * If the channel is given as -1, mix all available channels and * return the result. */ virtual size_t getData(int channel, size_t start, size_t count, float *buffer) const = 0; /** * Get the specified set of samples from the given channel of the * model in double-precision floating-point format. Return the * number of samples actually retrieved. * If the channel is given as -1, mix all available channels and * return the result. */ virtual size_t getData(int channel, size_t start, size_t count, double *buffer) const = 0; /** * Get the specified set of samples from given contiguous range * of channels of the model in single-precision floating-point * format. Return the number of sample frames actually retrieved. */ virtual size_t getData(size_t fromchannel, size_t tochannel, size_t start, size_t count, float **buffers) const = 0; virtual bool canPlay() const { return true; } virtual QString getDefaultPlayPluginId() const { return ""; } virtual QString getDefaultPlayPluginConfiguration() const { return ""; } virtual QString toDelimitedDataString(QString delimiter, size_t f0, size_t f1) const; QString getTypeName() const { return tr("Dense Time-Value"); } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/ImageModel.h0000644000175000017500000001320712252354725023423 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _IMAGE_MODEL_H_ #define _IMAGE_MODEL_H_ #include "SparseModel.h" #include "base/XmlExportable.h" #include "base/RealTime.h" #include /** * Image point type for use in a SparseModel. This represents an * image, identified by filename, at a given time. The filename can * be empty, in which case we instead have a space to put an image in. */ struct ImagePoint : public XmlExportable { public: ImagePoint(long _frame) : frame(_frame) { } ImagePoint(long _frame, QString _image, QString _label) : frame(_frame), image(_image), label(_label) { } int getDimensions() const { return 1; } long frame; QString image; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame) .arg(encodeEntities(image)) .arg(encodeEntities(label)) .arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, size_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << image; if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const ImagePoint &p1, const ImagePoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.label != p2.label) return p1.label < p2.label; return p1.image < p2.image; } }; struct OrderComparator { bool operator()(const ImagePoint &p1, const ImagePoint &p2) const { return p1.frame < p2.frame; } }; }; // Make this a class rather than a typedef so it can be predeclared. class ImageModel : public SparseModel { Q_OBJECT public: ImageModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd) { } QString getTypeName() const { return tr("Image"); } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { SparseModel::toXml (out, indent, QString("%1 subtype=\"image\"") .arg(extraAttributes)); } /** * Command to change the image for a point. */ class ChangeImageCommand : public Command { public: ChangeImageCommand(ImageModel *model, const ImagePoint &point, QString newImage, QString newLabel) : m_model(model), m_oldPoint(point), m_newPoint(point) { m_newPoint.image = newImage; m_newPoint.label = newLabel; } virtual QString getName() const { return tr("Edit Image"); } virtual void execute() { m_model->deletePoint(m_oldPoint); m_model->addPoint(m_newPoint); std::swap(m_oldPoint, m_newPoint); } virtual void unexecute() { execute(); } private: ImageModel *m_model; ImagePoint m_oldPoint; ImagePoint m_newPoint; }; /** * TabularModel methods. */ virtual int getColumnCount() const { return 4; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Image"); case 3: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseModel::getData (row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 2: return i->image; case 3: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 2) { return SparseModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 2: point.image = value.toString(); break; case 3: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { return (column < 2); } virtual SortType getSortType(int column) const { if (column > 2) return SortAlphabetical; return SortNumeric; } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/FFTModel.cpp0000644000175000017500000003303712252354725023356 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "FFTModel.h" #include "DenseTimeValueModel.h" #include "AggregateWaveModel.h" #include "base/Profiler.h" #include "base/Pitch.h" #include #include #ifndef __GNUC__ #include #endif FFTModel::FFTModel(const DenseTimeValueModel *model, int channel, WindowType windowType, size_t windowSize, size_t windowIncrement, size_t fftSize, bool polar, StorageAdviser::Criteria criteria, size_t fillFromColumn) : //!!! ZoomConstraint! m_server(0), m_xshift(0), m_yshift(0) { setSourceModel(const_cast(model)); //!!! hmm. m_server = getServer(model, channel, windowType, windowSize, windowIncrement, fftSize, polar, criteria, fillFromColumn); if (!m_server) return; // caller should check isOK() size_t xratio = windowIncrement / m_server->getWindowIncrement(); size_t yratio = m_server->getFFTSize() / fftSize; while (xratio > 1) { if (xratio & 0x1) { cerr << "ERROR: FFTModel: Window increment ratio " << windowIncrement << " / " << m_server->getWindowIncrement() << " must be a power of two" << endl; assert(!(xratio & 0x1)); } ++m_xshift; xratio >>= 1; } while (yratio > 1) { if (yratio & 0x1) { cerr << "ERROR: FFTModel: FFT size ratio " << m_server->getFFTSize() << " / " << fftSize << " must be a power of two" << endl; assert(!(yratio & 0x1)); } ++m_yshift; yratio >>= 1; } } FFTModel::~FFTModel() { if (m_server) FFTDataServer::releaseInstance(m_server); } void FFTModel::sourceModelAboutToBeDeleted() { if (m_sourceModel) { cerr << "FFTModel[" << this << "]::sourceModelAboutToBeDeleted(" << m_sourceModel << ")" << endl; if (m_server) { FFTDataServer::releaseInstance(m_server); m_server = 0; } FFTDataServer::modelAboutToBeDeleted(m_sourceModel); } } FFTDataServer * FFTModel::getServer(const DenseTimeValueModel *model, int channel, WindowType windowType, size_t windowSize, size_t windowIncrement, size_t fftSize, bool polar, StorageAdviser::Criteria criteria, size_t fillFromColumn) { // Obviously, an FFT model of channel C (where C != -1) of an // aggregate model is the same as the FFT model of the appropriate // channel of whichever model that aggregate channel is drawn // from. We should use that model here, in case we already have // the data for it or will be wanting the same data again later. // If the channel is -1 (i.e. mixture of all channels), then we // can't do this shortcut unless the aggregate model only has one // channel or contains exactly all of the channels of a single // other model. That isn't very likely -- if it were the case, // why would we be using an aggregate model? if (channel >= 0) { const AggregateWaveModel *aggregate = dynamic_cast(model); if (aggregate && channel < aggregate->getComponentCount()) { AggregateWaveModel::ModelChannelSpec spec = aggregate->getComponent(channel); return getServer(spec.model, spec.channel, windowType, windowSize, windowIncrement, fftSize, polar, criteria, fillFromColumn); } } // The normal case return FFTDataServer::getFuzzyInstance(model, channel, windowType, windowSize, windowIncrement, fftSize, polar, criteria, fillFromColumn); } size_t FFTModel::getSampleRate() const { return isOK() ? m_server->getModel()->getSampleRate() : 0; } FFTModel::Column FFTModel::getColumn(size_t x) const { Profiler profiler("FFTModel::getColumn", false); Column result; result.clear(); size_t h = getHeight(); result.reserve(h); #ifdef __GNUC__ float magnitudes[h]; #else float *magnitudes = (float *)alloca(h * sizeof(float)); #endif if (m_server->getMagnitudesAt(x << m_xshift, magnitudes)) { for (size_t y = 0; y < h; ++y) { result.push_back(magnitudes[y]); } } else { for (size_t i = 0; i < h; ++i) result.push_back(0.f); } return result; } QString FFTModel::getBinName(size_t n) const { size_t sr = getSampleRate(); if (!sr) return ""; QString name = tr("%1 Hz").arg((n * sr) / ((getHeight()-1) * 2)); return name; } bool FFTModel::estimateStableFrequency(size_t x, size_t y, float &frequency) { if (!isOK()) return false; size_t sampleRate = m_server->getModel()->getSampleRate(); size_t fftSize = m_server->getFFTSize() >> m_yshift; frequency = (float(y) * sampleRate) / fftSize; if (x+1 >= getWidth()) return false; // At frequency f, a phase shift of 2pi (one cycle) happens in 1/f sec. // At hopsize h and sample rate sr, one hop happens in h/sr sec. // At window size w, for bin b, f is b*sr/w. // thus 2pi phase shift happens in w/(b*sr) sec. // We need to know what phase shift we expect from h/sr sec. // -> 2pi * ((h/sr) / (w/(b*sr))) // = 2pi * ((h * b * sr) / (w * sr)) // = 2pi * (h * b) / w. float oldPhase = getPhaseAt(x, y); float newPhase = getPhaseAt(x+1, y); size_t incr = getResolution(); float expectedPhase = oldPhase + (2.0 * M_PI * y * incr) / fftSize; float phaseError = princargf(newPhase - expectedPhase); // bool stable = (fabsf(phaseError) < (1.1f * (m_windowIncrement * M_PI) / m_fftSize)); // The new frequency estimate based on the phase error resulting // from assuming the "native" frequency of this bin frequency = (sampleRate * (expectedPhase + phaseError - oldPhase)) / (2 * M_PI * incr); return true; } FFTModel::PeakLocationSet FFTModel::getPeaks(PeakPickType type, size_t x, size_t ymin, size_t ymax) { Profiler profiler("FFTModel::getPeaks"); FFTModel::PeakLocationSet peaks; if (!isOK()) return peaks; if (ymax == 0 || ymax > getHeight() - 1) { ymax = getHeight() - 1; } if (type == AllPeaks) { int minbin = ymin; if (minbin > 0) minbin = minbin - 1; int maxbin = ymax; if (maxbin < getHeight() - 1) maxbin = maxbin + 1; const int n = maxbin - minbin + 1; #ifdef __GNUC__ float values[n]; #else float *values = (float *)alloca(n * sizeof(float)); #endif getMagnitudesAt(x, values, minbin, maxbin - minbin + 1); for (size_t bin = ymin; bin <= ymax; ++bin) { if (bin == minbin || bin == maxbin) continue; if (values[bin - minbin] > values[bin - minbin - 1] && values[bin - minbin] > values[bin - minbin + 1]) { peaks.insert(bin); } } return peaks; } Column values = getColumn(x); float mean = 0.f; for (int i = 0; i < values.size(); ++i) mean += values[i]; if (values.size() >0) mean /= values.size(); // For peak picking we use a moving median window, picking the // highest value within each continuous region of values that // exceed the median. For pitch adaptivity, we adjust the window // size to a roughly constant pitch range (about four tones). size_t sampleRate = getSampleRate(); std::deque window; std::vector inrange; float dist = 0.5; size_t medianWinSize = getPeakPickWindowSize(type, sampleRate, ymin, dist); size_t halfWin = medianWinSize/2; size_t binmin; if (ymin > halfWin) binmin = ymin - halfWin; else binmin = 0; size_t binmax; if (ymax + halfWin < values.size()) binmax = ymax + halfWin; else binmax = values.size()-1; size_t prevcentre = 0; for (size_t bin = binmin; bin <= binmax; ++bin) { float value = values[bin]; window.push_back(value); // so-called median will actually be the dist*100'th percentile medianWinSize = getPeakPickWindowSize(type, sampleRate, bin, dist); halfWin = medianWinSize/2; while (window.size() > medianWinSize) { window.pop_front(); } size_t actualSize = window.size(); if (type == MajorPitchAdaptivePeaks) { if (ymax + halfWin < values.size()) binmax = ymax + halfWin; else binmax = values.size()-1; } std::deque sorted(window); std::sort(sorted.begin(), sorted.end()); float median = sorted[int(sorted.size() * dist)]; size_t centrebin = 0; if (bin > actualSize/2) centrebin = bin - actualSize/2; while (centrebin > prevcentre || bin == binmin) { if (centrebin > prevcentre) ++prevcentre; float centre = values[prevcentre]; if (centre > median) { inrange.push_back(centrebin); } if (centre <= median || centrebin+1 == values.size()) { if (!inrange.empty()) { size_t peakbin = 0; float peakval = 0.f; for (size_t i = 0; i < inrange.size(); ++i) { if (i == 0 || values[inrange[i]] > peakval) { peakval = values[inrange[i]]; peakbin = inrange[i]; } } inrange.clear(); if (peakbin >= ymin && peakbin <= ymax) { peaks.insert(peakbin); } } } if (bin == binmin) break; } } return peaks; } size_t FFTModel::getPeakPickWindowSize(PeakPickType type, size_t sampleRate, size_t bin, float &percentile) const { percentile = 0.5; if (type == MajorPeaks) return 10; if (bin == 0) return 3; size_t fftSize = m_server->getFFTSize() >> m_yshift; float binfreq = (sampleRate * bin) / fftSize; float hifreq = Pitch::getFrequencyForPitch(73, 0, binfreq); int hibin = lrintf((hifreq * fftSize) / sampleRate); int medianWinSize = hibin - bin; if (medianWinSize < 3) medianWinSize = 3; percentile = 0.5 + (binfreq / sampleRate); return medianWinSize; } FFTModel::PeakSet FFTModel::getPeakFrequencies(PeakPickType type, size_t x, size_t ymin, size_t ymax) { Profiler profiler("FFTModel::getPeakFrequencies"); PeakSet peaks; if (!isOK()) return peaks; PeakLocationSet locations = getPeaks(type, x, ymin, ymax); size_t sampleRate = getSampleRate(); size_t fftSize = m_server->getFFTSize() >> m_yshift; size_t incr = getResolution(); // This duplicates some of the work of estimateStableFrequency to // allow us to retrieve the phases in two separate vertical // columns, instead of jumping back and forth between columns x and // x+1, which may be significantly slower if re-seeking is needed std::vector phases; for (PeakLocationSet::iterator i = locations.begin(); i != locations.end(); ++i) { phases.push_back(getPhaseAt(x, *i)); } size_t phaseIndex = 0; for (PeakLocationSet::iterator i = locations.begin(); i != locations.end(); ++i) { float oldPhase = phases[phaseIndex]; float newPhase = getPhaseAt(x+1, *i); float expectedPhase = oldPhase + (2.0 * M_PI * *i * incr) / fftSize; float phaseError = princargf(newPhase - expectedPhase); float frequency = (sampleRate * (expectedPhase + phaseError - oldPhase)) / (2 * M_PI * incr); // bool stable = (fabsf(phaseError) < (1.1f * (incr * M_PI) / fftSize)); // if (stable) peaks[*i] = frequency; ++phaseIndex; } return peaks; } Model * FFTModel::clone() const { return new FFTModel(*this); } FFTModel::FFTModel(const FFTModel &model) : DenseThreeDimensionalModel(), m_server(model.m_server), m_xshift(model.m_xshift), m_yshift(model.m_yshift) { FFTDataServer::claimInstance(m_server); } sonic-visualiser-2.3~repack1.orig/svcore/data/model/RangeSummarisableTimeValueModel.h0000644000175000017500000000603612252354725027620 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2007 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _RANGE_SUMMARISABLE_TIME_VALUE_MODEL_H_ #define _RANGE_SUMMARISABLE_TIME_VALUE_MODEL_H_ #include #include "DenseTimeValueModel.h" #include "base/ZoomConstraint.h" #include /** * Base class for models containing dense two-dimensional data (value * against time) that may be meaningfully represented in a zoomed view * using min/max range summaries. Audio waveform data is an obvious * example: think "peaks and minima" for "ranges". */ class RangeSummarisableTimeValueModel : public DenseTimeValueModel { Q_OBJECT public: RangeSummarisableTimeValueModel() { } class Range { public: Range() : m_min(0.f), m_max(0.f), m_absmean(0.f) { } Range(const Range &r) : m_min(r.m_min), m_max(r.m_max), m_absmean(r.m_absmean) { } Range(float min, float max, float absmean) : m_min(min), m_max(max), m_absmean(absmean) { } float min() const { return m_min; } float max() const { return m_max; } float absmean() const { return m_absmean; } void setMin(float min) { m_min = min; } void setMax(float max) { m_max = max; } void setAbsmean(float absmean) { m_absmean = absmean; } private: float m_min; float m_max; float m_absmean; }; typedef std::vector RangeBlock; /** * Return ranges from the given start frame, corresponding to the * given number of underlying sample frames, summarised at the * given block size. duration / blockSize ranges should ideally * be returned. * * If the given block size is not supported by this model * (according to its zoom constraint), also modify the blockSize * parameter so as to return the block size that was actually * obtained. */ virtual void getSummaries(size_t channel, size_t start, size_t count, RangeBlock &ranges, size_t &blockSize) const = 0; /** * Return the range from the given start frame, corresponding to * the given number of underlying sample frames, summarised at a * block size equal to the distance between start and end frames. */ virtual Range getSummary(size_t channel, size_t start, size_t count) const = 0; virtual size_t getSummaryBlockSize(size_t desired) const = 0; QString getTypeName() const { return tr("Range-Summarisable Time-Value"); } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/Dense3DModelPeakCache.h0000644000175000017500000000547412252354725025362 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _DENSE_3D_MODEL_PEAK_CACHE_H_ #define _DENSE_3D_MODEL_PEAK_CACHE_H_ #include "DenseThreeDimensionalModel.h" #include "EditableDenseThreeDimensionalModel.h" #include "base/ResizeableBitset.h" class Dense3DModelPeakCache : public DenseThreeDimensionalModel { Q_OBJECT public: Dense3DModelPeakCache(DenseThreeDimensionalModel *source, size_t columnsPerPeak); ~Dense3DModelPeakCache(); virtual bool isOK() const { return m_source && m_source->isOK(); } virtual size_t getSampleRate() const { return m_source->getSampleRate(); } virtual size_t getStartFrame() const { return m_source->getStartFrame(); } virtual size_t getEndFrame() const { return m_source->getEndFrame(); } virtual Model *clone() const { return new Dense3DModelPeakCache(m_source, m_resolution); } virtual size_t getResolution() const { return m_source->getResolution() * m_resolution; } virtual size_t getWidth() const { return m_source->getWidth() / m_resolution + 1; } virtual size_t getHeight() const { return m_source->getHeight(); } virtual float getMinimumLevel() const { return m_source->getMinimumLevel(); } virtual float getMaximumLevel() const { return m_source->getMaximumLevel(); } virtual bool isColumnAvailable(size_t column) const; virtual Column getColumn(size_t column) const; virtual float getValueAt(size_t column, size_t n) const; virtual QString getBinName(size_t n) const { return m_source->getBinName(n); } virtual bool shouldUseLogValueScale() const { return m_source->shouldUseLogValueScale(); } QString getTypeName() const { return tr("Dense 3-D Peak Cache"); } virtual int getCompletion() const { return m_source->getCompletion(); } protected slots: void sourceModelChanged(); void sourceModelAboutToBeDeleted(); private: DenseThreeDimensionalModel *m_source; mutable EditableDenseThreeDimensionalModel *m_cache; mutable ResizeableBitset m_coverage; size_t m_resolution; bool haveColumn(size_t column) const; void fillColumn(size_t column) const; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/ModelDataTableModel.cpp0000644000175000017500000002356612252354725025547 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "ModelDataTableModel.h" #include "TabularModel.h" #include "Model.h" #include #include #include ModelDataTableModel::ModelDataTableModel(TabularModel *m) : m_model(m), m_sortColumn(0), m_sortOrdering(Qt::AscendingOrder), m_currentRow(0) { Model *baseModel = dynamic_cast(m); connect(baseModel, SIGNAL(modelChanged()), this, SLOT(modelChanged())); connect(baseModel, SIGNAL(modelChanged(size_t, size_t)), this, SLOT(modelChanged(size_t, size_t))); connect(baseModel, SIGNAL(aboutToBeDeleted()), this, SLOT(modelAboutToBeDeleted())); } ModelDataTableModel::~ModelDataTableModel() { } QVariant ModelDataTableModel::data(const QModelIndex &index, int role) const { if (!m_model) return QVariant(); if (role != Qt::EditRole && role != Qt::DisplayRole) return QVariant(); if (!index.isValid()) return QVariant(); return m_model->getData(getUnsorted(index.row()), index.column(), role); } bool ModelDataTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!m_model) return false; if (!index.isValid()) return false; Command *command = m_model->getSetDataCommand(getUnsorted(index.row()), index.column(), value, role); if (command) { emit addCommand(command); return true; } else { return false; } } bool ModelDataTableModel::insertRow(int row, const QModelIndex &parent) { if (!m_model) return false; if (parent.isValid()) return false; emit beginInsertRows(parent, row, row); Command *command = m_model->getInsertRowCommand(getUnsorted(row)); if (command) { emit addCommand(command); } emit endInsertRows(); return (command ? true : false); } bool ModelDataTableModel::removeRow(int row, const QModelIndex &parent) { if (!m_model) return false; if (parent.isValid()) return false; emit beginRemoveRows(parent, row, row); Command *command = m_model->getRemoveRowCommand(getUnsorted(row)); if (command) { emit addCommand(command); } emit endRemoveRows(); return (command ? true : false); } Qt::ItemFlags ModelDataTableModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsSelectable; return flags; } QVariant ModelDataTableModel::headerData(int section, Qt::Orientation orientation, int role) const { if (!m_model) return QVariant(); if (orientation == Qt::Vertical && role == Qt::DisplayRole) { return section + 1; } if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { return m_model->getHeading(section); } return QVariant(); } QModelIndex ModelDataTableModel::index(int row, int column, const QModelIndex &parent) const { return createIndex(row, column, (void *)0); } QModelIndex ModelDataTableModel::parent(const QModelIndex &index) const { return QModelIndex(); } int ModelDataTableModel::rowCount(const QModelIndex &parent) const { if (!m_model) return 0; if (parent.isValid()) return 0; return m_model->getRowCount(); } int ModelDataTableModel::columnCount(const QModelIndex &parent) const { if (!m_model) return 0; if (parent.isValid()) return 0; return m_model->getColumnCount(); } QModelIndex ModelDataTableModel::getModelIndexForFrame(size_t frame) const { if (!m_model) return createIndex(0, 0); int row = m_model->getRowForFrame(frame); return createIndex(getSorted(row), 0, (void *)0); } size_t ModelDataTableModel::getFrameForModelIndex(const QModelIndex &index) const { if (!m_model) return 0; return m_model->getFrameForRow(getUnsorted(index.row())); } QModelIndex ModelDataTableModel::findText(QString text) const { if (text == "") return QModelIndex(); int rows = rowCount(); int cols = columnCount(); int current = getCurrentRow(); for (int row = 1; row <= rows; ++row) { int wrapped = (row + current) % rows; for (int col = 0; col < cols; ++col) { if (m_model->getSortType(col) != TabularModel::SortAlphabetical) { continue; } QString cell = m_model->getData(getUnsorted(wrapped), col, Qt::DisplayRole).toString(); if (cell.contains(text, Qt::CaseInsensitive)) { return createIndex(wrapped, col); } } } return QModelIndex(); } void ModelDataTableModel::sort(int column, Qt::SortOrder sortOrder) { // SVDEBUG << "ModelDataTableModel::sort(" << column << ", " << sortOrder // << ")" << endl; int prevCurrent = getCurrentRow(); if (m_sortColumn != column) { clearSort(); } m_sortColumn = column; m_sortOrdering = sortOrder; int current = getCurrentRow(); if (current != prevCurrent) { // cerr << "Current row changed from " << prevCurrent << " to " << current << " for underlying row " << m_currentRow << endl; emit currentChanged(createIndex(current, 0, (void *)0)); } emit layoutChanged(); } void ModelDataTableModel::modelChanged() { clearSort(); emit layoutChanged(); } void ModelDataTableModel::modelChanged(size_t f0, size_t f1) { //!!! inefficient clearSort(); emit layoutChanged(); } void ModelDataTableModel::modelAboutToBeDeleted() { m_model = 0; emit modelRemoved(); } int ModelDataTableModel::getSorted(int row) const { if (!m_model) return row; if (m_model->isColumnTimeValue(m_sortColumn)) { if (m_sortOrdering == Qt::AscendingOrder) { return row; } else { return rowCount() - row - 1; } } if (m_sort.empty()) { resort(); } int result = 0; if (row >= 0 && row < m_sort.size()) { result = m_sort[row]; } if (m_sortOrdering == Qt::DescendingOrder) { result = rowCount() - result - 1; } return result; } int ModelDataTableModel::getUnsorted(int row) const { if (!m_model) return row; if (m_model->isColumnTimeValue(m_sortColumn)) { if (m_sortOrdering == Qt::AscendingOrder) { return row; } else { return rowCount() - row - 1; } } if (m_sort.empty()) { resort(); } int result = 0; if (row >= 0 && row < m_sort.size()) { if (m_sortOrdering == Qt::AscendingOrder) { result = m_rsort[row]; } else { result = m_rsort[rowCount() - row - 1]; } } return result; } void ModelDataTableModel::resort() const { if (!m_model) return; bool numeric = (m_model->getSortType(m_sortColumn) == TabularModel::SortNumeric); // cerr << "resort: numeric == " << numeric << endl; m_sort.clear(); m_rsort.clear(); if (numeric) resortNumeric(); else resortAlphabetical(); std::map tmp; // rsort maps from sorted row number to original row number for (int i = 0; i < m_rsort.size(); ++i) { tmp[m_rsort[i]] = i; } // tmp now maps from original row number to sorted row number for (std::map::const_iterator i = tmp.begin(); i != tmp.end(); ++i) { m_sort.push_back(i->second); } // and sort now maps from original row number to sorted row number } void ModelDataTableModel::resortNumeric() const { if (!m_model) return; typedef std::multimap MapType; MapType rowMap; int rows = m_model->getRowCount(); for (int i = 0; i < rows; ++i) { QVariant value = m_model->getData(i, m_sortColumn, TabularModel::SortRole); rowMap.insert(MapType::value_type(value.toDouble(), i)); } for (MapType::iterator i = rowMap.begin(); i != rowMap.end(); ++i) { // cerr << "resortNumeric: " << i->second << ": " << i->first << endl; m_rsort.push_back(i->second); } // rsort now maps from sorted row number to original row number } void ModelDataTableModel::resortAlphabetical() const { if (!m_model) return; typedef std::multimap MapType; MapType rowMap; int rows = m_model->getRowCount(); for (int i = 0; i < rows; ++i) { QVariant value = m_model->getData(i, m_sortColumn, TabularModel::SortRole); rowMap.insert(MapType::value_type(value.toString(), i)); } for (MapType::iterator i = rowMap.begin(); i != rowMap.end(); ++i) { // cerr << "resortAlphabetical: " << i->second << ": " << i->first << endl; m_rsort.push_back(i->second); } // rsort now maps from sorted row number to original row number } int ModelDataTableModel::getCurrentRow() const { return getSorted(m_currentRow); } void ModelDataTableModel::setCurrentRow(int row) { m_currentRow = getUnsorted(row); } void ModelDataTableModel::clearSort() { // int prevCurrent = getCurrentRow(); m_sort.clear(); // int current = getCurrentRow(); //!!! no -- not until the sort criteria have changed // if (current != prevCurrent) { // cerr << "Current row changed from " << prevCurrent << " to " << current << " for underlying row " << m_currentRow << endl; // emit currentRowChanged(createIndex(current, 0, 0)); // } } sonic-visualiser-2.3~repack1.orig/svcore/data/model/EditableDenseThreeDimensionalModel.h0000644000175000017500000001237412252354725030250 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_ #define _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_ #include "DenseThreeDimensionalModel.h" #include #include class EditableDenseThreeDimensionalModel : public DenseThreeDimensionalModel { Q_OBJECT public: // EditableDenseThreeDimensionalModel supports a basic compression // method that reduces the size of multirate data (e.g. wavelet // transform outputs) that are stored as plain 3d grids by about // 60% or thereabouts. However, it can only be used for models // whose columns are set in order from 0 and never subsequently // changed. If the model is going to be actually edited, it must // have NoCompression. enum CompressionType { NoCompression, BasicMultirateCompression }; EditableDenseThreeDimensionalModel(size_t sampleRate, size_t resolution, size_t yBinCount, CompressionType compression, bool notifyOnAdd = true); virtual bool isOK() const; virtual size_t getSampleRate() const; virtual size_t getStartFrame() const; virtual size_t getEndFrame() const; virtual Model *clone() const; /** * Set the frame offset of the first column. */ virtual void setStartFrame(size_t); /** * Return the number of sample frames covered by each set of bins. */ virtual size_t getResolution() const; /** * Set the number of sample frames covered by each set of bins. */ virtual void setResolution(size_t sz); /** * Return the number of columns. */ virtual size_t getWidth() const; /** * Return the number of bins in each set of bins. */ virtual size_t getHeight() const; /** * Set the number of bins in each set of bins. */ virtual void setHeight(size_t sz); /** * Return the minimum value of the value in each bin. */ virtual float getMinimumLevel() const; /** * Set the minimum value of the value in a bin. */ virtual void setMinimumLevel(float sz); /** * Return the maximum value of the value in each bin. */ virtual float getMaximumLevel() const; /** * Set the maximum value of the value in a bin. */ virtual void setMaximumLevel(float sz); /** * Return true if there are data available for the given column. */ virtual bool isColumnAvailable(size_t x) const { return x < getWidth(); } /** * Get the set of bin values at the given column. */ virtual Column getColumn(size_t x) const; /** * Get a single value, from the n'th bin of the given column. */ virtual float getValueAt(size_t x, size_t n) const; /** * Set the entire set of bin values at the given column. */ virtual void setColumn(size_t x, const Column &values); virtual QString getBinName(size_t n) const; virtual void setBinName(size_t n, QString); virtual void setBinNames(std::vector names); bool shouldUseLogValueScale() const; virtual void setCompletion(int completion, bool update = true); virtual int getCompletion() const { return m_completion; } QString getTypeName() const { return tr("Editable Dense 3-D"); } virtual QString toDelimitedDataString(QString delimiter) const; virtual QString toDelimitedDataString(QString delimiter, size_t f0, size_t f1) const; virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; protected: typedef QVector ValueMatrix; ValueMatrix m_data; // m_trunc is used for simple compression. If at least the top N // elements of column x (for N = some proportion of the column // height) are equal to those of an earlier column x', then // m_trunc[x] will contain x-x' and column x will be truncated so // as to remove the duplicate elements. If the equal elements are // at the bottom, then m_trunc[x] will contain x'-x (a negative // value). If m_trunc[x] is 0 then the whole of column x is // stored. std::vector m_trunc; void truncateAndStore(size_t index, const Column & values); Column expandAndRetrieve(size_t index) const; std::vector m_binNames; size_t m_startFrame; size_t m_sampleRate; size_t m_resolution; size_t m_yBinCount; CompressionType m_compression; float m_minimum; float m_maximum; bool m_haveExtents; bool m_notifyOnAdd; long m_sinceLastNotifyMin; long m_sinceLastNotifyMax; int m_completion; mutable QReadWriteLock m_lock; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/Dense3DModelPeakCache.cpp0000644000175000017500000000664312252354725025714 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2009 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Dense3DModelPeakCache.h" #include "base/Profiler.h" Dense3DModelPeakCache::Dense3DModelPeakCache(DenseThreeDimensionalModel *source, size_t columnsPerPeak) : m_source(source), m_resolution(columnsPerPeak) { m_coverage.resize(1); // otherwise it is simply invalid m_cache = new EditableDenseThreeDimensionalModel (source->getSampleRate(), getResolution(), source->getHeight(), EditableDenseThreeDimensionalModel::NoCompression, false); connect(source, SIGNAL(modelChanged()), this, SLOT(sourceModelChanged())); connect(source, SIGNAL(aboutToBeDeleted()), this, SLOT(sourceModelAboutToBeDeleted())); } Dense3DModelPeakCache::~Dense3DModelPeakCache() { delete m_cache; } bool Dense3DModelPeakCache::isColumnAvailable(size_t column) const { if (!m_source) return false; if (haveColumn(column)) return true; for (int i = m_resolution; i > 0; ) { --i; if (!m_source->isColumnAvailable(column * m_resolution + i)) { return false; } } return true; } Dense3DModelPeakCache::Column Dense3DModelPeakCache::getColumn(size_t column) const { Profiler profiler("Dense3DModelPeakCache::getColumn"); if (!m_source) return Column(); if (!haveColumn(column)) fillColumn(column); return m_cache->getColumn(column); } float Dense3DModelPeakCache::getValueAt(size_t column, size_t n) const { if (!m_source) return 0.f; if (!haveColumn(column)) fillColumn(column); return m_cache->getValueAt(column, n); } void Dense3DModelPeakCache::sourceModelChanged() { if (!m_source) return; if (m_coverage.size() > 0) { // The last peak may have come from an incomplete read, which // may since have been filled, so reset it m_coverage.reset(m_coverage.size()-1); } m_coverage.resize(getWidth()); // retaining data } void Dense3DModelPeakCache::sourceModelAboutToBeDeleted() { m_source = 0; } bool Dense3DModelPeakCache::haveColumn(size_t column) const { return column < m_coverage.size() && m_coverage.get(column); } void Dense3DModelPeakCache::fillColumn(size_t column) const { Profiler profiler("Dense3DModelPeakCache::fillColumn"); if (column >= m_coverage.size()) { // see note in sourceModelChanged if (m_coverage.size() > 0) m_coverage.reset(m_coverage.size()-1); m_coverage.resize(column + 1); } Column peak; for (int i = 0; i < m_resolution; ++i) { Column here = m_source->getColumn(column * m_resolution + i); if (i == 0) { peak = here; } else { for (int j = 0; j < peak.size() && j < here.size(); ++j) { if (here[j] > peak[j]) peak[j] = here[j]; } } } m_cache->setColumn(column, peak); m_coverage.set(column); } sonic-visualiser-2.3~repack1.orig/svcore/data/model/PowerOfSqrtTwoZoomConstraint.h0000644000175000017500000000223012252354725027251 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _POWER_OF_SQRT_TWO_ZOOM_CONSTRAINT_H_ #define _POWER_OF_SQRT_TWO_ZOOM_CONSTRAINT_H_ #include "base/ZoomConstraint.h" class PowerOfSqrtTwoZoomConstraint : virtual public ZoomConstraint { public: virtual size_t getNearestBlockSize(size_t requestedBlockSize, RoundingDirection dir = RoundNearest) const; virtual size_t getNearestBlockSize(size_t requestedBlockSize, int &type, int &power, RoundingDirection dir = RoundNearest) const; virtual size_t getMinCachePower() const { return 6; } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/DenseThreeDimensionalModel.h0000644000175000017500000001123712252354725026613 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _DENSE_THREE_DIMENSIONAL_MODEL_H_ #define _DENSE_THREE_DIMENSIONAL_MODEL_H_ #include "Model.h" #include "TabularModel.h" #include "base/ZoomConstraint.h" #include "base/RealTime.h" #include #include class DenseThreeDimensionalModel : public Model, public TabularModel { Q_OBJECT public: /** * Return the number of sample frames covered by each column of bins. */ virtual size_t getResolution() const = 0; /** * Return the number of columns of bins in the model. */ virtual size_t getWidth() const = 0; /** * Return the number of bins in each column. */ virtual size_t getHeight() const = 0; /** * Return the minimum permissible value in each bin. */ virtual float getMinimumLevel() const = 0; /** * Return the maximum permissible value in each bin. */ virtual float getMaximumLevel() const = 0; /** * Return true if there are data available for the given column. * This should return true only if getColumn(column) would not * have to do any substantial work to calculate its return values. * If this function returns false, it may still be possible to * retrieve the column, but its values may have to be calculated. */ virtual bool isColumnAvailable(size_t column) const = 0; typedef QVector Column; /** * Get data from the given column of bin values. */ virtual Column getColumn(size_t column) const = 0; /** * Get the single data point from the n'th bin of the given column. */ virtual float getValueAt(size_t column, size_t n) const = 0; /** * Get the name of a given bin (i.e. a label to associate with * that bin across all columns). */ virtual QString getBinName(size_t n) const = 0; /** * Estimate whether a logarithmic scale might be appropriate for * the value scale. */ virtual bool shouldUseLogValueScale() const = 0; /** * Utility function to query whether a given bin is greater than * its (vertical) neighbours. */ bool isLocalPeak(size_t x, size_t y) { float value = getValueAt(x, y); if (y > 0 && value < getValueAt(x, y - 1)) return false; if (y < getHeight() - 1 && value < getValueAt(x, y + 1)) return false; return true; } /** * Utility function to query whether a given bin is greater than a * certain threshold. */ bool isOverThreshold(size_t x, size_t y, float threshold) { return getValueAt(x, y) > threshold; } QString getTypeName() const { return tr("Dense 3-D"); } virtual int getCompletion() const = 0; /* TabularModel methods. This class is non-editable -- subclasses may be editable. Row and column are transposed for the tabular view (which is "on its side"). */ virtual int getRowCount() const { return getWidth(); } virtual int getColumnCount() const { return getHeight() + 2; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); default: return getBinName(column - 2); } } virtual QVariant getData(int row, int column, int) const { switch (column) { case 0: { RealTime rt = RealTime::frame2RealTime(row * getResolution(), getSampleRate()); return rt.toText().c_str(); } case 1: return int(row * getResolution()); default: return getValueAt(row, column - 2); } } virtual bool isColumnTimeValue(int col) const { return col < 2; } virtual SortType getSortType(int) const { return SortNumeric; } virtual long getFrameForRow(int row) const { return row * getSampleRate(); } virtual int getRowForFrame(long frame) const { return frame / getSampleRate(); } protected: DenseThreeDimensionalModel() { } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/WritableWaveFileModel.h0000644000175000017500000000625012252354725025575 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _WRITABLE_WAVE_FILE_MODEL_H_ #define _WRITABLE_WAVE_FILE_MODEL_H_ #include "WaveFileModel.h" class WavFileWriter; class WavFileReader; class WritableWaveFileModel : public RangeSummarisableTimeValueModel { Q_OBJECT public: WritableWaveFileModel(size_t sampleRate, size_t channels, QString path = ""); ~WritableWaveFileModel(); /** * Call addSamples to append a block of samples to the end of the * file. Caller should also call setCompletion to update the * progress of this file, if it has a known end point, and should * call setCompletion(100) when the file has been written. */ virtual bool addSamples(float **samples, size_t count); bool isOK() const; bool isReady(int *) const; virtual void setCompletion(int completion); // percentage virtual int getCompletion() const { return m_completion; } const ZoomConstraint *getZoomConstraint() const { static PowerOfSqrtTwoZoomConstraint zc; return &zc; } size_t getFrameCount() const; size_t getChannelCount() const { return m_channels; } size_t getSampleRate() const { return m_sampleRate; } virtual Model *clone() const; float getValueMinimum() const { return -1.0f; } float getValueMaximum() const { return 1.0f; } virtual size_t getStartFrame() const { return m_startFrame; } virtual size_t getEndFrame() const { return m_startFrame + getFrameCount(); } void setStartFrame(size_t startFrame); virtual size_t getData(int channel, size_t start, size_t count, float *buffer) const; virtual size_t getData(int channel, size_t start, size_t count, double *buffer) const; virtual size_t getData(size_t fromchannel, size_t tochannel, size_t start, size_t count, float **buffer) const; virtual size_t getSummaryBlockSize(size_t desired) const; virtual void getSummaries(size_t channel, size_t start, size_t count, RangeBlock &ranges, size_t &blockSize) const; virtual Range getSummary(size_t channel, size_t start, size_t count) const; QString getTypeName() const { return tr("Writable Wave File"); } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; protected: WaveFileModel *m_model; WavFileWriter *m_writer; WavFileReader *m_reader; size_t m_sampleRate; size_t m_channels; size_t m_frameCount; size_t m_startFrame; int m_completion; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/SparseTimeValueModel.h0000644000175000017500000001200312252354725025443 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SPARSE_TIME_VALUE_MODEL_H_ #define _SPARSE_TIME_VALUE_MODEL_H_ #include "SparseValueModel.h" #include "base/PlayParameterRepository.h" #include "base/RealTime.h" /** * Time/value point type for use in a SparseModel or SparseValueModel. * With this point type, the model basically represents a wiggly-line * plot with points at arbitrary intervals of the model resolution. */ struct TimeValuePoint { public: TimeValuePoint(long _frame) : frame(_frame), value(0.0f) { } TimeValuePoint(long _frame, float _value, QString _label) : frame(_frame), value(_value), label(_label) { } int getDimensions() const { return 2; } long frame; float value; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(value).arg(XmlExportable::encodeEntities(label)) .arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, size_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(value); if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const TimeValuePoint &p1, const TimeValuePoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.value != p2.value) return p1.value < p2.value; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const TimeValuePoint &p1, const TimeValuePoint &p2) const { return p1.frame < p2.frame; } }; }; class SparseTimeValueModel : public SparseValueModel { Q_OBJECT public: SparseTimeValueModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) : SparseValueModel(sampleRate, resolution, notifyOnAdd) { // not yet playable } SparseTimeValueModel(size_t sampleRate, size_t resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : SparseValueModel(sampleRate, resolution, valueMinimum, valueMaximum, notifyOnAdd) { // not yet playable } QString getTypeName() const { return tr("Sparse Time-Value"); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 4; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Value"); case 3: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseValueModel::getData (row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 2: if (role == Qt::EditRole || role == SortRole) return i->value; else return QString("%1 %2").arg(i->value).arg(getScaleUnits()); case 3: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 2) { return SparseValueModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 2: point.value = value.toDouble(); break; case 3: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { return (column < 2); } virtual SortType getSortType(int column) const { if (column == 3) return SortAlphabetical; return SortNumeric; } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/PathModel.h0000644000175000017500000000541612252354725023300 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _PATH_MODEL_H_ #define _PATH_MODEL_H_ #include "Model.h" #include "SparseModel.h" #include "base/RealTime.h" #include struct PathPoint { PathPoint(long _frame) : frame(_frame), mapframe(_frame) { } PathPoint(long _frame, long _mapframe) : frame(_frame), mapframe(_mapframe) { } int getDimensions() const { return 2; } long frame; long mapframe; QString getLabel() const { return ""; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(mapframe).arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, size_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(mapframe); return list.join(delimiter); } struct Comparator { bool operator()(const PathPoint &p1, const PathPoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; return p1.mapframe < p2.mapframe; } }; struct OrderComparator { bool operator()(const PathPoint &p1, const PathPoint &p2) const { return p1.frame < p2.frame; } }; }; class PathModel : public SparseModel { public: PathModel(size_t sampleRate, size_t resolution, bool notify = true) : SparseModel(sampleRate, resolution, notify) { } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { SparseModel::toXml (out, indent, QString("%1 subtype=\"path\"") .arg(extraAttributes)); } /** * TabularModel is inherited via SparseModel, but we don't need it here. */ virtual QString getHeading(int) const { return ""; } virtual bool isColumnTimeValue(int) const { return false; } virtual SortType getSortType(int) const { return SortNumeric; } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/SparseOneDimensionalModel.h0000644000175000017500000001154412252354725026465 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SPARSE_ONE_DIMENSIONAL_MODEL_H_ #define _SPARSE_ONE_DIMENSIONAL_MODEL_H_ #include "SparseModel.h" #include "base/PlayParameterRepository.h" #include "base/RealTime.h" #include struct OneDimensionalPoint { public: OneDimensionalPoint(long _frame) : frame(_frame) { } OneDimensionalPoint(long _frame, QString _label) : frame(_frame), label(_label) { } int getDimensions() const { return 1; } long frame; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(XmlExportable::encodeEntities(label)) .arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, size_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const OneDimensionalPoint &p1, const OneDimensionalPoint &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const OneDimensionalPoint &p1, const OneDimensionalPoint &p2) const { return p1.frame < p2.frame; } }; }; class SparseOneDimensionalModel : public SparseModel { Q_OBJECT public: SparseOneDimensionalModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd) { PlayParameterRepository::getInstance()->addPlayable(this); } virtual ~SparseOneDimensionalModel() { PlayParameterRepository::getInstance()->removePlayable(this); } virtual bool canPlay() const { return true; } virtual QString getDefaultPlayPluginId() const { return "dssi:_builtin:sample_player"; } virtual QString getDefaultPlayPluginConfiguration() const { return ""; } int getIndexOf(const Point &point) { // slow int i = 0; Point::Comparator comparator; for (PointList::const_iterator j = m_points.begin(); j != m_points.end(); ++j, ++i) { if (!comparator(*j, point) && !comparator(point, *j)) return i; } return -1; } QString getTypeName() const { return tr("Sparse 1-D"); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 3; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseModel::getData (row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 2: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 2) { return SparseModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 2: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { return (column < 2); } virtual SortType getSortType(int column) const { if (column == 2) return SortAlphabetical; return SortNumeric; } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/Model.cpp0000644000175000017500000001067712252354725023023 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "Model.h" #include "AlignmentModel.h" #include #include const int Model::COMPLETION_UNKNOWN = -1; Model::~Model() { // SVDEBUG << "Model::~Model(" << this << ")" << endl; if (!m_aboutToDelete) { SVDEBUG << "NOTE: Model::~Model(" << this << ", \"" << objectName() << "\"): Model deleted " << "with no aboutToDelete notification" << endl; } if (m_alignment) { m_alignment->aboutToDelete(); delete m_alignment; } } void Model::setSourceModel(Model *model) { if (m_sourceModel) { disconnect(m_sourceModel, SIGNAL(aboutToBeDeleted()), this, SLOT(sourceModelAboutToBeDeleted())); } m_sourceModel = model; if (m_sourceModel) { connect(m_sourceModel, SIGNAL(alignmentCompletionChanged()), this, SIGNAL(alignmentCompletionChanged())); connect(m_sourceModel, SIGNAL(aboutToBeDeleted()), this, SLOT(sourceModelAboutToBeDeleted())); } } void Model::aboutToDelete() { // cerr << "Model(" << this << ")::aboutToDelete()" << endl; if (m_aboutToDelete) { cerr << "WARNING: Model(" << this << ", \"" << objectName() << "\")::aboutToDelete: " << "aboutToDelete called more than once for the same model" << endl; } emit aboutToBeDeleted(); m_aboutToDelete = true; } void Model::sourceModelAboutToBeDeleted() { m_sourceModel = 0; } void Model::setAlignment(AlignmentModel *alignment) { if (m_alignment) { m_alignment->aboutToDelete(); delete m_alignment; } m_alignment = alignment; connect(m_alignment, SIGNAL(completionChanged()), this, SIGNAL(alignmentCompletionChanged())); } const AlignmentModel * Model::getAlignment() const { return m_alignment; } const Model * Model::getAlignmentReference() const { if (!m_alignment) { if (m_sourceModel) return m_sourceModel->getAlignmentReference(); return 0; } return m_alignment->getReferenceModel(); } size_t Model::alignToReference(size_t frame) const { if (!m_alignment) { if (m_sourceModel) return m_sourceModel->alignToReference(frame); else return frame; } size_t refFrame = m_alignment->toReference(frame); const Model *m = m_alignment->getReferenceModel(); if (m && refFrame > m->getEndFrame()) refFrame = m->getEndFrame(); return refFrame; } size_t Model::alignFromReference(size_t refFrame) const { if (!m_alignment) { if (m_sourceModel) return m_sourceModel->alignFromReference(refFrame); else return refFrame; } size_t frame = m_alignment->fromReference(refFrame); if (frame > getEndFrame()) frame = getEndFrame(); return frame; } int Model::getAlignmentCompletion() const { // SVDEBUG << "Model::getAlignmentCompletion" << endl; if (!m_alignment) { if (m_sourceModel) return m_sourceModel->getAlignmentCompletion(); else return 100; } int completion = 0; (void)m_alignment->isReady(&completion); // cerr << " -> " << completion << endl; return completion; } QString Model::getTitle() const { if (m_sourceModel) return m_sourceModel->getTitle(); else return ""; } QString Model::getMaker() const { if (m_sourceModel) return m_sourceModel->getMaker(); else return ""; } QString Model::getLocation() const { if (m_sourceModel) return m_sourceModel->getLocation(); else return ""; } void Model::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; stream << QString("\n") .arg(getObjectExportId(this)) .arg(encodeEntities(objectName())) .arg(getSampleRate()) .arg(getStartFrame()) .arg(getEndFrame()) .arg(extraAttributes); } sonic-visualiser-2.3~repack1.orig/svcore/data/model/DenseTimeValueModel.cpp0000644000175000017500000000327012252354725025605 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "DenseTimeValueModel.h" #include "base/PlayParameterRepository.h" #include DenseTimeValueModel::DenseTimeValueModel() { PlayParameterRepository::getInstance()->addPlayable(this); } DenseTimeValueModel::~DenseTimeValueModel() { PlayParameterRepository::getInstance()->removePlayable(this); } QString DenseTimeValueModel::toDelimitedDataString(QString delimiter, size_t f0, size_t f1) const { size_t ch = getChannelCount(); cerr << "f0 = " << f0 << ", f1 = " << f1 << endl; if (f1 <= f0) return ""; float **all = new float *[ch]; for (size_t c = 0; c < ch; ++c) { all[c] = new float[f1 - f0]; } size_t n = getData(0, ch - 1, f0, f1 - f0, all); QStringList list; for (size_t i = 0; i < n; ++i) { QStringList parts; parts << QString("%1").arg(f0 + i); for (size_t c = 0; c < ch; ++c) { parts << QString("%1").arg(all[c][i]); } list << parts.join(delimiter); } for (size_t c = 0; c < ch; ++c) { delete[] all[c]; } delete[] all; return list.join("\n"); } sonic-visualiser-2.3~repack1.orig/svcore/data/model/RangeSummarisableTimeValueModel.cpp0000644000175000017500000000122612252354725030147 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "RangeSummarisableTimeValueModel.h" #include sonic-visualiser-2.3~repack1.orig/svcore/data/model/PowerOfTwoZoomConstraint.cpp0000644000175000017500000000223012252354725026732 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PowerOfTwoZoomConstraint.h" size_t PowerOfTwoZoomConstraint::getNearestBlockSize(size_t req, RoundingDirection dir) const { size_t result = 0; for (size_t bs = 1; ; bs *= 2) { if (bs >= req) { if (dir == RoundNearest) { if (bs - req < req - bs/2) { result = bs; break; } else { result = bs/2; break; } } else if (dir == RoundDown) { result = bs/2; break; } else { result = bs; break; } } } if (result > getMaxZoomLevel()) result = getMaxZoomLevel(); return result; } sonic-visualiser-2.3~repack1.orig/svcore/data/model/IntervalModel.h0000644000175000017500000001377012252354725024172 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006-2008 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _INTERVAL_MODEL_H_ #define _INTERVAL_MODEL_H_ #include "SparseValueModel.h" #include "base/RealTime.h" /** * Model containing sparse data (points with some properties) of which * the properties include a duration and an arbitrary float value. * The other properties depend on the point type. */ template class IntervalModel : public SparseValueModel { public: IntervalModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) : SparseValueModel(sampleRate, resolution, notifyOnAdd) { } IntervalModel(size_t sampleRate, size_t resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : SparseValueModel(sampleRate, resolution, valueMinimum, valueMaximum, notifyOnAdd) { } /** * PointTypes have a duration, so this returns all points that span any * of the given range (as well as the usual additional few before * and after). Consequently this can be very slow (optimised data * structures still to be done!). */ virtual typename SparseValueModel::PointList getPoints(long start, long end) const; /** * PointTypes have a duration, so this returns all points that span the * given frame. Consequently this can be very slow (optimised * data structures still to be done!). */ virtual typename SparseValueModel::PointList getPoints(long frame) const; virtual const typename SparseModel::PointList &getPoints() const { return SparseModel::getPoints(); } /** * TabularModel methods. */ virtual QVariant getData(int row, int column, int role) const { if (column < 2) { return SparseValueModel::getData (row, column, role); } typename SparseModel::PointList::const_iterator i = SparseModel::getPointListIteratorForRow(row); if (i == SparseModel::m_points.end()) return QVariant(); switch (column) { case 2: if (role == Qt::EditRole || role == TabularModel::SortRole) return i->value; else return QString("%1 %2").arg(i->value).arg (IntervalModel::getScaleUnits()); case 3: return int(i->duration); //!!! could be better presented default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { typedef IntervalModel I; if (column < 2) { return SparseValueModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; typename I::PointList::const_iterator i = I::getPointListIteratorForRow(row); if (i == I::m_points.end()) return 0; typename I::EditCommand *command = new typename I::EditCommand (this, I::tr("Edit Data")); PointType point(*i); command->deletePoint(point); switch (column) { case 0: case 1: point.frame = value.toInt(); break; case 2: point.value = value.toDouble(); break; case 3: point.duration = value.toInt(); break; } command->addPoint(point); return command->finish(); } virtual bool isColumnTimeValue(int column) const { // NB duration is not a "time value" -- that's for columns // whose sort ordering is exactly that of the frame time return (column < 2); } }; template typename SparseValueModel::PointList IntervalModel::getPoints(long start, long end) const { typedef IntervalModel I; if (start > end) return typename I::PointList(); QMutex &mutex(I::m_mutex); QMutexLocker locker(&mutex); PointType endPoint(end); typename I::PointListConstIterator endItr = I::m_points.upper_bound(endPoint); if (endItr != I::m_points.end()) ++endItr; if (endItr != I::m_points.end()) ++endItr; typename I::PointList rv; for (typename I::PointListConstIterator i = endItr; i != I::m_points.begin(); ) { --i; if (i->frame < start) { if (i->frame + long(i->duration) >= start) { rv.insert(*i); } } else if (i->frame <= end) { rv.insert(*i); } } return rv; } template typename SparseValueModel::PointList IntervalModel::getPoints(long frame) const { typedef IntervalModel I; QMutex &mutex(I::m_mutex); QMutexLocker locker(&mutex); if (I::m_resolution == 0) return typename I::PointList(); long start = (frame / I::m_resolution) * I::m_resolution; long end = start + I::m_resolution; PointType endPoint(end); typename I::PointListConstIterator endItr = I::m_points.upper_bound(endPoint); typename I::PointList rv; for (typename I::PointListConstIterator i = endItr; i != I::m_points.begin(); ) { --i; if (i->frame < start) { if (i->frame + long(i->duration) >= start) { rv.insert(*i); } } else if (i->frame <= end) { rv.insert(*i); } } return rv; } #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/RegionModel.h0000644000175000017500000001421512252354725023624 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _REGION_MODEL_H_ #define _REGION_MODEL_H_ #include "IntervalModel.h" #include "base/RealTime.h" /** * RegionModel -- a concrete IntervalModel for intervals associated * with a value, which we call regions for no very compelling reason. */ /** * Region "point" type. A region is something that has an onset time, * a single value, and a duration. Like other points, it can also * have a label. * * This is called RegionRec instead of Region to avoid name collisions * with the X11 Region struct. Bah. */ struct RegionRec { public: RegionRec() : frame(0), value(0.f), duration(0) { } RegionRec(long _frame) : frame(_frame), value(0.0f), duration(0) { } RegionRec(long _frame, float _value, size_t _duration, QString _label) : frame(_frame), value(_value), duration(_duration), label(_label) { } int getDimensions() const { return 3; } long frame; float value; size_t duration; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(value).arg(duration) .arg(XmlExportable::encodeEntities(label)).arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, size_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(value); list << RealTime::frame2RealTime(duration, sampleRate).toString().c_str(); if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const RegionRec &p1, const RegionRec &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.value != p2.value) return p1.value < p2.value; if (p1.duration != p2.duration) return p1.duration < p2.duration; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const RegionRec &p1, const RegionRec &p2) const { return p1.frame < p2.frame; } }; }; class RegionModel : public IntervalModel { Q_OBJECT public: RegionModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, notifyOnAdd), m_valueQuantization(0), m_haveDistinctValues(false) { } RegionModel(size_t sampleRate, size_t resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, valueMinimum, valueMaximum, notifyOnAdd), m_valueQuantization(0), m_haveDistinctValues(false) { } virtual ~RegionModel() { } float getValueQuantization() const { return m_valueQuantization; } void setValueQuantization(float q) { m_valueQuantization = q; } bool haveDistinctValues() const { return m_haveDistinctValues; } QString getTypeName() const { return tr("Region"); } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { std::cerr << "RegionModel::toXml: extraAttributes = \"" << extraAttributes.toStdString() << std::endl; IntervalModel::toXml (out, indent, QString("%1 subtype=\"region\" valueQuantization=\"%2\"") .arg(extraAttributes).arg(m_valueQuantization)); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 5; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Value"); case 3: return tr("Duration"); case 4: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 4) { return IntervalModel::getData(row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 4: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 4) { return IntervalModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 4: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual SortType getSortType(int column) const { if (column == 4) return SortAlphabetical; return SortNumeric; } virtual void addPoint(const Point &point) { if (point.value != 0.f) m_haveDistinctValues = true; IntervalModel::addPoint(point); } protected: float m_valueQuantization; bool m_haveDistinctValues; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/WaveFileModel.cpp0000644000175000017500000005411112252354725024435 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "WaveFileModel.h" #include "fileio/AudioFileReader.h" #include "fileio/AudioFileReaderFactory.h" #include "system/System.h" #include #include #include #include #include #include #include //#define DEBUG_WAVE_FILE_MODEL 1 PowerOfSqrtTwoZoomConstraint WaveFileModel::m_zoomConstraint; WaveFileModel::WaveFileModel(FileSource source, size_t targetRate) : m_source(source), m_path(source.getLocation()), m_myReader(true), m_startFrame(0), m_fillThread(0), m_updateTimer(0), m_lastFillExtent(0), m_exiting(false), m_lastDirectReadStart(0), m_lastDirectReadCount(0) { m_source.waitForData(); if (m_source.isOK()) { m_reader = AudioFileReaderFactory::createThreadingReader (m_source, targetRate); if (m_reader) { SVDEBUG << "WaveFileModel::WaveFileModel: reader rate: " << m_reader->getSampleRate() << endl; } } if (m_reader) setObjectName(m_reader->getTitle()); if (objectName() == "") setObjectName(QFileInfo(m_path).fileName()); if (isOK()) fillCache(); } WaveFileModel::WaveFileModel(FileSource source, AudioFileReader *reader) : m_source(source), m_path(source.getLocation()), m_myReader(false), m_startFrame(0), m_fillThread(0), m_updateTimer(0), m_lastFillExtent(0), m_exiting(false) { m_reader = reader; if (m_reader) setObjectName(m_reader->getTitle()); if (objectName() == "") setObjectName(QFileInfo(m_path).fileName()); fillCache(); } WaveFileModel::~WaveFileModel() { m_exiting = true; if (m_fillThread) m_fillThread->wait(); if (m_myReader) delete m_reader; m_reader = 0; } bool WaveFileModel::isOK() const { return m_reader && m_reader->isOK(); } bool WaveFileModel::isReady(int *completion) const { bool ready = (isOK() && (m_fillThread == 0)); double c = double(m_lastFillExtent) / double(getEndFrame() - getStartFrame()); static int prevCompletion = 0; if (completion) { *completion = int(c * 100.0 + 0.01); if (m_reader) { int decodeCompletion = m_reader->getDecodeCompletion(); if (decodeCompletion < 90) *completion = decodeCompletion; else *completion = std::min(*completion, decodeCompletion); } if (*completion != 0 && *completion != 100 && prevCompletion != 0 && prevCompletion > *completion) { // just to avoid completion going backwards *completion = prevCompletion; } prevCompletion = *completion; } #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "WaveFileModel::isReady(): ready = " << ready << ", completion = " << (completion ? *completion : -1) << endl; #endif return ready; } Model * WaveFileModel::clone() const { WaveFileModel *model = new WaveFileModel(m_source); return model; } size_t WaveFileModel::getFrameCount() const { if (!m_reader) return 0; return m_reader->getFrameCount(); } size_t WaveFileModel::getChannelCount() const { if (!m_reader) return 0; return m_reader->getChannelCount(); } size_t WaveFileModel::getSampleRate() const { if (!m_reader) return 0; return m_reader->getSampleRate(); } size_t WaveFileModel::getNativeRate() const { if (!m_reader) return 0; size_t rate = m_reader->getNativeRate(); if (rate == 0) rate = getSampleRate(); return rate; } QString WaveFileModel::getTitle() const { QString title; if (m_reader) title = m_reader->getTitle(); if (title == "") title = objectName(); return title; } QString WaveFileModel::getMaker() const { if (m_reader) return m_reader->getMaker(); return ""; } QString WaveFileModel::getLocation() const { if (m_reader) return m_reader->getLocation(); return ""; } size_t WaveFileModel::getData(int channel, size_t start, size_t count, float *buffer) const { // Always read these directly from the file. // This is used for e.g. audio playback. // Could be much more efficient (although compiler optimisation will help) #ifdef DEBUG_WAVE_FILE_MODEL cout << "WaveFileModel::getData[" << this << "]: " << channel << ", " << start << ", " << count << ", " << buffer << endl; #endif if (start >= m_startFrame) { start -= m_startFrame; } else { for (size_t i = 0; i < count; ++i) buffer[i] = 0.f; if (count <= m_startFrame - start) { return 0; } else { count -= (m_startFrame - start); start = 0; } } if (!m_reader || !m_reader->isOK() || count == 0) { for (size_t i = 0; i < count; ++i) buffer[i] = 0.f; return 0; } #ifdef DEBUG_WAVE_FILE_MODEL // SVDEBUG << "WaveFileModel::getValues(" << channel << ", " // << start << ", " << end << "): calling reader" << endl; #endif int channels = getChannelCount(); SampleBlock frames(count * channels); m_reader->getInterleavedFrames(start, count, frames); size_t i = 0; int ch0 = channel, ch1 = channel; if (channel == -1) { ch0 = 0; ch1 = channels - 1; } while (i < count) { buffer[i] = 0.0; for (int ch = ch0; ch <= ch1; ++ch) { size_t index = i * channels + ch; if (index >= frames.size()) break; float sample = frames[index]; buffer[i] += sample; } ++i; } return i; } size_t WaveFileModel::getData(int channel, size_t start, size_t count, double *buffer) const { #ifdef DEBUG_WAVE_FILE_MODEL cout << "WaveFileModel::getData(double)[" << this << "]: " << channel << ", " << start << ", " << count << ", " << buffer << endl; #endif if (start > m_startFrame) { start -= m_startFrame; } else { for (size_t i = 0; i < count; ++i) buffer[i] = 0.0; if (count <= m_startFrame - start) { return 0; } else { count -= (m_startFrame - start); start = 0; } } if (!m_reader || !m_reader->isOK() || count == 0) { for (size_t i = 0; i < count; ++i) buffer[i] = 0.0; return 0; } int channels = getChannelCount(); SampleBlock frames(count * channels); m_reader->getInterleavedFrames(start, count, frames); size_t i = 0; int ch0 = channel, ch1 = channel; if (channel == -1) { ch0 = 0; ch1 = channels - 1; } while (i < count) { buffer[i] = 0.0; for (int ch = ch0; ch <= ch1; ++ch) { size_t index = i * channels + ch; if (index >= frames.size()) break; float sample = frames[index]; buffer[i] += sample; } ++i; } return i; } size_t WaveFileModel::getData(size_t fromchannel, size_t tochannel, size_t start, size_t count, float **buffer) const { #ifdef DEBUG_WAVE_FILE_MODEL cout << "WaveFileModel::getData[" << this << "]: " << fromchannel << "," << tochannel << ", " << start << ", " << count << ", " << buffer << endl; #endif size_t channels = getChannelCount(); if (fromchannel > tochannel) { cerr << "ERROR: WaveFileModel::getData: fromchannel (" << fromchannel << ") > tochannel (" << tochannel << ")" << endl; return 0; } if (tochannel >= channels) { cerr << "ERROR: WaveFileModel::getData: tochannel (" << tochannel << ") >= channel count (" << channels << ")" << endl; return 0; } if (fromchannel == tochannel) { return getData(fromchannel, start, count, buffer[0]); } size_t reqchannels = (tochannel - fromchannel) + 1; // Always read these directly from the file. // This is used for e.g. audio playback. // Could be much more efficient (although compiler optimisation will help) if (start >= m_startFrame) { start -= m_startFrame; } else { for (size_t c = 0; c < reqchannels; ++c) { for (size_t i = 0; i < count; ++i) buffer[c][i] = 0.f; } if (count <= m_startFrame - start) { return 0; } else { count -= (m_startFrame - start); start = 0; } } if (!m_reader || !m_reader->isOK() || count == 0) { for (size_t c = 0; c < reqchannels; ++c) { for (size_t i = 0; i < count; ++i) buffer[c][i] = 0.f; } return 0; } SampleBlock frames(count * channels); m_reader->getInterleavedFrames(start, count, frames); size_t i = 0; int ch0 = fromchannel, ch1 = tochannel; size_t index = 0, available = frames.size(); while (i < count) { if (index >= available) break; size_t destc = 0; for (size_t c = 0; c < channels; ++c) { if (c >= fromchannel && c <= tochannel) { buffer[destc][i] = frames[index]; ++destc; } ++index; } ++i; } return i; } size_t WaveFileModel::getSummaryBlockSize(size_t desired) const { int cacheType = 0; int power = m_zoomConstraint.getMinCachePower(); size_t roundedBlockSize = m_zoomConstraint.getNearestBlockSize (desired, cacheType, power, ZoomConstraint::RoundDown); if (cacheType != 0 && cacheType != 1) { // We will be reading directly from file, so can satisfy any // blocksize requirement return desired; } else { return roundedBlockSize; } } void WaveFileModel::getSummaries(size_t channel, size_t start, size_t count, RangeBlock &ranges, size_t &blockSize) const { ranges.clear(); if (!isOK()) return; ranges.reserve((count / blockSize) + 1); if (start > m_startFrame) start -= m_startFrame; else if (count <= m_startFrame - start) return; else { count -= (m_startFrame - start); start = 0; } int cacheType = 0; int power = m_zoomConstraint.getMinCachePower(); size_t roundedBlockSize = m_zoomConstraint.getNearestBlockSize (blockSize, cacheType, power, ZoomConstraint::RoundDown); size_t channels = getChannelCount(); if (cacheType != 0 && cacheType != 1) { // We need to read directly from the file. We haven't got // this cached. Hope the requested area is small. This is // not optimal -- we'll end up reading the same frames twice // for stereo files, in two separate calls to this method. // We could fairly trivially handle this for most cases that // matter by putting a single cache in getInterleavedFrames // for short queries. m_directReadMutex.lock(); if (m_lastDirectReadStart != start || m_lastDirectReadCount != count || m_directRead.empty()) { m_reader->getInterleavedFrames(start, count, m_directRead); m_lastDirectReadStart = start; m_lastDirectReadCount = count; } float max = 0.0, min = 0.0, total = 0.0; size_t i = 0, got = 0; while (i < count) { size_t index = i * channels + channel; if (index >= m_directRead.size()) break; float sample = m_directRead[index]; if (sample > max || got == 0) max = sample; if (sample < min || got == 0) min = sample; total += fabsf(sample); ++i; ++got; if (got == blockSize) { ranges.push_back(Range(min, max, total / got)); min = max = total = 0.0f; got = 0; } } m_directReadMutex.unlock(); if (got > 0) { ranges.push_back(Range(min, max, total / got)); } return; } else { QMutexLocker locker(&m_mutex); const RangeBlock &cache = m_cache[cacheType]; blockSize = roundedBlockSize; size_t cacheBlock, div; if (cacheType == 0) { cacheBlock = (1 << m_zoomConstraint.getMinCachePower()); div = (1 << power) / cacheBlock; } else { cacheBlock = ((unsigned int)((1 << m_zoomConstraint.getMinCachePower()) * sqrt(2.) + 0.01)); div = ((unsigned int)((1 << power) * sqrt(2.) + 0.01)) / cacheBlock; } size_t startIndex = start / cacheBlock; size_t endIndex = (start + count) / cacheBlock; float max = 0.0, min = 0.0, total = 0.0; size_t i = 0, got = 0; #ifdef DEBUG_WAVE_FILE_MODEL cerr << "blockSize is " << blockSize << ", cacheBlock " << cacheBlock << ", start " << start << ", count " << count << " (frame count " << getFrameCount() << "), power is " << power << ", div is " << div << ", startIndex " << startIndex << ", endIndex " << endIndex << endl; #endif for (i = 0; i <= endIndex - startIndex; ) { size_t index = (i + startIndex) * channels + channel; if (index >= cache.size()) break; const Range &range = cache[index]; if (range.max() > max || got == 0) max = range.max(); if (range.min() < min || got == 0) min = range.min(); total += range.absmean(); ++i; ++got; if (got == div) { ranges.push_back(Range(min, max, total / got)); min = max = total = 0.0f; got = 0; } } if (got > 0) { ranges.push_back(Range(min, max, total / got)); } } #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "returning " << ranges.size() << " ranges" << endl; #endif return; } WaveFileModel::Range WaveFileModel::getSummary(size_t channel, size_t start, size_t count) const { Range range; if (!isOK()) return range; if (start > m_startFrame) start -= m_startFrame; else if (count <= m_startFrame - start) return range; else { count -= (m_startFrame - start); start = 0; } size_t blockSize; for (blockSize = 1; blockSize <= count; blockSize *= 2); if (blockSize > 1) blockSize /= 2; bool first = false; size_t blockStart = (start / blockSize) * blockSize; size_t blockEnd = ((start + count) / blockSize) * blockSize; if (blockStart < start) blockStart += blockSize; if (blockEnd > blockStart) { RangeBlock ranges; getSummaries(channel, blockStart, blockEnd - blockStart, ranges, blockSize); for (size_t i = 0; i < ranges.size(); ++i) { if (first || ranges[i].min() < range.min()) range.setMin(ranges[i].min()); if (first || ranges[i].max() > range.max()) range.setMax(ranges[i].max()); if (first || ranges[i].absmean() < range.absmean()) range.setAbsmean(ranges[i].absmean()); first = false; } } if (blockStart > start) { Range startRange = getSummary(channel, start, blockStart - start); range.setMin(std::min(range.min(), startRange.min())); range.setMax(std::max(range.max(), startRange.max())); range.setAbsmean(std::min(range.absmean(), startRange.absmean())); } if (blockEnd < start + count) { Range endRange = getSummary(channel, blockEnd, start + count - blockEnd); range.setMin(std::min(range.min(), endRange.min())); range.setMax(std::max(range.max(), endRange.max())); range.setAbsmean(std::min(range.absmean(), endRange.absmean())); } return range; } void WaveFileModel::fillCache() { m_mutex.lock(); m_updateTimer = new QTimer(this); connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(fillTimerTimedOut())); m_updateTimer->start(100); m_fillThread = new RangeCacheFillThread(*this); connect(m_fillThread, SIGNAL(finished()), this, SLOT(cacheFilled())); m_mutex.unlock(); m_fillThread->start(); #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "WaveFileModel::fillCache: started fill thread" << endl; #endif } void WaveFileModel::fillTimerTimedOut() { if (m_fillThread) { size_t fillExtent = m_fillThread->getFillExtent(); #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "WaveFileModel::fillTimerTimedOut: extent = " << fillExtent << endl; #endif if (fillExtent > m_lastFillExtent) { emit modelChanged(m_lastFillExtent, fillExtent); m_lastFillExtent = fillExtent; } } else { #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "WaveFileModel::fillTimerTimedOut: no thread" << endl; #endif emit modelChanged(); } } void WaveFileModel::cacheFilled() { m_mutex.lock(); delete m_fillThread; m_fillThread = 0; delete m_updateTimer; m_updateTimer = 0; m_mutex.unlock(); if (getEndFrame() > m_lastFillExtent) { emit modelChanged(m_lastFillExtent, getEndFrame()); } emit modelChanged(); emit ready(); #ifdef DEBUG_WAVE_FILE_MODEL SVDEBUG << "WaveFileModel::cacheFilled" << endl; #endif } void WaveFileModel::RangeCacheFillThread::run() { size_t cacheBlockSize[2]; cacheBlockSize[0] = (1 << m_model.m_zoomConstraint.getMinCachePower()); cacheBlockSize[1] = ((unsigned int)((1 << m_model.m_zoomConstraint.getMinCachePower()) * sqrt(2.) + 0.01)); size_t frame = 0; int readBlockSize = 16384; SampleBlock block; if (!m_model.isOK()) return; size_t channels = m_model.getChannelCount(); bool updating = m_model.m_reader->isUpdating(); if (updating) { while (channels == 0 && !m_model.m_exiting) { // SVDEBUG << "WaveFileModel::fill: Waiting for channels..." << endl; sleep(1); channels = m_model.getChannelCount(); } } Range *range = new Range[2 * channels]; float *means = new float[2 * channels]; size_t count[2]; count[0] = count[1] = 0; for (int i = 0; i < 2 * channels; ++i) { means[i] = 0.f; } bool first = true; while (first || updating) { updating = m_model.m_reader->isUpdating(); m_frameCount = m_model.getFrameCount(); // SVDEBUG << "WaveFileModel::fill: frame = " << frame << ", count = " << m_frameCount << endl; while (frame < m_frameCount) { // SVDEBUG << "WaveFileModel::fill inner loop: frame = " << frame << ", count = " << m_frameCount << ", blocksize " << readBlockSize << endl; if (updating && (frame + readBlockSize > m_frameCount)) break; m_model.m_reader->getInterleavedFrames(frame, readBlockSize, block); // cerr << "block is " << block.size() << endl; for (int i = 0; i < readBlockSize; ++i) { if (channels * i + channels > block.size()) break; for (int ch = 0; ch < channels; ++ch) { int index = channels * i + ch; float sample = block[index]; for (int ct = 0; ct < 2; ++ct) { // cache type int rangeIndex = ch * 2 + ct; if (sample > range[rangeIndex].max() || count[ct] == 0) { range[rangeIndex].setMax(sample); } if (sample < range[rangeIndex].min() || count[ct] == 0) { range[rangeIndex].setMin(sample); } means[rangeIndex] += fabsf(sample); } } QMutexLocker locker(&m_model.m_mutex); for (size_t ct = 0; ct < 2; ++ct) { if (++count[ct] == cacheBlockSize[ct]) { for (size_t ch = 0; ch < size_t(channels); ++ch) { size_t rangeIndex = ch * 2 + ct; means[rangeIndex] /= count[ct]; range[rangeIndex].setAbsmean(means[rangeIndex]); m_model.m_cache[ct].push_back(range[rangeIndex]); range[rangeIndex] = Range(); means[rangeIndex] = 0.f; } count[ct] = 0; } } ++frame; } if (m_model.m_exiting) break; m_fillExtent = frame; } // cerr << "WaveFileModel: inner loop ended" << endl; first = false; if (m_model.m_exiting) break; if (updating) { // cerr << "sleeping..." << endl; sleep(1); } } if (!m_model.m_exiting) { QMutexLocker locker(&m_model.m_mutex); for (size_t ct = 0; ct < 2; ++ct) { if (count[ct] > 0) { for (size_t ch = 0; ch < size_t(channels); ++ch) { size_t rangeIndex = ch * 2 + ct; means[rangeIndex] /= count[ct]; range[rangeIndex].setAbsmean(means[rangeIndex]); m_model.m_cache[ct].push_back(range[rangeIndex]); range[rangeIndex] = Range(); means[rangeIndex] = 0.f; } count[ct] = 0; } const Range &rr = *m_model.m_cache[ct].begin(); MUNLOCK(&rr, m_model.m_cache[ct].capacity() * sizeof(Range)); } } delete[] means; delete[] range; m_fillExtent = m_frameCount; #ifdef DEBUG_WAVE_FILE_MODEL for (size_t ct = 0; ct < 2; ++ct) { cerr << "Cache type " << ct << " now contains " << m_model.m_cache[ct].size() << " ranges" << endl; } #endif } void WaveFileModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { Model::toXml(out, indent, QString("type=\"wavefile\" file=\"%1\" %2") .arg(encodeEntities(m_path)).arg(extraAttributes)); } sonic-visualiser-2.3~repack1.orig/svcore/data/model/PowerOfSqrtTwoZoomConstraint.cpp0000644000175000017500000000514512252354725027614 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PowerOfSqrtTwoZoomConstraint.h" #include #include size_t PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(size_t blockSize, RoundingDirection dir) const { int type, power; size_t rv = getNearestBlockSize(blockSize, type, power, dir); return rv; } size_t PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(size_t blockSize, int &type, int &power, RoundingDirection dir) const { // cerr << "given " << blockSize << endl; size_t minCachePower = getMinCachePower(); if (blockSize < (1U << minCachePower)) { type = -1; power = 0; float val = 1.0, prevVal = 1.0; while (val + 0.01 < blockSize) { prevVal = val; val *= sqrt(2.f); } size_t rval; if (dir == RoundUp) rval = size_t(val + 0.01); else if (dir == RoundDown) rval = size_t(prevVal + 0.01); else if (val - blockSize < blockSize - prevVal) rval = size_t(val + 0.01); else rval = size_t(prevVal + 0.01); // SVDEBUG << "returning " << rval << endl; return rval; } unsigned int prevBase = (1 << minCachePower); unsigned int prevPower = minCachePower; unsigned int prevType = 0; size_t result = 0; for (unsigned int i = 0; ; ++i) { power = minCachePower + i/2; type = i % 2; unsigned int base; if (type == 0) { base = (1 << power); } else { base = (((unsigned int)((1 << minCachePower) * sqrt(2.) + 0.01)) << (power - minCachePower)); } // SVDEBUG << "Testing base " << base << endl; if (base == blockSize) { result = base; break; } if (base > blockSize) { if (dir == RoundNearest) { if (base - blockSize < blockSize - prevBase) { dir = RoundUp; } else { dir = RoundDown; } } if (dir == RoundUp) { result = base; break; } else { type = prevType; power = prevPower; result = prevBase; break; } } prevType = type; prevPower = power; prevBase = base; } if (result > getMaxZoomLevel()) result = getMaxZoomLevel(); return result; } sonic-visualiser-2.3~repack1.orig/svcore/data/model/AlignmentModel.h0000644000175000017500000000500712252354725024316 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _ALIGNMENT_MODEL_H_ #define _ALIGNMENT_MODEL_H_ #include "Model.h" #include "PathModel.h" #include "base/RealTime.h" #include #include class SparseTimeValueModel; class AlignmentModel : public Model { Q_OBJECT public: AlignmentModel(Model *reference, Model *aligned, Model *inputModel, // probably an AggregateWaveModel; I take ownership SparseTimeValueModel *path); // I take ownership ~AlignmentModel(); virtual bool isOK() const; virtual size_t getStartFrame() const; virtual size_t getEndFrame() const; virtual size_t getSampleRate() const; virtual Model *clone() const; virtual bool isReady(int *completion = 0) const; virtual const ZoomConstraint *getZoomConstraint() const; QString getTypeName() const { return tr("Alignment"); } const Model *getReferenceModel() const; const Model *getAlignedModel() const; size_t toReference(size_t frame) const; size_t fromReference(size_t frame) const; void setPath(PathModel *path); virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; signals: void modelChanged(); void modelChanged(size_t startFrame, size_t endFrame); void completionChanged(); protected slots: void pathChanged(); void pathChanged(size_t startFrame, size_t endFrame); void pathCompletionChanged(); protected: Model *m_reference; // I don't own this Model *m_aligned; // I don't own this Model *m_inputModel; // I own this SparseTimeValueModel *m_rawPath; // I own this mutable PathModel *m_path; // I own this mutable PathModel *m_reversePath; // I own this bool m_pathBegun; bool m_pathComplete; void constructPath() const; void constructReversePath() const; size_t align(PathModel *path, size_t frame) const; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/SparseValueModel.h0000644000175000017500000001057112252354725024634 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SPARSE_VALUE_MODEL_H_ #define _SPARSE_VALUE_MODEL_H_ #include "SparseModel.h" #include "base/UnitDatabase.h" #include "system/System.h" /** * Model containing sparse data (points with some properties) of which * one of the properties is an arbitrary float value. The other * properties depend on the point type. */ template class SparseValueModel : public SparseModel { public: SparseValueModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd), m_valueMinimum(0.f), m_valueMaximum(0.f), m_haveExtents(false) { } SparseValueModel(size_t sampleRate, size_t resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : SparseModel(sampleRate, resolution, notifyOnAdd), m_valueMinimum(valueMinimum), m_valueMaximum(valueMaximum), m_haveExtents(true) { } using SparseModel::m_points; using SparseModel::modelChanged; using SparseModel::getPoints; using SparseModel::tr; QString getTypeName() const { return tr("Sparse Value"); } virtual float getValueMinimum() const { return m_valueMinimum; } virtual float getValueMaximum() const { return m_valueMaximum; } virtual QString getScaleUnits() const { return m_units; } virtual void setScaleUnits(QString units) { m_units = units; UnitDatabase::getInstance()->registerUnit(units); } virtual void addPoint(const PointType &point) { bool allChange = false; if (!ISNAN(point.value) && !ISINF(point.value)) { if (!m_haveExtents || point.value < m_valueMinimum) { m_valueMinimum = point.value; allChange = true; // std::cerr << "addPoint: value min = " << m_valueMinimum << std::endl; } if (!m_haveExtents || point.value > m_valueMaximum) { m_valueMaximum = point.value; allChange = true; // std::cerr << "addPoint: value max = " << m_valueMaximum << " (min = " << m_valueMinimum << ")" << std::endl; } m_haveExtents = true; } SparseModel::addPoint(point); if (allChange) emit modelChanged(); } virtual void deletePoint(const PointType &point) { SparseModel::deletePoint(point); if (point.value == m_valueMinimum || point.value == m_valueMaximum) { float formerMin = m_valueMinimum, formerMax = m_valueMaximum; for (typename SparseModel::PointList::const_iterator i = m_points.begin(); i != m_points.end(); ++i) { if (i == m_points.begin() || i->value < m_valueMinimum) { m_valueMinimum = i->value; // std::cerr << "deletePoint: value min = " << m_valueMinimum << std::endl; } if (i == m_points.begin() || i->value > m_valueMaximum) { m_valueMaximum = i->value; // std::cerr << "deletePoint: value max = " << m_valueMaximum << std::endl; } } if (formerMin != m_valueMinimum || formerMax != m_valueMaximum) { emit modelChanged(); } } } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { std::cerr << "SparseValueModel::toXml: extraAttributes = \"" << extraAttributes.toStdString() << std::endl; SparseModel::toXml (stream, indent, QString("%1 minimum=\"%2\" maximum=\"%3\" units=\"%4\"") .arg(extraAttributes).arg(m_valueMinimum).arg(m_valueMaximum) .arg(this->encodeEntities(m_units))); } protected: float m_valueMinimum; float m_valueMaximum; bool m_haveExtents; QString m_units; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/AggregateWaveModel.h0000644000175000017500000000606412252354725025115 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _AGGREGATE_WAVE_MODEL_H_ #define _AGGREGATE_WAVE_MODEL_H_ #include "RangeSummarisableTimeValueModel.h" #include "PowerOfSqrtTwoZoomConstraint.h" #include class AggregateWaveModel : public RangeSummarisableTimeValueModel { Q_OBJECT public: struct ModelChannelSpec { ModelChannelSpec(RangeSummarisableTimeValueModel *m, int c) : model(m), channel(c) { } RangeSummarisableTimeValueModel *model; int channel; }; typedef std::vector ChannelSpecList; AggregateWaveModel(ChannelSpecList channelSpecs); ~AggregateWaveModel(); bool isOK() const; bool isReady(int *) const; QString getTypeName() const { return tr("Aggregate Wave"); } size_t getComponentCount() const; ModelChannelSpec getComponent(size_t c) const; const ZoomConstraint *getZoomConstraint() const { return &m_zoomConstraint; } size_t getFrameCount() const; size_t getChannelCount() const; size_t getSampleRate() const; virtual Model *clone() const; float getValueMinimum() const { return -1.0f; } float getValueMaximum() const { return 1.0f; } virtual size_t getStartFrame() const { return 0; } virtual size_t getEndFrame() const { return getFrameCount(); } virtual size_t getData(int channel, size_t start, size_t count, float *buffer) const; virtual size_t getData(int channel, size_t start, size_t count, double *buffer) const; virtual size_t getData(size_t fromchannel, size_t tochannel, size_t start, size_t count, float **buffer) const; virtual size_t getSummaryBlockSize(size_t desired) const; virtual void getSummaries(size_t channel, size_t start, size_t count, RangeBlock &ranges, size_t &blockSize) const; virtual Range getSummary(size_t channel, size_t start, size_t count) const; virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; signals: void modelChanged(); void modelChanged(size_t, size_t); void completionChanged(); protected slots: void componentModelChanged(); void componentModelChanged(size_t, size_t); void componentModelCompletionChanged(); protected: ChannelSpecList m_components; static PowerOfSqrtTwoZoomConstraint m_zoomConstraint; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/FFTModel.h0000644000175000017500000001774712252354725023035 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _FFT_MODEL_H_ #define _FFT_MODEL_H_ #include "data/fft/FFTDataServer.h" #include "DenseThreeDimensionalModel.h" #include #include /** * An implementation of DenseThreeDimensionalModel that makes FFT data * derived from a DenseTimeValueModel available as a generic data * grid. The FFT data is acquired using FFTDataServer. Note that any * of the accessor functions may throw AllocationFailed if a cache * resize fails. */ class FFTModel : public DenseThreeDimensionalModel { Q_OBJECT public: /** * Construct an FFT model derived from the given * DenseTimeValueModel, with the given window parameters and FFT * size (which may exceed the window size, for zero-padded FFTs). * * If the model has multiple channels use only the given channel, * unless the channel is -1 in which case merge all available * channels. * * If polar is true, the data will normally be retrieved from the * FFT model in magnitude/phase form; otherwise it will normally * be retrieved in "cartesian" real/imaginary form. The results * should be the same either way, but a "polar" model addressed in * "cartesian" form or vice versa may suffer a performance * penalty. * * The fillFromColumn argument gives a hint that the FFT data * server should aim to start calculating FFT data at that column * number if possible, as that is likely to be requested first. */ FFTModel(const DenseTimeValueModel *model, int channel, WindowType windowType, size_t windowSize, size_t windowIncrement, size_t fftSize, bool polar, StorageAdviser::Criteria criteria = StorageAdviser::NoCriteria, size_t fillFromColumn = 0); ~FFTModel(); inline float getMagnitudeAt(size_t x, size_t y) { return m_server->getMagnitudeAt(x << m_xshift, y << m_yshift); } inline float getNormalizedMagnitudeAt(size_t x, size_t y) { return m_server->getNormalizedMagnitudeAt(x << m_xshift, y << m_yshift); } inline float getMaximumMagnitudeAt(size_t x) { return m_server->getMaximumMagnitudeAt(x << m_xshift); } inline float getPhaseAt(size_t x, size_t y) { return m_server->getPhaseAt(x << m_xshift, y << m_yshift); } inline void getValuesAt(size_t x, size_t y, float &real, float &imaginary) { m_server->getValuesAt(x << m_xshift, y << m_yshift, real, imaginary); } inline bool isColumnAvailable(size_t x) const { return m_server->isColumnReady(x << m_xshift); } inline bool getMagnitudesAt(size_t x, float *values, size_t minbin = 0, size_t count = 0) { return m_server->getMagnitudesAt(x << m_xshift, values, minbin << m_yshift, count, getYRatio()); } inline bool getNormalizedMagnitudesAt(size_t x, float *values, size_t minbin = 0, size_t count = 0) { return m_server->getNormalizedMagnitudesAt(x << m_xshift, values, minbin << m_yshift, count, getYRatio()); } inline bool getPhasesAt(size_t x, float *values, size_t minbin = 0, size_t count = 0) { return m_server->getPhasesAt(x << m_xshift, values, minbin << m_yshift, count, getYRatio()); } inline bool getValuesAt(size_t x, float *reals, float *imaginaries, size_t minbin = 0, size_t count = 0) { return m_server->getValuesAt(x << m_xshift, reals, imaginaries, minbin << m_yshift, count, getYRatio()); } inline size_t getFillExtent() const { return m_server->getFillExtent(); } // DenseThreeDimensionalModel and Model methods: // inline virtual size_t getWidth() const { return m_server->getWidth() >> m_xshift; } inline virtual size_t getHeight() const { // If there is no y-shift, the server's height (based on its // fftsize/2 + 1) is correct. If there is a shift, then the // server is using a larger fft size than we want, so we shift // it right as many times as necessary, but then we need to // re-add the "+1" part (because ((fftsize*2)/2 + 1) / 2 != // fftsize/2 + 1). return (m_server->getHeight() >> m_yshift) + (m_yshift > 0 ? 1 : 0); } virtual float getValueAt(size_t x, size_t y) const { return const_cast(this)->getMagnitudeAt(x, y); } virtual bool isOK() const { return m_server && m_server->getModel(); } virtual size_t getStartFrame() const { return 0; } virtual size_t getEndFrame() const { return getWidth() * getResolution() + getResolution(); } virtual size_t getSampleRate() const; virtual size_t getResolution() const { return m_server->getWindowIncrement() << m_xshift; } virtual size_t getYBinCount() const { return getHeight(); } virtual float getMinimumLevel() const { return 0.f; // Can't provide } virtual float getMaximumLevel() const { return 1.f; // Can't provide } virtual Column getColumn(size_t x) const; virtual QString getBinName(size_t n) const; virtual bool shouldUseLogValueScale() const { return true; // Although obviously it's up to the user... } /** * Calculate an estimated frequency for a stable signal in this * bin, using phase unwrapping. This will be completely wrong if * the signal is not stable here. */ virtual bool estimateStableFrequency(size_t x, size_t y, float &frequency); enum PeakPickType { AllPeaks, /// Any bin exceeding its immediate neighbours MajorPeaks, /// Peaks picked using sliding median window MajorPitchAdaptivePeaks /// Bigger window for higher frequencies }; typedef std::set PeakLocationSet; // bin typedef std::map PeakSet; // bin -> freq /** * Return locations of peak bins in the range [ymin,ymax]. If * ymax is zero, getHeight()-1 will be used. */ virtual PeakLocationSet getPeaks(PeakPickType type, size_t x, size_t ymin = 0, size_t ymax = 0); /** * Return locations and estimated stable frequencies of peak bins. */ virtual PeakSet getPeakFrequencies(PeakPickType type, size_t x, size_t ymin = 0, size_t ymax = 0); virtual int getCompletion() const { return m_server->getFillCompletion(); } virtual QString getError() const { return m_server->getError(); } virtual Model *clone() const; virtual void suspend() { m_server->suspend(); } virtual void suspendWrites() { m_server->suspendWrites(); } virtual void resume() { m_server->resume(); } QString getTypeName() const { return tr("FFT"); } public slots: void sourceModelAboutToBeDeleted(); private: FFTModel(const FFTModel &); // not implemented FFTModel &operator=(const FFTModel &); // not implemented FFTDataServer *m_server; int m_xshift; int m_yshift; FFTDataServer *getServer(const DenseTimeValueModel *, int, WindowType, size_t, size_t, size_t, bool, StorageAdviser::Criteria, size_t); size_t getPeakPickWindowSize(PeakPickType type, size_t sampleRate, size_t bin, float &percentile) const; size_t getYRatio() { size_t ys = m_yshift; size_t r = 1; while (ys) { --ys; r <<= 1; } return r; } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/TabularModel.h0000644000175000017500000000366112252354725023776 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _TABULAR_MODEL_H_ #define _TABULAR_MODEL_H_ #include #include class Command; /** * TabularModel is an abstract base class for models that support * direct access to data in a tabular form. A model that implements * TabularModel may be displayed and, perhaps, edited in a data * spreadsheet window. * * This is very like a cut-down QAbstractItemModel. It assumes a * relationship between row number and frame time. */ class TabularModel { public: virtual ~TabularModel() { } virtual int getRowCount() const = 0; virtual int getColumnCount() const = 0; virtual QString getHeading(int column) const = 0; enum { SortRole = Qt::UserRole }; enum SortType { SortNumeric, SortAlphabetical }; virtual QVariant getData(int row, int column, int role) const = 0; virtual bool isColumnTimeValue(int col) const = 0; virtual SortType getSortType(int col) const = 0; virtual long getFrameForRow(int row) const = 0; virtual int getRowForFrame(long frame) const = 0; virtual bool isEditable() const { return false; } virtual Command *getSetDataCommand(int /* row */, int /* column */, const QVariant &, int /* role */) { return 0; } virtual Command *getInsertRowCommand(int /* beforeRow */) { return 0; } virtual Command *getRemoveRowCommand(int /* row */) { return 0; } }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/NoteModel.h0000644000175000017500000001474412252354725023315 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _NOTE_MODEL_H_ #define _NOTE_MODEL_H_ #include "IntervalModel.h" #include "base/RealTime.h" #include "base/PlayParameterRepository.h" /** * NoteModel -- a concrete IntervalModel for notes. */ /** * Note type for use in a sparse model. All we mean by a "note" is * something that has an onset time, a single value, a duration, and a * level. Like other points, it can also have a label. With this * point type, the model can be thought of as representing a simple * MIDI-type piano roll, except that the y coordinates (values) do not * have to be discrete integers. */ struct Note { public: Note(long _frame) : frame(_frame), value(0.0f), duration(0), level(1.f) { } Note(long _frame, float _value, size_t _duration, float _level, QString _label) : frame(_frame), value(_value), duration(_duration), level(_level), label(_label) { } int getDimensions() const { return 3; } long frame; float value; size_t duration; float level; QString label; QString getLabel() const { return label; } void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const { stream << QString("%1\n") .arg(indent).arg(frame).arg(value).arg(duration).arg(level) .arg(XmlExportable::encodeEntities(label)).arg(extraAttributes); } QString toDelimitedDataString(QString delimiter, size_t sampleRate) const { QStringList list; list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str(); list << QString("%1").arg(value); list << RealTime::frame2RealTime(duration, sampleRate).toString().c_str(); list << QString("%1").arg(level); if (label != "") list << label; return list.join(delimiter); } struct Comparator { bool operator()(const Note &p1, const Note &p2) const { if (p1.frame != p2.frame) return p1.frame < p2.frame; if (p1.value != p2.value) return p1.value < p2.value; if (p1.duration != p2.duration) return p1.duration < p2.duration; if (p1.level != p2.level) return p1.level < p2.level; return p1.label < p2.label; } }; struct OrderComparator { bool operator()(const Note &p1, const Note &p2) const { return p1.frame < p2.frame; } }; }; class NoteModel : public IntervalModel { Q_OBJECT public: NoteModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, notifyOnAdd), m_valueQuantization(0) { PlayParameterRepository::getInstance()->addPlayable(this); } NoteModel(size_t sampleRate, size_t resolution, float valueMinimum, float valueMaximum, bool notifyOnAdd = true) : IntervalModel(sampleRate, resolution, valueMinimum, valueMaximum, notifyOnAdd), m_valueQuantization(0) { PlayParameterRepository::getInstance()->addPlayable(this); } virtual ~NoteModel() { PlayParameterRepository::getInstance()->removePlayable(this); } float getValueQuantization() const { return m_valueQuantization; } void setValueQuantization(float q) { m_valueQuantization = q; } QString getTypeName() const { return tr("Note"); } virtual bool canPlay() const { return true; } virtual QString getDefaultPlayPluginId() const { return "dssi:_builtin:sample_player"; } virtual QString getDefaultPlayPluginConfiguration() const { return ""; } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const { std::cerr << "NoteModel::toXml: extraAttributes = \"" << extraAttributes.toStdString() << std::endl; IntervalModel::toXml (out, indent, QString("%1 subtype=\"note\" valueQuantization=\"%2\"") .arg(extraAttributes).arg(m_valueQuantization)); } /** * TabularModel methods. */ virtual int getColumnCount() const { return 6; } virtual QString getHeading(int column) const { switch (column) { case 0: return tr("Time"); case 1: return tr("Frame"); case 2: return tr("Pitch"); case 3: return tr("Duration"); case 4: return tr("Level"); case 5: return tr("Label"); default: return tr("Unknown"); } } virtual QVariant getData(int row, int column, int role) const { if (column < 4) { return IntervalModel::getData(row, column, role); } PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 4: return i->level; case 5: return i->label; default: return QVariant(); } } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (column < 4) { return IntervalModel::getSetDataCommand (row, column, value, role); } if (role != Qt::EditRole) return 0; PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 4: point.level = value.toDouble(); break; case 5: point.label = value.toString(); break; } command->addPoint(point); return command->finish(); } virtual SortType getSortType(int column) const { if (column == 5) return SortAlphabetical; return SortNumeric; } protected: float m_valueQuantization; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/WritableWaveFileModel.cpp0000644000175000017500000001600312252354725026125 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "WritableWaveFileModel.h" #include "base/TempDirectory.h" #include "base/Exceptions.h" #include "fileio/WavFileWriter.h" #include "fileio/WavFileReader.h" #include #include #include #include #include //#define DEBUG_WRITABLE_WAVE_FILE_MODEL 1 WritableWaveFileModel::WritableWaveFileModel(size_t sampleRate, size_t channels, QString path) : m_model(0), m_writer(0), m_reader(0), m_sampleRate(sampleRate), m_channels(channels), m_frameCount(0), m_startFrame(0), m_completion(0) { if (path.isEmpty()) { try { QDir dir(TempDirectory::getInstance()->getPath()); path = dir.filePath(QString("written_%1.wav") .arg((intptr_t)this)); } catch (DirectoryCreationFailed f) { cerr << "WritableWaveFileModel: Failed to create temporary directory" << endl; return; } } // Write directly to the target file, so that we can do // incremental writes and concurrent reads m_writer = new WavFileWriter(path, sampleRate, channels, WavFileWriter::WriteToTarget); if (!m_writer->isOK()) { cerr << "WritableWaveFileModel: Error in creating WAV file writer: " << m_writer->getError() << endl; delete m_writer; m_writer = 0; return; } FileSource source(m_writer->getPath()); m_reader = new WavFileReader(source, true); if (!m_reader->getError().isEmpty()) { cerr << "WritableWaveFileModel: Error in creating wave file reader" << endl; delete m_reader; m_reader = 0; return; } m_model = new WaveFileModel(source, m_reader); if (!m_model->isOK()) { cerr << "WritableWaveFileModel: Error in creating wave file model" << endl; delete m_model; m_model = 0; delete m_reader; m_reader = 0; return; } m_model->setStartFrame(m_startFrame); connect(m_model, SIGNAL(modelChanged()), this, SIGNAL(modelChanged())); connect(m_model, SIGNAL(modelChanged(size_t, size_t)), this, SIGNAL(modelChanged(size_t, size_t))); } WritableWaveFileModel::~WritableWaveFileModel() { delete m_model; delete m_writer; delete m_reader; } void WritableWaveFileModel::setStartFrame(size_t startFrame) { m_startFrame = startFrame; if (m_model) m_model->setStartFrame(startFrame); } bool WritableWaveFileModel::addSamples(float **samples, size_t count) { if (!m_writer) return false; #ifdef DEBUG_WRITABLE_WAVE_FILE_MODEL // SVDEBUG << "WritableWaveFileModel::addSamples(" << count << ")" << endl; #endif if (!m_writer->writeSamples(samples, count)) { cerr << "ERROR: WritableWaveFileModel::addSamples: writer failed: " << m_writer->getError() << endl; return false; } m_frameCount += count; static int updateCounter = 0; if (m_reader && m_reader->getChannelCount() == 0) { #ifdef DEBUG_WRITABLE_WAVE_FILE_MODEL SVDEBUG << "WritableWaveFileModel::addSamples(" << count << "): calling updateFrameCount (initial)" << endl; #endif m_reader->updateFrameCount(); } else if (++updateCounter == 100) { #ifdef DEBUG_WRITABLE_WAVE_FILE_MODEL SVDEBUG << "WritableWaveFileModel::addSamples(" << count << "): calling updateFrameCount (periodic)" << endl; #endif if (m_reader) m_reader->updateFrameCount(); updateCounter = 0; } return true; } bool WritableWaveFileModel::isOK() const { bool ok = (m_writer && m_writer->isOK()); // SVDEBUG << "WritableWaveFileModel::isOK(): ok = " << ok << endl; return ok; } bool WritableWaveFileModel::isReady(int *completion) const { if (completion) *completion = m_completion; return (m_completion == 100); } void WritableWaveFileModel::setCompletion(int completion) { m_completion = completion; if (completion == 100) { if (m_reader) m_reader->updateDone(); } } size_t WritableWaveFileModel::getFrameCount() const { // SVDEBUG << "WritableWaveFileModel::getFrameCount: count = " << m_frameCount << endl; return m_frameCount; } Model * WritableWaveFileModel::clone() const { assert(0); //!!! return 0; } size_t WritableWaveFileModel::getData(int channel, size_t start, size_t count, float *buffer) const { if (!m_model || m_model->getChannelCount() == 0) return 0; return m_model->getData(channel, start, count, buffer); } size_t WritableWaveFileModel::getData(int channel, size_t start, size_t count, double *buffer) const { if (!m_model || m_model->getChannelCount() == 0) return 0; return m_model->getData(channel, start, count, buffer); } size_t WritableWaveFileModel::getData(size_t fromchannel, size_t tochannel, size_t start, size_t count, float **buffers) const { if (!m_model || m_model->getChannelCount() == 0) return 0; return m_model->getData(fromchannel, tochannel, start, count, buffers); } size_t WritableWaveFileModel::getSummaryBlockSize(size_t desired) const { if (!m_model) return desired; return m_model->getSummaryBlockSize(desired); } void WritableWaveFileModel::getSummaries(size_t channel, size_t start, size_t count, RangeBlock &ranges, size_t &blockSize) const { ranges.clear(); if (!m_model || m_model->getChannelCount() == 0) return; m_model->getSummaries(channel, start, count, ranges, blockSize); } WritableWaveFileModel::Range WritableWaveFileModel::getSummary(size_t channel, size_t start, size_t count) const { if (!m_model || m_model->getChannelCount() == 0) return Range(); return m_model->getSummary(channel, start, count); } void WritableWaveFileModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { // We don't actually write the data to XML. We just write a brief // description of the model. Any code that uses this class is // going to need to be aware that it will have to make separate // arrangements for the audio file itself. Model::toXml (out, indent, QString("type=\"writablewavefile\" file=\"%1\" channels=\"%2\" %3") .arg(encodeEntities(m_writer->getPath())) .arg(m_model->getChannelCount()).arg(extraAttributes)); } sonic-visualiser-2.3~repack1.orig/svcore/data/model/EditableDenseThreeDimensionalModel.cpp0000644000175000017500000003473012252354725030603 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "EditableDenseThreeDimensionalModel.h" #include "base/LogRange.h" #include #include #include #include #include #include #include #include "system/System.h" EditableDenseThreeDimensionalModel::EditableDenseThreeDimensionalModel(size_t sampleRate, size_t resolution, size_t yBinCount, CompressionType compression, bool notifyOnAdd) : m_startFrame(0), m_sampleRate(sampleRate), m_resolution(resolution), m_yBinCount(yBinCount), m_compression(compression), m_minimum(0.0), m_maximum(0.0), m_haveExtents(false), m_notifyOnAdd(notifyOnAdd), m_sinceLastNotifyMin(-1), m_sinceLastNotifyMax(-1), m_completion(100) { } bool EditableDenseThreeDimensionalModel::isOK() const { return true; } size_t EditableDenseThreeDimensionalModel::getSampleRate() const { return m_sampleRate; } size_t EditableDenseThreeDimensionalModel::getStartFrame() const { return m_startFrame; } void EditableDenseThreeDimensionalModel::setStartFrame(size_t f) { m_startFrame = f; } size_t EditableDenseThreeDimensionalModel::getEndFrame() const { return m_resolution * m_data.size() + (m_resolution - 1); } Model * EditableDenseThreeDimensionalModel::clone() const { QReadLocker locker(&m_lock); EditableDenseThreeDimensionalModel *model = new EditableDenseThreeDimensionalModel (m_sampleRate, m_resolution, m_yBinCount, m_compression); model->m_minimum = m_minimum; model->m_maximum = m_maximum; model->m_haveExtents = m_haveExtents; for (size_t i = 0; i < m_data.size(); ++i) { model->setColumn(i, m_data.at(i)); } return model; } size_t EditableDenseThreeDimensionalModel::getResolution() const { return m_resolution; } void EditableDenseThreeDimensionalModel::setResolution(size_t sz) { m_resolution = sz; } size_t EditableDenseThreeDimensionalModel::getWidth() const { return m_data.size(); } size_t EditableDenseThreeDimensionalModel::getHeight() const { return m_yBinCount; } void EditableDenseThreeDimensionalModel::setHeight(size_t sz) { m_yBinCount = sz; } float EditableDenseThreeDimensionalModel::getMinimumLevel() const { return m_minimum; } void EditableDenseThreeDimensionalModel::setMinimumLevel(float level) { m_minimum = level; } float EditableDenseThreeDimensionalModel::getMaximumLevel() const { return m_maximum; } void EditableDenseThreeDimensionalModel::setMaximumLevel(float level) { m_maximum = level; } EditableDenseThreeDimensionalModel::Column EditableDenseThreeDimensionalModel::getColumn(size_t index) const { QReadLocker locker(&m_lock); if (index >= m_data.size()) return Column(); return expandAndRetrieve(index); } float EditableDenseThreeDimensionalModel::getValueAt(size_t index, size_t n) const { Column c = getColumn(index); if (n < c.size()) return c.at(n); return m_minimum; } //static int given = 0, stored = 0; void EditableDenseThreeDimensionalModel::truncateAndStore(size_t index, const Column &values) { assert(index < m_data.size()); //cout << "truncateAndStore(" << index << ", " << values.size() << ")" << endl; // The default case is to store the entire column at m_data[index] // and place 0 at m_trunc[index] to indicate that it has not been // truncated. We only do clever stuff if one of the clever-stuff // tests works out. m_trunc[index] = 0; if (index == 0 || m_compression == NoCompression || values.size() != m_yBinCount) { // given += values.size(); // stored += values.size(); m_data[index] = values; return; } // Maximum distance between a column and the one we refer to as // the source of its truncated values. Limited by having to fit // in a signed char, but in any case small values are usually // better static int maxdist = 6; bool known = false; // do we know whether to truncate at top or bottom? bool top = false; // if we do know, will we truncate at top? // If the previous column is not truncated, then it is the only // candidate for comparison. If it is truncated, then the column // that it refers to is the only candidate. Either way, we only // have one possible column to compare against here, and we are // being careful to ensure it is not a truncated one (to avoid // doing more work recursively when uncompressing). int tdist = 1; int ptrunc = m_trunc[index-1]; if (ptrunc < 0) { top = false; known = true; tdist = -ptrunc + 1; } else if (ptrunc > 0) { top = true; known = true; tdist = ptrunc + 1; } Column p = expandAndRetrieve(index - tdist); int h = m_yBinCount; if (p.size() == h && tdist <= maxdist) { int bcount = 0, tcount = 0; if (!known || !top) { // count how many identical values there are at the bottom for (int i = 0; i < h; ++i) { if (values.at(i) == p.at(i)) ++bcount; else break; } } if (!known || top) { // count how many identical values there are at the top for (int i = h; i > 0; --i) { if (values.at(i-1) == p.at(i-1)) ++tcount; else break; } } if (!known) top = (tcount > bcount); int limit = h / 4; // don't bother unless we have at least this many if ((top ? tcount : bcount) > limit) { if (!top) { // create a new column with h - bcount values from bcount up Column tcol(h - bcount); // given += values.size(); // stored += h - bcount; for (int i = bcount; i < h; ++i) { tcol[i - bcount] = values.at(i); } m_data[index] = tcol; m_trunc[index] = -tdist; return; } else { // create a new column with h - tcount values from 0 up Column tcol(h - tcount); // given += values.size(); // stored += h - tcount; for (int i = 0; i < h - tcount; ++i) { tcol[i] = values.at(i); } m_data[index] = tcol; m_trunc[index] = tdist; return; } } } // given += values.size(); // stored += values.size(); // cout << "given: " << given << ", stored: " << stored << " (" // << ((float(stored) / float(given)) * 100.f) << "%)" << endl; // default case if nothing wacky worked out m_data[index] = values; return; } EditableDenseThreeDimensionalModel::Column EditableDenseThreeDimensionalModel::expandAndRetrieve(size_t index) const { // See comment above m_trunc declaration in header assert(index < m_data.size()); Column c = m_data.at(index); if (index == 0) { return c; } int trunc = (int)m_trunc[index]; if (trunc == 0) { return c; } bool top = true; int tdist = trunc; if (trunc < 0) { top = false; tdist = -trunc; } Column p = expandAndRetrieve(index - tdist); int psize = p.size(), csize = c.size(); if (psize != m_yBinCount) { cerr << "WARNING: EditableDenseThreeDimensionalModel::expandAndRetrieve: Trying to expand from incorrectly sized column" << endl; } if (top) { for (int i = csize; i < psize; ++i) { c.push_back(p.at(i)); } } else { // push_front is very slow on QVector -- but not enough to // make it desirable to choose a different container, since // QVector has all the other advantages for us. easier to // write the whole array out to a new vector Column cc(psize); for (int i = 0; i < psize - csize; ++i) { cc[i] = p.at(i); } for (int i = 0; i < csize; ++i) { cc[i + (psize - csize)] = c.at(i); } return cc; } return c; } void EditableDenseThreeDimensionalModel::setColumn(size_t index, const Column &values) { QWriteLocker locker(&m_lock); while (index >= m_data.size()) { m_data.push_back(Column()); m_trunc.push_back(0); } bool allChange = false; // if (values.size() > m_yBinCount) m_yBinCount = values.size(); for (size_t i = 0; i < values.size(); ++i) { float value = values[i]; if (ISNAN(value) || ISINF(value)) { continue; } if (!m_haveExtents || value < m_minimum) { m_minimum = value; allChange = true; } if (!m_haveExtents || value > m_maximum) { m_maximum = value; allChange = true; } m_haveExtents = true; } truncateAndStore(index, values); // assert(values == expandAndRetrieve(index)); long windowStart = index; windowStart *= m_resolution; if (m_notifyOnAdd) { if (allChange) { emit modelChanged(); } else { emit modelChanged(windowStart, windowStart + m_resolution); } } else { if (allChange) { m_sinceLastNotifyMin = -1; m_sinceLastNotifyMax = -1; emit modelChanged(); } else { if (m_sinceLastNotifyMin == -1 || windowStart < m_sinceLastNotifyMin) { m_sinceLastNotifyMin = windowStart; } if (m_sinceLastNotifyMax == -1 || windowStart > m_sinceLastNotifyMax) { m_sinceLastNotifyMax = windowStart; } } } } QString EditableDenseThreeDimensionalModel::getBinName(size_t n) const { if (m_binNames.size() > n) return m_binNames[n]; else return ""; } void EditableDenseThreeDimensionalModel::setBinName(size_t n, QString name) { while (m_binNames.size() <= n) m_binNames.push_back(""); m_binNames[n] = name; emit modelChanged(); } void EditableDenseThreeDimensionalModel::setBinNames(std::vector names) { m_binNames = names; emit modelChanged(); } bool EditableDenseThreeDimensionalModel::shouldUseLogValueScale() const { QReadLocker locker(&m_lock); QVector sample; QVector n; for (int i = 0; i < 10; ++i) { size_t index = i * 10; if (index < m_data.size()) { const Column &c = m_data.at(index); while (c.size() > sample.size()) { sample.push_back(0.f); n.push_back(0); } for (int j = 0; j < c.size(); ++j) { sample[j] += c.at(j); ++n[j]; } } } if (sample.empty()) return false; for (int j = 0; j < sample.size(); ++j) { if (n[j]) sample[j] /= n[j]; } return LogRange::useLogScale(sample.toStdVector()); } void EditableDenseThreeDimensionalModel::setCompletion(int completion, bool update) { if (m_completion != completion) { m_completion = completion; if (completion == 100) { m_notifyOnAdd = true; // henceforth emit modelChanged(); } else if (!m_notifyOnAdd) { if (update && m_sinceLastNotifyMin >= 0 && m_sinceLastNotifyMax >= 0) { emit modelChanged(m_sinceLastNotifyMin, m_sinceLastNotifyMax + m_resolution); m_sinceLastNotifyMin = m_sinceLastNotifyMax = -1; } else { emit completionChanged(); } } else { emit completionChanged(); } } } QString EditableDenseThreeDimensionalModel::toDelimitedDataString(QString delimiter) const { QReadLocker locker(&m_lock); QString s; for (size_t i = 0; i < m_data.size(); ++i) { QStringList list; for (size_t j = 0; j < m_data.at(i).size(); ++j) { list << QString("%1").arg(m_data.at(i).at(j)); } s += list.join(delimiter) + "\n"; } return s; } QString EditableDenseThreeDimensionalModel::toDelimitedDataString(QString delimiter, size_t f0, size_t f1) const { QReadLocker locker(&m_lock); QString s; for (size_t i = 0; i < m_data.size(); ++i) { size_t fr = m_startFrame + i * m_resolution; if (fr >= f0 && fr < f1) { QStringList list; for (size_t j = 0; j < m_data.at(i).size(); ++j) { list << QString("%1").arg(m_data.at(i).at(j)); } s += list.join(delimiter) + "\n"; } } return s; } void EditableDenseThreeDimensionalModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { QReadLocker locker(&m_lock); // For historical reasons we read and write "resolution" as "windowSize" SVDEBUG << "EditableDenseThreeDimensionalModel::toXml" << endl; Model::toXml (out, indent, QString("type=\"dense\" dimensions=\"3\" windowSize=\"%1\" yBinCount=\"%2\" minimum=\"%3\" maximum=\"%4\" dataset=\"%5\" startFrame=\"%6\" %7") .arg(m_resolution) .arg(m_yBinCount) .arg(m_minimum) .arg(m_maximum) .arg(getObjectExportId(&m_data)) .arg(m_startFrame) .arg(extraAttributes)); out << indent; out << QString("\n") .arg(getObjectExportId(&m_data)); for (size_t i = 0; i < m_binNames.size(); ++i) { if (m_binNames[i] != "") { out << indent + " "; out << QString("\n") .arg(i).arg(m_binNames[i]); } } for (size_t i = 0; i < m_data.size(); ++i) { out << indent + " "; out << QString("").arg(i); for (size_t j = 0; j < m_data.at(i).size(); ++j) { if (j > 0) out << " "; out << m_data.at(i).at(j); } out << QString("\n"); out.flush(); } out << indent + "\n"; } sonic-visualiser-2.3~repack1.orig/svcore/data/model/Model.h0000644000175000017500000002135712252354725022465 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _MODEL_H_ #define _MODEL_H_ #include #include #include "base/XmlExportable.h" #include "base/Playable.h" typedef std::vector SampleBlock; class ZoomConstraint; class AlignmentModel; /** * Model is the base class for all data models that represent any sort * of data on a time scale based on an audio frame rate. */ class Model : public QObject, public XmlExportable, public Playable { Q_OBJECT public: virtual ~Model(); /** * Return true if the model was constructed successfully. Classes * that refer to the model should always test this before use. */ virtual bool isOK() const = 0; /** * Return the first audio frame spanned by the model. */ virtual size_t getStartFrame() const = 0; /** * Return the last audio frame spanned by the model. */ virtual size_t getEndFrame() const = 0; /** * Return the frame rate in frames per second. */ virtual size_t getSampleRate() const = 0; /** * Return the frame rate of the underlying material, if the model * itself has already been resampled. */ virtual size_t getNativeRate() const { return getSampleRate(); } /** * Return the "work title" of the model, if known. */ virtual QString getTitle() const; /** * Return the "artist" or "maker" of the model, if known. */ virtual QString getMaker() const; /** * Return the location of the data in this model (e.g. source * URL). This should not normally be returned for editable models * that have been edited. */ virtual QString getLocation() const; /** * Return the type of the model. For display purposes only. */ virtual QString getTypeName() const = 0; /** * Return a copy of this model. * * If the model is not editable, this may be effectively a shallow * copy. If the model is editable, however, this operation must * properly copy all of the model's editable data. * * In general this operation is not useful for non-editable dense * models such as waveforms, because there may be no efficient * copy operation implemented -- for such models it is better not * to copy at all. * * Caller owns the returned value. */ virtual Model *clone() const = 0; /** * Return true if the model has finished loading or calculating * all its data, for a model that is capable of calculating in a * background thread. The default implementation is appropriate * for a thread that does not background any work but carries out * all its calculation from the constructor or accessors. * * If "completion" is non-NULL, this function should return * through it an estimated percentage value showing how far * through the background operation it thinks it is (for progress * reporting). If it has no way to calculate progress, it may * return the special value COMPLETION_UNKNOWN. */ virtual bool isReady(int *completion = 0) const { bool ok = isOK(); if (completion) *completion = (ok ? 100 : 0); return ok; } static const int COMPLETION_UNKNOWN; /** * If this model imposes a zoom constraint, i.e. some limit to the * set of resolutions at which its data can meaningfully be * displayed, then return it. */ virtual const ZoomConstraint *getZoomConstraint() const { return 0; } /** * If this model was derived from another, return the model it was * derived from. The assumption is that the source model's * alignment will also apply to this model, unless some other * property (such as a specific alignment model set on this model) * indicates otherwise. */ virtual Model *getSourceModel() const { return m_sourceModel; } /** * Set the source model for this model. */ virtual void setSourceModel(Model *model); /** * Specify an aligment between this model's timeline and that of a * reference model. The alignment model records both the * reference and the alignment. This model takes ownership of the * alignment model. */ virtual void setAlignment(AlignmentModel *alignment); /** * Retrieve the alignment model for this model. This is not a * generally useful function, as the alignment you really want may * be performed by the source model instead. You should normally * use getAlignmentReference, alignToReference and * alignFromReference instead of this. The main intended * application for this function is in streaming out alignments to * the session file. */ virtual const AlignmentModel *getAlignment() const; /** * Return the reference model for the current alignment timeline, * if any. */ virtual const Model *getAlignmentReference() const; /** * Return the frame number of the reference model that corresponds * to the given frame number in this model. */ virtual size_t alignToReference(size_t frame) const; /** * Return the frame number in this model that corresponds to the * given frame number of the reference model. */ virtual size_t alignFromReference(size_t referenceFrame) const; /** * Return the completion percentage for the alignment model: 100 * if there is no alignment model or it has been entirely * calculated, or less than 100 if it is still being calculated. */ virtual int getAlignmentCompletion() const; /** * Set the event, feature, or signal type URI for the features * contained in this model, according to the Audio Features RDF * ontology. */ void setRDFTypeURI(QString uri) { m_typeUri = uri; } /** * Retrieve the event, feature, or signal type URI for the * features contained in this model, if previously set with * setRDFTypeURI. */ QString getRDFTypeURI() const { return m_typeUri; } virtual void toXml(QTextStream &stream, QString indent = "", QString extraAttributes = "") const; virtual QString toDelimitedDataString(QString delimiter) const { return toDelimitedDataString(delimiter, getStartFrame(), getEndFrame()); } virtual QString toDelimitedDataString(QString, size_t f0, size_t f1) const { return ""; } public slots: void aboutToDelete(); void sourceModelAboutToBeDeleted(); signals: /** * Emitted when a model has been edited (or more data retrieved * from cache, in the case of a cached model that generates slowly) */ void modelChanged(); /** * Emitted when a model has been edited (or more data retrieved * from cache, in the case of a cached model that generates slowly) */ void modelChanged(size_t startFrame, size_t endFrame); /** * Emitted when some internal processing has advanced a stage, but * the model has not changed externally. Views should respond by * updating any progress meters or other monitoring, but not * refreshing the actual view. */ void completionChanged(); /** * Emitted when internal processing is complete (i.e. when * isReady() would return true, with completion at 100). */ void ready(); /** * Emitted when the completion percentage changes for the * calculation of this model's alignment model. */ void alignmentCompletionChanged(); /** * Emitted when something notifies this model (through calling * aboutToDelete() that it is about to delete it. Note that this * depends on an external agent such as a Document object or * owning model telling the model that it is about to delete it; * there is nothing in the model to guarantee that this signal * will be emitted before the actual deletion. */ void aboutToBeDeleted(); protected: Model() : m_sourceModel(0), m_alignment(0), m_aboutToDelete(false) { } // Not provided. Model(const Model &); Model &operator=(const Model &); Model *m_sourceModel; AlignmentModel *m_alignment; QString m_typeUri; bool m_aboutToDelete; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/AggregateWaveModel.cpp0000644000175000017500000001375612252354725025456 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "AggregateWaveModel.h" #include #include PowerOfSqrtTwoZoomConstraint AggregateWaveModel::m_zoomConstraint; AggregateWaveModel::AggregateWaveModel(ChannelSpecList channelSpecs) : m_components(channelSpecs) { for (ChannelSpecList::const_iterator i = channelSpecs.begin(); i != channelSpecs.end(); ++i) { if (i->model->getSampleRate() != channelSpecs.begin()->model->getSampleRate()) { SVDEBUG << "AggregateWaveModel::AggregateWaveModel: WARNING: Component models do not all have the same sample rate" << endl; break; } } } AggregateWaveModel::~AggregateWaveModel() { } bool AggregateWaveModel::isOK() const { for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { if (!i->model->isOK()) return false; } return true; } bool AggregateWaveModel::isReady(int *completion) const { if (completion) *completion = 100; bool ready = true; for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { int completionHere = 100; if (!i->model->isReady(&completionHere)) ready = false; if (completion && completionHere < *completion) { *completion = completionHere; } } return ready; } size_t AggregateWaveModel::getFrameCount() const { size_t count = 0; for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { size_t thisCount = i->model->getEndFrame() - i->model->getStartFrame(); if (thisCount > count) count = thisCount; } return count; } size_t AggregateWaveModel::getChannelCount() const { return m_components.size(); } size_t AggregateWaveModel::getSampleRate() const { if (m_components.empty()) return 0; return m_components.begin()->model->getSampleRate(); } Model * AggregateWaveModel::clone() const { return new AggregateWaveModel(m_components); } size_t AggregateWaveModel::getData(int channel, size_t start, size_t count, float *buffer) const { int ch0 = channel, ch1 = channel; bool mixing = false; if (channel == -1) { ch0 = 0; ch1 = getChannelCount()-1; mixing = true; } float *readbuf = buffer; if (mixing) { readbuf = new float[count]; for (size_t i = 0; i < count; ++i) { buffer[i] = 0.f; } } size_t sz = count; for (int c = ch0; c <= ch1; ++c) { size_t szHere = m_components[c].model->getData(m_components[c].channel, start, count, readbuf); if (szHere < sz) sz = szHere; if (mixing) { for (size_t i = 0; i < count; ++i) { buffer[i] += readbuf[i]; } } } if (mixing) delete[] readbuf; return sz; } size_t AggregateWaveModel::getData(int channel, size_t start, size_t count, double *buffer) const { int ch0 = channel, ch1 = channel; bool mixing = false; if (channel == -1) { ch0 = 0; ch1 = getChannelCount()-1; mixing = true; } double *readbuf = buffer; if (mixing) { readbuf = new double[count]; for (size_t i = 0; i < count; ++i) { buffer[i] = 0.0; } } size_t sz = count; for (int c = ch0; c <= ch1; ++c) { size_t szHere = m_components[c].model->getData(m_components[c].channel, start, count, readbuf); if (szHere < sz) sz = szHere; if (mixing) { for (size_t i = 0; i < count; ++i) { buffer[i] += readbuf[i]; } } } if (mixing) delete[] readbuf; return sz; } size_t AggregateWaveModel::getData(size_t fromchannel, size_t tochannel, size_t start, size_t count, float **buffer) const { size_t min = count; for (size_t c = fromchannel; c <= tochannel; ++c) { size_t here = getData(c, start, count, buffer[c - fromchannel]); if (here < min) min = here; } return min; } size_t AggregateWaveModel::getSummaryBlockSize(size_t desired) const { //!!! complete return desired; } void AggregateWaveModel::getSummaries(size_t channel, size_t start, size_t count, RangeBlock &ranges, size_t &blockSize) const { //!!! complete } AggregateWaveModel::Range AggregateWaveModel::getSummary(size_t channel, size_t start, size_t count) const { //!!! complete return Range(); } size_t AggregateWaveModel::getComponentCount() const { return m_components.size(); } AggregateWaveModel::ModelChannelSpec AggregateWaveModel::getComponent(size_t c) const { return m_components[c]; } void AggregateWaveModel::componentModelChanged() { emit modelChanged(); } void AggregateWaveModel::componentModelChanged(size_t start, size_t end) { emit modelChanged(start, end); } void AggregateWaveModel::componentModelCompletionChanged() { emit completionChanged(); } void AggregateWaveModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { //!!! complete } sonic-visualiser-2.3~repack1.orig/svcore/data/model/SparseModel.h0000644000175000017500000006046412252354725023645 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SPARSE_MODEL_H_ #define _SPARSE_MODEL_H_ #include "Model.h" #include "TabularModel.h" #include "base/Command.h" #include "base/RealTime.h" #include #include #include #include #include #include #include #include /** * Model containing sparse data (points with some properties). The * properties depend on the point type. */ template class SparseModel : public Model, public TabularModel { public: SparseModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true); virtual ~SparseModel() { } virtual bool isOK() const { return true; } virtual size_t getStartFrame() const; virtual size_t getEndFrame() const; virtual size_t getSampleRate() const { return m_sampleRate; } virtual Model *clone() const; // Number of frames of the underlying sample rate that this model // is capable of resolving to. For example, if m_resolution == 10 // then every point in this model will be at a multiple of 10 // sample frames and should be considered to cover a window ending // 10 sample frames later. virtual size_t getResolution() const { return m_resolution ? m_resolution : 1; } virtual void setResolution(size_t resolution); typedef PointType Point; typedef std::multiset PointList; typedef typename PointList::iterator PointListIterator; typedef typename PointList::const_iterator PointListConstIterator; /** * Return whether the model is empty or not. */ virtual bool isEmpty() const; /** * Get the total number of points in the model. */ virtual size_t getPointCount() const; /** * Get all points. */ virtual const PointList &getPoints() const; /** * Get all of the points in this model between the given * boundaries (in frames), as well as up to two points before and * after the boundaries. If you need exact boundaries, check the * point coordinates in the returned list. */ virtual PointList getPoints(long start, long end) const; /** * Get all points that cover the given frame number, taking the * resolution of the model into account. */ virtual PointList getPoints(long frame) const; /** * Return all points that share the nearest frame number prior to * the given one at which there are any points. */ virtual PointList getPreviousPoints(long frame) const; /** * Return all points that share the nearest frame number * subsequent to the given one at which there are any points. */ virtual PointList getNextPoints(long frame) const; /** * Remove all points. */ virtual void clear(); /** * Add a point. */ virtual void addPoint(const PointType &point); /** * Remove a point. Points are not necessarily unique, so this * function will remove the first point that compares equal to the * supplied one using Point::Comparator. Other identical points * may remain in the model. */ virtual void deletePoint(const PointType &point); virtual bool isReady(int *completion = 0) const { bool ready = isOK() && (m_completion == 100); if (completion) *completion = m_completion; return ready; } virtual void setCompletion(int completion, bool update = true); virtual int getCompletion() const { return m_completion; } virtual bool hasTextLabels() const { return m_hasTextLabels; } QString getTypeName() const { return tr("Sparse"); } virtual QString getXmlOutputType() const { return "sparse"; } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; virtual QString toDelimitedDataString(QString delimiter) const { QString s; for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { s += i->toDelimitedDataString(delimiter, m_sampleRate) + "\n"; } return s; } virtual QString toDelimitedDataString(QString delimiter, size_t f0, size_t f1) const { QString s; for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { if (i->frame >= (long)f0 && i->frame < (long)f1) { s += i->toDelimitedDataString(delimiter, m_sampleRate) + "\n"; } } return s; } /** * Command to add a point, with undo. */ class AddPointCommand : public Command { public: AddPointCommand(SparseModel *model, const PointType &point, QString name = "") : m_model(model), m_point(point), m_name(name) { } virtual QString getName() const { return (m_name == "" ? tr("Add Point") : m_name); } virtual void execute() { m_model->addPoint(m_point); } virtual void unexecute() { m_model->deletePoint(m_point); } const PointType &getPoint() const { return m_point; } private: SparseModel *m_model; PointType m_point; QString m_name; }; /** * Command to remove a point, with undo. */ class DeletePointCommand : public Command { public: DeletePointCommand(SparseModel *model, const PointType &point) : m_model(model), m_point(point) { } virtual QString getName() const { return tr("Delete Point"); } virtual void execute() { m_model->deletePoint(m_point); } virtual void unexecute() { m_model->addPoint(m_point); } const PointType &getPoint() const { return m_point; } private: SparseModel *m_model; PointType m_point; }; /** * Command to add or remove a series of points, with undo. * Consecutive add/remove pairs for the same point are collapsed. */ class EditCommand : public MacroCommand { public: EditCommand(SparseModel *model, QString commandName); virtual void addPoint(const PointType &point); virtual void deletePoint(const PointType &point); /** * Stack an arbitrary other command in the same sequence. */ virtual void addCommand(Command *command) { addCommand(command, true); } /** * If any points have been added or deleted, return this * command (so the caller can add it to the command history). * Otherwise delete the command and return NULL. */ virtual EditCommand *finish(); protected: virtual void addCommand(Command *command, bool executeFirst); SparseModel *m_model; }; /** * Command to relabel a point. */ class RelabelCommand : public Command { public: RelabelCommand(SparseModel *model, const PointType &point, QString newLabel) : m_model(model), m_oldPoint(point), m_newPoint(point) { m_newPoint.label = newLabel; } virtual QString getName() const { return tr("Re-Label Point"); } virtual void execute() { m_model->deletePoint(m_oldPoint); m_model->addPoint(m_newPoint); std::swap(m_oldPoint, m_newPoint); } virtual void unexecute() { execute(); } private: SparseModel *m_model; PointType m_oldPoint; PointType m_newPoint; }; /** * TabularModel methods. */ virtual int getRowCount() const { return m_points.size(); } virtual long getFrameForRow(int row) const { PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; return i->frame; } virtual int getRowForFrame(long frame) const { if (m_rows.empty()) rebuildRowVector(); std::vector::iterator i = std::lower_bound(m_rows.begin(), m_rows.end(), frame); #if defined(__SUNPRO_CC) && defined(__STD_RW_ITERATOR__) int row = 0; std::distance(m_rows.begin(), i, row); #else int row = std::distance(m_rows.begin(), i); #endif if (i != m_rows.begin() && (i == m_rows.end() || *i != frame)) { --row; } return row; } virtual int getColumnCount() const { return 1; } virtual QVariant getData(int row, int column, int role) const { PointListConstIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return QVariant(); switch (column) { case 0: { if (role == SortRole) return int(i->frame); RealTime rt = RealTime::frame2RealTime(i->frame, getSampleRate()); if (role == Qt::EditRole) return rt.toString().c_str(); else return rt.toText().c_str(); } case 1: return int(i->frame); } return QVariant(); } virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role) { if (role != Qt::EditRole) return 0; PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; EditCommand *command = new EditCommand(this, tr("Edit Data")); Point point(*i); command->deletePoint(point); switch (column) { case 0: point.frame = lrint(value.toDouble() * getSampleRate()); break; case 1: point.frame = value.toInt(); break; } command->addPoint(point); return command->finish(); } virtual Command *getInsertRowCommand(int row) { EditCommand *command = new EditCommand(this, tr("Insert Data Point")); Point point(0); PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end() && i != m_points.begin()) --i; if (i != m_points.end()) point = *i; command->addPoint(point); return command->finish(); } virtual Command *getRemoveRowCommand(int row) { EditCommand *command = new EditCommand(this, tr("Delete Data Point")); PointListIterator i = getPointListIteratorForRow(row); if (i == m_points.end()) return 0; command->deletePoint(*i); return command->finish(); } protected: size_t m_sampleRate; size_t m_resolution; bool m_notifyOnAdd; long m_sinceLastNotifyMin; long m_sinceLastNotifyMax; bool m_hasTextLabels; PointList m_points; size_t m_pointCount; mutable QMutex m_mutex; int m_completion; void getPointIterators(long frame, PointListIterator &startItr, PointListIterator &endItr); void getPointIterators(long frame, PointListConstIterator &startItr, PointListConstIterator &endItr) const; // This is only used if the model is called on to act in // TabularModel mode mutable std::vector m_rows; // map from row number to frame void rebuildRowVector() const { m_rows.clear(); for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { // std::cerr << "rebuildRowVector: row " << m_rows.size() << " -> " << i->frame << std::endl; m_rows.push_back(i->frame); } } PointListIterator getPointListIteratorForRow(int row) { if (m_rows.empty()) rebuildRowVector(); if (row < 0 || row + 1 > int(m_rows.size())) return m_points.end(); size_t frame = m_rows[row]; int indexAtFrame = 0; int ri = row; while (ri > 0 && m_rows[ri-1] == m_rows[row]) { --ri; ++indexAtFrame; } int initialIndexAtFrame = indexAtFrame; PointListIterator i0, i1; getPointIterators(frame, i0, i1); PointListIterator i = i0; for (i = i0; i != i1; ++i) { if (i->frame < (int)frame) { continue; } if (indexAtFrame > 0) { --indexAtFrame; continue; } return i; } if (indexAtFrame > 0) { std::cerr << "WARNING: SparseModel::getPointListIteratorForRow: No iterator available for row " << row << " (frame = " << frame << ", index at frame = " << initialIndexAtFrame << ", leftover index " << indexAtFrame << ")" << std::endl; } return i; } PointListConstIterator getPointListIteratorForRow(int row) const { if (m_rows.empty()) rebuildRowVector(); if (row < 0 || row + 1 > int(m_rows.size())) return m_points.end(); size_t frame = m_rows[row]; int indexAtFrame = 0; int ri = row; while (ri > 0 && m_rows[ri-1] == m_rows[row]) { --ri; ++indexAtFrame; } int initialIndexAtFrame = indexAtFrame; // std::cerr << "getPointListIteratorForRow " << row << ": initialIndexAtFrame = " << initialIndexAtFrame << std::endl; PointListConstIterator i0, i1; getPointIterators(frame, i0, i1); PointListConstIterator i = i0; for (i = i0; i != i1; ++i) { // std::cerr << "i->frame is " << i->frame << ", wanting " << frame << std::endl; if (i->frame < (int)frame) { continue; } if (indexAtFrame > 0) { --indexAtFrame; continue; } return i; } // std::cerr << "returning i with i->frame = " << i->frame << std::endl; if (indexAtFrame > 0) { std::cerr << "WARNING: SparseModel::getPointListIteratorForRow: No iterator available for row " << row << " (frame = " << frame << ", index at frame = " << initialIndexAtFrame << ", leftover index " << indexAtFrame << ")" << std::endl; } return i; } }; template SparseModel::SparseModel(size_t sampleRate, size_t resolution, bool notifyOnAdd) : m_sampleRate(sampleRate), m_resolution(resolution), m_notifyOnAdd(notifyOnAdd), m_sinceLastNotifyMin(-1), m_sinceLastNotifyMax(-1), m_hasTextLabels(false), m_pointCount(0), m_completion(100) { } template size_t SparseModel::getStartFrame() const { QMutexLocker locker(&m_mutex); size_t f = 0; if (!m_points.empty()) { f = m_points.begin()->frame; } return f; } template size_t SparseModel::getEndFrame() const { QMutexLocker locker(&m_mutex); size_t f = 0; if (!m_points.empty()) { PointListConstIterator i(m_points.end()); f = (--i)->frame; } return f; } template Model * SparseModel::clone() const { return 0; //!!! is this ever used? /* SparseModel *model = new SparseModel(m_sampleRate, m_resolution, m_notifyOnAdd); model->m_points = m_points; model->m_pointCount = m_pointCount; return model; */ } template bool SparseModel::isEmpty() const { return m_pointCount == 0; } template size_t SparseModel::getPointCount() const { return m_pointCount; } template const typename SparseModel::PointList & SparseModel::getPoints() const { return m_points; } template typename SparseModel::PointList SparseModel::getPoints(long start, long end) const { if (start > end) return PointList(); QMutexLocker locker(&m_mutex); PointType startPoint(start), endPoint(end); PointListConstIterator startItr = m_points.lower_bound(startPoint); PointListConstIterator endItr = m_points.upper_bound(endPoint); if (startItr != m_points.begin()) --startItr; if (startItr != m_points.begin()) --startItr; if (endItr != m_points.end()) ++endItr; if (endItr != m_points.end()) ++endItr; PointList rv; for (PointListConstIterator i = startItr; i != endItr; ++i) { rv.insert(*i); } return rv; } template typename SparseModel::PointList SparseModel::getPoints(long frame) const { PointListConstIterator startItr, endItr; getPointIterators(frame, startItr, endItr); PointList rv; for (PointListConstIterator i = startItr; i != endItr; ++i) { rv.insert(*i); } return rv; } template void SparseModel::getPointIterators(long frame, PointListIterator &startItr, PointListIterator &endItr) { QMutexLocker locker(&m_mutex); if (m_resolution == 0) { startItr = m_points.end(); endItr = m_points.end(); return; } long start = (frame / m_resolution) * m_resolution; long end = start + m_resolution; PointType startPoint(start), endPoint(end); startItr = m_points.lower_bound(startPoint); endItr = m_points.upper_bound(endPoint); } template void SparseModel::getPointIterators(long frame, PointListConstIterator &startItr, PointListConstIterator &endItr) const { QMutexLocker locker(&m_mutex); if (m_resolution == 0) { // std::cerr << "getPointIterators: resolution == 0, returning end()" << std::endl; startItr = m_points.end(); endItr = m_points.end(); return; } long start = (frame / m_resolution) * m_resolution; long end = start + m_resolution; PointType startPoint(start), endPoint(end); // std::cerr << "getPointIterators: start frame " << start << ", end frame " << end << ", m_resolution " << m_resolution << std::endl; startItr = m_points.lower_bound(startPoint); endItr = m_points.upper_bound(endPoint); } template typename SparseModel::PointList SparseModel::getPreviousPoints(long originFrame) const { QMutexLocker locker(&m_mutex); PointType lookupPoint(originFrame); PointList rv; PointListConstIterator i = m_points.lower_bound(lookupPoint); if (i == m_points.begin()) return rv; --i; long frame = i->frame; while (i->frame == frame) { rv.insert(*i); if (i == m_points.begin()) break; --i; } return rv; } template typename SparseModel::PointList SparseModel::getNextPoints(long originFrame) const { QMutexLocker locker(&m_mutex); PointType lookupPoint(originFrame); PointList rv; PointListConstIterator i = m_points.upper_bound(lookupPoint); if (i == m_points.end()) return rv; long frame = i->frame; while (i != m_points.end() && i->frame == frame) { rv.insert(*i); ++i; } return rv; } template void SparseModel::setResolution(size_t resolution) { { QMutexLocker locker(&m_mutex); m_resolution = resolution; } m_rows.clear(); emit modelChanged(); } template void SparseModel::clear() { { QMutexLocker locker(&m_mutex); m_points.clear(); m_pointCount = 0; } m_rows.clear(); emit modelChanged(); } template void SparseModel::addPoint(const PointType &point) { { QMutexLocker locker(&m_mutex); m_points.insert(point); m_pointCount++; if (point.getLabel() != "") m_hasTextLabels = true; } // Even though this model is nominally sparse, there may still be // too many signals going on here (especially as they'll probably // be queued from one thread to another), which is why we need the // notifyOnAdd as an option rather than a necessity (the // alternative is to notify on setCompletion). if (m_notifyOnAdd) { m_rows.clear(); //!!! inefficient emit modelChanged(point.frame, point.frame + m_resolution); } else { if (m_sinceLastNotifyMin == -1 || point.frame < m_sinceLastNotifyMin) { m_sinceLastNotifyMin = point.frame; } if (m_sinceLastNotifyMax == -1 || point.frame > m_sinceLastNotifyMax) { m_sinceLastNotifyMax = point.frame; } } } template void SparseModel::deletePoint(const PointType &point) { { QMutexLocker locker(&m_mutex); PointListIterator i = m_points.lower_bound(point); typename PointType::Comparator comparator; while (i != m_points.end()) { if (i->frame > point.frame) break; if (!comparator(*i, point) && !comparator(point, *i)) { m_points.erase(i); m_pointCount--; break; } ++i; } } // std::cout << "SparseOneDimensionalModel: emit modelChanged(" // << point.frame << ")" << std::endl; m_rows.clear(); //!!! inefficient emit modelChanged(point.frame, point.frame + m_resolution); } template void SparseModel::setCompletion(int completion, bool update) { // std::cerr << "SparseModel::setCompletion(" << completion << ")" << std::endl; if (m_completion != completion) { m_completion = completion; if (completion == 100) { if (!m_notifyOnAdd) { emit completionChanged(); } m_notifyOnAdd = true; // henceforth m_rows.clear(); //!!! inefficient emit modelChanged(); } else if (!m_notifyOnAdd) { if (update && m_sinceLastNotifyMin >= 0 && m_sinceLastNotifyMax >= 0) { m_rows.clear(); //!!! inefficient emit modelChanged(m_sinceLastNotifyMin, m_sinceLastNotifyMax); m_sinceLastNotifyMin = m_sinceLastNotifyMax = -1; } else { emit completionChanged(); } } else { emit completionChanged(); } } } template void SparseModel::toXml(QTextStream &out, QString indent, QString extraAttributes) const { // std::cerr << "SparseModel::toXml: extraAttributes = \"" // << extraAttributes.toStdString() << std::endl; QString type = getXmlOutputType(); Model::toXml (out, indent, QString("type=\"%1\" dimensions=\"%2\" resolution=\"%3\" notifyOnAdd=\"%4\" dataset=\"%5\" %6") .arg(type) .arg(PointType(0).getDimensions()) .arg(m_resolution) .arg(m_notifyOnAdd ? "true" : "false") .arg(getObjectExportId(&m_points)) .arg(extraAttributes)); out << indent; out << QString("\n") .arg(getObjectExportId(&m_points)) .arg(PointType(0).getDimensions()); for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { i->toXml(out, indent + " "); } out << indent; out << "\n"; } template SparseModel::EditCommand::EditCommand(SparseModel *model, QString commandName) : MacroCommand(commandName), m_model(model) { } template void SparseModel::EditCommand::addPoint(const PointType &point) { addCommand(new AddPointCommand(m_model, point), true); } template void SparseModel::EditCommand::deletePoint(const PointType &point) { addCommand(new DeletePointCommand(m_model, point), true); } template typename SparseModel::EditCommand * SparseModel::EditCommand::finish() { if (!m_commands.empty()) { return this; } else { delete this; return 0; } } template void SparseModel::EditCommand::addCommand(Command *command, bool executeFirst) { if (executeFirst) command->execute(); if (!m_commands.empty()) { DeletePointCommand *dpc = dynamic_cast(command); if (dpc) { AddPointCommand *apc = dynamic_cast (m_commands[m_commands.size() - 1]); typename PointType::Comparator comparator; if (apc) { if (!comparator(apc->getPoint(), dpc->getPoint()) && !comparator(dpc->getPoint(), apc->getPoint())) { deleteCommand(apc); return; } } } } MacroCommand::addCommand(command); } #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/WaveFileModel.h0000644000175000017500000000752312252354725024107 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _WAVE_FILE_MODEL_H_ #define _WAVE_FILE_MODEL_H_ #include "base/Thread.h" #include #include #include "data/fileio/FileSource.h" #include "RangeSummarisableTimeValueModel.h" #include "PowerOfSqrtTwoZoomConstraint.h" #include class AudioFileReader; class WaveFileModel : public RangeSummarisableTimeValueModel { Q_OBJECT public: WaveFileModel(FileSource source, size_t targetRate = 0); WaveFileModel(FileSource source, AudioFileReader *reader); ~WaveFileModel(); bool isOK() const; bool isReady(int *) const; const ZoomConstraint *getZoomConstraint() const { return &m_zoomConstraint; } size_t getFrameCount() const; size_t getChannelCount() const; size_t getSampleRate() const; size_t getNativeRate() const; QString getTitle() const; QString getMaker() const; QString getLocation() const; virtual Model *clone() const; float getValueMinimum() const { return -1.0f; } float getValueMaximum() const { return 1.0f; } virtual size_t getStartFrame() const { return m_startFrame; } virtual size_t getEndFrame() const { return m_startFrame + getFrameCount(); } void setStartFrame(size_t startFrame) { m_startFrame = startFrame; } virtual size_t getData(int channel, size_t start, size_t count, float *buffer) const; virtual size_t getData(int channel, size_t start, size_t count, double *buffer) const; virtual size_t getData(size_t fromchannel, size_t tochannel, size_t start, size_t count, float **buffers) const; virtual size_t getSummaryBlockSize(size_t desired) const; virtual void getSummaries(size_t channel, size_t start, size_t count, RangeBlock &ranges, size_t &blockSize) const; virtual Range getSummary(size_t channel, size_t start, size_t count) const; QString getTypeName() const { return tr("Wave File"); } virtual void toXml(QTextStream &out, QString indent = "", QString extraAttributes = "") const; protected slots: void fillTimerTimedOut(); void cacheFilled(); protected: void initialize(); class RangeCacheFillThread : public Thread { public: RangeCacheFillThread(WaveFileModel &model) : m_model(model), m_fillExtent(0), m_frameCount(model.getFrameCount()) { } size_t getFillExtent() const { return m_fillExtent; } virtual void run(); protected: WaveFileModel &m_model; size_t m_fillExtent; size_t m_frameCount; }; void fillCache(); FileSource m_source; QString m_path; AudioFileReader *m_reader; bool m_myReader; size_t m_startFrame; RangeBlock m_cache[2]; // interleaved at two base resolutions mutable QMutex m_mutex; RangeCacheFillThread *m_fillThread; QTimer *m_updateTimer; size_t m_lastFillExtent; bool m_exiting; static PowerOfSqrtTwoZoomConstraint m_zoomConstraint; mutable SampleBlock m_directRead; mutable size_t m_lastDirectReadStart; mutable size_t m_lastDirectReadCount; mutable QMutex m_directReadMutex; }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/ModelDataTableModel.h0000644000175000017500000000514612252354725025206 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2008 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _MODEL_DATA_TABLE_MODEL_H_ #define _MODEL_DATA_TABLE_MODEL_H_ #include #include class TabularModel; class Command; class ModelDataTableModel : public QAbstractItemModel { Q_OBJECT public: ModelDataTableModel(TabularModel *m); virtual ~ModelDataTableModel(); QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); bool insertRow(int row, const QModelIndex &parent = QModelIndex()); bool removeRow(int row, const QModelIndex &parent = QModelIndex()); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QModelIndex getModelIndexForFrame(size_t frame) const; size_t getFrameForModelIndex(const QModelIndex &) const; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); QModelIndex findText(QString text) const; void setCurrentRow(int row); int getCurrentRow() const; signals: void frameSelected(size_t); void addCommand(Command *); void currentChanged(const QModelIndex &); void modelRemoved(); protected slots: void modelChanged(); void modelChanged(size_t, size_t); void modelAboutToBeDeleted(); protected: TabularModel *m_model; int m_sortColumn; Qt::SortOrder m_sortOrdering; int m_currentRow; typedef std::vector RowList; mutable RowList m_sort; mutable RowList m_rsort; int getSorted(int row) const; int getUnsorted(int row) const; void resort() const; void resortNumeric() const; void resortAlphabetical() const; void clearSort(); }; #endif sonic-visualiser-2.3~repack1.orig/svcore/data/model/AlignmentModel.cpp0000644000175000017500000002333212252354725024652 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2007 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "AlignmentModel.h" #include "SparseTimeValueModel.h" //#define DEBUG_ALIGNMENT_MODEL 1 AlignmentModel::AlignmentModel(Model *reference, Model *aligned, Model *inputModel, SparseTimeValueModel *path) : m_reference(reference), m_aligned(aligned), m_inputModel(inputModel), m_rawPath(path), m_path(0), m_reversePath(0), m_pathBegun(false), m_pathComplete(false) { if (m_rawPath) { connect(m_rawPath, SIGNAL(modelChanged()), this, SLOT(pathChanged())); connect(m_rawPath, SIGNAL(modelChanged(size_t, size_t)), this, SLOT(pathChanged(size_t, size_t))); connect(m_rawPath, SIGNAL(completionChanged()), this, SLOT(pathCompletionChanged())); constructPath(); constructReversePath(); } if (m_rawPath && m_rawPath->isReady()) { pathCompletionChanged(); } } AlignmentModel::~AlignmentModel() { if (m_inputModel) m_inputModel->aboutToDelete(); delete m_inputModel; if (m_rawPath) m_rawPath->aboutToDelete(); delete m_rawPath; if (m_path) m_path->aboutToDelete(); delete m_path; if (m_reversePath) m_reversePath->aboutToDelete(); delete m_reversePath; } bool AlignmentModel::isOK() const { if (m_rawPath) return m_rawPath->isOK(); else return true; } size_t AlignmentModel::getStartFrame() const { size_t a = m_reference->getStartFrame(); size_t b = m_aligned->getStartFrame(); return std::min(a, b); } size_t AlignmentModel::getEndFrame() const { size_t a = m_reference->getEndFrame(); size_t b = m_aligned->getEndFrame(); return std::max(a, b); } size_t AlignmentModel::getSampleRate() const { return m_reference->getSampleRate(); } Model * AlignmentModel::clone() const { return new AlignmentModel (m_reference, m_aligned, m_inputModel ? m_inputModel->clone() : 0, m_rawPath ? static_cast(m_rawPath->clone()) : 0); } bool AlignmentModel::isReady(int *completion) const { if (!m_pathBegun && m_rawPath) { if (completion) *completion = 0; return false; } if (m_pathComplete || !m_rawPath) { if (completion) *completion = 100; return true; } return m_rawPath->isReady(completion); } const ZoomConstraint * AlignmentModel::getZoomConstraint() const { return 0; } const Model * AlignmentModel::getReferenceModel() const { return m_reference; } const Model * AlignmentModel::getAlignedModel() const { return m_aligned; } size_t AlignmentModel::toReference(size_t frame) const { #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::toReference(" << frame << ")" << endl; #endif if (!m_path) { if (!m_rawPath) return frame; constructPath(); } return align(m_path, frame); } size_t AlignmentModel::fromReference(size_t frame) const { #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::fromReference(" << frame << ")" << endl; #endif if (!m_reversePath) { if (!m_rawPath) return frame; constructReversePath(); } return align(m_reversePath, frame); } void AlignmentModel::pathChanged() { if (m_pathComplete) { cerr << "AlignmentModel: deleting raw path model" << endl; if (m_rawPath) m_rawPath->aboutToDelete(); delete m_rawPath; m_rawPath = 0; } } void AlignmentModel::pathChanged(size_t, size_t) { if (!m_pathComplete) return; constructPath(); constructReversePath(); } void AlignmentModel::pathCompletionChanged() { if (!m_rawPath) return; m_pathBegun = true; if (!m_pathComplete) { int completion = 0; m_rawPath->isReady(&completion); #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::pathCompletionChanged: completion = " << completion << endl; #endif m_pathComplete = (completion == 100); if (m_pathComplete) { constructPath(); constructReversePath(); if (m_inputModel) m_inputModel->aboutToDelete(); delete m_inputModel; m_inputModel = 0; } } emit completionChanged(); } void AlignmentModel::constructPath() const { if (!m_path) { if (!m_rawPath) { cerr << "ERROR: AlignmentModel::constructPath: " << "No raw path available" << endl; return; } m_path = new PathModel (m_rawPath->getSampleRate(), m_rawPath->getResolution(), false); } else { if (!m_rawPath) return; } m_path->clear(); SparseTimeValueModel::PointList points = m_rawPath->getPoints(); for (SparseTimeValueModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { long frame = i->frame; float value = i->value; long rframe = lrintf(value * m_aligned->getSampleRate()); m_path->addPoint(PathPoint(frame, rframe)); } #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::constructPath: " << m_path->getPointCount() << " points, at least " << (2 * m_path->getPointCount() * (3 * sizeof(void *) + sizeof(int) + sizeof(PathPoint))) << " bytes" << endl; #endif } void AlignmentModel::constructReversePath() const { if (!m_reversePath) { if (!m_path) { cerr << "ERROR: AlignmentModel::constructReversePath: " << "No forward path available" << endl; return; } m_reversePath = new PathModel (m_path->getSampleRate(), m_path->getResolution(), false); } else { if (!m_path) return; } m_reversePath->clear(); PathModel::PointList points = m_path->getPoints(); for (PathModel::PointList::const_iterator i = points.begin(); i != points.end(); ++i) { long frame = i->frame; long rframe = i->mapframe; m_reversePath->addPoint(PathPoint(rframe, frame)); } #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::constructReversePath: " << m_reversePath->getPointCount() << " points, at least " << (2 * m_reversePath->getPointCount() * (3 * sizeof(void *) + sizeof(int) + sizeof(PathPoint))) << " bytes" << endl; #endif } size_t AlignmentModel::align(PathModel *path, size_t frame) const { if (!path) return frame; // The path consists of a series of points, each with frame equal // to the frame on the source model and mapframe equal to the // frame on the target model. Both should be monotonically // increasing. const PathModel::PointList &points = path->getPoints(); if (points.empty()) { #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::align: No points" << endl; #endif return frame; } #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::align: frame " << frame << " requested" << endl; #endif PathModel::Point point(frame); PathModel::PointList::const_iterator i = points.lower_bound(point); if (i == points.end()) { #ifdef DEBUG_ALIGNMENT_MODEL cerr << "Note: i == points.end()" << endl; #endif --i; } while (i != points.begin() && i->frame > long(frame)) --i; long foundFrame = i->frame; long foundMapFrame = i->mapframe; long followingFrame = foundFrame; long followingMapFrame = foundMapFrame; if (++i != points.end()) { #ifdef DEBUG_ALIGNMENT_MODEL cerr << "another point available" << endl; #endif followingFrame = i->frame; followingMapFrame = i->mapframe; } else { #ifdef DEBUG_ALIGNMENT_MODEL cerr << "no other point available" << endl; #endif } if (foundMapFrame < 0) return 0; size_t resultFrame = foundMapFrame; if (followingFrame != foundFrame && long(frame) > foundFrame) { float interp = float(frame - foundFrame) / float(followingFrame - foundFrame); resultFrame += lrintf((followingMapFrame - foundMapFrame) * interp); } #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::align: resultFrame = " << resultFrame << endl; #endif return resultFrame; } void AlignmentModel::setPath(PathModel *path) { if (m_path) m_path->aboutToDelete(); delete m_path; m_path = path; #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::setPath: path = " << m_path << endl; #endif constructReversePath(); #ifdef DEBUG_ALIGNMENT_MODEL SVDEBUG << "AlignmentModel::setPath: after construction path = " << m_path << ", rpath = " << m_reversePath << endl; #endif } void AlignmentModel::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { if (!m_path) { SVDEBUG << "AlignmentModel::toXml: no path" << endl; return; } m_path->toXml(stream, indent, ""); Model::toXml(stream, indent, QString("type=\"alignment\" reference=\"%1\" aligned=\"%2\" path=\"%3\" %4") .arg(getObjectExportId(m_reference)) .arg(getObjectExportId(m_aligned)) .arg(getObjectExportId(m_path)) .arg(extraAttributes)); } sonic-visualiser-2.3~repack1.orig/svcore/configure.ac0000644000175000017500000001062712252354725021527 0ustar miramira AC_INIT([SVcore], [2.1], cannam@all-day-breakfast.com) AC_CONFIG_SRCDIR(base/Pitch.h) # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi AC_LANG_CPLUSPLUS AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_MKDIR_P AC_HEADER_STDC # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" PKG_PROG_PKG_CONFIG SV_CHECK_QT SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_DEBUG="-Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe" CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe" CXXFLAGS_MINIMAL="-g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build]) QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"]) if test x"$USER_CXXFLAGS" != x; then AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".]) AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.) CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen]) SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute]) SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute]) SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open]) SV_MODULE_REQUIRED([samplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new]) SV_MODULE_REQUIRED([vamp],[vamp >= 2.1],[vamp/vamp.h],[],[]) SV_MODULE_REQUIRED([vamphostsdk],[vamp-hostsdk >= 2.5],[vamp-hostsdk/PluginLoader.h],[vamp-hostsdk],[libvamphostsdk_v_2_5_present]) SV_MODULE_REQUIRED([rubberband],[rubberband],[rubberband/RubberBandStretcher.h],[rubberband],[rubberband_new]) SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new]) SV_MODULE_OPTIONAL([portaudio_2_0],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported]) SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open]) SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new]) SV_MODULE_OPTIONAL([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init]) SV_MODULE_OPTIONAL([oggz],[oggz >= 1.0.0],[oggz/oggz.h],[oggz],[oggz_run]) SV_MODULE_OPTIONAL([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new]) SV_MODULE_OPTIONAL([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init]) SV_MODULE_OPTIONAL([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new]) AC_SUBST(PERL) AC_SUBST(XARGS) AC_SUBST(MAKEDEPEND) AC_SUBST(SHA1SUM) AC_SUBST(CUT) AC_SUBST(CFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(CXXFLAGS_MINIMAL) AC_SUBST(HAVES) AC_SUBST(LIBS) AC_SUBST(CC) AC_SUBST(CXX) AC_SUBST(QMAKE_CONFIG) AC_CONFIG_FILES([config.pri]) AC_OUTPUT if ! $QMAKE -r svcore.pro; then AC_MSG_ERROR([qmake failed: Command was "$QMAKE -r"]) fi AC_MSG_NOTICE([ Configuration complete. Please check the above messages for any warnings that you might care about, and then run "make". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run "$QMAKE -r" again to regenerate the Makefile. ]) sonic-visualiser-2.3~repack1.orig/svcore/configure0000755000175000017500000076360012252354725021156 0ustar miramira#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for SVcore 2.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: cannam@all-day-breakfast.com about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='SVcore' PACKAGE_TARNAME='svcore' PACKAGE_VERSION='2.1' PACKAGE_STRING='SVcore 2.1' PACKAGE_BUGREPORT='cannam@all-day-breakfast.com' PACKAGE_URL='' ac_unique_file="base/Pitch.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS QMAKE_CONFIG HAVES CXXFLAGS_MINIMAL CUT SHA1SUM MAKEDEPEND XARGS PERL id3tag_LIBS id3tag_CFLAGS mad_LIBS mad_CFLAGS fishsound_LIBS fishsound_CFLAGS oggz_LIBS oggz_CFLAGS lrdf_LIBS lrdf_CFLAGS libpulse_LIBS libpulse_CFLAGS JACK_LIBS JACK_CFLAGS portaudio_2_0_LIBS portaudio_2_0_CFLAGS liblo_LIBS liblo_CFLAGS rubberband_LIBS rubberband_CFLAGS vamphostsdk_LIBS vamphostsdk_CFLAGS vamp_LIBS vamp_CFLAGS samplerate_LIBS samplerate_CFLAGS sndfile_LIBS sndfile_CFLAGS fftw3f_LIBS fftw3f_CFLAGS fftw3_LIBS fftw3_CFLAGS bz2_LIBS bz2_CFLAGS QMAKE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG EGREP GREP CXXCPP MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM ac_ct_CXX CXXFLAGS CXX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR bz2_CFLAGS bz2_LIBS fftw3_CFLAGS fftw3_LIBS fftw3f_CFLAGS fftw3f_LIBS sndfile_CFLAGS sndfile_LIBS samplerate_CFLAGS samplerate_LIBS vamp_CFLAGS vamp_LIBS vamphostsdk_CFLAGS vamphostsdk_LIBS rubberband_CFLAGS rubberband_LIBS liblo_CFLAGS liblo_LIBS portaudio_2_0_CFLAGS portaudio_2_0_LIBS JACK_CFLAGS JACK_LIBS libpulse_CFLAGS libpulse_LIBS lrdf_CFLAGS lrdf_LIBS oggz_CFLAGS oggz_LIBS fishsound_CFLAGS fishsound_LIBS mad_CFLAGS mad_LIBS id3tag_CFLAGS id3tag_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures SVcore 2.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/svcore] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of SVcore 2.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debug support [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path bz2_CFLAGS C compiler flags for bz2, overriding pkg-config bz2_LIBS linker flags for bz2, overriding pkg-config fftw3_CFLAGS C compiler flags for fftw3, overriding pkg-config fftw3_LIBS linker flags for fftw3, overriding pkg-config fftw3f_CFLAGS C compiler flags for fftw3f, overriding pkg-config fftw3f_LIBS linker flags for fftw3f, overriding pkg-config sndfile_CFLAGS C compiler flags for sndfile, overriding pkg-config sndfile_LIBS linker flags for sndfile, overriding pkg-config samplerate_CFLAGS C compiler flags for samplerate, overriding pkg-config samplerate_LIBS linker flags for samplerate, overriding pkg-config vamp_CFLAGS C compiler flags for vamp, overriding pkg-config vamp_LIBS linker flags for vamp, overriding pkg-config vamphostsdk_CFLAGS C compiler flags for vamphostsdk, overriding pkg-config vamphostsdk_LIBS linker flags for vamphostsdk, overriding pkg-config rubberband_CFLAGS C compiler flags for rubberband, overriding pkg-config rubberband_LIBS linker flags for rubberband, overriding pkg-config liblo_CFLAGS C compiler flags for liblo, overriding pkg-config liblo_LIBS linker flags for liblo, overriding pkg-config portaudio_2_0_CFLAGS C compiler flags for portaudio_2_0, overriding pkg-config portaudio_2_0_LIBS linker flags for portaudio_2_0, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config libpulse_CFLAGS C compiler flags for libpulse, overriding pkg-config libpulse_LIBS linker flags for libpulse, overriding pkg-config lrdf_CFLAGS C compiler flags for lrdf, overriding pkg-config lrdf_LIBS linker flags for lrdf, overriding pkg-config oggz_CFLAGS C compiler flags for oggz, overriding pkg-config oggz_LIBS linker flags for oggz, overriding pkg-config fishsound_CFLAGS C compiler flags for fishsound, overriding pkg-config fishsound_LIBS linker flags for fishsound, overriding pkg-config mad_CFLAGS C compiler flags for mad, overriding pkg-config mad_LIBS linker flags for mad, overriding pkg-config id3tag_CFLAGS C compiler flags for id3tag, overriding pkg-config id3tag_LIBS linker flags for id3tag, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF SVcore configure 2.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to cannam@all-day-breakfast.com ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by SVcore $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake.exe", so it can be a program name with args. set dummy qmake.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then as_fn_error $? " Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. " "$LINENO" 5 fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&5 $as_echo "$as_me: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&2;} esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_DEBUG="-Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe" CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe" CXXFLAGS_MINIMAL="-g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; { $as_echo "$as_me:${as_lineno-$LINENO}: enabling debug build" >&5 $as_echo "$as_me: enabling debug build" >&6;} QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG" fi if test x"$USER_CXXFLAGS" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&5 $as_echo "$as_me: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Overriding default compiler flags with the above user setting." >&5 $as_echo "$as_me: Overriding default compiler flags with the above user setting." >&6;} CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done SV_MODULE_MODULE=bz2 SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=bzlib.h SV_MODULE_LIB=bz2 SV_MODULE_FUNC=BZ2_bzReadOpen SV_MODULE_HAVE=HAVE_$(echo bz2 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$bz2_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $bz2_CFLAGS" LIBS="$LIBS $bz2_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bz2" >&5 $as_echo_n "checking for bz2... " >&6; } if test -n "$bz2_CFLAGS"; then pkg_cv_bz2_CFLAGS="$bz2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$bz2_LIBS"; then pkg_cv_bz2_LIBS="$bz2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then bz2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else bz2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$bz2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else bz2_CFLAGS=$pkg_cv_bz2_CFLAGS bz2_LIBS=$pkg_cv_bz2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $bz2_CFLAGS";LIBS="$LIBS $bz2_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3 SV_MODULE_VERSION_TEST="fftw3 >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3 SV_MODULE_FUNC=fftw_execute SV_MODULE_HAVE=HAVE_$(echo fftw3 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS" LIBS="$LIBS $fftw3_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3" >&5 $as_echo_n "checking for fftw3... " >&6; } if test -n "$fftw3_CFLAGS"; then pkg_cv_fftw3_CFLAGS="$fftw3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3_LIBS"; then pkg_cv_fftw3_LIBS="$fftw3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3_CFLAGS=$pkg_cv_fftw3_CFLAGS fftw3_LIBS=$pkg_cv_fftw3_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS";LIBS="$LIBS $fftw3_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3f SV_MODULE_VERSION_TEST="fftw3f >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3f SV_MODULE_FUNC=fftwf_execute SV_MODULE_HAVE=HAVE_$(echo fftw3f | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3f_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS" LIBS="$LIBS $fftw3f_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3f" >&5 $as_echo_n "checking for fftw3f... " >&6; } if test -n "$fftw3f_CFLAGS"; then pkg_cv_fftw3f_CFLAGS="$fftw3f_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3f_LIBS"; then pkg_cv_fftw3f_LIBS="$fftw3f_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3f_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3f_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3f_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3f_CFLAGS=$pkg_cv_fftw3f_CFLAGS fftw3f_LIBS=$pkg_cv_fftw3f_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS";LIBS="$LIBS $fftw3f_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sndfile SV_MODULE_VERSION_TEST="sndfile >= 1.0.16" SV_MODULE_HEADER=sndfile.h SV_MODULE_LIB=sndfile SV_MODULE_FUNC=sf_open SV_MODULE_HAVE=HAVE_$(echo sndfile | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sndfile_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS" LIBS="$LIBS $sndfile_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sndfile" >&5 $as_echo_n "checking for sndfile... " >&6; } if test -n "$sndfile_CFLAGS"; then pkg_cv_sndfile_CFLAGS="$sndfile_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sndfile_LIBS"; then pkg_cv_sndfile_LIBS="$sndfile_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sndfile_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sndfile_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sndfile_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sndfile_CFLAGS=$pkg_cv_sndfile_CFLAGS sndfile_LIBS=$pkg_cv_sndfile_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS";LIBS="$LIBS $sndfile_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=samplerate SV_MODULE_VERSION_TEST="samplerate >= 0.1.2" SV_MODULE_HEADER=samplerate.h SV_MODULE_LIB=samplerate SV_MODULE_FUNC=src_new SV_MODULE_HAVE=HAVE_$(echo samplerate | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$samplerate_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS" LIBS="$LIBS $samplerate_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for samplerate" >&5 $as_echo_n "checking for samplerate... " >&6; } if test -n "$samplerate_CFLAGS"; then pkg_cv_samplerate_CFLAGS="$samplerate_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$samplerate_LIBS"; then pkg_cv_samplerate_LIBS="$samplerate_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then samplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else samplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$samplerate_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else samplerate_CFLAGS=$pkg_cv_samplerate_CFLAGS samplerate_LIBS=$pkg_cv_samplerate_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS";LIBS="$LIBS $samplerate_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=vamp SV_MODULE_VERSION_TEST="vamp >= 2.1" SV_MODULE_HEADER=vamp/vamp.h SV_MODULE_LIB= SV_MODULE_FUNC= SV_MODULE_HAVE=HAVE_$(echo vamp | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$vamp_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $vamp_CFLAGS" LIBS="$LIBS $vamp_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vamp" >&5 $as_echo_n "checking for vamp... " >&6; } if test -n "$vamp_CFLAGS"; then pkg_cv_vamp_CFLAGS="$vamp_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamp_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$vamp_LIBS"; then pkg_cv_vamp_LIBS="$vamp_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamp_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then vamp_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else vamp_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$vamp_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else vamp_CFLAGS=$pkg_cv_vamp_CFLAGS vamp_LIBS=$pkg_cv_vamp_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $vamp_CFLAGS";LIBS="$LIBS $vamp_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=vamphostsdk SV_MODULE_VERSION_TEST="vamp-hostsdk >= 2.5" SV_MODULE_HEADER=vamp-hostsdk/PluginLoader.h SV_MODULE_LIB=vamp-hostsdk SV_MODULE_FUNC=libvamphostsdk_v_2_5_present SV_MODULE_HAVE=HAVE_$(echo vamphostsdk | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$vamphostsdk_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $vamphostsdk_CFLAGS" LIBS="$LIBS $vamphostsdk_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vamphostsdk" >&5 $as_echo_n "checking for vamphostsdk... " >&6; } if test -n "$vamphostsdk_CFLAGS"; then pkg_cv_vamphostsdk_CFLAGS="$vamphostsdk_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamphostsdk_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$vamphostsdk_LIBS"; then pkg_cv_vamphostsdk_LIBS="$vamphostsdk_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamphostsdk_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then vamphostsdk_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else vamphostsdk_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$vamphostsdk_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else vamphostsdk_CFLAGS=$pkg_cv_vamphostsdk_CFLAGS vamphostsdk_LIBS=$pkg_cv_vamphostsdk_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $vamphostsdk_CFLAGS";LIBS="$LIBS $vamphostsdk_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=rubberband SV_MODULE_VERSION_TEST="rubberband" SV_MODULE_HEADER=rubberband/RubberBandStretcher.h SV_MODULE_LIB=rubberband SV_MODULE_FUNC=rubberband_new SV_MODULE_HAVE=HAVE_$(echo rubberband | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$rubberband_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS" LIBS="$LIBS $rubberband_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rubberband" >&5 $as_echo_n "checking for rubberband... " >&6; } if test -n "$rubberband_CFLAGS"; then pkg_cv_rubberband_CFLAGS="$rubberband_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$rubberband_LIBS"; then pkg_cv_rubberband_LIBS="$rubberband_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then rubberband_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else rubberband_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$rubberband_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else rubberband_CFLAGS=$pkg_cv_rubberband_CFLAGS rubberband_LIBS=$pkg_cv_rubberband_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS";LIBS="$LIBS $rubberband_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=liblo SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=lo/lo.h SV_MODULE_LIB=lo SV_MODULE_FUNC=lo_address_new SV_MODULE_HAVE=HAVE_$(echo liblo | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$liblo_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $liblo_CFLAGS" LIBS="$LIBS $liblo_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for liblo" >&5 $as_echo_n "checking for liblo... " >&6; } if test -n "$liblo_CFLAGS"; then pkg_cv_liblo_CFLAGS="$liblo_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$liblo_LIBS"; then pkg_cv_liblo_LIBS="$liblo_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then liblo_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else liblo_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$liblo_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else liblo_CFLAGS=$pkg_cv_liblo_CFLAGS liblo_LIBS=$pkg_cv_liblo_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $liblo_CFLAGS";LIBS="$LIBS $liblo_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=portaudio_2_0 SV_MODULE_VERSION_TEST="portaudio-2.0 >= 19" SV_MODULE_HEADER=portaudio.h SV_MODULE_LIB=portaudio SV_MODULE_FUNC=Pa_IsFormatSupported SV_MODULE_HAVE=HAVE_$(echo portaudio_2_0 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$portaudio_2_0_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS" LIBS="$LIBS $portaudio_2_0_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio_2_0" >&5 $as_echo_n "checking for portaudio_2_0... " >&6; } if test -n "$portaudio_2_0_CFLAGS"; then pkg_cv_portaudio_2_0_CFLAGS="$portaudio_2_0_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$portaudio_2_0_LIBS"; then pkg_cv_portaudio_2_0_LIBS="$portaudio_2_0_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$portaudio_2_0_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else portaudio_2_0_CFLAGS=$pkg_cv_portaudio_2_0_CFLAGS portaudio_2_0_LIBS=$pkg_cv_portaudio_2_0_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS";LIBS="$LIBS $portaudio_2_0_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=JACK SV_MODULE_VERSION_TEST="jack >= 0.100" SV_MODULE_HEADER=jack/jack.h SV_MODULE_LIB=jack SV_MODULE_FUNC=jack_client_open SV_MODULE_HAVE=HAVE_$(echo JACK | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$JACK_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $JACK_CFLAGS";LIBS="$LIBS $JACK_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=libpulse SV_MODULE_VERSION_TEST="libpulse >= 0.9" SV_MODULE_HEADER=pulse/pulseaudio.h SV_MODULE_LIB=pulse SV_MODULE_FUNC=pa_stream_new SV_MODULE_HAVE=HAVE_$(echo libpulse | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$libpulse_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS" LIBS="$LIBS $libpulse_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpulse" >&5 $as_echo_n "checking for libpulse... " >&6; } if test -n "$libpulse_CFLAGS"; then pkg_cv_libpulse_CFLAGS="$libpulse_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libpulse_LIBS"; then pkg_cv_libpulse_LIBS="$libpulse_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libpulse_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else libpulse_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libpulse_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else libpulse_CFLAGS=$pkg_cv_libpulse_CFLAGS libpulse_LIBS=$pkg_cv_libpulse_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS";LIBS="$LIBS $libpulse_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=lrdf SV_MODULE_VERSION_TEST="lrdf >= 0.2" SV_MODULE_HEADER=lrdf.h SV_MODULE_LIB=lrdf SV_MODULE_FUNC=lrdf_init SV_MODULE_HAVE=HAVE_$(echo lrdf | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$lrdf_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS" LIBS="$LIBS $lrdf_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrdf" >&5 $as_echo_n "checking for lrdf... " >&6; } if test -n "$lrdf_CFLAGS"; then pkg_cv_lrdf_CFLAGS="$lrdf_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$lrdf_LIBS"; then pkg_cv_lrdf_LIBS="$lrdf_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then lrdf_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else lrdf_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$lrdf_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else lrdf_CFLAGS=$pkg_cv_lrdf_CFLAGS lrdf_LIBS=$pkg_cv_lrdf_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS";LIBS="$LIBS $lrdf_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=oggz SV_MODULE_VERSION_TEST="oggz >= 1.0.0" SV_MODULE_HEADER=oggz/oggz.h SV_MODULE_LIB=oggz SV_MODULE_FUNC=oggz_run SV_MODULE_HAVE=HAVE_$(echo oggz | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$oggz_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $oggz_CFLAGS" LIBS="$LIBS $oggz_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oggz" >&5 $as_echo_n "checking for oggz... " >&6; } if test -n "$oggz_CFLAGS"; then pkg_cv_oggz_CFLAGS="$oggz_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$oggz_LIBS"; then pkg_cv_oggz_LIBS="$oggz_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then oggz_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else oggz_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$oggz_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else oggz_CFLAGS=$pkg_cv_oggz_CFLAGS oggz_LIBS=$pkg_cv_oggz_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $oggz_CFLAGS";LIBS="$LIBS $oggz_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=fishsound SV_MODULE_VERSION_TEST="fishsound >= 1.0.0" SV_MODULE_HEADER=fishsound/fishsound.h SV_MODULE_LIB=fishsound SV_MODULE_FUNC=fish_sound_new SV_MODULE_HAVE=HAVE_$(echo fishsound | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fishsound_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS" LIBS="$LIBS $fishsound_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fishsound" >&5 $as_echo_n "checking for fishsound... " >&6; } if test -n "$fishsound_CFLAGS"; then pkg_cv_fishsound_CFLAGS="$fishsound_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fishsound_LIBS"; then pkg_cv_fishsound_LIBS="$fishsound_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fishsound_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fishsound_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fishsound_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fishsound_CFLAGS=$pkg_cv_fishsound_CFLAGS fishsound_LIBS=$pkg_cv_fishsound_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS";LIBS="$LIBS $fishsound_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=mad SV_MODULE_VERSION_TEST="mad >= 0.15.0" SV_MODULE_HEADER=mad.h SV_MODULE_LIB=mad SV_MODULE_FUNC=mad_decoder_init SV_MODULE_HAVE=HAVE_$(echo mad | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$mad_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $mad_CFLAGS" LIBS="$LIBS $mad_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mad" >&5 $as_echo_n "checking for mad... " >&6; } if test -n "$mad_CFLAGS"; then pkg_cv_mad_CFLAGS="$mad_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$mad_LIBS"; then pkg_cv_mad_LIBS="$mad_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then mad_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else mad_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$mad_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else mad_CFLAGS=$pkg_cv_mad_CFLAGS mad_LIBS=$pkg_cv_mad_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $mad_CFLAGS";LIBS="$LIBS $mad_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=id3tag SV_MODULE_VERSION_TEST="id3tag >= 0.15.0" SV_MODULE_HEADER=id3tag.h SV_MODULE_LIB=id3tag SV_MODULE_FUNC=id3_tag_new SV_MODULE_HAVE=HAVE_$(echo id3tag | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$id3tag_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS" LIBS="$LIBS $id3tag_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for id3tag" >&5 $as_echo_n "checking for id3tag... " >&6; } if test -n "$id3tag_CFLAGS"; then pkg_cv_id3tag_CFLAGS="$id3tag_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$id3tag_LIBS"; then pkg_cv_id3tag_LIBS="$id3tag_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then id3tag_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else id3tag_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$id3tag_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else id3tag_CFLAGS=$pkg_cv_id3tag_CFLAGS id3tag_LIBS=$pkg_cv_id3tag_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS";LIBS="$LIBS $id3tag_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi ac_config_files="$ac_config_files config.pri" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by SVcore $as_me 2.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ SVcore config.status 2.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.pri") CONFIG_FILES="$CONFIG_FILES config.pri" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if ! $QMAKE -r svcore.pro; then as_fn_error $? "qmake failed: Command was \"$QMAKE -r\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&5 $as_echo "$as_me: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&6;} sonic-visualiser-2.3~repack1.orig/svcore/system/0000755000175000017500000000000012264464201020551 5ustar miramirasonic-visualiser-2.3~repack1.orig/svcore/system/System.h0000644000175000017500000001137512252354725022223 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SYSTEM_H_ #define _SYSTEM_H_ #include "base/Debug.h" #ifdef _WIN32 #include #include #include #include #define MLOCK(a,b) 1 #define MUNLOCK(a,b) 1 #define MUNLOCK_SAMPLEBLOCK(a) 1 #define MUNLOCKALL() 1 extern void SystemMemoryBarrier(); #define MBARRIER() SystemMemoryBarrier() #define DLOPEN(a,b) LoadLibrary((a).toStdWString().c_str()) #define DLSYM(a,b) GetProcAddress((HINSTANCE)(a),(b)) #define DLCLOSE(a) (!FreeLibrary((HINSTANCE)(a))) #define DLERROR() "" #define PLUGIN_GLOB "*.dll" #define PATH_SEPARATOR ';' // The default Vamp plugin path is obtained from a function in the // Vamp SDK (Vamp::PluginHostAdapter::getPluginPath). // At the time of writing, at least, the vast majority of LADSPA // plugins on Windows hosts will have been put there for use in // Audacity. It's a bit of a shame that Audacity uses its own Program // Files directory for plugins that any host may want to use... maybe // they were just following the example of VSTs, which are usually // found in Steinberg's Program Files directory. Anyway, we can // greatly increase our chances of picking up some LADSPA plugins by // default if we include the Audacity plugin location as well as an // (imho) more sensible place. #define DEFAULT_LADSPA_PATH "%ProgramFiles%\\LADSPA Plugins;%ProgramFiles%\\Audacity\\Plug-Ins" #define DEFAULT_DSSI_PATH "%ProgramFiles%\\DSSI Plugins" #define getpid _getpid extern "C" { /* usleep is now in mingw void usleep(unsigned long usec); */ int gettimeofday(struct timeval *p, void *tz); } #define ISNAN std::isnan #define ISINF std::isinf #else #include #include #include // for perror #include #define MLOCK(a,b) ::mlock((a),(b)) #define MUNLOCK(a,b) (::munlock((a),(b)) ? (::perror("munlock failed"), 0) : 0) #define MUNLOCK_SAMPLEBLOCK(a) do { if (!(a).empty()) { const float &b = *(a).begin(); MUNLOCK(&b, (a).capacity() * sizeof(float)); } } while(0); //#define MLOCK(a,b) 1 //#define MUNLOCK(a,b) 1 //#define MUNLOCK_SAMPLEBLOCK(a) 1 #define DLOPEN(a,b) dlopen((a).toStdString().c_str(),(b)) #define DLSYM(a,b) dlsym((a),(b)) #define DLCLOSE(a) dlclose((a)) #define DLERROR() dlerror() #include #define ISNAN std::isnan #define ISINF std::isinf #ifdef __APPLE__ #define PLUGIN_GLOB "*.dylib *.so" #define PATH_SEPARATOR ':' #define DEFAULT_LADSPA_PATH "$HOME/Library/Audio/Plug-Ins/LADSPA:/Library/Audio/Plug-Ins/LADSPA" #define DEFAULT_DSSI_PATH "$HOME/Library/Audio/Plug-Ins/DSSI:/Library/Audio/Plug-Ins/DSSI" #define MUNLOCKALL() 1 #include #define MBARRIER() OSMemoryBarrier() #else #ifdef sun #undef MLOCK #undef MUNLOCK #define MLOCK(a,b) ::mlock((char *)a,b) #define MUNLOCK(a,b) ::munlock((char *)a,b) #ifdef __SUNPRO_CC #undef ISNAN #undef ISINF #define ISNAN(x) ((x)!=(x)) #define ISINF(x) 0 #endif #endif #define PLUGIN_GLOB "*.so" #define PATH_SEPARATOR ':' #define DEFAULT_LADSPA_PATH "$HOME/ladspa:$HOME/.ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa" #define DEFAULT_DSSI_PATH "$HOME/dssi:$HOME/.dssi:/usr/local/lib/dssi:/usr/lib/dssi" #define MUNLOCKALL() ::munlockall() #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) #define MBARRIER() __sync_synchronize() #else extern void SystemMemoryBarrier(); #define MBARRIER() SystemMemoryBarrier() #endif #endif /* ! __APPLE__ */ #endif /* ! _WIN32 */ enum ProcessStatus { ProcessRunning, ProcessNotRunning, UnknownProcessStatus }; extern ProcessStatus GetProcessStatus(int pid); // Return a vague approximation to the number of free megabytes of real memory. // Return -1 if unknown. extern void GetRealMemoryMBAvailable(int &available, int &total); // Return a vague approximation to the number of free megabytes of disc space // on the partition containing the given path. Return -1 if unknown. extern int GetDiscSpaceMBAvailable(const char *path); extern void StoreStartupLocale(); extern void RestoreStartupLocale(); #include extern double mod(double x, double y); extern float modf(float x, float y); extern double princarg(double a); extern float princargf(float a); #ifdef USE_POW_NO_F #define powf pow #endif #endif /* ! _SYSTEM_H_ */ sonic-visualiser-2.3~repack1.orig/svcore/system/Init.h0000644000175000017500000000131112252354725021627 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #ifndef _SV_SYSTEM_INIT_H_ #define _SV_SYSTEM_INIT_H_ extern void svSystemSpecificInitialisation(); #endif sonic-visualiser-2.3~repack1.orig/svcore/system/Init.cpp0000644000175000017500000000313712252354725022172 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include #include #ifdef Q_OS_WIN32 #include // required for SetDllDirectory #define _WIN32_WINNT 0x0502 #include // Set default file open mode to binary //#undef _fmode //int _fmode = _O_BINARY; void redirectStderr() { #ifdef NO_PROBABLY_NOT HANDLE stderrHandle = GetStdHandle(STD_ERROR_HANDLE); if (!stderrHandle) return; AllocConsole(); CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(stderrHandle, &info); info.dwSize.Y = 1000; SetConsoleScreenBufferSize(stderrHandle, info.dwSize); int h = _open_osfhandle((long)stderrHandle, _O_TEXT); if (h) { FILE *fd = _fdopen(h, "w"); if (fd) { *stderr = *fd; setvbuf(stderr, NULL, _IONBF, 0); } } #endif } #endif extern void svSystemSpecificInitialisation() { #ifdef Q_OS_WIN32 redirectStderr(); // Remove the CWD from the DLL search path, just in case SetDllDirectory(L""); putenv("PATH="); #else #endif } sonic-visualiser-2.3~repack1.orig/svcore/system/System.cpp0000644000175000017500000001671312252354725022557 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "System.h" #include #include #include #ifndef _WIN32 #include #include #include #include #endif #ifdef __APPLE__ #include #include #endif #include #include #include #ifdef __APPLE__ extern "C" { void * rpl_realloc (void *p, size_t n) { p = realloc(p, n); if (p == 0 && n == 0) { p = malloc(0); } return p; } } #endif #ifdef _WIN32 extern "C" { /* usleep is now in mingw void usleep(unsigned long usec) { ::Sleep(usec / 1000); } */ int gettimeofday(struct timeval *tv, void *tz) { union { long long ns100; FILETIME ft; } now; ::GetSystemTimeAsFileTime(&now.ft); tv->tv_usec = (long)((now.ns100 / 10LL) % 1000000LL); tv->tv_sec = (long)((now.ns100 - 116444736000000000LL) / 10000000LL); return 0; } } #endif ProcessStatus GetProcessStatus(int pid) { #ifdef _WIN32 HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); if (!handle) { return ProcessNotRunning; } else { CloseHandle(handle); return ProcessRunning; } #else if (kill(getpid(), 0) == 0) { if (kill(pid, 0) == 0) { return ProcessRunning; } else { return ProcessNotRunning; } } else { return UnknownProcessStatus; } #endif } #ifdef _WIN32 /* MEMORYSTATUSEX is missing from older Windows headers, so define a local replacement. This trick from MinGW source code. Ugh */ typedef struct { DWORD dwLength; DWORD dwMemoryLoad; DWORDLONG ullTotalPhys; DWORDLONG ullAvailPhys; DWORDLONG ullTotalPageFile; DWORDLONG ullAvailPageFile; DWORDLONG ullTotalVirtual; DWORDLONG ullAvailVirtual; DWORDLONG ullAvailExtendedVirtual; } lMEMORYSTATUSEX; typedef WINBOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*); #endif void GetRealMemoryMBAvailable(int &available, int &total) { available = -1; total = -1; #ifdef _WIN32 static bool checked = false; static bool exFound = false; static PFN_MS_EX ex; if (!checked) { HMODULE h = GetModuleHandleA("kernel32.dll"); if (h) { if ((ex = (PFN_MS_EX)GetProcAddress(h, "GlobalMemoryStatusEx"))) { exFound = true; } } checked = true; } DWORDLONG wavail = 0; DWORDLONG wtotal = 0; if (exFound) { lMEMORYSTATUSEX lms; lms.dwLength = sizeof(lms); if (!ex(&lms)) { cerr << "WARNING: GlobalMemoryStatusEx failed: error code " << GetLastError() << endl; return; } wavail = lms.ullAvailPhys; wtotal = lms.ullTotalPhys; } else { /* Fall back to GlobalMemoryStatus which is always available. but returns wrong results for physical memory > 4GB */ MEMORYSTATUS ms; GlobalMemoryStatus(&ms); wavail = ms.dwAvailPhys; wtotal = ms.dwTotalPhys; } DWORDLONG size = wavail / 1048576; if (size > INT_MAX) size = INT_MAX; available = int(size); size = wtotal / 1048576; if (size > INT_MAX) size = INT_MAX; total = int(size); return; #else #ifdef __APPLE__ unsigned int val; int mib[2]; size_t size_sys; mib[0] = CTL_HW; mib[1] = HW_PHYSMEM; size_sys = sizeof(val); sysctl(mib, 2, &val, &size_sys, NULL, 0); if (val) total = val / 1048576; mib[1] = HW_USERMEM; size_sys = sizeof(val); sysctl(mib, 2, &val, &size_sys, NULL, 0); if (val) available = val / 1048576; return; #else FILE *meminfo = fopen("/proc/meminfo", "r"); if (!meminfo) return; char buf[256]; while (!feof(meminfo)) { fgets(buf, 256, meminfo); bool isMemFree = (strncmp(buf, "MemFree:", 8) == 0); bool isMemTotal = (!isMemFree && (strncmp(buf, "MemTotal:", 9) == 0)); if (isMemFree || isMemTotal) { QString line = QString(buf).trimmed(); QStringList elements = line.split(' ', QString::SkipEmptyParts); QString unit = "kB"; if (elements.size() > 2) unit = elements[2]; int size = elements[1].toInt(); // cerr << "have size \"" << size << "\", unit \"" // << unit << "\"" << endl; if (unit.toLower() == "gb") size = size * 1024; else if (unit.toLower() == "mb") size = size; else if (unit.toLower() == "kb") size = size / 1024; else size = size / 1048576; if (isMemFree) available = size; else total = size; } if (available != -1 && total != -1) { fclose(meminfo); return; } } fclose(meminfo); return; #endif #endif } int GetDiscSpaceMBAvailable(const char *path) { #ifdef _WIN32 ULARGE_INTEGER available, total, totalFree; if (GetDiskFreeSpaceExA(path, &available, &total, &totalFree)) { __int64 a = available.QuadPart; a /= 1048576; if (a > INT_MAX) a = INT_MAX; return int(a); } else { cerr << "WARNING: GetDiskFreeSpaceEx failed: error code " << GetLastError() << endl; return -1; } #else struct statvfs buf; if (!statvfs(path, &buf)) { // do the multiplies and divides in this order to reduce the // likelihood of arithmetic overflow // cerr << "statvfs(" << path << ") says available: " << buf.f_bavail << ", block size: " << buf.f_bsize << endl; uint64_t available = ((buf.f_bavail / 1024) * buf.f_bsize) / 1024; if (available > INT_MAX) available = INT_MAX; return int(available); } else { perror("statvfs failed"); return -1; } #endif } #ifdef _WIN32 extern void SystemMemoryBarrier() { #ifdef __MSVC__ MemoryBarrier(); #else /* mingw */ LONG Barrier = 0; __asm__ __volatile__("xchgl %%eax,%0 " : "=r" (Barrier)); #endif } #else /* !_WIN32 */ #if !defined(__APPLE__) && ((__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ == 0)) void SystemMemoryBarrier() { pthread_mutex_t dummy = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&dummy); pthread_mutex_unlock(&dummy); } #endif /* !defined(__APPLE__) etc */ #endif /* !_WIN32 */ static char *startupLocale = 0; void StoreStartupLocale() { char *loc = setlocale(LC_ALL, 0); if (!loc) return; if (startupLocale) free(startupLocale); startupLocale = strdup(loc); } void RestoreStartupLocale() { if (!startupLocale) { setlocale(LC_ALL, ""); } else { setlocale(LC_ALL, startupLocale); } } double mod(double x, double y) { return x - (y * floor(x / y)); } float modf(float x, float y) { return x - (y * floorf(x / y)); } double princarg(double a) { return mod(a + M_PI, -2 * M_PI) + M_PI; } float princargf(float a) { return modf(a + M_PI, -2 * M_PI) + M_PI; } sonic-visualiser-2.3~repack1.orig/svcore/config.pri.in0000644000175000017500000000070312252354725021621 0ustar miramiraCONFIG += @QMAKE_CONFIG@ DEFINES += @HAVES@ HAVE_DATAQUAY QMAKE_CC = @CC@ QMAKE_CXX = @CXX@ QMAKE_LINK = @CXX@ QMAKE_CFLAGS += @CFLAGS@ QMAKE_CXXFLAGS += @CXXFLAGS@ QMAKE_LFLAGS += @LDFLAGS@ linux*:LIBS += -lasound macx*:DEFINES += HAVE_COREAUDIO MACOSX_DEPLOYMENT_TARGET=1060 macx*:LIBS += -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices LIBS += @LIBS@ sonic-visualiser-2.3~repack1.orig/svcore/COPYING0000644000175000017500000003543312252354725020276 0ustar miramira GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS sonic-visualiser-2.3~repack1.orig/CITATION0000644000175000017500000000074012252354725017070 0ustar miramiraIf you are using Sonic Visualiser in research work for publication, please cite: @InProceedings{SonicVisualiser, author = {C. Cannam and C. Landone and M. Sandler}, title = {Sonic Visualiser: An Open Source Application for Viewing, Analysing, and Annotating Music Audio Files}, pages = {1467--1468}, booktitle = {Proceedings of the ACM Multimedia 2010 International Conference}, month = {October}, year = {2010}, address = {Firenze, Italy}, } sonic-visualiser-2.3~repack1.orig/version.h.in0000644000175000017500000000004712252354725020176 0ustar miramira#define SV_VERSION "@PACKAGE_VERSION@" sonic-visualiser-2.3~repack1.orig/deploy/0000755000175000017500000000000012264464200017217 5ustar miramirasonic-visualiser-2.3~repack1.orig/deploy/osx/0000755000175000017500000000000012264464200020030 5ustar miramirasonic-visualiser-2.3~repack1.orig/deploy/osx/deploy.sh0000644000175000017500000000314112252354725021666 0ustar miramira#!/bin/bash # Execute this from the top-level directory of the project (the one # that contains the .app bundle). Supply the name of the .app bundle # as argument (the target will use $app.app regardless, but we need # to know the source) source="$1" dmg="$2" if [ -z "$source" ] || [ ! -d "$source" ] || [ -z "$dmg" ]; then echo "Usage: $0 " echo " e.g. $0 MyApplication.app MyApplication" echo " Version number and .dmg will be appended automatically," echo " but the .app name must include .app" exit 2 fi app=`basename "$source" .app` version=`perl -p -e 's/^[^"]*"([^"]*)".*$/$1/' version.h` case "$version" in [0-9].[0-9]) bundleVersion="$version".0 ;; [0-9].[0-9].[0-9]) bundleVersion="$version" ;; *) echo "Error: Version $version is neither two- nor three-part number" ;; esac echo echo "Fixing up paths." deploy/osx/paths.sh "$app" echo echo "Making target tree." volume="$app"-"$version" target="$volume"/"$app".app dmg="$dmg"-"$version".dmg mkdir "$volume" || exit 1 ln -s /Applications "$volume"/Applications cp README README.OSC COPYING CHANGELOG "$volume/" cp -rp "$source" "$target" echo "Done" echo "Writing version $bundleVersion in to bundle." echo "(This should be a three-part number: major.minor.point)" perl -p -e "s/SV_VERSION/$bundleVersion/" deploy/osx/Info.plist \ > "$target"/Contents/Info.plist echo "Done: check $target/Contents/Info.plist for sanity please" deploy/osx/sign.sh "$volume" || exit 1 echo echo "Making dmg..." hdiutil create -srcfolder "$volume" "$dmg" -volname "$volume" && rm -r "$volume" echo "Done" sonic-visualiser-2.3~repack1.orig/deploy/osx/paths.sh0000755000175000017500000000274012252354725021520 0ustar miramira#!/bin/bash app="$1" if [ -z "$app" ]; then echo "Usage: $0 " echo "Provide appname without the .app extension, please" exit 2 fi echo echo "I expect you to have already copied QtCore, QtNetwork, QtGui, QtXml and QtWidgets to " echo "$app.app/Contents/Frameworks -- expect errors to follow if they're missing" echo echo "Fixing up loader paths in binaries..." install_name_tool -id QtCore "$app.app/Contents/Frameworks/QtCore" install_name_tool -id QtGui "$app.app/Contents/Frameworks/QtGui" install_name_tool -id QtNetwork "$app.app/Contents/Frameworks/QtNetwork" install_name_tool -id QtXml "$app.app/Contents/Frameworks/QtXml" install_name_tool -id QtWidgets "$app.app/Contents/Frameworks/QtWidgets" find "$app.app" -name \*.dylib -print | while read x; do install_name_tool -id "`basename \"$x\"`" "$x" done for fwk in QtCore QtGui QtNetwork QtXml QtWidgets; do find "$app.app" -type f -print | while read x; do current=$(otool -L "$x" | grep "$fwk" | grep amework | awk '{ print $1; }') [ -z "$current" ] && continue echo "$x has $current" relative=$(echo "$x" | sed -e "s,$app.app/Contents/,," \ -e 's,[^/]*/,../,g' -e 's,/[^/]*$,/Frameworks/'"$fwk"',' ) echo "replacing with relative path $relative" install_name_tool -change "$current" "@loader_path/$relative" "$x" done done echo "Done: be sure to run the app and see that it works!" sonic-visualiser-2.3~repack1.orig/deploy/osx/sign.sh0000755000175000017500000000213112252354725021333 0ustar miramira#!/bin/bash # Execute this from the top-level directory of the project (the one # that contains the .app bundle). Supply the name of the .app bundle # as argument dir="$1" if [ -z "$dir" ] || [ ! -d "$dir" ]; then echo "Usage: $0 " echo "Where pkgdir is the directory containing .app" echo "All .app bundles in pkgdir will be signed" exit 2 fi for app in "$dir"/*.app; do find "$app" -name Qt\* -print | while read fr; do codesign -s "Developer ID Application: Chris Cannam" -fv "$fr" done find "$app" -name \*.dylib -print | while read fr; do codesign -s "Developer ID Application: Chris Cannam" -fv "$fr" done codesign -s "Developer ID Application: Chris Cannam" -fv \ --requirements '=designated => identifier "org.sonicvisualiser.SonicVisualiser" and ( (anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] ) or (anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] and certificate leaf[field.1.2.840.113635.100.6.1.13] and certificate leaf[subject.OU] = "M2H8666U82"))' \ "$app" done sonic-visualiser-2.3~repack1.orig/deploy/osx/Info.plist0000644000175000017500000000711712252354725022015 0ustar miramira CFBundlePackageType APPL CFBundleName Sonic Visualiser CFBundleExecutable Sonic Visualiser CFBundleIconFile sv-macicon.icns CFBundleIdentifier org.sonicvisualiser.SonicVisualiser CFBundleShortVersionString SV_VERSION NSPrincipalClass NSApplication NSHighResolutionCapable True CFBundleDocumentTypes CFBundleTypeExtensions sv CFBundleTypeMIMETypes application/x-sonic-visualiser-session CFBundleTypeName Sonic Visualiser Session CFBundleTypeOSTypes **** CFBundleTypeRole Editor LSHandlerRank Owner LSIsAppleDefaultForType CFBundleTypeExtensions mp3 CFBundleTypeMIMETypes audio/mpeg CFBundleTypeName MP3 Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate CFBundleTypeExtensions ogg oga CFBundleTypeMIMETypes audio/ogg CFBundleTypeName Ogg Vorbis Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate CFBundleTypeExtensions wav CFBundleTypeMIMETypes audio/x-wav CFBundleTypeName Wave Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate CFBundleTypeExtensions aif aiff CFBundleTypeMIMETypes audio/x-aiff CFBundleTypeName AIFF Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate CFBundleTypeExtensions flac CFBundleTypeMIMETypes audio/flac CFBundleTypeName FLAC Audio CFBundleTypeRole Viewer LSIsAppleDefaultForType LSHandlerRank Alternate sonic-visualiser-2.3~repack1.orig/deploy/win32/0000755000175000017500000000000012264464200020161 5ustar miramirasonic-visualiser-2.3~repack1.orig/deploy/win32/sonic-visualiser.wxs0000644000175000017500000002070012252354725024231 0ustar miramira sonic-visualiser-2.3~repack1.orig/deploy/win32/License.rtf0000644000175000017500000004661012252354725022276 0ustar miramira{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1046\deflangfe1046\deftab708{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fmodern\fprq1\fcharset0 Courier New;}} {\colortbl ;\red0\green0\blue255;} {\stylesheet{ Normal;}{\s1 heading 1;}{\s2 heading 2;}{\s3 heading 3;}} {\*\generator Riched20 6.2.9200}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 \pard\widctlpar\s3\sb100\sa100\b\f0\fs27 GNU GENERAL PUBLIC LICENSE\par \pard\widctlpar\sb100\sa100\b0\fs24 Version 2, June 1991 \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\f1\fs20 Copyright (C) 1989, 1991 Free Software Foundation, Inc. \par 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\par \par Everyone is permitted to copy and distribute verbatim copies\par of this license document, but changing it is not allowed.\par \pard\widctlpar\s3\sb100\sa100\b\f0\fs27 Preamble\par \pard\widctlpar\sb100\sa100\b0\fs24 The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. \par When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. \par To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. \par For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. \par We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. \par Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. \par Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. \par The precise terms and conditions for copying, distribution and modification follow. \par \pard\widctlpar\s3\sb100\sa100\b\fs27 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\par \pard\widctlpar\sb100\sa100\fs24 0.\b0 This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". \par Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. \par \b 1.\b0 You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. \par You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. \par \b 2.\b0 You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: \par \pard\widctlpar\li720\b a)\b0 You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. \par \b b)\b0 You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. \par \b c)\b0 If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) \par \pard\widctlpar\sb100\sa100 These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. \par Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. \par In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. \par \b 3.\b0 You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: \par \pard\widctlpar\li720\b a)\b0 Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \par \b b)\b0 Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \par \b c)\b0 Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) \par \pard\widctlpar\sb100\sa100 The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. \par If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. \par \b 4.\b0 You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. \par \b 5.\b0 You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. \par \b 6.\b0 Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. \par \b 7.\b0 If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. \par If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. \par It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. \par This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. \par \b 8.\b0 If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. \par \b 9.\b0 The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. \par Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. \par \b 10.\b0 If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. \par \b NO WARRANTY\b0\par \b 11.\b0 BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. \par \b 12.\b0 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \par \pard\widctlpar\s3\sb100\sa100\b\fs27 END OF TERMS AND CONDITIONS\par How to Apply These Terms to Your New Programs\par \pard\widctlpar\sb100\sa100\b0\fs24 If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. \par To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\i\f1\fs20 one line to give the program's name and an idea of what it does.\i0\par Copyright (C) \i yyyy\i0 \i name of author\i0\par \par This program is free software; you can redistribute it and/or\par modify it under the terms of the GNU General Public License\par as published by the Free Software Foundation; either version 2\par of the License, or (at your option) any later version.\par \par This program is distributed in the hope that it will be useful,\par but WITHOUT ANY WARRANTY; without even the implied warranty of\par MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\par GNU General Public License for more details.\par \par You should have received a copy of the GNU General Public License\par along with this program; if not, write to the Free Software\par Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\par \pard\widctlpar\sb100\sa100\f0\fs24 Also add information on how to contact you by electronic and paper mail. \par If the program is interactive, make it output a short notice like this when it starts in an interactive mode: \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\f1\fs20 Gnomovision version 69, Copyright (C) \i year\i0 \i name of author\i0\par Gnomovision comes with ABSOLUTELY NO WARRANTY; for details\par type `show w'. This is free software, and you are welcome\par to redistribute it under certain conditions; type `show c' \par for details.\par \pard\widctlpar\sb100\sa100\f0\fs24 The hypothetical commands \f1 `show w'\f0 and \f1 `show c'\f0 should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than \f1 `show w'\f0 and \f1 `show c'\f0 ; they could even be mouse-clicks or menu items--whatever suits your program. \par You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: \par \pard\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\f1\fs20 Yoyodyne, Inc., hereby disclaims all copyright\par interest in the program `Gnomovision'\par (which makes passes at compilers) written \par by James Hacker.\par \par \i signature of Ty Coon\i0 , 1 April 1989\par Ty Coon, President of Vice\par \pard\widctlpar\sb100\sa100\f0\fs24 This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the {{\field{\*\fldinst{HYPERLINK "http://www.gnu.org/licenses/lgpl.html" }}{\fldrslt{\ul\cf1\cf1\ul GNU Lesser General Public License}}}}\f0\fs24 instead of this License. \par \par } sonic-visualiser-2.3~repack1.orig/deploy/win32/README-Vamp.txt0000644000175000017500000000025112252354725022565 0ustar miramira To add Vamp audio analysis plugins to the Transform menu in Sonic Visualiser, unpack them into this directory. See http://vamp-plugins.org/ for more information. sonic-visualiser-2.3~repack1.orig/deploy/win32/build.cmd0000644000175000017500000000056212252354725021757 0ustar miramira@ECHO OFF SET WIXPATH="C:\Program Files (x86)\WiX Toolset v3.7\bin" IF NOT EXIST %WIXPATH% ( SET WIXPATH="C:\Program Files\WiX Toolset v3.7\bin" ) DEL sonic-visualiser.msi %WIXPATH%\candle.exe -v sonic-visualiser.wxs %WIXPATH%\light.exe -b ..\.. -ext WixUIExtension -v sonic-visualiser.wixobj PAUSE DEL sonic-visualiser.wixobj DEL sonic-visualiser.wixpdb sonic-visualiser-2.3~repack1.orig/deploy/linux/0000755000175000017500000000000012264464200020356 5ustar miramirasonic-visualiser-2.3~repack1.orig/deploy/linux/doc/0000755000175000017500000000000012264464200021123 5ustar miramirasonic-visualiser-2.3~repack1.orig/deploy/linux/doc/sonic-visualiser/0000755000175000017500000000000012264464200024422 5ustar miramirasonic-visualiser-2.3~repack1.orig/deploy/linux/doc/sonic-visualiser/copyright0000644000175000017500000000252112252354725026364 0ustar miramiraSonic Visualiser was developed at the Centre for Digital Music, Queen Mary, University of London. http://www.elec.qmul.ac.uk/digitalmusic/ The main program is by Chris Cannam, with additional DSP and program design work by Christian Landone. Thanks also to Craig Sapp for his suggestions and useful feedback. Code copyright 2005-2007 Chris Cannam and copyright 2006-2013 Queen Mary, University of London, except where indicated in the individual source files. This work was partially funded by the European Commission through the SIMAC project IST-FP6-507142 and the EASAIER project IST-FP6-033902. This work was partially funded by the Arts and Humanities Research Council through its Research Centre for the History and Analysis of Recorded Music (CHARM). This work was partially funded by the Engineering and Physical Sciences Research Council through the OMRAS2 project EP/E017614/1. This work was partially funded by the Engineering and Physical Sciences Research Council through the Musicology for the Masses project EP/I001832/1. Sonic Visualiser is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file /usr/share/common-licenses/GPL-2 for more information. sonic-visualiser-2.3~repack1.orig/deploy/linux/remember-to-run-lintian0000644000175000017500000000000012252354725024752 0ustar miramirasonic-visualiser-2.3~repack1.orig/deploy/linux/control.example0000644000175000017500000000174212252354725023426 0ustar miramiraPackage: sonic-visualiser Priority: optional Maintainer: Chris Cannam Architecture: PLACE ARCHITECTURE HERE i386 or amd64 Version: PLACE VERSION HERE e.g. 2.2cc-1 Depends: libqtgui4 (>= 4.5.0), libexpat1, libfontconfig1, libfreetype6, libice6, libpcre3, libstdc++6, libx11-6, libxau6, libxcursor1, libxdmcp6, libxext6, libx fixes3, libxrender1, zlib1g, libasound2, libc6 Description: View and analyse the contents of music audio files Sonic Visualiser is an application for viewing and analysing the contents of mu sic audio files. It was developed at the Centre for Digital Music at Queen Mary, University of London. Our aim is for it to be the first program you reach for w hen want to study a musical recording rather than simply listen to it. We hope Sonic Visualiser will be of particular interest to musicologists, archi vists, signal-processing researchers and anyone else looking for a friendly way to take a look at what lies inside the audio file. sonic-visualiser-2.3~repack1.orig/deploy/src/0000755000175000017500000000000012264464200020006 5ustar miramirasonic-visualiser-2.3~repack1.orig/deploy/src/archive.sh0000644000175000017500000000037612252354725022000 0ustar miramira#!/bin/bash tag=`hg tags | grep '^sv_v' | head -1 | awk '{ print $1; }'` v=`echo "$tag" |sed 's/sv_v//'` echo "Packaging up version $v from tag $tag..." hg archive -r"$tag" --subrepos --exclude sv-dependency-builds /tmp/sonic-visualiser-"$v".tar.gz sonic-visualiser-2.3~repack1.orig/configure.ac0000644000175000017500000001144712252354725020227 0ustar miramira AC_INIT([Sonic Visualiser], [2.3], cannam@all-day-breakfast.com) AC_CONFIG_SRCDIR(main/main.cpp) # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi AC_LANG_CPLUSPLUS AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_MKDIR_P AC_HEADER_STDC # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" PKG_PROG_PKG_CONFIG SV_CHECK_QT SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_DEBUG="-Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe" CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe" CXXFLAGS_MINIMAL="-g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build]) QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"]) if test x"$USER_CXXFLAGS" != x; then AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".]) AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.) CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen]) SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute]) SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute]) SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open]) SV_MODULE_REQUIRED([samplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new]) SV_MODULE_REQUIRED([vamp],[vamp >= 2.1],[vamp/vamp.h],[],[]) SV_MODULE_REQUIRED([vamphostsdk],[vamp-hostsdk >= 2.5],[vamp-hostsdk/PluginLoader.h],[vamp-hostsdk],[libvamphostsdk_v_2_5_present]) SV_MODULE_REQUIRED([rubberband],[rubberband],[rubberband/RubberBandStretcher.h],[rubberband],[rubberband_new]) SV_MODULE_REQUIRED([sord],[sord-0 >= 0.5],[sord/sord.h],[sord-0],[sord_world_new]) SV_MODULE_REQUIRED([serd],[serd-0 >= 0.5],[serd/serd.h],[serd-0],[serd_reader_read_file]) SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new]) SV_MODULE_OPTIONAL([portaudio_2_0],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported]) SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open]) SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new]) SV_MODULE_OPTIONAL([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init]) SV_MODULE_OPTIONAL([oggz],[oggz >= 1.0.0],[oggz/oggz.h],[oggz],[oggz_run]) SV_MODULE_OPTIONAL([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new]) SV_MODULE_OPTIONAL([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init]) SV_MODULE_OPTIONAL([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new]) # Link in -lX11 if it exists -- this is for the X error handler SV_MODULE_OPTIONAL([X11],[x11 >= 1.0.0],[X11/X.h],[x11],[XGetErrorText]) AC_SUBST(PERL) AC_SUBST(XARGS) AC_SUBST(MAKEDEPEND) AC_SUBST(SHA1SUM) AC_SUBST(CUT) AC_SUBST(CFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(CXXFLAGS_MINIMAL) AC_SUBST(LDFLAGS) AC_SUBST(HAVES) AC_SUBST(LIBS) AC_SUBST(CC) AC_SUBST(CXX) AC_SUBST(QMAKE_CONFIG) AC_CONFIG_SUBDIRS([svcore svgui svapp]) AC_CONFIG_FILES([config.pri version.h]) AC_OUTPUT if ! $QMAKE -r sonic-visualiser.pro; then AC_MSG_ERROR([qmake failed: Command was "$QMAKE -r"]) fi AC_MSG_NOTICE([ Configuration complete. Please check the above messages for any warnings that you might care about, and then run "make". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run "$QMAKE -r" again to regenerate the Makefile. ]) sonic-visualiser-2.3~repack1.orig/dataquay/0000755000175000017500000000000012264464201017535 5ustar miramirasonic-visualiser-2.3~repack1.orig/dataquay/.hgignore0000644000175000017500000000012212252354725021341 0ustar miramirasyntax: glob re:^doc/html/ re:^o/ re:^tests/o/ *.a *~ *.gcda *.gcno *.gcov *.ttl sonic-visualiser-2.3~repack1.orig/dataquay/tests/0000755000175000017500000000000012264464201020677 5ustar miramirasonic-visualiser-2.3~repack1.orig/dataquay/tests/tests.pro0000644000175000017500000000153312252354725022573 0ustar miramira TEMPLATE = app CONFIG += debug console QT += testlib QT -= gui TARGET = test-dataquay exists(../config.pri) { include(../config.pri) } INCLUDEPATH += . .. DEPENDPATH += . .. QMAKE_LIBDIR += .. OBJECTS_DIR = o MOC_DIR = o !win32: LIBS += -Wl,-rpath,.. LIBS += -L.. -ldataquay $${EXTRALIBS} HEADERS += TestBasicStore.h TestDatatypes.h TestTransactionalStore.h TestImportOptions.h TestObjectMapper.h SOURCES += TestDatatypes.cpp main.cpp exists(../../platform-dataquay.pri) { include(../../platform-dataquay.pri) } exists(./platform.pri) { include(./platform.pri) } !exists(./platform.pri) { exists(../platform.pri) { include(../platform.pri) } } !win32 { !macx* { QMAKE_POST_LINK=./$${TARGET} } macx* { QMAKE_POST_LINK=./$${TARGET}.app/Contents/MacOS/$${TARGET} } } win32:QMAKE_POST_LINK=$${TARGET}.exe sonic-visualiser-2.3~repack1.orig/dataquay/tests/TestQtWidgets.cpp0000644000175000017500000001463712252354725024177 0ustar miramira #include "dataquay/BasicStore.h" #include "dataquay/PropertyObject.h" #include "dataquay/TransactionalStore.h" #include "dataquay/Connection.h" #include "dataquay/RDFException.h" #include "dataquay/objectmapper/ObjectStorer.h" #include "dataquay/objectmapper/ObjectLoader.h" #include "dataquay/objectmapper/ObjectBuilder.h" #include "dataquay/objectmapper/TypeMapping.h" #include "../src/Debug.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::cerr; using std::endl; #include #include #include namespace Dataquay { namespace Test { static Uri qtypePrefix("http://breakfastquay.com/rdf/dataquay/qtype/"); static Uri dqPrefix("http://breakfastquay.com/rdf/dataquay/common/"); //??? struct LayoutLoader : public ObjectLoader::LoadCallback { void loaded(ObjectLoader *m, ObjectLoader::NodeObjectMap &map, Node node, QObject *o) { cerr << "LayoutLoader::loaded: uri " << node.value.toStdString() << ", object type " << o->metaObject()->className() << endl; Store *s = m->getStore(); PropertyObject pod(s, dqPrefix.toString(), node); //!!! was cacheing, but that doesn't support this interface yet QObject *parent = o->parent(); if (dynamic_cast(parent) && dynamic_cast(o)) { dynamic_cast(parent)->menuBar()->addMenu (dynamic_cast(o)); } if (dynamic_cast(parent) && dynamic_cast(o)) { dynamic_cast(parent)->addAction (dynamic_cast(o)); } QObject *layout = 0; QObject *layoutOf = 0; QObject *centralOf = 0; if (pod.hasProperty("layout")) { layout = map.value(Uri(pod.getProperty("layout").value())); std::cerr << "have layout property: in map is " << layout << std::endl; } if (pod.hasProperty("layout_of")) { layoutOf = map.value(Uri(pod.getProperty("layout_of").value())); std::cerr << "have layout_of property: in map is " << layoutOf << std::endl; } if (pod.hasProperty("central_widget_of")) { centralOf = map.value(Uri(pod.getProperty("central_widget_of").value())); std::cerr << "have central_widget_of property: in map is " << centralOf << std::endl; } if (centralOf) { QMainWindow *m = dynamic_cast(centralOf); QWidget *w = dynamic_cast(o); if (m && w) { m->setCentralWidget(w); std::cerr << "added central widget" << std::endl; } } if (layoutOf) { QWidget *w = dynamic_cast(layoutOf); QLayout *l = dynamic_cast(o); if (w && l) { w->setLayout(l); std::cerr << "added layout to widget" << std::endl; } } if (layout) { QLayout *cl = dynamic_cast(layout); if (cl) { QWidget *w = dynamic_cast(o); if (w) cl->addWidget(w); std::cerr << "added widget to layout" << std::endl; } } } }; struct LayoutStorer : public ObjectStorer::StoreCallback { void stored(ObjectStorer *m, ObjectStorer::ObjectNodeMap &map, QObject *o, Node node) { std::cerr << "LayoutStorer: stored: " << node << std::endl; PropertyObject pod(m->getStore(), dqPrefix.toString(), node); //!!! not right -- these calls back to store() cause an //!!! infinite loop -- we really need to store only if not //!!! stored already, or modify ObjectStorer so as to call //!!! callbacks only after all objects have been stored (as //!!! ObjectLoader does already) QLayout *layout = dynamic_cast(o); if (layout) { pod.setProperty(0, "layout_of", m->store(o->parent(), map)); } QWidget *widget = dynamic_cast(o); if (widget) { if (widget->layout()) { pod.setProperty(0, "layout", m->store(widget->layout(), map)); } } } }; extern int testQtWidgets(int argc, char **argv) { QApplication app(argc, argv); QString infile = "file:test-qt-widgets.ttl"; if (argc > 1) { infile = QString("file:%1").arg(argv[1]); } BasicStore store; store.import(infile, BasicStore::ImportIgnoreDuplicates); ObjectBuilder *b = ObjectBuilder::getInstance(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); b->registerClass(); TypeMapping mapping; mapping.setObjectTypePrefix(qtypePrefix); mapping.setPropertyPrefix(qtypePrefix); mapping.setRelationshipPrefix(dqPrefix); ObjectLoader oloader(&store); oloader.setTypeMapping(mapping); LayoutLoader loader; oloader.addLoadCallback(&loader, ObjectLoader::FinalCallback); std::cerr << "about to load all objects..." << std::endl; QObjectList objects = oloader.loadAll(); QMainWindow *mw = 0; if (!mw) { foreach (QObject *o, objects) { std::cerr << "child: " << o->metaObject()->className() << std::endl; QMainWindow *hmw = qobject_cast(o); if (hmw) { mw = hmw; std::cerr << "showing main window (it is " << hmw << ", object name \"" << hmw->objectName().toStdString() << "\")" << std::endl; } } } if (mw) mw->show(); else { std::cerr << "no main window! nothing will appear to happen!" << std::endl; } BasicStore store2; store2.setBaseUri(store.getBaseUri()); store2.addPrefix("dq", dqPrefix); store2.addPrefix("qtype", qtypePrefix); ObjectStorer ostorer(&store2); ostorer.setTypeMapping(mapping); ostorer.setPropertyStorePolicy(ObjectStorer::StoreIfChanged); LayoutStorer storer; ostorer.addStoreCallback(&storer); ostorer.setFollowPolicy(ObjectStorer::FollowObjectProperties | ObjectStorer::FollowSiblings | ObjectStorer::FollowParent | ObjectStorer::FollowChildren); std::cerr << "about to store all objects..." << std::endl; ostorer.store(objects); std::cerr << "about to save resulting store..." << std::endl; store2.save("test-qt-widgets-out.ttl"); return app.exec(); } } } int main(int argc, char **argv) { if (!Dataquay::Test::testQtWidgets(argc, argv)) return 1; std::cerr << "testQtWidgets successfully completed" << std::endl; return 0; } sonic-visualiser-2.3~repack1.orig/dataquay/tests/TestDatatypes.cpp0000644000175000017500000000332712252354725024214 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "TestDatatypes.h" QDataStream &operator<<(QDataStream &out, StreamableValueType v) { return out << int(v); } QDataStream &operator>>(QDataStream &in, StreamableValueType &v) { int i; in >> i; v = StreamableValueType(i); return in; } sonic-visualiser-2.3~repack1.orig/dataquay/tests/TestTransactionalStore.h0000644000175000017500000002317212252354725025542 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_TRANSACTIONAL_STORE_H_ #define _TEST_TRANSACTIONAL_STORE_H_ #include #include #include #include #include #include #include namespace Dataquay { class TestTransactionalStore : public QObject { Q_OBJECT private slots: void initTestCase() { store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); ts = new TransactionalStore(&store); } void init() { store.clear(); } void simpleAdds() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); // pause to test transactional isolation Triples triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); // do it again, just to check internal state isn't being bungled triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); // and check that reads *through* the transaction return the // partial state as expected triples = t->match(Triple()); QCOMPARE(triples.size(), added); t->commit(); triples = ts->match(Triple()); QCOMPARE(triples.size(), added); // this is the bogus value we added and then removed in addThings QVERIFY(!ts->contains(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(43))))); // this is the value we actually retained QVERIFY(ts->contains(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))); delete t; } void simpleRollback() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); t->rollback(); delete t; Triples triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); } void autoRollback() { // automatic rollback triggered by an exception in e.g. add Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); // Add incomplete statement to provoke an exception try { t->add(Triple(Node(), Uri("http://xmlns.com/foaf/0.1/name"), Node("this_statement_is_incomplete"))); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } // Now everything should fail on this tx try { t->add(Triple(store.expand(":fred2"), store.expand(":is_sadly_deluded"), Node::fromVariant(true))); QVERIFY2(0, "add succeeded after auto-rollback, should have failed"); } catch (RDFException) { QVERIFY(1); } try { (void)t->match(Triple()); QVERIFY2(0, "match succeeded after auto-rollback, should have failed"); } catch (RDFException) { QVERIFY(1); } // including commit try { t->commit(); QVERIFY2(0, "commit succeeded after auto-rollback, should have failed"); } catch (RDFException) { QVERIFY(1); } // and rollback! try { t->rollback(); QVERIFY2(0, "rollback succeed after auto-rollback, should have failed"); } catch (RDFException) { QVERIFY(1); } delete t; } void emptyTx() { Transaction *t = ts->startTransaction(); t->commit(); delete t; t = ts->startTransaction(); t->rollback(); delete t; } void mustCommitOrRollback() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); try { delete t; QVERIFY(0); } catch (RDFException) { QVERIFY(1); } // but check that this doesn't prevent any further // transactions from happening t = ts->startTransaction(); t->rollback(); delete t; } void noConcurrentTxInThread() { Transaction *t = ts->startTransaction(); try { Transaction *tt = ts->startTransaction(); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } t->rollback(); delete t; } void consecutiveTxInThread() { Transaction *t = ts->startTransaction(); t->commit(); delete t; Transaction *tt = ts->startTransaction(); tt->commit(); delete tt; } void cannotUseFinishedTx() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); // Test that we can't use the transaction after a rollback t->rollback(); try { QVERIFY(!t->add(Triple(store.expand(":fred2"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":samuel")))); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } delete t; t = ts->startTransaction(); QVERIFY(addThings(t, added)); //... or a commit t->commit(); try { Triples triples = t->match(Triple()); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } // and that we can't commit or rollback twice delete t; t = ts->startTransaction(); t->commit(); try { t->commit(); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } delete t; t = ts->startTransaction(); t->rollback(); try { t->rollback(); QVERIFY(0); } catch (RDFException) { QVERIFY(1); } delete t; } void changesets() { Transaction *t = ts->startTransaction(); int added = 0; QVERIFY(addThings(t, added)); ChangeSet changes = t->getChanges(); QVERIFY(!changes.empty()); ChangeSet cchanges = t->getCommittedChanges(); QVERIFY(cchanges.empty()); t->commit(); cchanges = t->getCommittedChanges(); QCOMPARE(cchanges, changes); t = ts->startTransaction(); t->revert(changes); t->commit(); delete t; Triples triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); t = ts->startTransaction(); t->change(changes); t->commit(); delete t; triples = ts->match(Triple()); QCOMPARE(triples.size(), added); // this is the bogus value we added and then removed in addThings QVERIFY(!ts->contains(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(43))))); // this is the value we actually retained QVERIFY(ts->contains(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))); } void simpleConnection() { Connection *c = new Connection(ts); int added = 0; QVERIFY(addThings(c, added)); // query on connection Triples triples = c->match(Triple()); QCOMPARE(triples.size(), added); // query on store triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); // query on a different connection { Connection c2(ts); triples = c2.match(Triple()); QCOMPARE(triples.size(), 0); } c->commit(); triples = c->match(Triple()); QCOMPARE(triples.size(), added); triples = ts->match(Triple()); QCOMPARE(triples.size(), added); c->add(Triple(store.expand(":fred"), store.expand(":likes_to_think_his_age_is"), Node::fromVariant(QVariant(21.9)))); ++added; triples = c->match(Triple()); QCOMPARE(triples.size(), added); triples = ts->match(Triple()); QCOMPARE(triples.size(), added-1); c->commit(); triples = c->match(Triple()); QCOMPARE(triples.size(), added); triples = ts->match(Triple()); QCOMPARE(triples.size(), added); // test implicit commit on dtor for (int i = 0; i < triples.size(); ++i) { c->remove(triples[i]); } delete c; triples = ts->match(Triple()); QCOMPARE(triples.size(), 0); } private: BasicStore store; TransactionalStore *ts; bool addThings(Store *t, int &added) { added = 0; // These add calls are things we've tested in testBasicStore already if (!t->add(Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))) return false; ++added; if (!t->add(Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":alice")))) return false; ++added; t->add(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(43)))); ++added; if (!t->remove(Triple(store.expand(":fred"), store.expand(":age"), Node()))) return false; --added; if (!t->add(Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))) return false; ++added; return true; } }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/tests/main.cpp0000644000175000017500000000467412252354725022350 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "TestBasicStore.h" #include "TestDatatypes.h" #include "TestTransactionalStore.h" #include "TestImportOptions.h" #include "TestObjectMapper.h" #include int main(int argc, char *argv[]) { int good = 0, bad = 0; QCoreApplication app(argc, argv); Dataquay::TestBasicStore tbs; if (QTest::qExec(&tbs, argc, argv) == 0) ++good; else ++bad; Dataquay::TestDatatypes td; if (QTest::qExec(&td, argc, argv) == 0) ++good; else ++bad; Dataquay::TestTransactionalStore tts; if (QTest::qExec(&tts, argc, argv) == 0) ++good; else ++bad; Dataquay::TestImportOptions ti; if (QTest::qExec(&ti, argc, argv) == 0) ++good; else ++bad; Dataquay::TestObjectMapper tom; if (QTest::qExec(&tom, argc, argv) == 0) ++good; else ++bad; if (bad > 0) { std::cerr << "\n********* " << bad << " test suite(s) failed!\n" << std::endl; return 1; } else { std::cerr << "All tests passed" << std::endl; return 0; } } sonic-visualiser-2.3~repack1.orig/dataquay/tests/TestObjects.h0000644000175000017500000001125312252354725023311 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_OBJECTS_H_ #define _TEST_OBJECTS_H_ #include #include #include #include class A : public QObject { Q_OBJECT Q_PROPERTY(QObject *ref READ getRef WRITE setRef STORED true) public: A(QObject *parent = 0) : QObject(parent), m_ref(0) { } QObject *getRef() const { return m_ref; } void setRef(QObject *r) { m_ref = r; } private: QObject *m_ref; }; Q_DECLARE_METATYPE(A*) class B : public QObject { Q_OBJECT Q_PROPERTY(A *aref READ getA WRITE setA STORED true) public: B(QObject *parent = 0) : QObject(parent), m_a(0) { } A *getA() const { return m_a; } void setA(A *r) { m_a = qobject_cast(r); } private: A *m_a; }; Q_DECLARE_METATYPE(B*) class C : public QObject { Q_OBJECT Q_PROPERTY(QString string READ getString WRITE setString NOTIFY stringChanged STORED true) Q_PROPERTY(QStringList strings READ getStrings WRITE setStrings NOTIFY stringsChanged STORED true) Q_PROPERTY(QList floats READ getFloats WRITE setFloats STORED true) Q_PROPERTY(QList bees READ getBees WRITE setBees STORED true) Q_PROPERTY(QSet cees READ getCees WRITE setCees STORED true) Q_PROPERTY(QObjectList objects READ getObjects WRITE setObjects STORED true) public: C(QObject *parent = 0) : QObject(parent) { } QString getString() const { return m_string; } void setString(QString s) { m_string = s; emit stringChanged(s); } QStringList getStrings() const { return m_strings; } void setStrings(QStringList sl) { m_strings = sl; emit stringsChanged(sl); } QList getFloats() const { return m_floats; } void setFloats(QList fl) { m_floats = fl; } QList getBees() const { return m_bees; } void setBees(QList bl) { m_bees = bl; } QSet getCees() const { return m_cees; } void setCees(QSet cl) { m_cees = cl; } QObjectList getObjects() const { return m_objects; } void setObjects(QObjectList ol) { m_objects = ol; } signals: void stringChanged(QString s); void stringsChanged(QStringList sl); private: QString m_string; QStringList m_strings; QList m_floats; QList m_bees; QSet m_cees; QObjectList m_objects; }; Q_DECLARE_METATYPE(C*) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QObjectList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QSet) /* StreamableValueType is a type that can be streamed to QDataStream * and thus converted automatically to QVariant, but that will not be * registered with a Node encoder -- so Node must use an "unknown * type" datatype */ enum StreamableValueType { ValueA = 0, ValueB, ValueC, ValueD, ValueE }; /* NonStreamableValueType is a type that cannot be streamed to * QDataStream, but that we will register with a Node encoder -- so * Node can give it the proper datatype */ enum NonStreamableValueType { ValueF = 0, ValueG, ValueH, ValueI, ValueJ }; extern QDataStream &operator<<(QDataStream &out, StreamableValueType v); extern QDataStream &operator>>(QDataStream &in, StreamableValueType &v); Q_DECLARE_METATYPE(StreamableValueType) Q_DECLARE_METATYPE(NonStreamableValueType) #endif sonic-visualiser-2.3~repack1.orig/dataquay/tests/TestBasicStore.h0000644000175000017500000005130412252354725023757 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_BASIC_STORE_H_ #define _TEST_BASIC_STORE_H_ #include #include #include #include #include namespace Dataquay { class TestBasicStore : public QObject { Q_OBJECT private slots: void initTestCase() { store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); base = store.getBaseUri().toString(); count = 0; fromFred = 0; usingKnows = 0; toAlice = 0; } void makeUri() { // create absolute URI QString s("http://breakfastquay.com/rdf/dataquay/"); Uri uri(s); QCOMPARE(uri.length(), s.length()); // fail to create relative or bogus URI in a few different ways try { Uri uri("/rdf/dataquay"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } try { Uri uri("#x"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } try { Uri uri("x"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } try { Uri uri(""); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } // "a" is a special case uri = Uri("a"); QCOMPARE(uri, Uri::rdfTypeUri()); // succeed in creating relative file URI, Uri should fix it for us uri = Uri("file:a"); QVERIFY(uri.toString() == "file://a"); uri = Uri("file:/a/b"); QVERIFY(uri.toString() == "file:///a/b"); // but we don't like any other prefix without // try { uri = Uri("blah:a"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } try { uri = Uri("blah:/a"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } // succeed in creating absolute URI through store.expand uri = store.expand(":relative"); QCOMPARE(uri.length(), store.getBaseUri().length() + 8); // but fail in turning bogus URI into good one try { uri = store.expand("bogus"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } // and fail in expanding a relative URI through a store with // no base URI BasicStore s1; try { uri = s1.expand(":relative"); QVERIFY(0); } catch (RDFIncompleteURI &) { QVERIFY(1); } } void simpleAdd() { // check triple can be added QVERIFY(store.add (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))); ++count; ++fromFred; // alternative Triple constructor QVERIFY(store.add (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":alice")))); ++count; ++fromFred; ++usingKnows; ++toAlice; } void simpleLookup() { // check triple just added can be found again QVERIFY(store.contains (Triple(store.expand(":fred"), Node(Uri("http://xmlns.com/foaf/0.1/name")), Node("Fred Jenkins")))); } void simpleAbsentLookup() { // check absent triple lookups are correctly handled QVERIFY(!store.contains (Triple(store.expand(":fred"), Node(Uri("http://xmlns.com/foaf/0.1/name")), Node("Fred Johnson")))); } void addFromVariantInt() { // variant conversion QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))); ++count; ++fromFred; Triples triples = store.match (Triple(store.expand(":fred"), store.expand(":age"), Node())); QCOMPARE(triples.size(), 1); QCOMPARE(triples[0].c.toVariant().toInt(), 42); } void addFromVariantURI() { // variant conversion Uri fredUri("http://breakfastquay.com/rdf/person/fred"); QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":has_some_uri"), Node::fromVariant (QVariant::fromValue(fredUri))))); ++count; ++fromFred; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":has_some_local_uri"), Node::fromVariant (QVariant::fromValue(store.expand(":pootle")))))); ++count; ++fromFred; Triples triples = store.match (Triple(store.expand(":fred"), store.expand(":has_some_uri"), Node())); QCOMPARE(triples.size(), 1); QCOMPARE(Uri(triples[0].c.value), fredUri); triples = store.match (Triple(store.expand(":fred"), store.expand(":has_some_local_uri"), Node())); QCOMPARE(triples.size(), 1); QCOMPARE(triples[0].c.toVariant().value(), store.expand(":pootle")); } void addFromVariantFloat() { // variant conversion QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":likes_to_think_his_age_is"), Node::fromVariant(QVariant(21.9))))); ++count; ++fromFred; } void addFromVariantBool() { // variant conversion QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":is_sadly_deluded"), Node::fromVariant(true)))); ++count; ++fromFred; Triples triples = store.match (Triple(store.expand(":fred"), store.expand(":is_sadly_deluded"), Node())); QCOMPARE(triples.size(), 1); QCOMPARE(triples[0].c.toVariant().toBool(), true); } void addFromVariantList() { // variant conversion QStringList colours; colours << "turquoise"; colours << "red"; colours << "black"; QCOMPARE(colours.size(), 3); QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":favourite_colours_are"), Node::fromVariant(QVariant(colours))))); ++count; ++fromFred; Triples triples = store.match (Triple(store.expand(":fred"), store.expand(":favourite_colours_are"), Node())); QCOMPARE(triples.size(), 1); QStringList retrievedColours = triples[0].c.toVariant().toStringList(); QCOMPARE(colours, retrievedColours); } void addWithRdfTypeBuiltin() { // rdf:type builtin QVERIFY(store.add (Triple(store.expand(":fred"), Uri("a"), store.expand(":person")))); QVERIFY(store.contains (Triple(store.expand(":fred"), store.expand("rdf:type"), store.expand(":person")))); ++count; ++fromFred; } void addUsingPrefix() { // prefix expansion store.addPrefix("foaf", Uri("http://xmlns.com/foaf/0.1/")); QVERIFY(store.add (Triple(store.expand(":alice"), store.expand("foaf:knows"), store.expand(":fred")))); QVERIFY(store.contains (Triple(store.expand(":alice"), Node(Uri("http://xmlns.com/foaf/0.1/knows")), store.expand(":fred")))); QVERIFY(store.add (Triple(store.expand(":alice"), store.expand("foaf:name"), Node(QString("Alice Banquet"))))); ++usingKnows; ++count; ++count; } void addDuplicate() { // we try to add a triple that is a differently-expressed // duplicate of an already-added one -- this should be ignored // (returning false) and we do not increment our count QVERIFY(!store.add (Triple(Uri(base + "alice"), Uri("http://xmlns.com/foaf/0.1/name"), Node(QString("Alice Banquet"))))); // now we try to add a triple a bit like an existing one but // differing in prefix -- this should succeed, and we do increment // our count, although this is not a very useful statement QVERIFY(store.add (Triple(store.expand(":alice"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand("foaf:fred")))); ++usingKnows; ++count; } void addBlanks() { // things involving blank nodes Node blankNode = store.addBlankNode(); QVERIFY(store.add (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/maker"), blankNode))); ++count; ++fromFred; QVERIFY(store.add (Triple(blankNode, store.expand("foaf:name"), Node("Omnipotent Being")))); ++count; } void addBlankPredicateFail() { // can't have a blank node as predicate Node anotherBlank = store.addBlankNode(); try { QVERIFY(!store.add (Triple(store.expand(":fred"), anotherBlank, Node("this_statement_is_incomplete")))); } catch (RDFException &) { QVERIFY(1); } } void matchCounts() { // Must run after adds. Check match-all, and matches with each // of S, P and O primary QCOMPARE(store.match(Triple()).size(), count); QCOMPARE(store.match (Triple(store.expand(":fred"), Node(), Node())).size(), fromFred); QCOMPARE(store.match (Triple(Node(), store.expand("foaf:knows"), Node())).size(), usingKnows); QCOMPARE(store.match (Triple(Node(), Node(), store.expand(":alice"))).size(), toAlice); } void compareTriples() { // check empty Triples match QVERIFY(Triples().matches(Triples())); // check two identical searches return matching (non-empty) results Triples t1 = store.match(Triple(store.expand(":fred"), Node(), Node())); Triples t2 = store.match(Triple(store.expand(":fred"), Node(), Node())); QVERIFY(t1.size() > 0); QVERIFY(!t1.matches(Triples())); QVERIFY(t1.matches(t2)); QVERIFY(t2.matches(t1)); // check Triples matches itself in a different order t2 = Triples(); foreach (Triple t, t1) t2.push_front(t); QVERIFY(t1.matches(t2)); QVERIFY(t2.matches(t1)); // check two different searches return non-matching results t2 = store.match(Triple(store.expand(":alice"), Node(), Node())); QVERIFY(!t1.matches(t2)); QVERIFY(!t2.matches(t1)); } void sliceTriples() { Triples tt = store.match(Triple()); QCOMPARE(tt.size(), count); Nodes nna = tt.subjects(); QCOMPARE(nna.size(), count); foreach (Node n, nna) { QVERIFY(n.type == Node::URI || n.type == Node::Blank); } Nodes nnb = tt.predicates(); QVERIFY(nnb != nna); QCOMPARE(nnb.size(), count); foreach (Node n, nnb) { QVERIFY(n.type == Node::URI); } Nodes nnc = tt.objects(); QVERIFY(nnc != nna); QCOMPARE(nnc.size(), count); } void query() { QString q = QString(" SELECT ?a " " WHERE { :fred foaf:knows ?a } "); ResultSet results; // We cannot perform queries without an absolute base URI, // it seems, because the query engine takes relative URIs // as relative to the query URI and we can't override that // without an absolute prefix for the base URI try { results = store.query(q); QCOMPARE(results.size(), 1); Node v = store.queryOnce(q, "a"); QString expected = base + "alice"; QCOMPARE(v.type, Node::URI); QCOMPARE(v.value, expected); } catch (RDFUnsupportedError &e) { #if (QT_VERSION >= 0x050000) QSKIP("SPARQL queries not supported by current store backend"); #else QSKIP("SPARQL queries not supported by current store backend", SkipSingle); #endif } } void complete() { Node n = store.complete (Triple(store.expand(":alice"), store.expand("foaf:name"), Node())); QCOMPARE(n, Node("Alice Banquet")); n = store.complete (Triple(store.expand(":alice"), Node(), Node("Alice Banquet"))); QCOMPARE(n, Node(store.expand("foaf:name"))); n = store.complete (Triple(Node(), store.expand("foaf:name"), Node("Alice Banquet"))); QCOMPARE(n, Node(store.expand(":alice"))); try { n = store.complete (Triple(store.expand(":alice"), store.expand("foaf:name"), Node("Alice Banquet"))); QVERIFY(0); } catch (RDFException &) { // can't complete a complete triple QVERIFY(1); } try { n = store.complete (Triple(Node(), store.expand("foaf:name"), Node())); QVERIFY(0); } catch (RDFException &) { // can't complete an underspecified triple QVERIFY(1); } } void saveAndLoad() { store.save("test.ttl"); BasicStore *store2 = BasicStore::load(QUrl("file:test.ttl")); QVERIFY(store2); store2->save("test2.ttl"); QCOMPARE(store2->match(Triple()).size(), count); QCOMPARE(store2->match (Triple(store.expand(":fred"), Node(), Node())).size(), fromFred); QCOMPARE(store2->match (Triple(Node(), Node(), store.expand(":alice"))).size(), toAlice); delete store2; store.clear(); store.import(QUrl("file:test2.ttl"), BasicStore::ImportFailOnDuplicates); QCOMPARE(store.match(Triple()).size(), count); QCOMPARE(store.match (Triple(store.expand(":fred"), Node(), Node())).size(), fromFred); QCOMPARE(store.match (Triple(Node(), Node(), store.expand(":alice"))).size(), toAlice); } //!!! todo: files with explicit @base in file void loadRelative() { // Make test file without a base URI QFile f("test3.ttl"); QVERIFY(f.open(QFile::WriteOnly | QFile::Truncate)); QTextStream ts(&f); ts << "@prefix : <#> ." << endl << ":thing a :wotsit ." << endl; ts.flush(); f.close(); // If a file has no base URI, importing it into an existing // store with a base should result in URLs relative to that // base BasicStore s1; s1.setBaseUri(Uri("http://wox/")); s1.import(QUrl("file:test3.ttl"), BasicStore::ImportIgnoreDuplicates); Triple t = s1.matchOnce(Triple(Node(), Uri("a"), Node())); QCOMPARE(t.a, Node(Uri("http://wox/#thing"))); QCOMPARE(t.c, Node(Uri("http://wox/#wotsit"))); // And loading it should result in URLs relative to the file // URL BasicStore *s2 = BasicStore::load(QUrl("file://test3.ttl")); t = s2->matchOnce(Triple(Node(), Uri("a"), Node())); QCOMPARE(t.a, Node(Uri("file://test3.ttl#thing"))); QCOMPARE(t.c, Node(Uri("file://test3.ttl#wotsit"))); } void loadMultiBase() { // save two stores with different base URIs to files, check we // can reload them into the same store (i.e. that we resolve // the CURIEs properly relative to file base URI not target // store base URI on loading) BasicStore *otherStore = new BasicStore; otherStore->setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests/other#")); // this must be a triple we have already added to the first // store, using a local URI -- we are checking here for // duplicates on import QVERIFY(otherStore->add (Triple(otherStore->expand(":fred"), Node(Uri("http://xmlns.com/foaf/0.1/name")), Node("Fred Jenkins")))); // and this is to test that the reloaded :fred, despite having // the same name, is a different individual from the :fred in // our first store QVERIFY(otherStore->add (Triple(otherStore->expand(":fred"), otherStore->expand(":age"), Node::fromVariant(QVariant(3))))); store.save("multi-a.ttl"); otherStore->save("multi-b.ttl"); BasicStore *target = new BasicStore; target->setBaseUri(store.getBaseUri()); target->import(QUrl("file:multi-a.ttl"), BasicStore::ImportIgnoreDuplicates); QVERIFY(target); QCOMPARE(target->getBaseUri(), store.getBaseUri()); target->import(QUrl("file:multi-b.ttl"), Store::ImportFailOnDuplicates); QVERIFY(target->contains (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))); QVERIFY(target->contains (Triple(Uri("http://breakfastquay.com/rdf/dataquay/tests#fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))); QVERIFY(target->contains (Triple(Node(Uri("http://breakfastquay.com/rdf/dataquay/tests/other#fred")), Node(Uri("http://xmlns.com/foaf/0.1/name")), Node("Fred Jenkins")))); QVERIFY(target->contains (Triple(Uri("http://breakfastquay.com/rdf/dataquay/tests/other#fred"), Uri("http://breakfastquay.com/rdf/dataquay/tests/other#age"), Node("3", store.expand("xsd:integer"))))); QVERIFY(target->contains (Triple(Node(Uri("http://breakfastquay.com/rdf/dataquay/tests#fred")), store.expand(":age"), Node("42", store.expand("xsd:integer"))))); } void loadCompetingBlanks() { // import from two files which use the same blank genid for // different purposes and establish that the two don't // conflict with each other { QFile f("test-blank-1.ttl"); QVERIFY(f.open(QFile::WriteOnly | QFile::Truncate)); QTextStream ts(&f); ts << "@prefix : <#> ." << endl; ts << ":thing :has _:genid1 ." << endl; ts << "_:genid1 :name \"weevil\" ." << endl; ts.flush(); f.close(); } { QFile f("test-blank-2.ttl"); QVERIFY(f.open(QFile::WriteOnly | QFile::Truncate)); QTextStream ts(&f); ts << "@prefix : <#> ." << endl; ts << ":other :has _:genid1 ." << endl; ts << "_:genid1 :name \"squidlet\" ." << endl; ts.flush(); f.close(); } BasicStore *s = BasicStore::load(QUrl("file:test-blank-1.ttl")); s->import(QUrl("file:test-blank-2.ttl"), Store::ImportFailOnDuplicates); Triple t1 = s->matchOnce(Triple(Node(), Node(), Node("weevil"))); Triple t2 = s->matchOnce(Triple(Node(), Node(), Node("squidlet"))); QVERIFY(t1.a != t2.a); delete s; } void remove() { // check we can remove a triple QVERIFY(store.remove (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":alice")))); --count; --fromFred; --toAlice; // check we can't remove a triple that does not exist in store QVERIFY(!store.remove (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/knows"), store.expand(":tammy")))); Triples triples = store.match(Triple()); QCOMPARE(triples.size(), count); } void removeMatch() { // check we can remove triples matching wildcard pattern QVERIFY(store.remove(Triple(store.expand(":fred"), Node(), Node()))); Triples triples = store.match(Triple()); QCOMPARE(triples.size(), count - fromFred); QVERIFY(store.remove(Triple(Node(), Node(), Node()))); triples = store.match(Triple()); QCOMPARE(triples.size(), 0); } private: BasicStore store; QString base; int count; int fromFred; int usingKnows; int toAlice; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/tests/TestObjectMapper.h0000644000175000017500000005334412252354725024302 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_OBJECT_MAPPER_H_ #define _TEST_OBJECT_MAPPER_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Object types to be used in the tests class A : public QObject { Q_OBJECT Q_PROPERTY(QObject *ref READ getRef WRITE setRef STORED true) public: A(QObject *parent = 0) : QObject(parent), m_ref(0) { } QObject *getRef() const { return m_ref; } void setRef(QObject *r) { m_ref = r; } private: QObject *m_ref; }; Q_DECLARE_METATYPE(A*) class B : public QObject { Q_OBJECT Q_PROPERTY(A *aref READ getA WRITE setA STORED true) public: B(QObject *parent = 0) : QObject(parent), m_a(0) { } A *getA() const { return m_a; } void setA(A *r) { m_a = qobject_cast(r); } private: A *m_a; }; Q_DECLARE_METATYPE(B*) class C : public QObject { Q_OBJECT Q_PROPERTY(QString string READ getString WRITE setString NOTIFY stringChanged STORED true) Q_PROPERTY(QStringList strings READ getStrings WRITE setStrings NOTIFY stringsChanged STORED true) Q_PROPERTY(QList floats READ getFloats WRITE setFloats STORED true) Q_PROPERTY(QList bees READ getBees WRITE setBees STORED true) Q_PROPERTY(QSet cees READ getCees WRITE setCees STORED true) Q_PROPERTY(QObjectList objects READ getObjects WRITE setObjects STORED true) public: C(QObject *parent = 0) : QObject(parent) { } QString getString() const { return m_string; } void setString(QString s) { m_string = s; emit stringChanged(s); } QStringList getStrings() const { return m_strings; } void setStrings(QStringList sl) { m_strings = sl; emit stringsChanged(sl); } QList getFloats() const { return m_floats; } void setFloats(QList fl) { m_floats = fl; } QList getBees() const { return m_bees; } void setBees(QList bl) { m_bees = bl; } QSet getCees() const { return m_cees; } void setCees(QSet cl) { m_cees = cl; } QObjectList getObjects() const { return m_objects; } void setObjects(QObjectList ol) { m_objects = ol; } signals: void stringChanged(QString s); void stringsChanged(QStringList sl); private: QString m_string; QStringList m_strings; QList m_floats; QList m_bees; QSet m_cees; QObjectList m_objects; }; Q_DECLARE_METATYPE(C*) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QObjectList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QSet) namespace Dataquay { class TestObjectMapper : public QObject { Q_OBJECT public: TestObjectMapper() : store(), storer(&store) { } ~TestObjectMapper() { } private slots: void initTestCase() { store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); store.addPrefix("type", storer.getTypeMapping().getObjectTypePrefix()); store.addPrefix("property", storer.getTypeMapping().getPropertyPrefix()); store.addPrefix("rel", storer.getTypeMapping().getRelationshipPrefix()); } void init() { store.clear(); storer.setPropertyStorePolicy(ObjectStorer::StoreIfChanged); } void untypedStoreRecall() { QObject *o = new QObject; o->setObjectName("Test Object"); Uri uri = storer.store(o); QVERIFY(uri != Uri()); ObjectLoader loader(&store); QObject *recalled = loader.load(uri); QVERIFY(recalled); QCOMPARE(recalled->objectName(), o->objectName()); delete recalled; delete o; } void typedStoreRecall() { QTimer *t = new QTimer; t->setSingleShot(true); t->setInterval(4); Uri uri = storer.store(t); QVERIFY(uri != Uri()); ObjectLoader loader(&store); QObject *recalled = 0; try { // object type is not registered, this load should fail recalled = loader.load(uri); QVERIFY(0); } catch (UnknownTypeException) { QVERIFY(1); } ObjectBuilder::getInstance()->registerClass(); recalled = loader.load(uri); QVERIFY(recalled); QCOMPARE(recalled->objectName(), t->objectName()); QVERIFY(qobject_cast(recalled)); delete recalled; delete t; } void customTypeStoreRecall() { A *a = new A; a->setProperty("uri", QVariant::fromValue(store.expand(":a"))); Uri uri = storer.store(a); QVERIFY(uri != Uri()); ObjectLoader loader(&store); QObject *recalled = 0; try { // object type is not registered, this load should fail recalled = loader.load(uri); QVERIFY(0); } catch (UnknownTypeException) { QVERIFY(1); } qRegisterMetaType("A*"); ObjectBuilder::getInstance()->registerClass("A*"); recalled = loader.load(uri); QVERIFY(recalled); QCOMPARE(recalled->objectName(), a->objectName()); QVERIFY(qobject_cast(recalled)); delete recalled; delete a; } void prepareGraphTypes() { // We registered the metatype and object builder class for A // in the previous test qRegisterMetaType("B*"); qRegisterMetaType("C*"); qRegisterMetaType >("QList"); qRegisterMetaType >("QList"); qRegisterMetaType >("QSet"); qRegisterMetaType("QObjectList"); ObjectBuilder::getInstance()->registerClass("B*"); ObjectBuilder::getInstance()->registerClass("C*"); ContainerBuilder::getInstance()->registerContainer >("A*", "QList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer >("B*", "QList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer >("C*", "QList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer("QObject*", "QObjectList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer >("float", "QList", ContainerBuilder::SequenceKind); ContainerBuilder::getInstance()->registerContainer >("C*", "QSet", ContainerBuilder::SetKind); } void complexGraphStoreRecall() { QObject *o = new QObject; o->setObjectName("Test Object"); A *a = new A(o); B *b = new B(o); b->setA(a); C *c = new C; c->setObjectName("C with many properties"); QStringList strings; strings << "First string"; strings << "Second string"; c->setStrings(strings); QList floats; floats << 1.f; floats << 2.f; floats << 3.f; floats << 4.f; c->setFloats(floats); QList blist; B *b0 = new B; b0->setA(a); b0->setObjectName("b0"); B *b1 = new B; A *a1 = new A; a1->setObjectName("a1"); b1->setA(a1); b1->setObjectName("b1"); B *b2 = new B; b2->setObjectName("b2"); blist << b0 << b1; c->setBees(blist); QSet cset; C *c1 = new C; c1->setObjectName("c1"); C *c2 = new C; c2->setObjectName("c2"); cset.insert(c1); cset.insert(c2); // nb circular reference cset.insert(c); c->setCees(cset); QObjectList ol; ol << b2; c->setObjects(ol); a->setRef(c); storer.setFollowPolicy(ObjectStorer::FollowObjectProperties | ObjectStorer::FollowChildren); ObjectStorer::ObjectNodeMap map; storer.store(o, map); // We should have: // // - one object with URI, one property, of type:QObject // - one object with URI, one property, follows, and parent, of type:A // - one blank node of type:A // - three blank nodes of type:C // - four blank nodes of type:B, one of which has parent // // We will check existence (though not qualities) of all the // above. First though we do a quick count of type triples, then // store again using the same object-node map, then check the // results match (in case the storer is generating new URIs or // blank nodes for things that already have them in the map). Triples test = store.match(Triple(Node(), Uri("a"), Node())); QCOMPARE(test.size(), 10); storer.store(o, map); test = store.match(Triple(Node(), Uri("a"), Node())); QCOMPARE(test.size(), 10); // Now the rest of the content tests test = store.match(Triple(Node(), Uri("a"), store.expand("type:QObject"))); QCOMPARE(test.size(), 1); QCOMPARE(test[0].a.type, Node::URI); test = store.match(Triple(Node(), Uri("a"), store.expand("type:A"))); QCOMPARE(test.size(), 2); int blankCount = 0, uriCount = 0; foreach (Triple t, test) { if (t.a.type == Node::URI) uriCount++; else if (t.a.type == Node::Blank) blankCount++; } QCOMPARE(blankCount, 1); QCOMPARE(uriCount, 1); test = store.match(Triple(Node(), Uri("a"), store.expand("type:B"))); QCOMPARE(test.size(), 4); /*!!! not a good test -- one of the Bs ("b") will be given a URI because it's a top-level node rather than a property foreach (Triple t, test) { if (t.a.type != Node::Blank) { cerr << "B-type node in store is not expected blank node" << endl; return false; } } */ test = store.match(Triple(Node(), Uri("a"), store.expand("type:C"))); QCOMPARE(test.size(), 3); // pull out the b0 object node and check some of its properties test = store.match(Triple(Node(), store.expand("property:objectName"), Node("b0"))); QCOMPARE(test.size(), 1); Node b0node = test[0].a; test = store.match(Triple(b0node, store.expand("property:aref"), Node())); QCOMPARE(test.size(), 1); Node anode = test[0].c; test = store.match(Triple(anode, Uri("a"), store.expand("type:A"))); QCOMPARE(test.size(), 1); test = store.match(Triple(anode, store.expand("rel:parent"), Node())); QCOMPARE(test.size(), 1); Node pnode = test[0].c; test = store.match(Triple(pnode, store.expand("property:objectName"), Node())); QCOMPARE(test.size(), 1); QCOMPARE(test[0].c.value, QString("Test Object")); store.save("test-complex-graph.ttl"); delete c; delete a; delete a1; delete b; delete b0; delete b1; delete b2; delete c1; delete c2; delete o; } void complexGraphReload() { // relies on test-complex-graph.ttl having been saved in // previous test ObjectLoader loader(&store); QObjectList objects = loader.loadAll(); QCOMPARE(objects.size(), 0); store.import(QUrl("file:test-complex-graph.ttl"), Store::ImportIgnoreDuplicates); objects = loader.loadAll(); QCOMPARE(objects.size(), 10); // Delete the objects we loaded -- but carefully as some are // children of others. Count the number of these so as // to test that the graph has similar shape to before int haveParent = 0; QObjectList toDelete; foreach (QObject *o, objects) { if (!o->parent()) toDelete.push_back(o); else ++haveParent; } foreach (QObject *o, toDelete) { delete o; } QCOMPARE(haveParent, 2); } void mapperSimpleAdd() { QObject *o = new QObject; o->setObjectName("Test Object"); A *a = new A(o); // prime things by storing one object ObjectStorer storer(&store); storer.store(o); TransactionalStore ts(&store); ObjectMapper mapper(&ts); try { // This should not be possible: the object lacks a URI, // has not been added to the store before, and needs to be // added, not just managed mapper.manage(a); QVERIFY(0); } catch (NoUriException) { QVERIFY(1); } // this should work, though, because o has been stored mapper.manage(o); mapper.add(a); // We haven't committed the add yet, so added object should // have no node yet Node anode = mapper.getNodeForObject(a); QCOMPARE(anode, Node()); // But the object that was stored earlier should have Node onode = mapper.getNodeForObject(o); QVERIFY(onode != Node()); // now commit the add mapper.commit(); // check properties of o Triples t = ts.match(Triple(onode, Node(), Node())); QCOMPARE(t.size(), 2); // type, name t = ts.match(Triple(onode, Uri("a"), Node())); QCOMPARE(t.size(), 1); QCOMPARE(t[0].c, Node(store.expand("type:QObject"))); t = ts.match(Triple(onode, store.expand("property:objectName"), Node())); QCOMPARE(t.size(), 1); QCOMPARE(t[0].c, Node("Test Object")); // and a should have a node now anode = mapper.getNodeForObject(a); QVERIFY(anode != Node()); t = ts.match(Triple(anode, Node(), Node())); QCOMPARE(t.size(), 2); // type, parent t = ts.match(Triple(anode, Uri("a"), Node())); QCOMPARE(t.size(), 1); QCOMPARE(t[0].c, Node(store.expand("type:A"))); t = ts.match(Triple(anode, store.expand("rel:parent"), Node())); QCOMPARE(t.size(), 1); QCOMPARE(t[0].c, onode); delete o; // also deletes a, as it's a child of o } void mapperSimplePropertyUpdate() { C *c = new C; TransactionalStore ts(&store); ObjectMapper mapper(&ts); mapper.add(c); mapper.commit(); Node n = mapper.getNodeForObject(c); QVERIFY(n != Node()); Triple t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c, Node()); c->setString("Lone string"); // should not have affected the store yet t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c, Node()); mapper.commit(); // now it should t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c.value, QString("Lone string")); c->setString("New lone string"); t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c.value, QString("Lone string")); mapper.commit(); t = ts.matchOnce(Triple(n, store.expand("property:string"), Node())); QCOMPARE(t.c.value, QString("New lone string")); Transaction *tx = ts.startTransaction(); QVERIFY(tx->remove(Triple(n, store.expand("property:string"), Node()))); tx->commit(); delete tx; // deleting the property should have caused the object to be // reloaded QCOMPARE(c->getString(), QString()); tx = ts.startTransaction(); QVERIFY(tx->add(Triple(n, store.expand("property:string"), Node("Another lone string")))); tx->commit(); delete tx; QCOMPARE(c->getString(), QString("Another lone string")); delete c; } void mapperListPropertyUpdate() { C *c = new C; TransactionalStore ts(&store); ObjectMapper mapper(&ts); mapper.add(c); mapper.commit(); Node n = mapper.getNodeForObject(c); QVERIFY(n != Node()); QStringList strings; strings << "First string"; strings << "Second string"; c->setStrings(strings); Triple t = ts.matchOnce(Triple(n, store.expand("property:strings"), Node())); QCOMPARE(t.c, Node()); mapper.commit(); t = ts.matchOnce(Triple(n, store.expand("property:strings"), Node())); QVERIFY(t.c.type == Node::Blank); // list starts with blank node Triple v = ts.matchOnce(Triple(t.c, store.expand("rdf:first"), Node())); QCOMPARE(v.c.value, QString("First string")); t = ts.matchOnce(Triple(t.c, store.expand("rdf:rest"), Node())); QVERIFY(t.c.type == Node::Blank); v = ts.matchOnce(Triple(t.c, store.expand("rdf:first"), Node())); QCOMPARE(v.c.value, QString("Second string")); t = ts.matchOnce(Triple(t.c, store.expand("rdf:rest"), Node())); QCOMPARE(t.c, Node(store.expand("rdf:nil"))); strings.clear(); strings << "Replacement string"; c->setStrings(strings); mapper.commit(); t = ts.matchOnce(Triple(n, store.expand("property:strings"), Node())); QVERIFY(t.c.type == Node::Blank); v = ts.matchOnce(Triple(t.c, store.expand("rdf:first"), Node())); QCOMPARE(v.c.value, QString("Replacement string")); t = ts.matchOnce(Triple(t.c, store.expand("rdf:rest"), Node())); QCOMPARE(t.c, Node(store.expand("rdf:nil"))); // check the former strings are now gone t = ts.matchOnce(Triple(Node(), Node(), Node("First string"))); QCOMPARE(t, Triple()); t = ts.matchOnce(Triple(Node(), Node(), Node("Second string"))); QCOMPARE(t, Triple()); delete c; mapper.commit(); // all properties should now be gone, as c has been deleted t = ts.matchOnce(Triple()); QCOMPARE(t, Triple()); } void mapperResyncOnParentRemoval() { // This is a test for a very specific situation -- we cause to // be deleted the parent of a managed object, by removing all // references to the parent from the store so that the mapper // deletes the parent when the transaction is committed. This // causes the child to be deleted by Qt; is the mapper clever // enough to realise that this is a different deletion signal // from that of the parent, and re-sync the child accordingly? QObject *o = new QObject; o->setObjectName("Test Object"); A *a = new A(o); TransactionalStore ts(&store); ObjectMapper mapper(&ts); mapper.add(o); mapper.add(a); mapper.commit(); Node onode = mapper.getNodeForObject(o); QVERIFY(onode != Node()); Node anode = mapper.getNodeForObject(a); QVERIFY(anode != Node()); Triples t = ts.match(Triple(anode, Node(), Node())); QCOMPARE(t.size(), 2); // type and parent Transaction *tx = ts.startTransaction(); // remove all properties of the parent of a tx->remove(Triple(onode, Node(), Node())); tx->commit(); delete tx; mapper.commit(); t = ts.match(Triple(anode, Node(), Node())); QCOMPARE(t.size(), 0); // a should have been removed } void loaderPropertyOfParent() { // Another very specific one involving cycles -- an object // that is referred to as a property of its own parent. On // loading through the child with follow-parent set, we should // find that the object has the correct parent and that the // parent refers to the correct object in its property (and // not that the loader has instantiated the child without a // parent in order to fill the parent's property in a // recursive call while instantiating the parent for the // child) Node child(store.getUniqueUri(":child_")); Node parent(store.getUniqueUri(":parent_")); store.add(Triple(child, Uri("a"), store.expand("type:A"))); store.add(Triple(child, store.expand("rel:parent"), parent)); store.add(Triple(parent, Uri("a"), store.expand("type:B"))); store.add(Triple(parent, store.expand("property:aref"), child)); store.save("test-pp.ttl"); ObjectLoader loader(&store); loader.setFollowPolicy(ObjectLoader::FollowObjectProperties | ObjectLoader::FollowParent); ObjectLoader::NodeObjectMap testMap; loader.reload(Nodes() << child, testMap); QCOMPARE(testMap.size(), 2); QVERIFY(testMap.contains(parent)); QVERIFY(testMap.contains(child)); QVERIFY(testMap.value(parent)); QVERIFY(testMap.value(child)); A *testChild = qobject_cast(testMap.value(child).data()); B *testParent = qobject_cast(testMap.value(parent).data()); QVERIFY(testChild); QVERIFY(testParent); QCOMPARE(testChild->parent(), testParent); QCOMPARE(testParent->children().size(), 1); QCOMPARE(testParent->children()[0], testChild); QCOMPARE(testParent->getA(), testChild); } private: BasicStore store; ObjectStorer storer; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/tests/TestImportOptions.h0000644000175000017500000001213712252354725024550 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_IMPORT_OPTIONS_H_ #define _TEST_IMPORT_OPTIONS_H_ #include #include #include #include #include #include #include namespace Dataquay { class TestImportOptions : public QObject { Q_OBJECT private slots: void initTestCase() { count = 0; store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); // If TestBasicStore has passed, these should be no problem QVERIFY(store.add (Triple(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), Node("Fred Jenkins")))); ++count; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":age"), Node::fromVariant(QVariant(42))))); ++count; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":has_some_uri"), Node::fromVariant(QVariant::fromValue (Uri("http://breakfastquay.com/rdf/person/fred")))))); ++count; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":has_some_local_uri"), Node::fromVariant(QVariant::fromValue (store.expand(":pootle")))))); ++count; QVERIFY(store.add (Triple(store.expand(":fred"), store.expand(":likes_to_think_his_age_is"), Node::fromVariant(QVariant(21.9))))); ++count; filename = "import-test.ttl"; fileUrl = QUrl("file:" + filename); store.save(filename); } void normal() { store.clear(); store.import(fileUrl, BasicStore::ImportIgnoreDuplicates); Triples tt = store.match(Triple()); QCOMPARE(tt.size(), count); } void duplicatesFail() { store.clear(); store.import(fileUrl, BasicStore::ImportFailOnDuplicates); bool caught = false; try { store.import(fileUrl, BasicStore::ImportFailOnDuplicates); } catch (RDFDuplicateImportException) { caught = true; } QVERIFY2(caught, "Failed to catch RDFDuplicateImportException when importing duplicate graph with ImportFailOnDuplicates"); Triples tt = store.match(Triple()); QCOMPARE(tt.size(), count); } void duplicatesIgnored() { store.clear(); store.import(fileUrl, BasicStore::ImportFailOnDuplicates); store.import(fileUrl, BasicStore::ImportIgnoreDuplicates); // note -- the number of triples after import is only the same // as count because there are no blank nodes involved, so all // nodes are duplicates. Blank nodes synthesised during import // can't be identified as identical to existing blank nodes, // so they would load multiple times successfully leaving us // with semantically identical triples in the store Triples tt = store.match(Triple()); QCOMPARE(tt.size(), count); } void duplicatesPermitted() { store.clear(); store.import(fileUrl, BasicStore::ImportFailOnDuplicates); store.import(fileUrl, BasicStore::ImportPermitDuplicates); // we can say nothing about the number of triples in store // here as it all depends on the back end (this is not a // useful mode if the store already has something in it, it's // just the fastest) } void transactionalIsolation() { // testing only isolation during import, there is a separate // TransactionalStore test suite TransactionalStore ts(&store); Connection c(&ts); c.remove(Triple()); c.commit(); c.import(fileUrl, BasicStore::ImportIgnoreDuplicates); { Connection c2(&ts); // unrelated connection, should be isolated QCOMPARE(c2.match(Triple()).size(), 0); } c.commit(); { Connection c2(&ts); QCOMPARE(c2.match(Triple()).size(), count); } } private: BasicStore store; QString filename; QUrl fileUrl; int count; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/tests/TestDatatypes.h0000644000175000017500000001624012252354725023657 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _TEST_DATATYPES_H_ #define _TEST_DATATYPES_H_ #include #include #include #include #include /* StreamableValueType is a type that can be streamed to QDataStream * and thus converted automatically to QVariant, but that will not be * registered with a Node encoder -- so Node must use an "unknown * type" datatype */ enum StreamableValueType { ValueA = 0, ValueB, ValueC, ValueD, ValueE }; /* NonStreamableValueType is a type that cannot be streamed to * QDataStream, but that we will register with a Node encoder -- so * Node can give it the proper datatype */ enum NonStreamableValueType { ValueF = 0, ValueG, ValueH, ValueI, ValueJ }; Q_DECLARE_METATYPE(StreamableValueType) Q_DECLARE_METATYPE(NonStreamableValueType) extern QDataStream &operator<<(QDataStream &out, StreamableValueType v); extern QDataStream &operator>>(QDataStream &in, StreamableValueType &v); namespace Dataquay { struct NonStreamableEncoder : public Node::VariantEncoder { QVariant toVariant(const QString &s) { if (s == "F") return QVariant::fromValue(ValueF); else if (s == "G") return QVariant::fromValue(ValueG); else if (s == "H") return QVariant::fromValue(ValueH); else if (s == "I") return QVariant::fromValue(ValueI); else if (s == "J") return QVariant::fromValue(ValueJ); else return QVariant(); } QString fromVariant(const QVariant &v) { NonStreamableValueType nsv = v.value(); switch (nsv) { case ValueF: return "F"; case ValueG: return "G"; case ValueH: return "H"; case ValueI: return "I"; case ValueJ: return "J"; default: return ""; } } }; class TestDatatypes : public QObject { Q_OBJECT private: Uri nsvDtUri; private slots: void initTestCase() { store.setBaseUri(Uri("http://breakfastquay.com/rdf/dataquay/tests#")); qRegisterMetaType("StreamableValueType"); qRegisterMetaType("NonStreamableValueType"); qRegisterMetaTypeStreamOperators("StreamableValueType"); nsvDtUri = Uri("http://breakfastquay.com/rdf/dataquay/test/nonstreamable"); Node::registerDatatype(nsvDtUri, "NonStreamableValueType", new NonStreamableEncoder()); } void basicConversions() { Node n("Fred Jenkins", Uri()); QVariant v = n.toVariant(); QCOMPARE(v.userType(), (int)QMetaType::QString); QCOMPARE(Node::fromVariant(v).datatype, n.datatype); Triple t(store.expand(":fred"), Uri("http://xmlns.com/foaf/0.1/name"), n); QVERIFY(store.add(t)); t.c = Node(); Triple t0(store.matchOnce(t)); Node n0 = t.c; QCOMPARE(n0.datatype, n.datatype); n = Node("1", store.expand("xsd:integer")); v = n.toVariant(); QCOMPARE(v.userType(), (int)QMetaType::Long); n0 = Node::fromVariant(v); QCOMPARE(n0.datatype, n.datatype); t = Triple(store.expand(":fred"), store.expand(":number_of_jobs"), n); QVERIFY(store.add(t)); t.c = Node(); t0 = store.matchOnce(t); n0 = t0.c; QCOMPARE(n0.datatype, n.datatype); } void streamableTypeConversions() { StreamableValueType sv = ValueC; QVERIFY(QMetaType::type("StreamableValueType") > 0); // first some tests on basic QVariant storage just to ensure // we've registered the type correctly and our understanding // of expected behaviour is correct QVariant svv = QVariant::fromValue(sv); QCOMPARE(svv.userType(), (int)QMetaType::type("StreamableValueType")); QCOMPARE(svv.value(), sv); // we registered in initTestCase stream operators necessary to // permit Node-QVariant conversion using an opaque "unknown // type" node datatype and the standard QVariant datastream // streaming: test conversion that way Node n = Node::fromVariant(svv); //!!! no -- the type is actually encodedVariantTypeURI from Node.cpp, and this is what we should expect -- but it's not public! we can't test it -- fix this // QCOMPARE(n.datatype, Uri()); Triple t = Triple(store.expand(":fred"), store.expand(":has_some_value"), n); QVERIFY(store.add(t)); t.c = Node(); Triple t0 = store.matchOnce(t); Node n0 = t0.c; QCOMPARE(n0.datatype, n.datatype); QVariant v0 = n0.toVariant(); QCOMPARE(v0.userType(), svv.userType()); QCOMPARE(v0.value(), svv.value()); } void nonStreamableTypeConversions() { NonStreamableValueType nsv = ValueJ; QVERIFY(QMetaType::type("NonStreamableValueType") > 0); // as above but using NonStreamableValueType with a // registered encoder, rather than StreamableValueType with no // encoder but a stream operator instead QVariant nsvv = QVariant::fromValue(nsv); QCOMPARE(nsvv.userType(), (int)QMetaType::type("NonStreamableValueType")); QCOMPARE(nsvv.value(), nsv); Node n = Node::fromVariant(nsvv); QCOMPARE(n.datatype, nsvDtUri); Triple t = Triple(store.expand(":fred"), store.expand(":has_some_other_value"), n); QVERIFY(store.add(t)); t.c = Node(); Triple t0 = store.matchOnce(t); Node n0 = t0.c; QCOMPARE(n0.datatype, n.datatype); QVariant v0 = n0.toVariant(); QCOMPARE(v0.userType(), nsvv.userType()); QCOMPARE(v0.value(), nsvv.value()); } void explicitlyTypedRetrieval() { QVariant nsvv = QVariant::fromValue(ValueJ); Node n = Node::fromVariant(nsvv); n.datatype = Uri(); QVariant v0 = n.toVariant(); // having reset the datatype, this should be the default QCOMPARE(v0.userType(), (int)QMetaType::QString); // now convert with datatype prompting v0 = n.toVariant(QMetaType::type("NonStreamableValueType")); QCOMPARE(v0.userType(), nsvv.userType()); } private: BasicStore store; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/tests/test-qt-widgets.ttl0000644000175000017500000000212112252354725024473 0ustar miramira@base . @prefix rdf: . @prefix : <> . @prefix qtype: . @prefix dq: . @prefix xsd: . :mainwindow qtype:objectName "My Main Window" ; a qtype:QMainWindow . :menu dq:parent :mainwindow ; a qtype:QMenu ; qtype:title "File" . :exit dq:parent :menu ; a qtype:QAction ; qtype:text "Exit" . :exit_connection a dq:Connection ; dq:source [ dq:object :exit ; dq:signal "triggered" ] ; dq:target [ dq:object :mainwindow ; dq:slot "close" ] . :frame dq:parent :mainwindow ; dq:central_widget_of :mainwindow ; a qtype:QFrame . :vbox dq:parent :frame ; dq:layout_of :frame ; a qtype:QVBoxLayout . :label_1 a qtype:QLabel ; dq:parent :frame ; dq:follows :label_2 ; dq:layout :vbox ; qtype:text "Hello! I am the first label (but I go second)." . :label_2 a qtype:QLabel ; dq:parent :frame ; dq:layout :vbox ; qtype:text "Hello! I am the second label (but I go first)." . sonic-visualiser-2.3~repack1.orig/dataquay/tests/test-qt.pro0000644000175000017500000000057212252354725023034 0ustar miramira TEMPLATE = app CONFIG += debug TARGET = test-qt-widgets INCLUDEPATH += . .. DEPENDPATH += . .. LIBPATH += .. PRE_TARGETDEPS += ../libdataquay.a OBJECTS_DIR = o MOC_DIR = o LIBS += ../libdataquay.a SOURCES += TestQtWidgets.cpp exists(./platform.pri) { include(./platform.pri) } !exists(./platform.pri) { exists(../platform.pri) { include(../platform.pri) } } sonic-visualiser-2.3~repack1.orig/dataquay/lib.pro0000644000175000017500000000472212252354725021040 0ustar miramira exists(debug.pri) { include(./debug.pri) } TEMPLATE = lib CONFIG += warn_on QT -= gui TARGET = dataquay exists(config.pri) { include(./config.pri) } VERSION=0.9 OBJECTS_DIR = o MOC_DIR = o QMAKE_LFLAGS_SHLIB *= $(LDFLAGS) INCLUDEPATH += dataquay !debug:DEFINES += NDEBUG HEADERS += dataquay/BasicStore.h \ dataquay/Connection.h \ dataquay/Node.h \ dataquay/PropertyObject.h \ dataquay/RDFException.h \ dataquay/Store.h \ dataquay/Transaction.h \ dataquay/TransactionalStore.h \ dataquay/Triple.h \ dataquay/Uri.h \ dataquay/objectmapper/ContainerBuilder.h \ dataquay/objectmapper/ObjectBuilder.h \ dataquay/objectmapper/ObjectLoader.h \ dataquay/objectmapper/ObjectMapper.h \ dataquay/objectmapper/ObjectMapperDefs.h \ dataquay/objectmapper/ObjectMapperForwarder.h \ dataquay/objectmapper/ObjectStorer.h \ dataquay/objectmapper/TypeMapping.h \ src/Debug.h SOURCES += src/Connection.cpp \ src/Node.cpp \ src/PropertyObject.cpp \ src/RDFException.cpp \ src/Store.cpp \ src/Transaction.cpp \ src/TransactionalStore.cpp \ src/Triple.cpp \ src/Uri.cpp \ src/backend/BasicStoreRedland.cpp \ src/backend/BasicStoreSord.cpp \ src/backend/define-check.cpp \ src/objectmapper/ContainerBuilder.cpp \ src/objectmapper/ObjectBuilder.cpp \ src/objectmapper/ObjectLoader.cpp \ src/objectmapper/ObjectMapper.cpp \ src/objectmapper/ObjectMapperForwarder.cpp \ src/objectmapper/ObjectStorer.cpp \ src/objectmapper/TypeMapping.cpp \ src/acsymbols.c linux* { isEmpty(PREFIX) { PREFIX = /usr/local } isEmpty(LIBDIR) { LIBDIR = $${PREFIX}/lib } target.path = $${LIBDIR} includes.path = $${PREFIX}/include includes.files = dataquay pkgconfig.path = $${PREFIX}/lib/pkgconfig pkgconfig.files = deploy/dataquay.pc pkgconfig.extra = sed -e "'"s.%PREFIX%.$${PREFIX}."'" -e "'"s.%LIBDIR%.$${LIBDIR}."'" -e "'"s.%EXTRALIBS%.$${EXTRALIBS}."'" deploy/dataquay.pc.in > deploy/dataquay.pc INSTALLS += target includes pkgconfig } exists(../platform-dataquay.pri) { include(../platform-dataquay.pri) } exists(platform.pri) { include(./platform.pri) } sonic-visualiser-2.3~repack1.orig/dataquay/dataquay.pro0000644000175000017500000000020612252354725022074 0ustar miramira TEMPLATE = subdirs SUBDIRS = sub_lib sub_tests sub_lib.file = lib.pro sub_tests.file = tests/tests.pro sub_tests.depends = sub_lib sonic-visualiser-2.3~repack1.orig/dataquay/Doxyfile0000644000175000017500000020035312252354725021254 0ustar miramira# Doxyfile 1.6.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Dataquay # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.8 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = docs/doxygen/warning.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = . \ dataquay \ dataquay/objectmapper # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.h \ *.C \ *.cpp \ *.cc \ doc-overview # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = qrc_*.cpp \ moc_*.cpp \ *.moc.cpp \ *_skel.cpp # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enabled doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO # When the SERVER_BASED_SEARCH tag is enabled the search engine will be implemented using a PHP enabled web server instead of at the web client using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server based approach is that it scales better to large projects and allows full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = NO # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES sonic-visualiser-2.3~repack1.orig/dataquay/CHANGELOG0000644000175000017500000000604712252354725020764 0ustar miramira Changes in Dataquay 0.9 since the previous version 0.8: * Rework Uri, Node, and Triple constructors. Now Uri is to be used only for absolute URIs; Node demands that Uri be used when constructing URI nodes, treating a string as a literal type; and Triple demands three Nodes, losing the short-circuiting constructors that used to take relative URIs as strings. This simplifies the rules for type usage: an absolute URI is a Uri, a literal is a string, and a relative URI must be expanded before it can be used. It also makes Triple construction patterns more consistent and easier to remember. * Add "slice" methods subjects(), predicates(), objects() to Triples * Rename matchFirst to matchOnce and queryFirst to queryOnce in Store API. There was no ordering by which the result could meaningfully be described as the first * Add Store::complete() to return a Node that completes a Triple with only one wildcard Node in it * Ensure store always has a base URI, and some fixes to base URI management for file loading (this will be reviewed again before 1.0 though) * Fix lack of predicate-index in Sord backend * Formalise ObjectStorer in the same way as the formalisation of the ObjectMapper and ObjectLoader for 0.8 * Replace ad-hoc unit tests with QtTest-based tests Changes in Dataquay 0.8 since the previous version 0.3: * Add support for David Robillard's lightweight Sord datastore as an alternative to the existing Redland support. The Dataquay Store now has a getSupportedFeatures() method to return capabilities of the underlying datastore. * Many fixes to ObjectMapper API, including a more formal approach to circular dependencies and formalising the object loading order * Add method to commit a transaction on a connection and simultaneously receive the set of changes * Hoist save() and import() to the Store interface from the BasicStore concrete class, and provide transactional implementations in TransactionalStore Changes in Dataquay 0.3 since the previous version 0.2: * Add the entire ObjectMapper API and implementation * Add the ability to extend Node with new converters between QVariant types and RDF literal types * Replace QUrl with a new, very thin Uri class throughout for representation of RDF URIs. QUrl turned out to be very costly for this and most of its facilities are not needed here * Change the Transaction interface so as to require an explicit commit() call rather than committing on delete (it's more work to use this way, but code written to use the old interface just didn't read well) * Change Node so as to use an untyped literal for string types rather than using xsd:string (necessary for practical interoperability) * Some very substantial performance improvements and further fixes Changes in Dataquay 0.2 since the initial version 0.1: * Add the ability to control how duplicate triples are handled on import * Make the transactional store emit a signal when a transaction is committed * A small number of other fixes sonic-visualiser-2.3~repack1.orig/dataquay/config.pri0000644000175000017500000000063312252354725021526 0ustar miramiraCONFIG -= debug CONFIG += release # Define these to use the Redland datastore (http://librdf.org/) DEFINES += USE_REDLAND QMAKE_CXXFLAGS += -I/usr/include/rasqal -I/usr/include/raptor2 EXTRALIBS += -lrdf # Define this to use the Sord datastore (http://drobilla.net/software/sord/) #DEFINES += USE_SORD #QMAKE_CXXFLAGS += -I/usr/local/include/sord-0 -I/usr/local/include/serd-0 #EXTRALIBS += -lsord-0 -lserd-0 sonic-visualiser-2.3~repack1.orig/dataquay/README.txt0000644000175000017500000001060612252354725021244 0ustar miramira Dataquay ======== Dataquay is a free open source library that provides a friendly C++ API for an RDF data store using Qt4 classes and containers. http://breakfastquay.com/dataquay/ This is version 0.9 of Dataquay. Note that this is a pre-1.0 release and the API is still subject to change. Dataquay is simple to use and easy to integrate. It is principally intended for use in Qt-based applications that would like to use an RDF datastore as backing for in-memory project data, to avoid having to provide application data-specific file formats and to make it easy to augment the data with descriptive metadata pulled in from external sources. Dataquay is also intended to be useful for applications whose primary purpose is not related to RDF but that have ad-hoc RDF needs for metadata management. Dataquay does not include the datastore implementation itself; instead it is a wrapper around either Redland (http://librdf.org) or Sord (http://drobilla.net/software/sord/). Dataquay provides these features: * Conversion between arbitrary data types and RDF nodes using the Node class and QVariant types. Data are converted to XSD datatypes where possible, using an easily extended mechanism. * Simple and flexible storage, query, and file I/O (natively using the Turtle format) functions provided by the Store and BasicStore classes. * Straightforward transactional interface via TransactionalStore and Transaction. Transactions are atomic at the library level, and are isolated from any non-transactional queries occurring at the same time. The transactional implementation is designed to be simple rather than scalable, intended for use in encapsulating single-user editing operations: it is probably not wise to use Dataquay as a store for server applications, although it might work. * Optional ODBC-style transactional Connection interface. * ObjectMapper, a facility which can take care of a complete object hierarchy, map it to the RDF store, and synchronise in both directions any changes to the hierarchy or the store. Arbitrary mappings between C++ class and property names and RDF URIs can be specified. The mapping is flexible enough to allow you to load many publicly generated Linked Data sources directly into object class hierarchies, if you wish (although this is not usually an ideal way to handle unpredictable data sources). * API documentation, thread safety, documentation of threading requirements, readable code, and basic unit tests included. * BSD licensing. You can use Dataquay cost-free in commercial or open source applications and modify it as you like with no particular requirements except acknowledgement in your copyright notes. We do ask that you let us know of any bugs, fixes and enhancements you might find -- particularly for serious bugs -- but you have no obligation to do so. Choice of datastore ------------------- Dataquay can be built against either Redland (http://librdf.org) or Sord (http://drobilla.net/software/sord/). You will need to have the Raptor, Rasqal and Redland libraries installed in order to build and use Dataquay with Redland, or the Sord and Serd libraries installed in order to use Sord. To use Redland, ensure USE_REDLAND is defined in config.pri; to use Sord, ensure USE_SORD is defined. The choice is made at compile time: Dataquay does not have any module or plugin system. Which to choose? Sord is smaller and simpler, Redland more complete. SPARQL queries and data loading from a remote (e.g. HTTP) resource are only available when using Redland. For this reason, anyone packaging Dataquay for general use (e.g. in a Linux distribution) is advised to build with Redland. Compiling Dataquay ------------------ Dataquay requires Qt 4.5 or newer with qmake. Make sure your preferred datastore (see above) is selected in the config.pri file. Run "qmake dataquay.pro", then make. This should compile the library and unit tests and automatically run the tests. If compilation succeeds but any unit tests fail, please do not use the library -- report the problem to me instead. Linux users can "make install" after building if desired. A debug build will print a lot of information to standard error during run time; this can be very helpful for debugging your application, but it can quickly become excessive. Perform a release build to eliminate this output. Chris Cannam chris.cannam@breakfastquay.com sonic-visualiser-2.3~repack1.orig/dataquay/examples/0000755000175000017500000000000012264464201021353 5ustar miramirasonic-visualiser-2.3~repack1.orig/dataquay/examples/ConnectionLoader.cpp0000644000175000017500000000236012252354725025314 0ustar miramira/*!!! pulled out from ObjectLoader.cpp: can we do this using a callback, as an example? void ObjectLoader::D::loadConnections(NodeObjectMap &map) { QString slotTemplate = SLOT(xxx()); QString signalTemplate = SIGNAL(xxx()); // The store does not necessarily know m_relationshipPrefix ResultSet rs = m_s->query (QString (" PREFIX rel: <%1> " " SELECT ?sobj ?ssig ?tobj ?tslot WHERE { " " ?conn a rel:Connection; rel:source ?s; rel:target ?t. " " ?s rel:object ?sobj; rel:signal ?ssig. " " ?t rel:object ?tobj; rel:slot ?tslot. " " } ").arg(m_tm.getRelationshipPrefix().toString())); foreach (Dictionary d, rs) { Uri sourceUri(d["sobj"].value); Uri targetUri(d["tobj"].value); if (!map.contains(sourceUri) || !map.contains(targetUri)) continue; QString sourceSignal = signalTemplate.replace("xxx", d["ssig"].value); QString targetSlot = slotTemplate.replace("xxx", d["tslot"].value); QByteArray sigba = sourceSignal.toLocal8Bit(); QByteArray slotba = targetSlot.toLocal8Bit(); QObject::connect(map[sourceUri], sigba.data(), map[targetUri], slotba.data()); } } */ sonic-visualiser-2.3~repack1.orig/dataquay/examples/TransactionalCommand.h0000644000175000017500000000374312252354725025642 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TRANSACTIONAL_COMMAND_H_ #define _DATAQUAY_TRANSACTIONAL_COMMAND_H_ #include "Transaction.h" #include "base/Command.h" namespace Dataquay { class TransactionalStore; class TransactionalCommand : public Turbot::Command { public: virtual void execute(); virtual void unexecute(); protected: TransactionalCommand(TransactionalStore *store); virtual void performCommand(Transaction *tx) = 0; private: TransactionalStore *m_store; ChangeSet m_cs; bool m_haveCs; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/examples/TransactionalCommand.cpp0000644000175000017500000000402012252354725026162 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "TransactionalCommand.h" #include "TransactionalStore.h" #include using std::auto_ptr; namespace Dataquay { TransactionalCommand::TransactionalCommand(TransactionalStore *store) : m_store(store), m_haveCs(false) { } void TransactionalCommand::execute() { if (m_haveCs) { m_store->change(m_cs); return; } auto_ptr tx(m_store->startTransaction()); performCommand(tx.get()); m_cs = tx->getChanges(); m_haveCs = true; } void TransactionalCommand::unexecute() { m_store->revert(m_cs); } } sonic-visualiser-2.3~repack1.orig/dataquay/examples/VariantEncoderExample.cpp0000644000175000017500000000125512252354725026310 0ustar miramira /* Bits pulled out from Node.cpp during tidying -- not a useful example yet */ /*!!! move this (and converse) to examples/ as example of encoder registration static QString qTimeToXsdDuration(QTime t) { if (t.hour() != 0) { return QString("PT%1H%2M%3S") .arg(t.hour()) .arg(t.minute()) .arg(t.second() + double(t.msec())/1000.0); } else if (t.minute() != 0) { return QString("PT%1M%2S") .arg(t.minute()) .arg(t.second() + double(t.msec())/1000.0); } else { return QString("PT%1S") .arg(t.second() + double(t.msec())/1000.0); } } */ sonic-visualiser-2.3~repack1.orig/dataquay/deploy/0000755000175000017500000000000012264464201021031 5ustar miramirasonic-visualiser-2.3~repack1.orig/dataquay/deploy/dataquay.pc.in0000644000175000017500000000037612252354725023607 0ustar miramiraprefix=%PREFIX% libdir=%LIBDIR% exec_prefix=${prefix} includedir=${prefix}/include Name: dataquay Version: 0.9 Description: C++ API for an RDF data store using Qt4 classes and containers Libs: -L${libdir} -ldataquay %EXTRALIBS% Cflags: -I${includedir} sonic-visualiser-2.3~repack1.orig/dataquay/deploy/update-version.sh0000644000175000017500000000147612252354725024350 0ustar miramira#!/bin/bash usage() { echo "Usage: $0 " echo " e.g. $0 2.2" exit 2; } version=$1 [ -n "$version" ] || usage major=${version%%.*} # 2.3 -> 2, 2.3.1 -> 2 minor=${version#*.} # 2.3 -> 3, 2.3.1 -> 3.1 point=${minor#*.} # 3 -> 3, 3.1 -> 1 if [ "$minor" = "$point" ]; then point=0; fi minor=${minor%.*} # 3 -> 3, 3.1 -> 3 echo "Major version = $major, minor version = $minor, point release = $point" acs="`echo $version | tr '.' '_'`" echo "acsymbols string = $acs" p="perl -i -p -e" $p 's/(This is version) [^ ]+/$1 '$version'/' \ README.txt $p 's/(VERSION)=[0-9\.]+/$1='$version'/' \ lib.pro $p 's/(Version:) .*/$1 '$version'/' \ deploy/dataquay.pc.in if ! grep -q "$acs" src/acsymbols.c ; then $p 's/^$/\nextern void dataquay_v_'$acs'_present(void) { }/' \ src/acsymbols.c fi sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/0000755000175000017500000000000012264464201021346 5ustar miramirasonic-visualiser-2.3~repack1.orig/dataquay/dataquay/Uri.h0000644000175000017500000001231712252354725022270 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_URI_H_ #define _DATAQUAY_URI_H_ namespace Dataquay { class Uri; } // Declare this early, to avoid any problems with instantiation order // arising from inclusion "races" extern unsigned int qHash(const Dataquay::Uri &u); #include #include #include #include class QDataStream; class QTextStream; class QVariant; namespace Dataquay { /** * Uri represents a single URI. It is a very thin wrapper around a * string. Its purpose is to allow us to distinguish between * abbreviated URIs (CURIEs) which may be subject to prefix expansion * (represented by strings) and full URIs (represented by Uri). * * In terms of the Turtle syntax, anything written within angle * brackets is a Uri, while a bare string in URI context is not: it * should be stored as a QString and converted to a Uri using * Store::expand(). For example, is * a Uri, while foaf:name is just a string. Never store the latter * form in a Uri object without expanding it first. * * Dataquay uses Uri in preference to QUrl because the latter is * relatively slow to convert to and from string forms. Uri imposes * no overhead over a string, it simply aids type safety. */ class Uri { public: /** * Construct an empty (invalid, null) URI. */ Uri() { } /** * Construct a URI from the given string, which is expected to * contain the text of a complete well-formed absolute URI. * * As special cases, file: URIs are allowed to be relative * ("file:x" will be expanded to "file://x" automatically) and "a" * will be expanded to the rdf:type URI. * * This will throw RDFIncompleteURI if given an incomplete or * relative URI, so use care when constructing Uri objects from * unvalidated input. Call isComplete() if you wish to test * whether a URI string will be accepted before constructing. * * To construct a Uri from an abbreviated or relative URI via * prefix or base expansion, use Store::expand(). * * This constructor is intentionally marked explicit; no silent * conversion is available. */ explicit Uri(const QString &s) : m_uri(s) { checkComplete(); } /** * Construct a URI from the given QUrl, which is expected to * contain a complete well-formed URI. May throw * RDFIncompleteURI. */ explicit Uri(const QUrl &u) : m_uri(u.toString()) { checkComplete(); } ~Uri() { } inline QString toString() const { return m_uri; } inline QUrl toUrl() const { return QUrl(m_uri); } inline int length() const { return m_uri.length(); } QString scheme() const; bool operator==(const Uri &u) const; inline bool operator!=(const Uri &u) const { return !operator==(u); } inline bool operator<(const Uri &u) const { return m_uri < u.m_uri; } inline bool operator>(const Uri &u) const { return u < *this; } /** * Return true if the given string contains a complete URI, * i.e. if it is possible to construct a Uri object from it. */ static bool isCompleteUri(QString s); static QString metaTypeName(); static int metaTypeId(); /** * Return true if the given variant has metatype metatypeId(). */ static bool hasUriType(const QVariant &); /** * Return the rdf:type URI. */ static Uri rdfTypeUri(); private: void checkComplete(); QString m_uri; static bool canBeComplete(QString &s); }; typedef QList UriList; QDataStream &operator<<(QDataStream &out, const Uri &); QDataStream &operator>>(QDataStream &in, Uri &); std::ostream &operator<<(std::ostream &out, const Uri &); QTextStream &operator<<(QTextStream &out, const Uri &); } Q_DECLARE_METATYPE(Dataquay::Uri) #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/PropertyObject.h0000644000175000017500000004701212252354725024504 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_PROPERTY_OBJECT_H_ #define _DATAQUAY_PROPERTY_OBJECT_H_ #include #include #include #include #include #include "Node.h" namespace Dataquay { class Transaction; class Store; /** * \class PropertyObject PropertyObject.h * * PropertyObject is a helper class for managing RDF properties of an * object URI -- that is, triples that share a common subject and * possibly a common prefix for the predicate, and that have only one * value for each subject-predicate combination. This could be of use * in situations where properties of a single object URI are referred * to often. This class provides set and get methods that act * directly upon the backing datastore, optionally using a * transaction. See CacheingPropertyObject for a cacheing * alternative. * * PropertyObject is constructed using a "property prefix" (a string) * and "my URI" (a URI). The URI is used by the property object as * the subject for all RDF triples. * * All the property handling methods then also take a "property name", * which is a string. If this name contains no ':' character, it will * be prefixed with the property prefix that was supplied to the * PropertyObject constructor before being subjected to prefix * expansion in the RDF store. The result is then used as the * predicate for the RDF triple. If the name does contain a ':', it * is passed for expansion directly (the prefix is not prepended * first). As an exception, if the prefix is the special name "a", * it will be expanded (by the store) as "rdf:type". * * Example: If the property prefix is "myprops:" and the property name * passed to getProperty is "some_property", the returned value from * getProperty will be the result of matching on the triple (myUri, * "myprops:some_property", ()). Hopefully, the RDF store will have * already been told about the "myprops" prefix and will know how to * expand it. * * Example: If the property prefix is "http://example.com/property/" * and the property name passed to getProperty is "some_property", the * returned value from getProperty will be the result of matching on * the triple (myUri, "http://example.com/property/some_property", ()). * * Example: If the property prefix is "myprops:" and the property name * passed to getProperty is "yourprops:some_property", the returned * value from getProperty will be the result of matching on the triple * (myUri, "yourprops:some_property", ()). The property prefix is not * used at all in this example because the property name contains ':'. */ class PropertyObject { public: /** * Construct a PropertyObject acting on the given Store, with the * default prefix for properties taken from the global default * (see setDefaultPropertyPrefix) and the given "subject" URI. */ PropertyObject(Store *s, Uri myUri); /** * Construct a PropertyObject acting on the given Store, with the * default prefix for properties taken from the global default * (see setDefaultPropertyPrefix) and the given "subject" URI * (which will be prefix expanded). */ PropertyObject(Store *s, QString myUri); /** * Construct a PropertyObject acting on the given Store, with the * default prefix for properties taken from the global default * (see setDefaultPropertyPrefix) and the given "subject" node. * This is provided so as to permit querying the properties of * blank nodes or nodes returned from other queries. */ PropertyObject(Store *s, Node myNode); /** * Construct a PropertyObject acting on the given Store, with the * given default prefix (which will itself be prefix expanded) for * properties and the given "subject" URI. */ PropertyObject(Store *s, QString propertyPrefix, Uri myUri); /** * Construct a PropertyObject acting on the given Store, with the * given default prefix for properties and the given "subject" * URI (which will be prefix expanded). */ PropertyObject(Store *s, QString propertyPrefix, QString myUri); /** * Construct a PropertyObject acting on the given Store, with the * given default prefix for properties and the given node as its * subject. This is provided so as to permit querying the * properties of blank nodes or nodes returned from other queries. */ PropertyObject(Store *s, QString propertyPrefix, Node myNode); ~PropertyObject(); /** * Return the node passed to the constructor (or derived from the * URI passed to the constructor). */ Node getNode() const; /** * Return the rdf:type of my URI, if any. If more than one is * defined, return the first one found. */ Uri getObjectType() const; /** * Return the rdf:type of my URI, if any, querying through the * given transaction. If more than one is defined, return the * first one found. */ Uri getObjectType(Transaction *tx) const; /** * Return true if the property object has the given property. That * is, if the store contains at least one triple whose subject and * predicate match those for my URI and the expansion of the given * property name. */ bool hasProperty(QString name) const; /** * Return true if the property object has the given property, * querying through the given transaction. That is, if the store * contains at least one triple whose subject and predicate match * those for my URI and the expansion of the given property name. */ bool hasProperty(Transaction *tx, QString name) const; /** * Get the value of the given property. That is, if the store * contains at least one triple whose subject and predicate match * those for my URI and the expansion of the given property name, * convert the object part of the first such matching triple to a * QVariant via Node::toVariant and return that value. If there * is no such match, return QVariant(). */ QVariant getProperty(QString name) const; /** * Get the value of the given property, querying through the given * transaction. That is, if the store contains at least one * triple whose subject and predicate match those for my URI and * the expansion of the given property name, convert the object * part of the first such matching triple to a QVariant via * Node::toVariant and return that value. If there is no such * match, return QVariant(). */ QVariant getProperty(Transaction *tx, QString name) const; /** * Get the value of the given property as a list. That is, if the * store contains at least one triple whose subject and predicate * match those for my URI and the expansion of the given property * name, convert the object parts of all such matching triples to * QVariant via Node::toVariant and return a list of the resulting * values. If there is no such match, return an empty list. * * Note that the order of variants in the returned list is * arbitrary and may change from one call to the next. */ QVariantList getPropertyList(QString name) const; /** * Get the value of the given property as a list, querying through * the given transaction. That is, if the store contains at least * one triple whose subject and predicate match those for my URI * and the expansion of the given property name, convert the * object parts of all such matching triples to QVariant via * Node::toVariant and return a list of the resulting values. If * there is no such match, return QVariant(). * * Note that the order of variants in the returned list is * arbitrary and may change from one call to the next. */ QVariantList getPropertyList(Transaction *tx, QString name) const; /** * Get the node for the given property. That is, if the store * contains at least one triple whose subject and predicate match * those for my URI and the expansion of the given property name, * return the object part of the first such matching triple. If * there is no such match, return Node(). */ Node getPropertyNode(QString name) const; /** * Get the node for the given property, querying through the given * transaction. That is, if the store contains at least one * triple whose subject and predicate match those for my URI and * the expansion of the given property name, return the object * part of the first such matching triple. If there is no such * match, return Node(). */ Node getPropertyNode(Transaction *tx, QString name) const; /** * Get the nodes for the given property. That is, if the store * contains at least one triple whose subject and predicate match * those for my URI and the expansion of the given property name, * return the object parts of all such matching triples. If there * is no such match, return an empty list. * * Note that the order of nodes in the returned list is arbitrary * and may change from one call to the next. */ Nodes getPropertyNodeList(QString name) const; /** * Get the nodes for the given property, querying through the * given transaction. That is, if the store contains at least one * triple whose subject and predicate match those for my URI and * the expansion of the given property name, return the object * parts of all such matching triples. If there is no such match, * return an empty list. * * Note that the order of nodes in the returned list is arbitrary * and may change from one call to the next. * *!!! NB this is misnamed -- this looks up a set rather than a list */ Nodes getPropertyNodeList(Transaction *tx, QString name) const; /** * Get the names of this object's properties beginning with our * property prefix. That is, find all triples in the store whose * subject matches my URI and whose predicate begins with our * property prefix, and return a list of the remainder of their * predicate URIs following the property prefix. */ QStringList getPropertyNames() const; /** * Get the names of this object's properties beginning with our * property prefix, querying through the given transaction. That * is, find all triples in the store whose subject matches my URI * and whose predicate begins with our property prefix, and return * a list of the remainder of their predicate URIs following the * property prefix. */ QStringList getPropertyNames(Transaction *tx) const; /** * Set the given property to the given value. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple whose object part is the result * of converting the given variant to a node via * Node::fromVariant. */ void setProperty(QString name, QVariant value); /** * Set the given property to the given URI. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple whose object part is the URI. */ void setProperty(QString name, Uri uri); /** * Set the given property to the given node. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple whose object part is the node. */ void setProperty(QString name, Node node); /** * Set the given property to the given value through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * whose object part is the result of converting the given variant * to a node via Node::fromVariant. */ void setProperty(Transaction *tx, QString name, QVariant value); /** * Set the given property to the given URI through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * whose object part is the URI. */ void setProperty(Transaction *tx, QString name, Uri uri); /** * Set the given property to the given node through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * whose object part is the node. */ void setProperty(Transaction *tx, QString name, Node node); /** * Set the given property to the given values. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple for each variant in the value * list, whose object part is the result of converting that * variant to a node via Node::fromVariant. */ void setPropertyList(QString name, QVariantList values); /** * Set the given property to the given values through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * for each variant in the value list, whose object part is the * result of converting that variant to a node via * Node::fromVariant. */ void setPropertyList(Transaction *tx, QString name, QVariantList values); /** * Set the given property to the given nodes. That is, first * remove from the store any triples whose subject and predicate * match those for my URI and the expansion of the given property * name, then insert a new triple for each node in the list, whose * object part is that node. */ void setPropertyList(QString name, Nodes nodes); /** * Set the given property to the given nodes through the given * transaction. That is, first remove from the store any triples * whose subject and predicate match those for my URI and the * expansion of the given property name, then insert a new triple * for each node in the list, whose object part is that node. */ void setPropertyList(Transaction *tx, QString name, Nodes nodes); /** * Remove the given property. That is, remove from the store any * triples whose subject and predicate match those for my URI and * the expansion of the given property name. */ void removeProperty(QString name); /** * Remove the given property. That is, remove from the store any * triples whose subject and predicate match those for my URI and * the expansion of the given property name. */ void removeProperty(Transaction *tx, QString name); /** * Return the Store object that will be used for modifications in * the given transaction. If the transaction is not * NoTransaction, then the returned Store will simply be the * transaction itself; otherwise it will be the store that was * passed to the constructor. */ Store *getStore(Transaction *tx) const; /** * Return the URI used for the "predicate" part of any triple * referring to the given property name. See the general * PropertyObject documentation for details of how these names are * expanded. */ Uri getPropertyUri(QString name) const; /** * Set the global default property prefix. This will be used as * the prefix for all PropertyObjects subsequently constructed * using the two-argument (prefixless) constructors. */ static void setDefaultPropertyPrefix(QString prefix); private: Store *m_store; QString m_pfx; Uri m_upfx; Node m_node; static QString m_defaultPrefix; }; /** * \class CacheingPropertyObject PropertyObject.h * * CacheingPropertyObject is a helper class for managing RDF * properties of an object URI -- that is, triples that share a common * subject and possibly a common prefix for the predicate, and that * have only one value for each subject-predicate combination. * * This class caches results from the datastore and so may be faster * than PropertyObject, but it can only be used in contexts where it * is known that no other agent may be modifying the same set of * properties. Its set of available functions is more limited than * PropertyObject also: it has no Transaction-based functions. * * See PropertyObject for individual method documentation. */ class CacheingPropertyObject { public: CacheingPropertyObject(Store *s, Uri myUri); CacheingPropertyObject(Store *s, QString myUri); CacheingPropertyObject(Store *s, QString propertyPrefix, Uri myUri); CacheingPropertyObject(Store *s, QString propertyPrefix, QString myUri); CacheingPropertyObject(Store *s, QString propertyPrefix, Node myUri); Uri getObjectType() const; bool hasProperty(QString name) const; QVariant getProperty(QString name) const; QVariantList getPropertyList(QString name) const; Node getPropertyNode(QString name) const; Nodes getPropertyNodeList(QString name) const; QStringList getPropertyNames() const; void setProperty(QString name, QVariant value); void setProperty(QString name, Uri value); void setProperty(QString name, Node node); void setPropertyList(QString name, QVariantList values); void setPropertyList(QString name, Nodes nodes); void removeProperty(QString name); Uri getPropertyUri(QString name) const; private: PropertyObject m_po; typedef QHash Properties; mutable Properties m_cache; // note: value is never empty mutable bool m_cached; void encache() const; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/TransactionalStore.h0000644000175000017500000001667012252354725025356 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TRANSACTIONAL_STORE_H_ #define _DATAQUAY_TRANSACTIONAL_STORE_H_ #include "Transaction.h" namespace Dataquay { /** * \class TransactionalStore TransactionalStore.h * * TransactionalStore is an RDF data store implementing the Store * interface, providing transaction support as a wrapper around a * non-transactional store such as a BasicStore. * * Write access to the store is permitted only in the context of a * transaction. If you call a modifying function directly on * TransactionalStore, the store will either throw RDFException (if * set to NoAutoTransaction) or create a single-use Transaction object * for the duration of that modification (if set to AutoTransaction). * Note that the latter behaviour will deadlock if a transaction is in * progress already. * * Read access may be carried out through a Transaction, in which case * the read state will reflect the changes made so far in that * transaction, or directly on the TransactionalStore, in which case * the read will be isolated from any pending transaction. * * Call startTransaction to obtain a new Transaction object and start * its transaction; use the Transaction's Store interface for all * accesses associated with that transaction; call commit on the * Transaction object once done, to finish the transaction, and then * delete the object; or call Transaction::rollback() if you decide * you do not wish to commit it. * * TransactionalStore is thread-safe. * *!!! ... but the individual Transactions that you get from it are _not_ thread-safe -- document this (it's probably acceptable) or fix it */ class TransactionalStore : public QObject, public Store { Q_OBJECT public: /** * DirectWriteBehaviour controls how TransactionalStore responds * when called directly (not through a Transaction) for a write * operation (add, remove, change, or revert). * * NoAutoTransaction (the default) means that an RDF exception * will be thrown whenever a write is attempted without a * transaction. * * AutoTransaction means that a Transaction object will be * created, used for the single access, and then closed. This may * cause a deadlock if another transaction is already ongoing * elsewhere. */ enum DirectWriteBehaviour { NoAutoTransaction, AutoTransaction }; /** * Create a TransactionalStore operating on the given (presumably * non-transactional) data store. * * Nothing in the code prevents the given _underlying_ store being * used non-transactionally elsewhere at the same time. Don't do * that: once you have set up a transactional store, you should * use it for all routine accesses to the underlying store. */ TransactionalStore(Store *store, DirectWriteBehaviour dwb = NoAutoTransaction); /** * Delete the TransactionalStore. This does _not_ delete the * underlying Store that is being wrapped (the one that was passed * to the constructor). */ ~TransactionalStore(); /** * Start a transaction and obtain a Transaction through which to * carry out its operations. Once the transaction is complete, * you must call commit on the Transaction object to finish the * transaction, and then you must delete the object. */ Transaction *startTransaction(); // Store interface bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format = ""); Features getSupportedFeatures() const; signals: /** * Emitted after a transaction has been committed. Note that the * transaction lock on the store is unlocked before the signal is * emitted, so that in a multi-threaded context it is possible * that other users of the store may have carried out further * transactions before this signal can be acted on. */ void transactionCommitted(const ChangeSet &cs); /** * Emitted after a transaction has been committed. Note that the * transaction lock on the store is unlocked before the signal is * emitted, so that in a multi-threaded context it is possible * that other users of the store may have carried out further * transactions before this signal can be acted on. */ void transactionCommitted(); private: class D; D *m_d; class TSTransaction : public Transaction { public: // Store interface bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format = ""); Features getSupportedFeatures() const; // Transaction interface void commit(); void rollback(); ChangeSet getCommittedChanges() const; ChangeSet getChanges() const; TSTransaction(TransactionalStore::D *td); virtual ~TSTransaction(); private: TSTransaction(const TSTransaction &); TSTransaction &operator=(const TSTransaction &); class D; D *m_d; }; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/Transaction.h0000644000175000017500000001065512252354725024021 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TRANSACTION_H_ #define _DATAQUAY_TRANSACTION_H_ #include "Store.h" namespace Dataquay { /** * \class Transaction Transaction.h * * Transaction is an abstract interface for classes that read and * write an RDF Store within the context of an atomic operation such * as an editing command. The Transaction interface provides the same * editing operations as the Store interface; it subclasses from Store * and may be interchanged with Store in most contexts. To obtain a * Transaction, use TransactionalStore. */ class Transaction : public Store { public: /** * Delete this transaction object. You must either commit or roll * back the transaction before deleting it. * * The destructor will throw RDFTransactionError if the * transaction has been used but not committed or rolled back. * Such a situation indicates a straightforward coding oversight: * fix the code, rather than catching the exception. */ virtual ~Transaction() { } /** * Commit this transaction. Changes made during the transaction * will be committed to the store, atomically with respect to * other active transactions. * * You should not attempt to use the Transaction object again * (except to call getChanges or to delete it) after this call is * made. Any further call to the transaction's Store interface * will throw an RDFTransactionError. */ virtual void commit() = 0; /** * Roll back this transaction. All changes made during the * transaction will be discarded. * * You should not attempt to use the Transaction object again * (except to delete it) after this call is made. Any further * call to the transaction's Store interface will throw an * RDFTransactionError. */ virtual void rollback() = 0; /** * Return the ChangeSet committed in this transaction. If the * transaction has not yet been committed (or has been rolled * back), this will be empty. * * (After a transaction has been committed, you can in principle * revert it in its entirety by calling Store::revert() with this * change set.) */ virtual ChangeSet getCommittedChanges() const = 0; /** * Return the ChangeSet for this transaction to date. This * returns all changes provisionally made (but not necessarily * committed) during the transaction. * * If the transaction has been rolled back, this will return the * changes that were accumulated prior to the roll back, i.e. the * changes that were then rolled back. * * If the transaction has been committed, this will return the * same ChangeSet as getCommittedChanges(). */ virtual ChangeSet getChanges() const = 0; protected: Transaction() { } private: Transaction(const Transaction &); Transaction &operator=(const Transaction &); }; extern Transaction *const NoTransaction; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/Store.h0000644000175000017500000002523212252354725022625 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_STORE_H_ #define _DATAQUAY_STORE_H_ #include "Triple.h" #include #include #include #include #include namespace Dataquay { /// A mapping from key to node, used to list results for a set of result keys. typedef QHash Dictionary; /// A list of Dictionary types, used to contain a sequence of query results. typedef QList ResultSet; enum ChangeType { AddTriple, RemoveTriple }; /// An add or remove operation specified by add/remove token and triple. typedef QPair Change; /// A sequence of add/remove operations such as may be enacted by a transaction. typedef QList ChangeSet; /** * \class Store Store.h * * Store is an abstract interface for Dataquay RDF data stores. */ class Store { public: /** * Add a triple to the store. Return false if the triple was * already in the store. (Dataquay does not permit duplicate * triples in a store.) Throw RDFException if the triple can not * be added for some other reason. */ virtual bool add(Triple t) = 0; /** * Remove a triple from the store. If some nodes in the triple are * Nothing nodes, remove all matching triples. Return false if no * matching triple was found in the store. Throw RDFException if * removal failed for some other reason. */ virtual bool remove(Triple t) = 0; /** * Atomically apply the sequence of add/remove changes described * in the given ChangeSet. Throw RDFException if any operation * fails for any reason (including duplication etc). */ virtual void change(ChangeSet changes) = 0; /** * Atomically apply the sequence of add/remove changes described * in the given ChangeSet, in reverse (ie removing adds and * adding removes, in reverse order). Throw RDFException if any * operation fails for any reason (including duplication etc). */ virtual void revert(ChangeSet changes) = 0; /** * Return true if the store contains the given triple, false * otherwise. Throw RDFException if the triple is not complete or if * the test failed for any other reason. */ virtual bool contains(Triple t) const = 0; /** * Return all triples matching the given wildcard triple. A node * of type Nothing in any part of the triple matches any node in * the data store. Return an empty list if there are no matches; may * throw RDFException if matching fails in some other way. */ virtual Triples match(Triple t) const = 0; /** * Run a SPARQL query against the store and return its results. * Any prefixes added previously using addQueryPrefix will be * available in this query without needing to be declared in the * SPARQL given here (equivalent to writing "PREFIX prefix: " * for each prefix,uri pair set with addPrefix). * * May throw RDFException. * * Note that the RDF store must have an absolute base URI (rather * than the default "#") in order to perform queries, as relative * URIs in the query will be interpreted relative to the query * base rather than the store and without a proper base URI there * is no way to override that internally. */ virtual ResultSet query(QString sparql) const = 0; /** * Given a triple in which any two nodes are specified and the * other is a wildcard node of type Nothing, return a node that * can be substituted for the Nothing node in order to complete a * triple that exists in the store. If no matching triple can be * found, return a null node. If more than one triple matches, * the returned value may arbitrarily be from any of them. May * throw RDFException. */ virtual Node complete(Triple t) const = 0; /** * Return a triple from the store that matches the given wildcard * triple, or the empty triple if none matches. A node of type * Nothing in any part of the triple matches any node in the data * store. If more than one triple matches, the returned value may * arbitrarily be any of them. May throw RDFException. */ virtual Triple matchOnce(Triple t) const = 0; /** * Run a SPARQL query against the store and return the node of * the first result for the given query binding. This is a * shorthand for use with queries that are only expected to have * one result. May throw RDFException. */ virtual Node queryOnce(QString sparql, QString bindingName) const = 0; /** * Get a new URI, starting with the given prefix (e.g. ":event_"), * that does not currently exist within this store. The URI will * be prefix expanded. */ virtual Uri getUniqueUri(QString prefix) const = 0; /** * Create and return a new blank node. This node can only be * referred to using the given Node object, and only during its * lifetime within this instance of the store. */ virtual Node addBlankNode() = 0; /** * Expand the given URI (which may use local namespaces) and * prefix-expand it, returning the result as a Uri. (The Uri * class cannot be used to store URIs that have unexpanded * namespace prefixes.) * * The set of available prefixes for expansion depends on the * subclass implementation. See, for example, * BasicStore::addPrefix. */ virtual Uri expand(QString uri) const = 0; /** * Export the store to an RDF/TTL file with the given filename. * If the file already exists, it will if possible be overwritten. * May throw RDFException, FileOperationFailed, FailedToOpenFile, * etc. * * Note that unlike import (which takes a URL argument), save * takes a simple filename with no file:// prefix. */ virtual void save(QString filename) const = 0; /** * ImportDuplicatesMode determines the outcome when an import * operation encounters a triple in the imported data set that * already exists in the store. * * ImportIgnoreDuplicates: Any duplicate of a triple that is * already in the store is discarded without comment. * * ImportFailOnDuplicates: Import will fail with an * RDFDuplicateImportException if any duplicate of a triple * already in the store is found, and nothing will be imported. * * ImportPermitDuplicates: No tests for duplicate triples will be * carried out, and the behaviour when duplicates are imported * will depend on the underlying store implementation (which may * merge them or store them as separate duplicate triples). This * is usually inadvisable: besides its unpredictability, this * class does not generally handle duplicate triples well in other * contexts. */ enum ImportDuplicatesMode { ImportIgnoreDuplicates, ImportFailOnDuplicates, ImportPermitDuplicates }; /** * Import the RDF document found at the given URL into the current * store (in addition to its existing contents). Its behaviour * when a triple is encountered that already exists in the store * is controlled by the ImportDuplicatesMode. * * May throw RDFException or RDFDuplicateImportException. * * Note that the URL must be a URL, not just a filename * (i.e. local files need the file: prefix). * * If format is specified, it will be taken as the RDF parse * format (e.g. ntriples). The set of supported format strings * depends on the underlying RDF library configuration. The * default is to guess the format if possible. */ virtual void import(QUrl url, ImportDuplicatesMode idm, QString format = "") = 0; /** * Feature defines the set of optional features a Store * implementation may support. Code that uses Store should check * that the features it requires are available before trying to * make use of them. * * ModifyFeature: The store can be modified (triples can be added * to it). All current Store implementations support this feature. * * QueryFeature: The store supports SPARQL queries through the * query and queryOnce methods. A store that does not support * queries will throw RDFUnsupportedError when these functions are * called. * * RemoteImportFeature: The store can import URLs that represent * network resources as well as URLs referring to files on the * local disc. The extent to which this feature is actually * available may also depend on the configuration of the * underlying RDF library. A store that does not support remote * URLs will fail as if the resource was absent, when asked to * load one. */ enum Feature { ModifyFeature, QueryFeature, RemoteImportFeature }; typedef QSet Features; /** * Retrieve the set of optional features supported by this Store * implementation. */ virtual Features getSupportedFeatures() const = 0; protected: virtual ~Store() { } }; } QDataStream &operator<<(QDataStream &out, const Dataquay::ChangeType &); QDataStream &operator>>(QDataStream &in, Dataquay::ChangeType &); #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/0000755000175000017500000000000012264464201024021 5ustar miramirasonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/ObjectStorer.h0000644000175000017500000003357412252354725026621 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_STORER_H_ #define _DATAQUAY_OBJECT_STORER_H_ #include "../Node.h" #include "ObjectMapperDefs.h" #include class QObject; namespace Dataquay { class Store; class TypeMapping; /** * \class ObjectStorer ObjectStorer.h * * ObjectStorer is a storage handler capable of turning objects * derived from QObject into RDF triples in a Store, such that under * the right conditions the original objects can be recreated from the * store by ObjectLoader. * * See also ObjectMapper, for a class which manages a set of objects * and uses ObjectStorer and ObjectLoader to map changes * bidirectionally between object hierarchy and datastore. * * ObjectStorer typically creates a new URI for each object it stores, * based on the object's class name with a unique suffix. (In some * cases -- where an object only exists as the value of a property of * another object and is not referred to elsewhere in the hierarchy -- * it will by default be given a blank node instead of a URI.) The * URI created for an object will be stored in that object as a user * property named "uri" of type Dataquay::Uri. If that property * already exists, ObjectStorer will use its value instead of creating * a new URI; you can exploit this if you wish to override the * generated URI. Note that ObjectStorer cannot handle objects having * a uri property of any type other than Dataquay::Uri. * * For each object, ObjectStorer will write an rdf:type; an RDF * property for each of the QObject properties of the object that have * STORED set to true; and RDF properties identifying the parent and * sibling objects if the object is part of a QObject hierarchy. The * URIs used for the type and these properties can be controlled using * a TypeMapping object. * * ObjectStorer uses Node::fromVariant to convert QObject property * values to RDF literals: see Node::registerDatatype for the means to * add new datatypes. Properties with subclass-of-QObject-pointer * values can be written recursively (see setFollowPolicy); the * default is to write them only if the "value" QObject already has a * URI. ObjectStorer can write properties which have set and sequence * container types (converting sets to multiple RDF properties with * the same subject URI, and sequences to RDF lists) if those types * have been registered with ContainerBuilder. * * Finally, you can register callbacks (using addStoreCallback) to be * called after each object is stored, in case you wish to associate * more information with an object. * * ObjectStorer is primarily intended to provide a simple, open and * extensible storage format for small networks of * application-specific objects. With TypeMapping there is some * flexibility to assist with creating object structures from * arbitrary RDF graphs, and the mechanism has been tested and * optimised to some degree for some millions of triples, but that way * could lie madness. * * ObjectStorer is re-entrant, but not thread-safe. */ class ObjectStorer { public: /** * ObjectNodeMap contains a record of the RDF node used for each * object. This can be filled in a call to store() and passed to * subsequent calls in order to hasten lookup, avoid unnecessary * repeated stores, and ensure consistency for generated URIs. * * Note that, although ObjectStorer places the URI of each object * in its uri property, certain objects may be written using blank * nodes -- those nodes can only be retrieved through this map. * * The caller is responsible for ensuring that any objects * subsequently deleted are also removed from this map. */ typedef QHash ObjectNodeMap; /** * Create an ObjectStorer ready to store objects to the given * datastore. */ ObjectStorer(Store *s); ~ObjectStorer(); /** * Retrieve the store object that was passed to the constructor. */ Store *getStore(); /** * Provide a TypeMapping object, which controls the URIs chosen by * ObjectStorer to represent object types and properties. * Generally if you are using ObjectStorer and ObjectLoader * together, you will want to use the same TypeMapping object with * both. */ void setTypeMapping(const TypeMapping &); /** * Retrieve the current TypeMapping object. */ const TypeMapping &getTypeMapping() const; enum PropertyStorePolicy { /** * Store only properties that differ from default object */ StoreIfChanged, /** * Store all properties (if storable, readable & writable) (default) */ StoreAlways }; /** * Set the policy used to determine whether to store a property. * * If StoreIfChanged, properties will only be written if they * differ in value from those retrieved from a newly-constructed * instance of the object. If StoreAlways, all suitable * properties will be written. The default is StoreAlways. * * StoreIfChanged only works for objects that have been registered * with ObjectBuilder so that a default object can be constructed. * Any other objects will have all suitable properties written. * * In either case, only properties whose QObject property * definitions have all of READ, WRITE, and STORED set to true * will be considered suitable and stored. */ void setPropertyStorePolicy(PropertyStorePolicy policy); /** * Retrieve the current policy used to determine whether to store * a property. */ PropertyStorePolicy getPropertyStorePolicy() const; /** * Set the policy used to determine whether to give an object a * URI or use a blank node for it. * * If BlankNodesAsNeeded (the default), objects will be given * blank nodes if it appears to ObjectStorer that they do not need * URIs. In practice this means that objects which are referred * to because they are properties of other objects and which do * not appear elsewhere in the list of objects being stored, do * not have an existing uri property, and do not have a URI node * allocated in an ObjectNodeMap passed to the store method, will * be assigned blank nodes. * * If NoBlankObjectNodes, all objects written will be given URIs. * These will be drawn from the object's uri property if it exists * and is of Dataquay::Uri type, or else invented uniquely based * on the object's class name. * * If NeverUseBlankNodes, the ObjectStorer will never generate a * blank node -- all objects written will be given URIs, and list * nodes will be given URIs generated from those of their * contents. With this setting, an object graph written twice * using the same object-node map will produce identical RDF * graphs. *!!! ^^^ write a unit test for this, and ensure that it is true * * If you are using BlankNodesAsNeeded but would prefer * ObjectStorer not to use a blank node for a specific object, you * can assign a URI in advance by setting a Dataquay::Uri to its * "uri" property (either a declared property or a user property). * * Note that if a blank node is used for an object, there will be * no way to retrieve that node through the object (no equivalent * of the "uri" property). If you want to refer to the node * subsequently you will need to ensure you provide an * ObjectNodeMap to the store method to retrieve the node that was * generated. */ void setBlankNodePolicy(BlankNodePolicy policy); /** * Retrieve the current policy used to determine whether to give * an object a URI or use a blank node for it. */ BlankNodePolicy getBlankNodePolicy() const; enum FollowOption { FollowNone = 0, // the default FollowObjectProperties = 1, FollowParent = 2, FollowSiblings = 4, FollowChildren = 8 // there is no FollowAll; it generally isn't a good idea //!!! revise this in light of two-step rework }; typedef int FollowPolicy; /** * Set the policy used to determine which objects to store, based * on their relationship to an object whose storage is being * explicitly requested. * * If the policy is FollowNone, only the objects explicitly * requested for storage by being passed as arguments to a store() * method call will be stored. * * If the policy has FollowObjectProperties set, then where an * object has a property that is suitable for storing (see * setPropertyStorePolicy) and whose type is a pointer-to-object * class for some subclass of QObject, the object referred to by * that property will be stored. Otherwise, such properties will * only be written where their objects have URIs available already * (either because they exist in the object-node map or because * they have a QObject property of name uri and Dataquay::Uri * type). * * If the policy has FollowParent set, then where an object has a * QObject parent, that parent will also be written. * * If the policy has FollowSiblings set, then where an object has * QObject siblings (i.e. the object and those other objects share * a parent), those siblings will also be written. * * If the policy has FollowChildren set, then where an object has * QObject children, those children will also be written. */ void setFollowPolicy(FollowPolicy policy); FollowPolicy getFollowPolicy() const; /** * Store the given object and return its URI in the datastore. * Other objects may also be stored, depending on the FollowPolicy * setting. * * The object will be stored even if it already exists in the * store. No other data will be changed; for example, if other * triples already exist with this object's URI as subject, they * will be left alone. See setBlankNodePolicy for details of the * assignment of nodes to objects. */ Uri store(QObject *o); /** * Store the given object; add the object and its node to the * ObjectNodeMap, and return its URI in the datastore. Other * objects may also be stored, depending on the FollowPolicy * setting, and will be recorded in the ObjectNodeMap as well. * * The object will be stored even if it already exists in the * store. No other data will be changed; for example, if other * triples already exist with this object's URI as subject, they * will be left alone. See setBlankNodePolicy for details of the * assignment of nodes to objects. */ Uri store(QObject *o, ObjectNodeMap &map); /** * Store the given objects. Other objects may also be stored, * depending on the FollowPolicy setting. */ void store(QObjectList o); /** * Store the given objects, and add them and their nodes to the * ObjectNodeMap. Other objects may also be stored, depending on * the FollowPolicy setting. */ void store(QObjectList o, ObjectNodeMap &map); /** * Remove an object from the store, given its node. This removes * all triples with the node as subject. If any such triple * references a blank node that is not referred to elsewhere in * the store, all triples with that node as subject will be * removed as well. If such a blank node is also the head of an * RDF list, the rest of the RDF list will also be removed * provided it fulfils the same criteria. */ void removeObject(Node node); struct StoreCallback { /** * An object has been stored by the given ObjectStorer, * resulting in the given RDF node. The object and node will * also be found in the ObjectNodeMap, which additionally * references any other objects that have been stored during * this storage sequence. */ virtual void stored(ObjectStorer *, ObjectNodeMap &, QObject *, Node) = 0; }; /** * Register the given callback (a subclass of the abstract * StoreCallback class) as providing a "stored" callback method * which will be called after each object is stored. */ void addStoreCallback(StoreCallback *callback); private: ObjectStorer(const ObjectStorer &); ObjectStorer &operator=(const ObjectStorer &); class D; D *m_d; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/ObjectBuilder.h0000644000175000017500000003100512252354725026714 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_BUILDER_H_ #define _DATAQUAY_OBJECT_BUILDER_H_ #include #include #include namespace Dataquay { /** * \class ObjectBuilder ObjectBuilder.h * * ObjectBuilder is a singleton object factory capable of constructing * new objects of classes that are subclassed from QObject. Given the * class name as a string, and optionally a parent object, it will * return a new instance of the class. To be capable of construction * using ObjectBuilder, a class must be declared using Q_OBJECT as * well as subclassed from QObject. * * All candidate object classes need to be registered with the builder * before they can be constructed. The only class that ObjectBuilder * is able to construct without registration is QObject itself. * * This class permits code to construct new objects dynamically, * without needing to know anything about them except for their class * names, and without needing their definitions to be visible. (The * definitions must be visible when the object classes are registered, * but not when the objects are constructed.) */ class ObjectBuilder { public: /** * Retrieve the single global instance of ObjectBuilder. */ static ObjectBuilder *getInstance(); /** * Register type T, a subclass of QObject, as a class that can be * constructed by calling a zero-argument constructor. * * For example, registerClass() declares that QAction is * a subclass of QObject that may be built by calling * QAction::QAction(). * * A subsequent call to ObjectBuilder::build("QAction") would * return a new QAction built with that constructor (since * "QAction" is the class name of QAction returned by its meta * object). */ template void registerClass() { m_builders[T::staticMetaObject.className()] = new Builder0(); } /** * Register type T, a subclass of QObject, as a class that can be * constructed by calling a single-argument constructor whose * argument is of pointer-to-Parent type, where Parent is also a * subclass of QObject. * * For example, registerClass() declares that * QWidget is a subclass of QObject that may be built by calling * QWidget::QWidget(QWidget *parent). * * A subsequent call to ObjectBuilder::build("QWidget", parent) * would return a new QWidget built with that constructor (since * "QWidget" is the class name of QWidget returned by its meta * object). */ template void registerClass() { m_builders[T::staticMetaObject.className()] = new Builder1(); } /** * Register type T, a subclass of QObject, as a class that can be * constructed by calling a zero-argument constructor. Also * declare pointerName to be the meta type name for pointers to * type T, such that QVariant can be used to store such pointers. * * For example, registerClass("QAction*") declares that * QAction is a subclass of QObject that may be built by calling * QAction::QAction(), and that "QAction*" has been registered * (using qRegisterMetaType) as the meta type name for * pointer-to-QAction. * * A subsequent call to ObjectBuilder::build("QAction") would * return a new QAction built with that constructor (since * "QAction" is the class name of QAction returned by its meta * object). */ template void registerClass(QString pointerName) { QString className = T::staticMetaObject.className(); m_cpmap[className] = pointerName; m_pcmap[pointerName] = className; m_builders[className] = new Builder0(); registerExtractor(pointerName); } /** * Register type T, a subclass of QObject, as a class that can be * constructed by calling a single-argument constructor whose * argument is of pointer-to-Parent type, where Parent is also a * subclass of QObject. Also declare pointerName to be the meta * type name for pointers to type T, such that QVariant can be * used to store such pointers. * * For example, registerClass("QWidget*") * declares that QWidget is a subclass of QObject that may be * built by calling QWidget::QWidget(QWidget *parent), and that * "QWidget*" has been registered (using qRegisterMetaType) as the * meta type name for pointer-to-QWidget. * * A subsequent call to ObjectBuilder::build("QWidget", parent) * would return a new QWidget built with that constructor (since * "QWidget" is the class name of QWidget returned by its meta * object). */ template void registerClass(QString pointerName) { QString className = T::staticMetaObject.className(); m_cpmap[className] = pointerName; m_pcmap[pointerName] = className; m_builders[className] = new Builder1(); registerExtractor(pointerName); } /** * Register type T, a subclass of QObject, as an interface (a pure * virtual class) and pointerName to be the meta type name for * pointers to type T, such that QVariant can be used to store * such pointers. * * For example, registerClass("Command*") declares that * Command is a subclass of QObject that may not be built directly * but that "Command*" has been registered (using * qRegisterMetaType) as the meta type name for * pointer-to-QAction. * * A subsequent call to ObjectBuilder::extract("Command*", v) * would extract a pointer of type Command* from the QVariant v. */ template void registerInterface(QString pointerName) { QString className = T::staticMetaObject.className(); m_cpmap[className] = pointerName; m_pcmap[pointerName] = className; registerExtractor(pointerName); } /** * Return true if the class whose class name (according to its * meta object) is className has been registered for building. */ bool knows(QString className) { return m_builders.contains(className); } /** * Return a new object whose class name (according to its meta * object) is className, with the given parent (cast * appropriately) passed to its single argument constructor. */ QObject *build(QString className, QObject *parent) { if (!knows(className)) return 0; return m_builders[className]->build(parent); } /** * Return a new object whose class name (according to its meta * object) is className, constructed with no parent. */ QObject *build(QString className) { if (!knows(className)) return 0; return m_builders[className]->build(0); } /** * Return true if the class whose pointer has meta-type name * pointerName has been registered with that pointer name * (i.e. using one of the registerClass(pointerName) methods or * registerInterface). */ bool canExtract(QString pointerName) { return m_extractors.contains(pointerName); } /** * Return true if the class whose pointer has meta-type name * pointerName has been registered with that pointer name * (i.e. using one of the registerClass(pointerName) methods or * registerInterface). */ bool canInject(QString pointerName) { return m_extractors.contains(pointerName); } /** * Provided the given pointerName has been registered using one of * the registerClass(pointerName) methods or registerInterface, * take the given variant containing that pointer type and extract * and return the pointer. */ QObject *extract(QString pointerName, QVariant &v) { if (!canExtract(pointerName)) return 0; return m_extractors[pointerName]->extract(v); } /** * Provided the given pointerName has been registered using one of * the registerClass(pointerName) methods or registerInterface, * take the given pointer and stuff it into a variant, returning * the result. */ QVariant inject(QString pointerName, QObject *p) { if (!canInject(pointerName)) return QVariant(); return m_extractors[pointerName]->inject(p); } /** * Provided the given pointerName has been registered using one of * the registerClass(pointerName) methods, return the name of the * class that was used as the template argument for that method. */ QString getClassNameForPointerName(QString pointerName) const { if (m_pcmap.contains(pointerName)) return m_pcmap[pointerName]; return ""; } /** * If the class whose class name (according to its meta object) is * className has been registered using one of the * registerClass(pointerName) methods, return the pointerName that * was passed to that method. */ QString getPointerNameForClassName(QString className) const { if (m_cpmap.contains(className)) return m_cpmap[className]; return ""; } private: ObjectBuilder() { registerClass("QObject*"); } ~ObjectBuilder() { for (BuilderMap::iterator i = m_builders.begin(); i != m_builders.end(); ++i) { delete *i; } for (ExtractorMap::iterator i = m_extractors.begin(); i != m_extractors.end(); ++i) { delete *i; } } template void registerExtractor(QString pointerName) { m_extractors[pointerName] = new Extractor(); } template void registerExtractor(QString pointerName, QString listName) { m_extractors[pointerName] = new Extractor(); } struct BuilderBase { virtual ~BuilderBase() { } virtual QObject *build(QObject *) = 0; }; template struct Builder0 : public BuilderBase { virtual QObject *build(QObject *) { return new T(); } }; template struct Builder1 : public BuilderBase { virtual QObject *build(QObject *p) { return new T(qobject_cast(p)); } }; typedef QHash BuilderMap; BuilderMap m_builders; struct ExtractorBase { virtual ~ExtractorBase() { } virtual QObject *extract(const QVariant &v) = 0; virtual QVariant inject(QObject *) = 0; }; template struct Extractor : public ExtractorBase { virtual QObject *extract(const QVariant &v) { return v.value(); } virtual QVariant inject(QObject *o) { Pointer p = qobject_cast(o); if (p) return QVariant::fromValue(p); else return QVariant(); } }; typedef QHash ExtractorMap; ExtractorMap m_extractors; QHash m_cpmap; QHash m_pcmap; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/ObjectMapper.h0000644000175000017500000002537612252354725026570 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_MAPPER_H_ #define _DATAQUAY_OBJECT_MAPPER_H_ #include "../Node.h" #include "../Store.h" #include "ObjectMapperDefs.h" #include namespace Dataquay { class TransactionalStore; class TypeMapping; /** * \class ObjectMapper ObjectMapper.h * * ObjectMapper manages a set of objects, maintaining a consistent * record of their state in a TransactionalStore by mapping changes in * both directions between objects and store. It uses ObjectStorer to * map objects (derived from QObject) to the store, and then watches * both the objects and the store for changes, applying to the store * any changes in the objects and using ObjectLoader to bring the * objects up to date with any changes in the store. * * See ObjectStorer for details of how objects are mapped to the RDF * store, and ObjectLoader for details of how changes in the RDF store * are mapped back to the objects. * * ObjectMapper watches QObject properties' notify signals to * determine when a property has changed, and uses QObject::destroyed * to determine when an object has been deleted. You can also advise * it of changes using the objectModified slot directly (for example * where a property has no notify signal). * * ObjectMapper requires a TransactionalStore as its backing RDF * store, and uses the TransactionalStore's transactionCommitted * signal to tell it when a change has been made to the store which * should be mapped back to the object structure. * * You must call the commit() method to cause any changes to be * written to the store. This also commits the underlying * transaction. * * Call add() to add a new object to the store (managing it, and also * marking it to be stored on the next commit). ObjectMapper does not * have any other way to find out about new objects, even if they are * properties or children of existing managed objects. * * Alternatively, call manage() to manage an object without marking it * as needing to be written -- implying that the object is known to be * up-to-date with the store already. ObjectMapper will refuse to * manage any object that lacks a uri property, as any objects that * have not previously been mapped will normally need to be add()ed * (which gives them URIs) rather than manage()d. * * It is safe to call add() or manage() with an object that is already * managed; if add() is called with such an object it will be * rescheduled to be stored, but there will be no other effect. * * Call unmanage() to tell ObjectMapper to stop watching an object. * You should not call this when the object is destroyed, unless you * want to ensure that destroying it does not remove it from the * store. Managed objects are automatically monitored for destruction * and removed from the store and unmanaged appropriately. * * ObjectMapper is thread-safe. */ class ObjectMapper : public QObject { Q_OBJECT public: /** * Construct an object mapper backed by the given store. The * mapper is initially managing no objects. * * The store must be a TransactionalStore (rather than for example * a BasicStore) because the object mapper commits each update as * a single transaction and relies on the * TransactionalStore::transactionCommitted signal to learn about * changes in the store. */ ObjectMapper(TransactionalStore *ts); ~ObjectMapper(); /** * Obtain the TransactionalStore that was passed to the * constructor. */ TransactionalStore *getStore(); /** * Supply a TypeMapping object describing the RDF URIs that should * be used to encode each object's property and class names. * Without this, ObjectMapper (or rather its ObjectStorer and * ObjectLoader classes) will generate suitable-looking URIs for * each class and property names. */ void setTypeMapping(const TypeMapping &); /** * Obtain the TypeMapping previously set using setTypeMapping, or * the default (empty) TypeMapping if none has been set. */ const TypeMapping &getTypeMapping() const; /** * Set the policy used to determine whether to give an object a * URI or use a blank node for it. The default is * BlankNodesAsNeeded. */ void setBlankNodePolicy(BlankNodePolicy policy); /** * Retrieve the current policy used to determine whether to give * an object a URI or use a blank node for it. */ BlankNodePolicy getBlankNodePolicy() const; /** * Obtain the RDF node to which the given object has been mapped, * or a null Node if the object has not yet been stored by this * ObjectMapper. */ Node getNodeForObject(QObject *o) const; /** * Obtain the QObject which has been mapped to the given node, or * NULL if the node is not one that has been stored by this * ObjectMapper. */ QObject *getObjectByNode(Node n) const; //!!!doc QObject *load(Node node); //!!!doc QObjectList loadType(Uri type); signals: void committed(); public slots: /** * Add a new object to the store. This tells ObjectMapper to * manage the object, and also marks it to be stored the next time * \ref commit is called. * * You must call \ref add or \ref manage for every new object that * needs to be managed; ObjectMapper does not have any other way * to find out about new objects, even if they are properties or * children of existing managed objects. *!!! above is no longer correct (anything stored or loaded is managed automatically), document */ void add(QObject *); /** * Add a list of new objects to the store. This tells * ObjectMapper to manage the objects, and also marks them to be * stored the next time \ref commit is called. * * You must call \ref add or \ref manage for every new object that * needs to be managed; ObjectMapper does not have any other way * to find out about new objects, even if they are properties or * children of existing managed objects. *!!! above is no longer correct (anything stored or loaded is managed automatically), document */ void add(QObjectList); /** * Tell ObjectMapper to start managing an object. This tells * ObjectMapper to watch the object and commit to the store any * changes that it detects in the object's properties, or when the * object is destroyed. If the object was managed already, * nothing happens. * * This does not mark the object as needing to be written; it * implies that the object is known to be up-to-date with the * store already. ObjectMapper will refuse to manage any object * that lacks a uri property; if your object is a "new" one, you * should use \ref add instead of \ref manage. *!!! above is no longer enough (anything stored or loaded is managed automatically), document */ void manage(QObject *); /** * Tell ObjectMapper to start managing a list of objects. This * tells ObjectMapper to watch the objects and commit to the store * any changes that it detects in the objects' properties, or when * the objects are destroyed. * * Any objects that were managed already are ignored: there is no * harm in passing them more than once, except a small time * penalty. * * This does not mark the objects as needing to be written; it * implies that the objects are known to be up-to-date with the * store already. ObjectMapper will refuse to manage any object * that lacks a uri property; if your object is a "new" one, you * should use \ref add instead of \ref manage. *!!! above is no longer enough (anything stored or loaded is managed automatically), document */ void manage(QObjectList); /** * Tell ObjectMapper to stop managing the given object. */ void unmanage(QObject *); /** * Tell ObjectMapper to stop managing the given objects. */ void unmanage(QObjectList); /** * Commit to the store any changes that have happened to the * currently managed objects since the last commit. * * You need to call this (or commitAndObtain) if you want any * changes to appear in the store. */ void commit(); /** * Commit to the store any changes that have happened to the * currently managed objects since the last commit, and return the * changes committed. * * You need to call this (or commit) if you want any changes to * appear in the store. */ ChangeSet commitAndObtain(); /** * Notify ObjectMapper that the given object has changed. * ObjectMapper automatically watches the notify signals for an * object's properties, but it will not spot any changes that do * not have an associated notify signal. */ void objectModified(QObject *); /** * Notify ObjectMapper that the given object is being destroyed. * This should not normally be necessary, as ObjectMapper * automatically watches the destroyed signals for objects it * manages. */ void objectDestroyed(QObject *); private slots: void transactionCommitted(const ChangeSet &cs); private: ObjectMapper(const ObjectMapper &); ObjectMapper &operator=(const ObjectMapper &); class D; D *m_d; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/ContainerBuilder.h0000644000175000017500000002026612252354725027437 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_CONTAINER_BUILDER_H_ #define _DATAQUAY_CONTAINER_BUILDER_H_ #include #include #include #include namespace Dataquay { /** * \class ContainerBuilder ContainerBuilder.h * * ContainerBuilder is a utility class which assists with storage of * arbitrary container objects into variant objects and subsequently * retrieving them into lists. * * Given types T and Container (where Container is typically something * like QList), ContainerBuilder can convert a QVariantList holding * type T into a QVariant holding Container, and back again. */ class ContainerBuilder { public: /** * Retrieve the single global instance of ContainerBuilder. */ static ContainerBuilder *getInstance(); /** * ContainerKind describes the sort of behaviour a container * displays with regard to ordering and structure. A container of * kind SequenceKind is externally ordered (order must be * preserved when serialising, for example); kind SetKind is * unordered or internally ordered (its ordering does not need to * be described). */ enum ContainerKind { UnknownKind = 0, SequenceKind, // e.g. list SetKind // e.g. set // perhaps also something for maps }; /** * Register Container as a container of kind ContainerKind holding * type T. T must be something capable of being stored in a * QVariant -- so typically a primitive type, a Qt utility type * such as QString, or a pointer type. Both T and Container must * be registered as Qt metatypes using qRegisterMetaType. * * The arguments typeName and containerName give the textual names * for the types T and Container; these must be the same as were * used when calling qRegisterMetaType. * * For example, to register QStringList: * * registerContainer * ("QString", "QStringList", SequenceKind); */ template void registerContainer(QString typeName, QString containerName, ContainerKind kind) { registerContainerExtractor (typeName, containerName, kind); } /** * Return true if the container named containerName can be * extracted from a variant. This is the case if containerName * was the name of a container provided to an earlier call to * registerContainer. */ bool canExtractContainer(QString containerName) { return m_containerExtractors.contains(containerName); } /** * Return true if the container named containerName can be * injected into a variant. This is the case if containerName was * the name of a container provided to an earlier call to * registerContainer. */ bool canInjectContainer(QString containerName) { return m_containerExtractors.contains(containerName); } /** * Return the typeName that is associated with the given * containerName. That is, when registerContainer was called for * a container with name containerName, typeName is the name that * was given as the first argument of that call. */ QString getTypeNameForContainer(QString containerName) { if (!canExtractContainer(containerName)) return QString(); return m_containerExtractors[containerName]->getTypeName(); } /** * Return the kind of the container with the given containerName. * That is, when registerContainer was called for a container with * name containerName, return the kind that was given as the final * argument of that call. */ ContainerKind getContainerKind(QString containerName) { if (!canExtractContainer(containerName)) return UnknownKind; return m_containerExtractors[containerName]->getKind(); } /** * Extract the named container type from the given variant object * (which must hold that container type) and return a list of * variants containing the individual elements in the container. */ QVariantList extractContainer(QString containerName, const QVariant &v) { if (!canExtractContainer(containerName)) return QVariantList(); return m_containerExtractors[containerName]->extract(v); } /** * Inject the named container type into a new variant object. * Taking a list of variants holding the individual elements in * the container, return a single variant holding the container * itself. */ QVariant injectContainer(QString containerName, const QVariantList &vl) { if (!canInjectContainer(containerName)) return QVariant(); return m_containerExtractors[containerName]->inject(vl); } private: ContainerBuilder() { registerContainer ("QString", "QStringList", SequenceKind); } ~ContainerBuilder() { for (ContainerExtractorMap::iterator i = m_containerExtractors.begin(); i != m_containerExtractors.end(); ++i) { delete *i; } } template void registerContainerExtractor(QString typeName, QString containerName, ContainerKind kind) { m_containerExtractors[containerName] = new ContainerExtractor(typeName, kind); } struct ContainerExtractorBase { virtual ~ContainerExtractorBase() { } virtual QVariantList extract(const QVariant &v) = 0; virtual QVariant inject(const QVariantList &) = 0; virtual QString getTypeName() const = 0; virtual ContainerKind getKind() const = 0; }; template struct ContainerExtractor : public ContainerExtractorBase { ContainerExtractor(QString typeName, ContainerKind kind) : m_typeName(typeName), m_kind(kind) { } virtual QVariantList extract(const QVariant &v) { Container tl = v.value(); QVariantList vl; foreach (const T &t, tl) vl << QVariant::fromValue(t); return vl; } virtual QVariant inject(const QVariantList &vl) { Container tl; foreach (const QVariant &v, vl) tl << v.value(); return QVariant::fromValue(tl); } virtual QString getTypeName() const { return m_typeName; } virtual ContainerKind getKind() const { return m_kind; } QString m_typeName; ContainerKind m_kind; }; typedef QHash ContainerExtractorMap; ContainerExtractorMap m_containerExtractors; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/ObjectMapperExceptions.h0000644000175000017500000000720412252354725030620 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_MAPPER_EXCEPTIONS_H_ #define _DATAQUAY_OBJECT_MAPPER_EXCEPTIONS_H_ #include #include namespace Dataquay { /** * \class UnknownTypeException ObjectMapperExceptions.h * * UnknownTypeException is an exception thrown by ObjectMapper classes * when asked to load an object from an RDF entity whose type cannot * be mapped to a C++ class type using the current TypeMapping. */ class UnknownTypeException : virtual public std::exception { public: UnknownTypeException(QString type) throw() : m_type(type) { } virtual ~UnknownTypeException() throw() { } virtual const char *what() const throw() { return QString("Unknown type: %1").arg(m_type).toLocal8Bit().data(); } protected: QString m_type; }; /** * \class ConstructionFailedException ObjectMapperExceptions.h * * ConstructionFailedException is an exception that may be thrown by * ObjectMapper classes if a class mapped from an RDF entity type * could not be constructed. */ class ConstructionFailedException : virtual public std::exception { public: ConstructionFailedException(QString type) throw() : m_type(type) { } virtual ~ConstructionFailedException() throw() { } virtual const char *what() const throw() { return QString("Failed to construct type: %1") .arg(m_type).toLocal8Bit().data(); } protected: QString m_type; }; /** * \class NoUriException ObjectMapperExceptions.h * * NoUriException is an exception thrown by ObjectMapper classes when * asked to store a class that is expected to have been assigned a URI * already, if its URI property is absent. */ class NoUriException : virtual public std::exception { public: NoUriException(QString oname, QString cname) throw() : m_oname(oname), m_cname(cname) { } virtual ~NoUriException() throw() { } virtual const char *what() const throw() { return QString("Object of name \"%1\" and class %2 lacks URI") .arg(m_oname).arg(m_cname).toLocal8Bit().data(); } protected: QString m_oname; QString m_cname; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/ObjectMapperDefs.h0000644000175000017500000000411112252354725027352 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_MAPPER_DEFS_H_ #define _DATAQUAY_OBJECT_MAPPER_DEFS_H_ namespace Dataquay { enum BlankNodePolicy { /** * Use blank nodes for objects with no existing URIs that are * not known to be referred to elsewhere. This is the * default. */ PermitBlankObjectNodes, /** * Ensure that every object explicitly stored has a URI. Blank * nodes may still appear as list nodes when storing * containers. */ NoBlankObjectNodes, /** * Never write a blank node: allocate a URI even for list * nodes. */ NeverUseBlankNodes }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/ObjectLoader.h0000644000175000017500000002662412252354725026547 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_LOADER_H_ #define _DATAQUAY_OBJECT_LOADER_H_ #include "../Node.h" #include #include class QObject; namespace Dataquay { class Store; class TypeMapping; /** * \class ObjectLoader ObjectLoader.h * * ObjectLoader constructs objects corresponding to nodes in the RDF * store and sets properties on those objects corresponding to the * node's RDF properties. The class of each object is based on the * node's RDF type. TypeMapping is used to relate node types to * object classes, and ObjectBuilder is used to construct the objects * (which must be subclasses of QObject). * * In addition to some specification of which nodes to load, * ObjectLoader methods may also take a reference to a NodeObjectMap * in which is stored the object corresponding to each loaded node. * This map may be used by the caller as a persistent record of * node-object relationships, as it is updated on each new * ObjectLoader call with any unaffected nodes remaining unchanged in * the map. * * By default, ObjectLoader loads only those objects passed in to each * load() or reload() call. ObjectLoader sets as many QObject * properties on each object as possible, given the information * available to it: * * \li Properties with non-object-type values will be assigned from * RDF properties with literal value nodes, provided Node::toVariant * is able to carry out the conversion from literal; * * \li Properties with object-type values will be assigned from RDF * properties with URI value nodes, provided those URI nodes have * corresponding objects available to ObjectLoader, i.e. also in the * set being loaded or in the NodeObjectMap. (However, see also * FollowObjectProperties below.) * * \li Properties whose value types are sequenced containers such as * QList or std::vector will be assigned from RDF properties with * sequence values, provided their container types have been * registered with ContainerBuilder; * * \li Properties whose value types are set containers such as QSet * will be assigned from the aggregation of all RDF properties with * the appropriate subject and predicate, provided their container * types have been registered with ContainerBuilder. * * Some behaviour can be adjusted using setFollowPolicy and * setAbsentPropertyPolicy, as follows: * * \li \c FollowPolicy is a set of flags describing how ObjectLoader * should recurse from each object to those related to it. It can be * used to cause ObjectLoader to load more objects than are explicitly * requested. The flag \c FollowObjectProperties causes objects to be * loaded whenever they are required as the values of properties on * other objects in the loaded set. The flags \c FollowParent, \c * FollowSiblings and \c FollowChildren cause object tree * relationships to be followed up, using the "parent" and "follow" * properties with the TypeMapping's relationship prefix to determine * family relationships. * * \li \c AbsentPropertyPolicy determines how ObjectLoader handles * properties of an object that have no definition in the RDF store. * These properties are ignored if IgnoreAbsentProperties (the * default) is set, but if ResetAbsentProperties is set ObjectLoader * will attempt to reset each property to its default value based on * the value found in a freshly-constructed default instance of the * object class in question. * * The load procedure follows a defined order: * * \li The requested objects, and any relatives required by the * FollowPolicy, are constructed with their default properties (no * properties assigned from RDF yet). If the FollowPolicy includes * FollowParents or FollowSiblings, these will be followed before the * current object is loaded; if FollowChildren, they will be followed * afterwards; * * \li After all objects have been constructed, those properties that * have "simple" RDF literal values are assigned for each object; * * \li Next any immediate callbacks registered with addLoadCallback * are called for each object that has been loaded (i.e. any object * that was either constructed or assigned to). Use immediate * callbacks if you need to do any further initialisation work on an * object before its neighbours or property objects are loaded. * * \li After all "simple" properties have been assigned, any further * properties are set (those with container and object types); * * \li Finally, any final callbacks registered with addLoadCallback * are called for each object that has been loaded (i.e. any object * that was either constructed or assigned to). * * Note that ObjectLoader always maintains a one-to-one correspondence * between QObjects and the RDF nodes that it loads as QObjects. In * particular, where multiple objects have properties that refer to * the same URI, no more than a single value object will be * constructed and the same value object will be assigned to all of * those objects' properties. This implies that objects to be loaded * using ObjectLoader should be designed so that they do not attempt * to "own" (control lifecycle for) any other QObjects that appear as * their properties. Ownership must be maintained separately from the * property relationship. * * ObjectLoader is re-entrant, but not thread-safe. */ class ObjectLoader { public: /// Map from RDF node to object typedef QHash > NodeObjectMap; /** * Create an ObjectLoader ready to load objects from the given RDF * store. */ ObjectLoader(Store *s); ~ObjectLoader(); Store *getStore(); void setTypeMapping(const TypeMapping &); const TypeMapping &getTypeMapping() const; //!!! document this (after ObjectStorer) -- or pull it into ObjectMapperDefs enum FollowOption { FollowNone = 0, // the default FollowObjectProperties = 1, FollowParent = 2, FollowSiblings = 4, FollowChildren = 8 }; typedef int FollowPolicy; void setFollowPolicy(FollowPolicy policy); FollowPolicy getFollowPolicy() const; enum AbsentPropertyPolicy { IgnoreAbsentProperties, ResetAbsentProperties }; void setAbsentPropertyPolicy(AbsentPropertyPolicy policy); AbsentPropertyPolicy getAbsentPropertyPolicy() const; /** * Construct a QObject based on the properties of the given object * URI in the object mapper's store. The type of class created * will be calculated from the rdf:type for the URI, using the * current TypeMapping (see TypeMapping::getClassForTypeUri). * * Use caution in calling this method when the FollowPolicy is set * to anything other than FollowNone. Other objects may be loaded * when following connections from the given node according to the * current FollowPolicy, but only the object initially requested * is actually returned from the function -- other objects loaded * may be only accessible as parent/child or properties of this * node, or in some cases (e.g. FollowSiblings) may even be * inaccessible to the caller and be leaked. */ QObject *load(Node node); /** * For each node of the given RDF type found in the store, * construct a corresponding QObject, returning the objects. */ QObjectList loadType(Uri type); /** * For each node of the given RDF type found in the store, * construct a corresponding QObject, updating the map with all * resulting node-object correspondences and returning the * objects. */ QObjectList loadType(Uri type, NodeObjectMap &map); /** * Examine each of the nodes passed in, and if there is no * corresponding object in the node-object map, load the node as a * new QObject and place it in the map; if there is a * corresponding object in the node-object map, update it with * current properties from the store. If a node is passed in that * does not exist in the store, delete any object associated with * it from the map. */ void reload(Nodes nodes, NodeObjectMap &map); /** * Load and return an object for each node in the store that can * be loaded. */ QObjectList loadAll(); /** * Load and return an object for each node in the store that can * be loaded, updating the map with all resulting node-object * correspondences. Note that this loads all suitably-typed nodes * found in the store, not the objects found in the map. If there * are nodes in the map which are not found in the store, they * will be ignored (and not deleted from the map). */ QObjectList loadAll(NodeObjectMap &map); struct LoadCallback { /** * An object has been loaded by the given ObjectLoader from * the given RDF node. The node and object will also be found * in the NodeObjectMap, which additionally references any * other objects which have been loaded during this load * sequence. */ virtual void loaded(ObjectLoader *, NodeObjectMap &, Node, QObject *) = 0; }; /** * Type of a load callback. Immediate callbacks are called after * each node's literal properties have been assigned but before * any child, sibling, property etc relationships are followed. * Final callbacks are called after all work has been done on all * nodes and the graph is complete. */ enum LoadCallbackType { ImmediateCallback, FinalCallback }; /** * Register the given callback (a subclass of the abstract * LoadCallback class) as providing a "loaded" callback method * which will be called after each object is loaded. */ void addLoadCallback(LoadCallback *callback, LoadCallbackType type); private slots: void objectDestroyed(QObject *); private: ObjectLoader(const ObjectLoader &); ObjectLoader &operator=(const ObjectLoader &); class D; D *m_d; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/ObjectMapperForwarder.h0000644000175000017500000000477312252354725030442 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_OBJECT_MAPPER_FORWARDER_H_ #define _DATAQUAY_OBJECT_MAPPER_FORWARDER_H_ #include namespace Dataquay { class ObjectMapper; /** * ObjectMapperForwarder notifies ObjectMapper when a QObject is * modified or destroyed. It connects all of the object's property * notify signals and its destroyed signal to itself, and then calls * ObjectMapper methods when they are activated. * * ObjectMapperForwarder is used automatically by ObjectMapper; you do * not normally need to use it yourself. * * The principal motivation for this class is to avoid the * ObjectMapper trying to connect many signals for each of many * managed objects directly to its slots: if the number of such * objects was large, this would be a serious performance bottleneck. */ class ObjectMapperForwarder : public QObject { Q_OBJECT public: ObjectMapperForwarder(ObjectMapper *mapper, QObject *o); private slots: void objectModified(); void objectDestroyed(); private: ObjectMapper *m_mapper; QObject *m_source; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/objectmapper/TypeMapping.h0000644000175000017500000002256712252354725026451 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TYPE_MAPPING_H_ #define _DATAQUAY_TYPE_MAPPING_H_ #include "../Uri.h" #include namespace Dataquay { /** * TypeMapping describes a set of relationships between RDF entity and * property URIs, and C++ class and QObject property names. The * TypeMapping is referred to by ObjectMapper, ObjectStorer and * ObjectLoader when mapping between RDF entities and C++ objects. * * For example, say we have a class MyApplication::Person, with a * QObject string property called "name". We want the class to be * stored as a URI with RDF type foaf:Person, and the property to be * stored as a relationship for that URI of type foaf:name. These * URIs need to be expanded in order to be used with TypeMapping; we * assume here that "store" points to a Store which is aware of the * "foaf" prefix and can perform that expansion for us through * Store::expand. * * \code * TypeMapping tm; * tm.addTypeMapping("MyApplication::Person", store->expand("foaf:Person")); * tm.addPropertyMapping("MyApplication::Person", "name", store->expand("foaf:name")); * objectStorer->setTypeMapping(tm); * \endcode * * Now if objectStorer is used to store an object of class * MyApplication::Person, it will do so as a foaf:Person. Similarly, * whenever ObjectLoader is asked to load a foaf:Person, it will * create a MyApplication::Person object to do so. * * TypeMapping is re-entrant, but not thread-safe. * * *!!! TODO: Review method names */ class TypeMapping { public: /** * Construct a TypeMapping using default URIs throughout. */ TypeMapping(); TypeMapping(const TypeMapping &); TypeMapping &operator=(const TypeMapping &); ~TypeMapping(); /** * Set the prefix for synthetic type URIs. This is the prefix * used when asked to generate or convert type URIs for which no * specific mapping has been set using setTypeMapping. See also * \ref synthesiseTypeUriForClass and \ref synthesiseClassForTypeUri. */ void setObjectTypePrefix(Uri prefix); /** * Retrieve the prefix for synthetic type URIs. */ Uri getObjectTypePrefix() const; /** * Set the prefix for synthetic property URIs. This is the prefix * used when generating URIs for QObject properties for which no * specific mapping has been set using addPropertyMapping, and * when converting such URIs back to QObject properties. */ void setPropertyPrefix(Uri prefix); /** * Retrieve the prefix for synthetic property URIs. */ Uri getPropertyPrefix() const; /** * Set the prefix for ObjectMapper-specific property URIs. This * is the prefix used for object relationship properties such as * "parent" or "follows". */ void setRelationshipPrefix(Uri prefix); /** * Retrieve the prefix for ObjectMapper-specific property URIs. */ Uri getRelationshipPrefix() const; /** * Add a specific mapping from class name to entity URI. */ void addTypeMapping(QString className, Uri uri); /** * Retrieve the URI that has been set for the given class name * using \ref addTypeMapping, returning it in uri. Return true if * such a URI was found, false otherwise. */ bool getTypeUriForClass(QString className, Uri &uri) const; /** * Retrieve the C++ class name that has been set for the given * entity URI using \ref addTypeMapping, returning it in * className. Return true if such a name was found, false * otherwise. */ bool getClassForTypeUri(Uri uri, QString &className) const; /** * Return a URI for the RDF entity type corresponding to the given * C++ class. * * If a specific URI has been set for this class name using \ref * addTypeMapping (i.e. if \ref getTypeUriForClass would return a * result for this class name), the result will be that URI. * * Otherwise, the result will consist of the synthetic type URI * prefix (set using setObjectTypePrefix, or the default synthetic * type URI prefix if none has been set) followed by the class * name, with all namespace separators ("::") replaced by slashes * ("/"). */ Uri synthesiseTypeUriForClass(QString className) const; /** * Return a C++ class name corresponding to the given RDF entity * type URI. * * If a specific class name has been set for this URI using \ref * addTypeMapping (i.e. if \ref getClassForTypeUri would return a * result for this URI), the result will be that class name. * * Otherwise, the result will consist of the URI with the * synthetic type URI prefix (set using setObjectTypePrefix, or * the default synthetic type URI prefix if none has been set) * stripped off the beginning, and with subsequent slashes ("/") * replaced by namespace separators ("::"). * * Throws UnknownTypeException if no specific class name is * available and the URI does not begin with the synthetic type * URI prefix. */ QString synthesiseClassForTypeUri(Uri uri) const; /** * Add a mapping between class name and the common parts of any * URIs that are automatically generated when storing instances of * that class that have no URI property defined. * * For example, a mapping from "MyNamespace::MyClass" to * "http://mydomain.com/resource/" would ensure that automatically * generated "unique" URIs for instances that class all started * with that URI prefix. Note that the prefix itself is also * subject to namespace prefix expansion when stored. * * (If no prefix mapping was given for this example, its generated * URIs would start with ":mynamespace_myclass_".) * * Generated URIs are only checked for uniqueness within the store * being exported to and cannot be guaranteed to be globally * unique. For this reason, caution should be exercised in the * use of this function. * * Note that in principle the object mapper could use this when * loading, to infer class types for URIs in the store that have * no rdf:type. In practice that does not happen -- the object * mapper will not generate a class for URIs without rdf:type. */ void addTypeUriPrefixMapping(QString className, Uri prefix); /** * Retrieve the URI prefix set for the given className using \ref * addTypeUriPrefixMapping, if any, returning it in prefix. * Return true if such a prefix was found, false otherwise. */ bool getUriPrefixForClass(QString className, Uri &prefix) const; /** * Add a specific mapping for the given QObject property in the * given C++ class, to an RDF property URI. * * Note that distinct properties of the same class must map to * distinct URIs. If two properties of a class map to the same * URI, ObjectLoader will not be able to distinguish between them * (it does not attempt to resolve ambiguities using the type of * the argument, for example). */ void addPropertyMapping(QString className, QString propertyName, Uri uri); /** * Retrieve the URI that has been set for the given property in * the given class using \ref addPropertyMapping, returning it in * uri. Return true if such a URI was found, false otherwise. */ bool getPropertyUri(QString className, QString propertyName, Uri &uri) const; /** * Retrieve the name of the property for which the given URI has * been set in the given class using \ref addPropertyMapping, * returning it in propertyName. Return true if such a property * was found, false otherwise. */ bool getPropertyName(QString className, Uri propertyUri, QString &propertyName) const; //!!! Note no property equivalents of //!!! synthesiseClassForTypeUri/synthesiseTypeUriForClass -- do we want them? if only to have somewhere to put the documentation? private: class D; D *m_d; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/RDFException.h0000644000175000017500000001243712252354725024026 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_EXCEPTION_H_ #define _DATAQUAY_EXCEPTION_H_ #include #include namespace Dataquay { class Uri; class Node; class Triple; /** * \class RDFException RDFException.h * * RDFException is an exception that results from incorrect usage of * the RDF store interface or unsuitable data provided to a function. * For example, this exception would be thrown in response to trying * to add an incomplete triple to the store. */ class RDFException : virtual public std::exception { public: RDFException(QString message) throw(); RDFException(QString message, QString data) throw(); RDFException(QString message, const Uri &uri) throw(); RDFException(QString message, const Node &node) throw(); RDFException(QString message, const Triple &triple) throw(); RDFException(const RDFException &e) throw(); RDFException &operator=(const RDFException &e) throw(); virtual ~RDFException() throw(); virtual const char *what() const throw() { return m_message; } protected: char *m_message; void setMessage(QString m); }; /** * \class RDFIncompleteURI RDFException.h * * RDFIncompleteURI is thrown when an attempt is made to construct a * Uri from an incomplete URI string, such as a relative URI or a * string with no scheme. Relative URIs should be represented as plain * strings, and expanded by the store using its base URI into Uri * objects. */ class RDFIncompleteURI : virtual public RDFException { public: RDFIncompleteURI(QString message, QString data) throw() : RDFException(message, data) { } virtual ~RDFIncompleteURI() throw() { } }; /** * \class RDFInternalError RDFException.h * * RDFInternalError is an exception that results from an internal * error in the RDF store. */ class RDFInternalError : virtual public RDFException { public: RDFInternalError(QString message, QString data = "") throw() : RDFException(message, data) { } RDFInternalError(QString message, const Uri &data) throw() : RDFException(message, data) { } virtual ~RDFInternalError() throw() { } }; /** * \class RDFUnsupportedError RDFException.h * * RDFUnsupportedError is an exception that results from an attempt to * use a feature that is not supported or not configured in the * current build. */ class RDFUnsupportedError : virtual public RDFException { public: RDFUnsupportedError(QString message, QString data = "") throw() : RDFException(message, data) { } RDFUnsupportedError(QString message, const Uri &data) throw() : RDFException(message, data) { } virtual ~RDFUnsupportedError() throw() { } }; /** * \class RDFTransactionError RDFException.h * * RDFTransactionError is an exception that results from incorrect use * of a Transaction, for example using a Transaction object after it * has been committed. */ class RDFTransactionError : virtual public RDFException { public: RDFTransactionError(QString message, QString data = "") throw() : RDFException(message, data) { } virtual ~RDFTransactionError() throw() { } }; /** * \class RDFDuplicateImportException RDFException.h * * RDFDuplicateImportException is an exception that results from an * import into a store from an RDF document in ImportFailOnDuplicates * mode, where the document contains a triple that already exists in * the store. */ class RDFDuplicateImportException : virtual public RDFException { public: RDFDuplicateImportException(QString message, QString data = "") throw() : RDFException(message, data) { } RDFDuplicateImportException(QString message, const Triple &t) throw() : RDFException(message, t) { } virtual ~RDFDuplicateImportException() throw() { } }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/Triple.h0000644000175000017500000001113112252354725022761 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_TRIPLE_H_ #define _DATAQUAY_TRIPLE_H_ #include "Node.h" namespace Dataquay { /** * \class Triple Triple.h * * Triple represents an RDF statement made up of three Node objects. */ class Triple { public: /** * Construct a triple of three Nothing nodes. */ Triple() { } /** * Construct a triple of the three given nodes. * * Our triples may contain anything, including the Nothing node * type for undefined elements (used in wildcard matching, etc). * * However, in order to be inserted in the RDF store, a triple * must have either URI or Blank type for its first (or subject) * node, URI for its second (or predicate) node, and either URI, * Blank, or Literal type for its third (or object) node. */ Triple(Node _a, Node _b, Node _c) : a(_a), b(_b), c(_c) { } ~Triple() { } /** * Return the subject node. This is synonymous with accessing the * data member a. */ Node subject() { return a; } /** * Return the predicate node. This is synonymous with accessing * the data member b. */ Node predicate() { return b; } /** * Return the object node. This is synonymous with accessing the * data member c. */ Node object() { return c; } bool operator<(const Triple &t) const { if (a != t.a) return a < t.a; if (b != t.b) return b < t.b; if (c != t.c) return c < t.c; return false; } Node a; Node b; Node c; }; bool operator==(const Triple &a, const Triple &b); bool operator!=(const Triple &a, const Triple &b); QDataStream &operator<<(QDataStream &out, const Triple &); QDataStream &operator>>(QDataStream &in, Triple &); std::ostream &operator<<(std::ostream &out, const Triple &); QTextStream &operator<<(QTextStream &out, const Triple &); /// A list of RDF triples. class Triples : public QList { public: /** * Return true if the two Triples lists contain the same elements. * Triples is an ordered list, so operator== returns true only if * the two lists have the same elements in the same order; this * test is independent of order (although not independent of * number, in the case of duplicate triples) and so may be more * meaningful in some cases. */ bool matches(const Triples &other) const { if (this == &other) return true; if (size() != other.size()) return false; if (size() < 2) return QList::operator==(other); // Triple has operator< but not qHash, hence use QMap rather than QSet QMap a, b; foreach (Triple t, *this) ++a[t]; foreach (Triple t, other) ++b[t]; return a == b; } Nodes subjects() { Nodes result; foreach (Triple t, *this) result.push_back(t.a); return result; } Nodes predicates() { Nodes result; foreach (Triple t, *this) result.push_back(t.b); return result; } Nodes objects() { Nodes result; foreach (Triple t, *this) result.push_back(t.c); return result; } }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/Connection.h0000644000175000017500000001136312252354725023630 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_CONNECTION_H_ #define _DATAQUAY_CONNECTION_H_ #include "Store.h" namespace Dataquay { class TransactionalStore; class Transaction; /** * \class Connection Connection.h * * Connection provides a connection interface to TransactionalStore, * allowing it to be used in a convenient manner familiar to * programmers working with SQL databases. * * Each processing thread may construct a Connection to a central * TransactionalStore. The Connection will start a new Transaction on * the store when the first modifying function (add, remove, change or * revert) is called and will continue to use this Transaction for all * accesses to the store until either commit() or rollback() is called * on the Connection. * * Any read-only functions called on this class between a commit() or * rollback() and the next modifying function will be passed directly * to the store without any transaction. Read-only functions called * while a transaction is in progress will be passed through the * current transaction, and so will read the effective state of the * store with the partial transaction in force. * * The Connection commits any active Transaction when it is deleted. * To avoid this, call rollback() before deletion. No other * auto-commit functionality is provided -- if you want auto-commit, * use the TransactionalStore's own interface in AutoTransaction mode. * * Each Connection should be used in a single processing thread only. * Connection is not thread-safe. */ class Connection : public QObject, public Store { Q_OBJECT public: /** * Construct a Connection to the given TransactionalStore, through * which a series of transactions may be made in a single * processing thread. */ Connection(TransactionalStore *ts); /** * Destroy the Connection, first committing any outstanding * transaction. If you do not want any outstanding transaction to * be committed, call rollback() first. */ ~Connection(); // Store interface bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format = ""); Features getSupportedFeatures() const; public slots: /** * Commit the outstanding Transaction, if any. */ void commit(); /** * Commit the outstanding Transaction, if any, and return the * changes committed. */ ChangeSet commitAndObtain(); /** * Roll back the outstanding Transaction, if any, and prepare to * begin a new Transaction the next time a modifying function is * called. */ void rollback(); signals: /// Forwarded from TransactionalStore void transactionCommitted(const ChangeSet &); /// Forwarded from TransactionalStore void transactionCommitted(); private: class D; D *m_d; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/Node.h0000644000175000017500000002174712252354725022425 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_NODE_H_ #define _DATAQUAY_NODE_H_ namespace Dataquay { class Node; } // Declare this early, to avoid any problems with instantiation order // arising from inclusion "races". If this is not found when // compiling, hoist this header so that it is included earlier than // any other header that includes extern unsigned int qHash(const Dataquay::Node &); #include "Uri.h" #include #include class QDataStream; class QTextStream; namespace Dataquay { /** * \class Node Node.h * * Node represents a single RDF node, with conversions to and from * variant types. */ class Node { public: /** * Node type. */ enum Type { Nothing, URI, Literal, Blank }; /** * Construct a node with no node type (used for example as an * undefined node when pattern matching a triple). */ Node() : type(Nothing), value() { } /** * Construct a node with a URI node type and the given URI. * * Note that relative URIs (using namespace prefixes) must be * expanded before they be represented in a Uri. Call * Store::expand() to achieve this. * * (One basic principle of this RDF library is that we use QString * to represent URIs that may be local or namespace prefixed, and * Uri to represent expanded or canonical URIs.) */ Node(Uri u) : type(URI), value(u.toString()) { } /** * Construct a literal node with the given value, and with no * defined datatype. */ Node(QString v) : type(Literal), value(v) { } /** * Construct a literal node with the given value and datatype. */ Node(QString v, Uri dt) : type(Literal), value(v), datatype(dt) { } Node(const Node &n) : type(n.type), value(n.value), datatype(n.datatype) { } Node &operator=(const Node &n) { type = n.type; value = n.value; datatype = n.datatype; return *this; } ~Node() { } /** * Convert a QVariant to a Node. * * Simple QVariant types (integer, etc) are converted to literal * Nodes whose values are encoded as XSD datatypes, with the * node's value storing the XSD representation and the node's * datatype storing the XSD datatype URI. * * QVariants containing \ref Uri are converted to URI nodes. Note * that URIs using namespace prefixes will need to be expanded * before they can safely be represented in a Uri or Uri QVariant. * Call Store::expand() to achieve this. In general you should * ensure that URIs are expanded when placed in a Node object * rather than being stored in prefixed form. * * For QVariants whose types have been registered using * registerDatatype, the registered VariantEncoder's fromVariant * method will be used to convert the variant to a string which * will be stored in a literal node. * * Other QVariants, including complex structures, are converted * into literals containing an encoded representation which may be * converted back again using toVariant but cannot be directly * read from or interchanged using the node's value. These types * are given a specific fixed datatype URI. */ static Node fromVariant(const QVariant &v); /** * Convert a Node to a QVariant. * * See fromVariant for details of the conversion. * * Note that URI nodes are returned as variants with user type * corresponding to Uri, not as QString variants. This may result * in invalid Uris if the URIs were not properly expanded on * construction (see the notes about fromVariant). */ QVariant toVariant() const; /** * Convert a Node to a QVariant, with a nudge for the variant * type, used to override the default variant type corresponding * to the node's datatype. This is marginally simpler than * setting the datatype on the node and then converting, and so * may be convenient in situations where the proper RDF datatype * is missing. * * Meaningful results still depend on having the proper encoder * available (i.e. the type name whose QMetaType id is metaTypeId * must have been registered using registerDatatype, if it is not * one of the types with built-in support). If no encoder is * found, a QString variant will be returned instead. */ QVariant toVariant(int metaTypeId) const; bool operator<(const Node &n) const { if (type != n.type) return type < n.type; if (value != n.value) return value < n.value; if (datatype != n.datatype) return datatype < n.datatype; return false; } /** * VariantEncoder is an abstract interface for classes that can * convert between QVariant and strings for storage in literal * Node objects. */ struct VariantEncoder { virtual ~VariantEncoder() { } /** * Convert a string to a variant. The VariantEncoder is * expected to be know the node type from which the string has * been obtained. */ virtual QVariant toVariant(const QString &n) = 0; /** * Convert a variant to a string. The specific VariantEncoder * is expected to know the node type which is the target of * the conversion. */ virtual QString fromVariant(const QVariant &v) = 0; }; /** * Register an association between a particular datatype URI and a * type which can be stored in a QVariant. This can be used to * provide meaningful conversions between literal nodes and * QVariant objects in addition to the built-in types. * * For conversions from variant, once an association has been made * via this call, a subsequent call to Node::fromVariant given a * variant whose type is that of the given variantTypeName will * return a Node of the specified datatype. If an encoder is also * given, it will be used for the QVariant-to-string conversion * needed to produce a value string in the correct form for the * RDF datatype. * * For conversions to variant, the encoder is required. If it is * provided, then a subsequent call to Node::toVariant on a node * of the given datatype will result in a variant of the specified * type, produced by calling the encoder's toVariant method with * the node's value string as argument. */ static void registerDatatype(Uri datatype, QString variantTypeName, VariantEncoder *encoder = 0); /** * Retrieve the datatype URI that has been associated with the * given variant type using \ref registerDatatype. If no such * association has been made or the variant type is unknown, * return the empty Uri. */ static Uri getDatatype(QString variantTypeName); /** * Retrieve the variant type that has been associated with the * given datatype Uri using \ref registerDatatype. If no such * association has been made, return an empty string. */ static QString getVariantTypeName(Uri datatype); Type type; QString value; Uri datatype; }; /** * A list of node types. */ typedef QList Nodes; bool operator==(const Node &a, const Node &b); bool operator!=(const Node &a, const Node &b); QDataStream &operator<<(QDataStream &out, const Node &); QDataStream &operator>>(QDataStream &in, Node &); std::ostream &operator<<(std::ostream &out, const Node &); QTextStream &operator<<(QTextStream &out, const Node &); } #endif sonic-visualiser-2.3~repack1.orig/dataquay/dataquay/BasicStore.h0000644000175000017500000001132712252354725023567 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_BASIC_STORE_H_ #define _DATAQUAY_BASIC_STORE_H_ #include "Store.h" namespace Dataquay { /** * \class BasicStore BasicStore.h * * BasicStore is an in-memory RDF data store implementing the Store * interface, providing add, remove, matching and query operations for * RDF triples and SPARQL, as well as export and import. * * BasicStore uses a Redland or Sord datastore internally, depending * on whether USE_REDLAND or USE_SORD was defined when Dataquay was * built. * * All operations are thread safe. */ class BasicStore : public Store { public: BasicStore(); ~BasicStore(); /** * Set the base URI for the store. This is used to expand the * empty URI prefix when adding and querying triples, and is also * used as the document base URI when exporting. */ void setBaseUri(Uri uri); /** * Retrieve the base URI for the store. */ Uri getBaseUri() const; /** * Empty the store of triples. Prefixes that have been added with * addPrefix are unaffected. *!!! hoist to Store()? */ void clear(); /** * Add a prefix/uri pair (an XML namespace, except that this class * doesn't directly deal in XML) for use in subsequent operations. * If the prefix has already been added, this overrides any uri * associated with it. * * Example: addPrefix("dc", "http://purl.org/dc/elements/1.1/") to * add a prefix for the Dublin Core namespace. * * The store always knows about the XSD and RDF namespaces. * * Note that the base URI is always available as the empty prefix. * For example, the URI ":blather" will be expanded to the base * URI plus "blather". */ void addPrefix(QString prefix, Uri uri); // Store interface bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format = ""); Features getSupportedFeatures() const; /** * Construct a new BasicStore from the RDF document at the given * URL. May throw RDFException. The returned BasicStore is owned * by the caller and must be deleted using delete when finished * with. The return value is never NULL; all errors result in * exceptions. * * Note that the URL must be a URL, not just a filename * (i.e. local files need the file: prefix). The file URL will * also become the base URI of the store. * * If format is specified, it will be taken as the RDF parse * format (e.g. ntriples). The set of supported format strings * depends on the underlying RDF library configuration. The * default is to guess the format if possible. */ static BasicStore *load(QUrl url, QString format = ""); private: class D; D *m_d; }; } #endif sonic-visualiser-2.3~repack1.orig/dataquay/COPYING0000644000175000017500000000250012252354725020573 0ustar miramira Dataquay Copyright (c) 2009 Chris Cannam Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. sonic-visualiser-2.3~repack1.orig/dataquay/src/0000755000175000017500000000000012264464201020324 5ustar miramirasonic-visualiser-2.3~repack1.orig/dataquay/src/Store.cpp0000644000175000017500000000337712252354725022144 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Store.h" #include QDataStream &operator<<(QDataStream &out, const Dataquay::ChangeType &ct) { return (out << (qint32)ct); } QDataStream &operator>>(QDataStream &in, Dataquay::ChangeType &ct) { qint32 i; in >> i; ct = (Dataquay::ChangeType)i; return in; } sonic-visualiser-2.3~repack1.orig/dataquay/src/Debug.h0000644000175000017500000000422612252354725021535 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifndef _DATAQUAY_INTERNAL_DEBUG_H_ #define _DATAQUAY_INTERNAL_DEBUG_H_ #include #ifndef NDEBUG #include #define DEBUG QDebug(QtDebugMsg) << "[dataquay] " namespace Dataquay { template inline QDebug &operator<<(QDebug &d, const T &t) { QString s; QTextStream ts(&s); ts << t; d << s; return d; } } #else namespace Dataquay { class NoDebug { public: inline NoDebug() {} inline ~NoDebug(){} template inline NoDebug &operator<<(const T &) { return *this; } inline NoDebug &operator<<(QTextStreamFunction) { return *this; } }; } #define DEBUG ::Dataquay::NoDebug() #endif /* !NDEBUG */ #endif /* !_DEBUG_H_ */ sonic-visualiser-2.3~repack1.orig/dataquay/src/Uri.cpp0000644000175000017500000001204512252354725021577 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Uri.h" #include #include #include #include #include #include #include #ifndef NDEBUG #include #endif #include "Debug.h" #include "RDFException.h" namespace Dataquay { class UriRegistrar { public: static UriRegistrar *instance() { static UriRegistrar *inst = 0; static QMutex mutex; mutex.lock(); if (inst == 0) inst = new UriRegistrar(); mutex.unlock(); return inst; } int getType() const { return type; } QString getName() const { return name; } private: QString name; int type; UriRegistrar() : name("Dataquay::Uri") { DEBUG << "UriRegistrar: registering Dataquay::Uri" << endl; QByteArray bname = name.toLatin1(); type = qRegisterMetaType(bname.data()); qRegisterMetaTypeStreamOperators(bname.data()); } }; QString Uri::metaTypeName() { return UriRegistrar::instance()->getName(); } int Uri::metaTypeId() { int t = UriRegistrar::instance()->getType(); if (t <= 0) { DEBUG << "Uri::metaTypeId: No meta type available -- did static registration fail?" << endl; return 0; } return t; } void Uri::checkComplete() { if (!canBeComplete(m_uri)) { // may modify m_uri throw RDFIncompleteURI ("Uri::Uri: Given string is not a complete absolute URI", m_uri); } } bool Uri::isCompleteUri(QString s) { QString s0(s); return canBeComplete(s0); } bool Uri::canBeComplete(QString &s) { // An RDF URI must be absolute, with a few special cases if (s == "a") { s = rdfTypeUri().toString(); return true; } else if (s.isEmpty() || s[0] == '#' || s[0] == ':') { return false; } else { // look for scheme (and we know from the above that the first // char is not ':') bool hasScheme = false; for (int i = 0; i < s.length(); ++i) { if (s[i] == QChar(':')) { if (s[i+1] != QChar('/')) break; if (s[i+2] != QChar('/')) break; hasScheme = true; break; } if (!s[i].isLetter()) return false; } if (hasScheme) return true; // we are generous with file URIs: if we get file:x, convert // it to file://x if (s.startsWith("file:")) { s = "file://" + s.right(s.length() - 5); return true; } else { return false; } } } QString Uri::scheme() const { int index = m_uri.indexOf(':'); if (index < 0) return ""; return m_uri.left(index); } bool Uri::operator==(const Uri &u) const { const QString &other = u.m_uri; int len = length(); if (len != other.length()) return false; for (int i = len - 1; i >= 0; --i) { if (m_uri.at(i) != other.at(i)) return false; } return true; } bool Uri::hasUriType(const QVariant &v) { return (v.type() == QVariant::UserType && v.userType() == metaTypeId()); } Uri Uri::rdfTypeUri() { return Uri("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"); } QDataStream &operator<<(QDataStream &out, const Uri &u) { return out << u.toString(); } QDataStream &operator>>(QDataStream &in, Uri &u) { QString s; in >> s; u = Uri(s); return in; } std::ostream &operator<<(std::ostream &out, const Uri &u) { return out << u.toString().toLocal8Bit().data(); } QTextStream &operator<<(QTextStream &out, const Uri &u) { return out << u.toString(); } } unsigned int qHash(const Dataquay::Uri &u) { return qHash(u.toString()); } sonic-visualiser-2.3~repack1.orig/dataquay/src/TransactionalStore.cpp0000644000175000017500000006054012252354725024662 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "TransactionalStore.h" #include "BasicStore.h" #include "RDFException.h" #include "Debug.h" #include #include #include #include // auto_ptr using std::auto_ptr; namespace Dataquay { class TransactionalStore::D { /** * Current store context. * * TxContext: changes pending for the transaction are present in the * store (committing the transaction would be a no-op; * non-transactional queries would return incorrect results). * * NonTxContext: changes pending for the transaction are absent from * the store (store is ready for non-transactional queries; * committing the transaction would require reapplying changes). */ enum Context { TxContext, NonTxContext }; public: D(TransactionalStore *ts, Store *store, DirectWriteBehaviour dwb) : m_ts(ts), m_store(store), m_dwb(dwb), m_currentTx(NoTransaction), m_context(NonTxContext) { } ~D() { if (m_currentTx != NoTransaction) { std::cerr << "WARNING: TransactionalStore deleted with transaction ongoing" << std::endl; } } Transaction *startTransaction() { QMutexLocker locker(&m_mutex); DEBUG << "TransactionalStore::startTransaction" << endl; if (m_currentTx != NoTransaction) { throw RDFTransactionError("ERROR: Attempt to start transaction when another transaction from the same thread is already in train"); } Transaction *tx = new TSTransaction(this); m_currentTx = tx; return tx; } void commitTransaction(Transaction *tx) { ChangeSet cs; { QMutexLocker locker(&m_mutex); DEBUG << "TransactionalStore::commitTransaction" << endl; if (tx != m_currentTx) { throw RDFInternalError("Transaction integrity error"); } enterTransactionContext(); cs = m_currentTx->getChanges(); // The store is now in transaction context, which means // its changes have been committed; resetting m_currentTx // now ensures they will remain committed. Reset // m_context as well for symmetry with the initial state // in the constructor, though it shouldn't be necessary m_currentTx = NoTransaction; m_context = NonTxContext; } DEBUG << "TransactionalStore::commitTransaction: committed " << cs.size() << " change(s)" << endl; m_ts->transactionCommitted(cs); m_ts->transactionCommitted(); DEBUG << "TransactionalStore::commitTransaction complete" << endl; } void rollbackTransaction(Transaction *tx) { QMutexLocker locker(&m_mutex); DEBUG << "TransactionalStore::rollbackTransaction" << endl; if (tx != m_currentTx) { throw RDFInternalError("Transaction integrity error"); } leaveTransactionContext(); // The store is now in non-transaction context, which means // the transaction's changes are uncommitted m_currentTx = NoTransaction; DEBUG << "TransactionalStore::rollbackTransaction complete" << endl; } class Operation { public: Operation(const D *d, const Transaction *tx) : m_d(d), m_tx(tx) { m_d->startOperation(m_tx); } ~Operation() { m_d->endOperation(m_tx); } private: const D *m_d; const Transaction *m_tx; }; class NonTransactionalAccess { public: NonTransactionalAccess(D *d) : m_d(d) { m_d->startNonTransactionalAccess(); } ~NonTransactionalAccess() { m_d->endNonTransactionalAccess(); } private: D *m_d; }; bool add(Transaction *tx, Triple t) { Operation op(this, tx); return m_store->add(t); } bool remove(Transaction *tx, Triple t) { Operation op(this, tx); return m_store->remove(t); } bool contains(const Transaction *tx, Triple t) const { Operation op(this, tx); return m_store->contains(t); } Triples match(const Transaction *tx, Triple t) const { Operation op(this, tx); return m_store->match(t); } ResultSet query(const Transaction *tx, QString sparql) const { Operation op(this, tx); return m_store->query(sparql); } Node complete(const Transaction *tx, Triple t) const { Operation op(this, tx); return m_store->complete(t); } Triple matchOnce(const Transaction *tx, Triple t) const { Operation op(this, tx); return m_store->matchOnce(t); } Node queryOnce(const Transaction *tx, QString sparql, QString bindingName) const { Operation op(this, tx); return m_store->queryOnce(sparql, bindingName); } Uri getUniqueUri(const Transaction *tx, QString prefix) const { Operation op(this, tx); return m_store->getUniqueUri(prefix); } Node addBlankNode(Transaction *tx) const { Operation op(this, tx); return m_store->addBlankNode(); } Uri expand(QString uri) const { return m_store->expand(uri); } void save(const Transaction *tx, QString filename) const { Operation op(this, tx); m_store->save(filename); } /*!!! void import(Transaction *tx, QUrl url, ImportDuplicatesMode idm, QString format) { Operation op(this, tx); m_store->import(url, idm, format); } */ Features getSupportedFeatures() const { return m_store->getSupportedFeatures(); } bool hasWrap() const { return m_dwb == AutoTransaction; } void startNonTransactionalAccess() { // This is only called from the containing TransactionalStore // when it wants to carry out a non-transactional read access. // Hence, it needs to take a lock and hold it until // endNonTransactionalAccess is called m_mutex.lock(); DEBUG << "TransactionalStore::startNonTransactionalAccess" << endl; if (m_context == NonTxContext) DEBUG << "(note: already in non-tx context)" << endl; leaveTransactionContext(); // return with mutex held } void endNonTransactionalAccess() { // We can remain in NonTxContext, since every transactional // access checks this via enterTransactionContext before doing // any work; this way is quicker if we may have multiple // non-transactional reads happening together. DEBUG << "TransactionalStore::endNonTransactionalAccess" << endl; m_mutex.unlock(); } Store *getStore() { return m_store; } const Store *getStore() const { return m_store; } private: // Most things are mutable here because the TransactionalStore // manipulates the Store extensively when entering and leaving // transaction context, which can happen on any supposedly // read-only access TransactionalStore *m_ts; mutable Store *m_store; DirectWriteBehaviour m_dwb; mutable QMutex m_mutex; const Transaction *m_currentTx; mutable Context m_context; void startOperation(const Transaction *tx) const { // This will succeed immediately if the mutex is already held // by this thread from a startTransaction call (because it is // a recursive mutex). If another thread is performing a // transaction, then we have to block until the whole // transaction is complete m_mutex.lock(); if (tx != m_currentTx) { throw RDFInternalError("Transaction integrity error"); } enterTransactionContext(); } void endOperation(const Transaction *tx) const { if (tx != m_currentTx) { throw RDFInternalError("Transaction integrity error"); } m_mutex.unlock(); } void enterTransactionContext() const { // This is always called from within this class, with the // mutex held already if (m_context == TxContext) { return; } if (m_currentTx == NoTransaction) { return; } ChangeSet cs = m_currentTx->getChanges(); if (!cs.empty()) { DEBUG << "TransactionalStore::enterTransactionContext: replaying" << endl; try { m_store->change(cs); } catch (RDFException &e) { throw RDFTransactionError(QString("Failed to enter transaction context. Has the store been modified non-transactionally while a transaction was in progress? Original error is: %1").arg(e.what())); } } m_context = TxContext; } void leaveTransactionContext() const { // This is always called from within this class, with the // mutex held already if (m_context == NonTxContext) { return; } if (m_currentTx == NoTransaction) { m_context = NonTxContext; return; } // N.B. This is the reason for Transaction::getChanges() // returning the change set prior to rollback, rather than // e.g. an empty change set, if called after a rollback ChangeSet cs = m_currentTx->getChanges(); if (!cs.empty()) { try { m_store->revert(cs); } catch (RDFException &e) { throw RDFTransactionError(QString("Failed to leave transaction context. Has the store been modified non-transactionally while a transaction was in progress? Original error is: %1").arg(e.what())); } } m_context = NonTxContext; } }; class TransactionalStore::TSTransaction::D { public: D(TransactionalStore::TSTransaction *tx, TransactionalStore::D *td) : m_tx(tx), m_td(td), m_committed(false), m_abandoned(false) { } ~D() { if (!m_committed && !m_abandoned && !m_tx->getChanges().empty()) { // Although it's not a good idea for any code to try to // catch this exception and continue (better just to fix // the code!), we should at least make it possible -- so // we need to either commit or rollback, or else the next // transaction will stall m_td->rollbackTransaction(m_tx); throw RDFTransactionError(QString("Transaction deleted without having been committed or rolled back")); } } void abandon() const { if (m_abandoned || m_committed) return; DEBUG << "TransactionalStore::TSTransaction::abandon: Auto-rollback triggered by exception" << endl; m_td->rollbackTransaction(m_tx); m_abandoned = true; } void check() const { if (m_abandoned) { throw RDFTransactionError("Transaction used after being rolled back"); } if (m_committed) { throw RDFTransactionError("Transaction used afted being committed"); } } bool add(Triple t) { check(); try { if (m_td->add(m_tx, t)) { m_changes.push_back(Change(AddTriple, t)); return true; } else { return false; } } catch (RDFException &) { abandon(); throw; } } bool remove(Triple t) { check(); try { // If some nodes are null, we need to remove all matching // triples -- we need to do that here instead of relying // on the underlying store (which does the same thing) // because we can't push the incomplete statement onto the // change set Triples tt; bool wild = false; if (t.a.type == Node::Nothing || t.b.type == Node::Nothing || t.c.type == Node::Nothing) { tt = m_td->match(m_tx, t); wild = true; } else { tt.push_back(t); } bool found = false; for (int i = 0; i < tt.size(); ++i) { if (m_td->remove(m_tx, tt[i])) { m_changes.push_back(Change(RemoveTriple, tt[i])); found = true; } else if (wild) { throw RDFInternalError("Failed to remove matched statement in remove() with wildcards"); } } return found; } catch (RDFException &) { abandon(); throw; } } void change(ChangeSet cs) { // this is all atomic anyway (as it's part of the // transaction), so unlike BasicStore we don't need a lock for (int i = 0; i < cs.size(); ++i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!add(triple)) { throw RDFException("Change add failed: triple is already in store", triple); } break; case RemoveTriple: if (!remove(cs[i].second)) { throw RDFException("Change remove failed: triple is not in store", triple); } break; } } } void revert(ChangeSet cs) { // this is all atomic anyway (as it's part of the // transaction), so unlike BasicStore we don't need a lock for (int i = cs.size()-1; i >= 0; --i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!remove(triple)) { throw RDFException("Revert of add failed: triple is not in store", triple); } break; case RemoveTriple: if (!add(triple)) { throw RDFException("Revert of remove failed: triple is already in store", triple); } break; } } } bool contains(Triple t) const { check(); try { return m_td->contains(m_tx, t); } catch (RDFException &) { abandon(); throw; } } Triples match(Triple t) const { check(); try { return m_td->match(m_tx, t); } catch (RDFException &) { abandon(); throw; } } ResultSet query(QString sparql) const { check(); try { return m_td->query(m_tx, sparql); } catch (RDFException &) { abandon(); throw; } } Node complete(Triple t) const { check(); try { return m_td->complete(m_tx, t); } catch (RDFException &) { abandon(); throw; } } Triple matchOnce(Triple t) const { check(); try { return m_td->matchOnce(m_tx, t); } catch (RDFException &) { abandon(); throw; } } Node queryOnce(QString sparql, QString bindingName) const { check(); try { return m_td->queryOnce(m_tx, sparql, bindingName); } catch (RDFException &) { abandon(); throw; } } Uri getUniqueUri(QString prefix) const { check(); try { return m_td->getUniqueUri(m_tx, prefix); } catch (RDFException &) { abandon(); throw; } } Node addBlankNode() { check(); try { return m_td->addBlankNode(m_tx); } catch (RDFException &) { abandon(); throw; } } Uri expand(QString uri) const { return m_td->expand(uri); } void save(QString filename) const { check(); try { return m_td->save(m_tx, filename); } catch (RDFException &) { abandon(); throw; } } void import(QUrl url, ImportDuplicatesMode idm, QString format) { check(); BasicStore *bs = 0; try { bs = BasicStore::load(url, format); Triples ts = bs->match(Triple()); foreach (Triple t, ts) { bool added = m_td->add(m_tx, t); if (added) { m_changes.push_back(Change(AddTriple, t)); } else if (idm == ImportFailOnDuplicates) { throw RDFDuplicateImportException("Duplicate statement encountered on import in ImportFailOnDuplicates mode"); } } delete bs; bs = 0; } catch (RDFException &) { delete bs; abandon(); throw; } } Features getSupportedFeatures() const { return m_td->getSupportedFeatures(); } void commit() { check(); DEBUG << "TransactionalStore::TSTransaction::commit: Committing" << endl; m_td->commitTransaction(m_tx); m_committed = true; } void rollback() { check(); DEBUG << "TransactionalStore::TSTransaction::rollback: Abandoning" << endl; m_td->rollbackTransaction(m_tx); m_abandoned = true; } ChangeSet getCommittedChanges() const { if (m_committed) return m_changes; else return ChangeSet(); } ChangeSet getChanges() const { return m_changes; } private: TransactionalStore::TSTransaction *m_tx; TransactionalStore::D *m_td; ChangeSet m_changes; mutable bool m_committed; mutable bool m_abandoned; }; TransactionalStore::TransactionalStore(Store *store, DirectWriteBehaviour dwb) : m_d(new D(this, store, dwb)) { } TransactionalStore::~TransactionalStore() { delete m_d; } Transaction * TransactionalStore::startTransaction() { return m_d->startTransaction(); } void TransactionalStore::save(QString filename) const { D::NonTransactionalAccess ntxa(m_d); m_d->getStore()->save(filename); } void TransactionalStore::import(QUrl url, ImportDuplicatesMode idm, QString format) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::import() called without Transaction"); } auto_ptr tx(startTransaction()); return tx->import(url, idm, format); } TransactionalStore::Features TransactionalStore::getSupportedFeatures() const { return m_d->getStore()->getSupportedFeatures(); } bool TransactionalStore::add(Triple t) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::add() called without Transaction"); } // auto_ptr here is very useful to ensure destruction on exceptions auto_ptr tx(startTransaction()); return tx->add(t); } bool TransactionalStore::remove(Triple t) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::remove() called without Transaction"); } auto_ptr tx(startTransaction()); return tx->remove(t); } void TransactionalStore::change(ChangeSet cs) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::change() called without Transaction"); } auto_ptr tx(startTransaction()); tx->change(cs); } void TransactionalStore::revert(ChangeSet cs) { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::revert() called without Transaction"); } auto_ptr tx(startTransaction()); tx->revert(cs); } bool TransactionalStore::contains(Triple t) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->contains(t); } Triples TransactionalStore::match(Triple t) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->match(t); } ResultSet TransactionalStore::query(QString s) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->query(s); } Node TransactionalStore::complete(Triple t) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->complete(t); } Triple TransactionalStore::matchOnce(Triple t) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->matchOnce(t); } Node TransactionalStore::queryOnce(QString s, QString b) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->queryOnce(s, b); } Uri TransactionalStore::getUniqueUri(QString prefix) const { D::NonTransactionalAccess ntxa(m_d); return m_d->getStore()->getUniqueUri(prefix); } Node TransactionalStore::addBlankNode() { if (!m_d->hasWrap()) { throw RDFException("TransactionalStore::addBlankNode() called without Transaction"); } auto_ptr tx(startTransaction()); return tx->addBlankNode(); } Uri TransactionalStore::expand(QString uri) const { return m_d->expand(uri); } TransactionalStore::TSTransaction::TSTransaction(TransactionalStore::D *td) : m_d(new D(this, td)) { } TransactionalStore::TSTransaction::~TSTransaction() { delete m_d; } bool TransactionalStore::TSTransaction::add(Triple t) { return m_d->add(t); } bool TransactionalStore::TSTransaction::remove(Triple t) { return m_d->remove(t); } void TransactionalStore::TSTransaction::change(ChangeSet cs) { m_d->change(cs); } void TransactionalStore::TSTransaction::revert(ChangeSet cs) { m_d->revert(cs); } bool TransactionalStore::TSTransaction::contains(Triple t) const { return m_d->contains(t); } Triples TransactionalStore::TSTransaction::match(Triple t) const { return m_d->match(t); } ResultSet TransactionalStore::TSTransaction::query(QString sparql) const { return m_d->query(sparql); } Node TransactionalStore::TSTransaction::complete(Triple t) const { return m_d->complete(t); } Triple TransactionalStore::TSTransaction::matchOnce(Triple t) const { return m_d->matchOnce(t); } Node TransactionalStore::TSTransaction::queryOnce(QString sparql, QString bindingName) const { return m_d->queryOnce(sparql, bindingName); } Uri TransactionalStore::TSTransaction::getUniqueUri(QString prefix) const { return m_d->getUniqueUri(prefix); } Node TransactionalStore::TSTransaction::addBlankNode() { return m_d->addBlankNode(); } Uri TransactionalStore::TSTransaction::expand(QString uri) const { return m_d->expand(uri); } void TransactionalStore::TSTransaction::save(QString filename) const { return m_d->save(filename); } void TransactionalStore::TSTransaction::import(QUrl url, ImportDuplicatesMode idm, QString format) { m_d->import(url, idm, format); } TransactionalStore::TSTransaction::Features TransactionalStore::TSTransaction::getSupportedFeatures() const { return m_d->getSupportedFeatures(); } void TransactionalStore::TSTransaction::commit() { m_d->commit(); } void TransactionalStore::TSTransaction::rollback() { m_d->rollback(); } ChangeSet TransactionalStore::TSTransaction::getCommittedChanges() const { return m_d->getCommittedChanges(); } ChangeSet TransactionalStore::TSTransaction::getChanges() const { return m_d->getChanges(); } } sonic-visualiser-2.3~repack1.orig/dataquay/src/Triple.cpp0000644000175000017500000000434512252354725022303 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Triple.h" #include #include namespace Dataquay { bool operator==(const Triple &a, const Triple &b) { if (a.a == b.a && a.b == b.b && a.c == b.c) return true; return false; } bool operator!=(const Triple &a, const Triple &b) { return !operator==(a, b); } QDataStream & operator<<(QDataStream &out, const Triple &t) { return out << t.a << t.b << t.c; } QDataStream & operator>>(QDataStream &in, Triple &t) { return in >> t.a >> t.b >> t.c; } std::ostream & operator<<(std::ostream &out, const Triple &t) { return out << "( " << t.a << " " << t.b << " " << t.c << " )"; } QTextStream & operator<<(QTextStream &out, const Triple &t) { return out << "( " << t.a << " " << t.b << " " << t.c << " )"; } } sonic-visualiser-2.3~repack1.orig/dataquay/src/Node.cpp0000644000175000017500000003504712252354725021734 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Node.h" #include "Debug.h" #include #include #include #include #include #include #include namespace Dataquay { static const Uri encodedVariantTypeURI ("http://breakfastquay.com/dataquay/datatype/encodedvariant"); static const Uri xsdPrefix ("http://www.w3.org/2001/XMLSchema#"); struct StandardVariantEncoder : public Node::VariantEncoder { QString fromVariant(const QVariant &v) { return v.toString(); } }; struct LongVariantEncoder : public StandardVariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(s.toLong()); } }; struct ULongVariantEncoder : public StandardVariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(s.toULong()); } }; struct DoubleVariantEncoder : public StandardVariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(s.toDouble()); } }; struct StringVariantEncoder : public StandardVariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(s); } }; struct BoolVariantEncoder : public Node::VariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue((s == "true") || (s == "1")); } QString fromVariant(const QVariant &v) { return (v.toBool() ? "true" : "false"); } }; struct UriVariantEncoder : public Node::VariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(Uri(s)); } QString fromVariant(const QVariant &v) { return v.value().toString(); } }; struct QUrlVariantEncoder : public Node::VariantEncoder { QVariant toVariant(const QString &s) { return QVariant::fromValue(QUrl(s)); } QString fromVariant(const QVariant &v) { return v.value().toString(); } }; // Type maps to be used when converting from Node to Variant and // Variant to Node, respectively. These are not symmetrical -- for // example, we convert xsd:string to QString, but convert QString to // an untyped literal ("literal" and "literal"^^xsd:string compare // differently and most people just use "literal", so we're more // likely to achieve interoperable results if we don't type plain // strings). Similarly we convert both double and float to // xsd:decimal, but always convert xsd:decimal to double. However, we // do currently impose symmetry for user-provided types (that is, our // registerDatatype method adds the datatype to both maps). class DatatypeMetatypeAssociation { public: static DatatypeMetatypeAssociation *instance() { static DatatypeMetatypeAssociation *inst = 0; static QMutex mutex; mutex.lock(); if (inst == 0) inst = new DatatypeMetatypeAssociation(); mutex.unlock(); return inst; } int getMetatypeId(Uri dt) { DatatypeMetatypeMap::const_iterator i = datatypeMetatypeMap.find(dt); if (i != datatypeMetatypeMap.end()) return i->first; return 0; } bool getDatatype(int mt, Uri &dt) { MetatypeDatatypeMap::const_iterator i = metatypeDatatypeMap.find(mt); if (i != metatypeDatatypeMap.end()) { dt = i->first; return true; } return false; } Node::VariantEncoder *getEncoder(Uri dt) { DatatypeMetatypeMap::const_iterator i = datatypeMetatypeMap.find(dt); if (i != datatypeMetatypeMap.end()) return i->second; return 0; } Node::VariantEncoder *getEncoder(int id) { MetatypeDatatypeMap::const_iterator i = metatypeDatatypeMap.find(id); if (i != metatypeDatatypeMap.end()) return i->second; return 0; } void registerDatatype(Uri dt, int id, Node::VariantEncoder *enc) { datatypeMetatypeMap[dt] = QPair(id, enc); } void registerDatatype(int id, Uri dt, Node::VariantEncoder *enc) { metatypeDatatypeMap[id] = QPair(dt, enc); } void registerXsd(QString name, int id, Node::VariantEncoder *enc) { registerDatatype(Uri(xsdPrefix.toString() + name), id, enc); } void registerXsd(int id, QString name, Node::VariantEncoder *enc) { registerDatatype(id, Uri(xsdPrefix.toString() + name), enc); } private: DatatypeMetatypeAssociation() { registerXsd("string", QMetaType::QString, new StringVariantEncoder()); registerXsd("boolean", QMetaType::Bool, new BoolVariantEncoder()); registerXsd("int", QMetaType::Int, new LongVariantEncoder()); registerXsd("long", QMetaType::Long, new LongVariantEncoder()); registerXsd("integer", QMetaType::Long, new LongVariantEncoder()); registerXsd("unsignedInt", QMetaType::UInt, new ULongVariantEncoder()); registerXsd("nonNegativeInteger", QMetaType::ULong, new ULongVariantEncoder()); registerXsd("float", QMetaType::Float, new DoubleVariantEncoder()); registerXsd("double", QMetaType::Double, new DoubleVariantEncoder()); registerXsd("decimal", QMetaType::Double, new DoubleVariantEncoder()); registerXsd(QMetaType::Bool, "boolean", new BoolVariantEncoder()); registerXsd(QMetaType::Int, "integer", new LongVariantEncoder()); registerXsd(QMetaType::Long, "integer", new LongVariantEncoder()); registerXsd(QMetaType::UInt, "integer", new ULongVariantEncoder()); registerXsd(QMetaType::ULong, "integer", new ULongVariantEncoder()); registerXsd(QMetaType::Float, "decimal", new DoubleVariantEncoder()); registerXsd(QMetaType::Double, "decimal", new DoubleVariantEncoder()); // Not necessary in normal use, because URIs are stored in URI // nodes and handled separately rather than being stored in // literal nodes... but necessary if an untyped literal is // presented for conversion via toVariant(Uri::metaTypeId()) registerDatatype(Uri::metaTypeId(), Uri(), new UriVariantEncoder()); // Similarly, although no datatype is associated with QUrl, it // could be presented when trying to convert a URI Node using // an explicit variant type target (e.g. to assign RDF URIs to // QUrl properties rather than Uri ones) registerDatatype(QMetaType::QUrl, Uri(), new QUrlVariantEncoder()); // QString is a known variant type, but has no datatype when // writing (we write strings as untyped literals because // that's what seems most useful). We already registered it // with xsd:string for reading. registerDatatype(QMetaType::QString, Uri(), new StringVariantEncoder()); } typedef QHash > DatatypeMetatypeMap; DatatypeMetatypeMap datatypeMetatypeMap; typedef QHash > MetatypeDatatypeMap; MetatypeDatatypeMap metatypeDatatypeMap; }; void Node::registerDatatype(Uri dt, QString typeName, VariantEncoder *enc) { QByteArray ba = typeName.toLocal8Bit(); int id = QMetaType::type(ba.data()); if (id <= 0) { std::cerr << "WARNING: Node::registerDatatype: Type name \"" << typeName.toLocal8Bit().data() << "\" is unknown to QMetaType, " << "cannot register it here" << std::endl; return; } DatatypeMetatypeAssociation::instance()->registerDatatype(dt, id, enc); DatatypeMetatypeAssociation::instance()->registerDatatype(id, dt, enc); } Uri Node::getDatatype(QString typeName) { QByteArray ba = typeName.toLocal8Bit(); int id = QMetaType::type(ba.data()); if (id <= 0) return Uri(); Uri dt; if (DatatypeMetatypeAssociation::instance()->getDatatype(id, dt)) return dt; return Uri(); } QString Node::getVariantTypeName(Uri datatype) { int id = DatatypeMetatypeAssociation::instance()->getMetatypeId(datatype); if (id > 0) return QMetaType::typeName(id); else return QString(); } Node Node::fromVariant(const QVariant &v) { DEBUG << "Node::fromVariant: QVariant type is " << v.userType() << " (" << int(v.userType()) << "), variant is " << v << endl; if (Uri::hasUriType(v)) { return Node(v.value()); } if (v.type() == QVariant::Url) { QString s = v.toUrl().toString(); if (Uri::isCompleteUri(s)) { return Node(Uri(s)); } } int id = v.userType(); DatatypeMetatypeAssociation *a = DatatypeMetatypeAssociation::instance(); Uri datatype; if (a->getDatatype(id, datatype)) { Node n; n.type = Literal; n.datatype = datatype; VariantEncoder *encoder = a->getEncoder(id); if (encoder) { n.value = encoder->fromVariant(v); } else { n.value = v.toString(); } return n; } else { // unknown type: use opaque encoding QByteArray b; QDataStream ds(&b, QIODevice::WriteOnly); ds << v; Node n; n.type = Literal; n.datatype = encodedVariantTypeURI; n.value = QString::fromLatin1(qCompress(b).toBase64()); return n; } } QVariant Node::toVariant() const { if (type == URI) { return QVariant::fromValue(Uri(value)); } if (type == Nothing || type == Blank) { return QVariant(); } if (datatype == Uri()) { return QVariant::fromValue(value); } if (datatype == encodedVariantTypeURI) { // Opaque encoding used for "unknown" types. If this is // encoding is in use, we must decode from it even if the type // is actually known QByteArray benc = value.toLatin1(); QByteArray b = qUncompress(QByteArray::fromBase64(benc)); QDataStream ds(&b, QIODevice::ReadOnly); QVariant v; ds >> v; return v; } DatatypeMetatypeAssociation *a = DatatypeMetatypeAssociation::instance(); int id = a->getMetatypeId(datatype); if (id > 0) { VariantEncoder *encoder = a->getEncoder(datatype); if (encoder) { return encoder->toVariant(value); } else { // datatype present, but no encoder: can do nothing // interesting with this, convert as string return QVariant::fromValue(value); } } else { // unknown datatype, but not "unknown type" encoding; // convert as a string return QVariant::fromValue(value); } } QVariant Node::toVariant(int metatype) const { VariantEncoder *encoder = DatatypeMetatypeAssociation::instance()->getEncoder(metatype); if (!encoder) { std::cerr << "WARNING: Node::toVariant: Unsupported metatype id " << metatype << " (\"" << QMetaType::typeName(metatype) << "\"), register it with registerDatatype please" << std::endl; return QVariant(); } return encoder->toVariant(value); } bool operator==(const Node &a, const Node &b) { if (a.type == Node::Nothing && b.type == Node::Nothing) return true; if (a.type == b.type && a.value == b.value && a.datatype == b.datatype) return true; return false; } bool operator!=(const Node &a, const Node &b) { return !operator==(a, b); } QDataStream & operator<<(QDataStream &out, const Node &n) { return out << (int)n.type << n.value << n.datatype; } QDataStream & operator>>(QDataStream &in, Node &n) { int t; in >> t >> n.value >> n.datatype; n.type = (Node::Type)t; return in; } std::ostream & operator<<(std::ostream &out, const Node &n) { switch (n.type) { case Node::Nothing: out << "[]"; break; case Node::URI: if (n.value == "") { out << "[empty-uri]"; } else { out << "<" << n.value.toLocal8Bit().data() << ">"; } break; case Node::Literal: out << "\"" << n.value.toLocal8Bit().data() << "\""; if (n.datatype != Uri()) out << "^^" << n.datatype; break; case Node::Blank: out << "[blank " << n.value.toLocal8Bit().data() << "]"; break; } return out; } QTextStream & operator<<(QTextStream &out, const Node &n) { switch (n.type) { case Node::Nothing: out << "[]"; break; case Node::URI: if (n.value == "") { out << "[empty-uri]"; } else { out << "<" << n.value << ">"; } break; case Node::Literal: out << "\"" << n.value << "\""; if (n.datatype != Uri()) out << "^^" << n.datatype; break; case Node::Blank: out << "[blank " << n.value << "]"; break; } return out; } } unsigned int qHash(const Dataquay::Node &n) { switch (n.type) { case Dataquay::Node::URI: return qHash(n.value); case Dataquay::Node::Literal: return qHash(n.value + n.datatype.toString()); case Dataquay::Node::Blank: return qHash(n.value); default: return qHash(""); } } sonic-visualiser-2.3~repack1.orig/dataquay/src/objectmapper/0000755000175000017500000000000012264464201022777 5ustar miramirasonic-visualiser-2.3~repack1.orig/dataquay/src/objectmapper/ContainerBuilder.cpp0000644000175000017500000000344312252354725026746 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ContainerBuilder.h" #include #include namespace Dataquay { ContainerBuilder * ContainerBuilder::getInstance() { static ContainerBuilder *instance; static QMutex mutex; QMutexLocker locker(&mutex); if (!instance) instance = new ContainerBuilder(); return instance; } } sonic-visualiser-2.3~repack1.orig/dataquay/src/objectmapper/TypeMapping.cpp0000644000175000017500000001712112252354725025750 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/TypeMapping.h" #include "objectmapper/ObjectMapperExceptions.h" #include namespace Dataquay { static Uri defaultTypePrefix("http://breakfastquay.com/rdf/dataquay/objectmapper/type/"); static Uri defaultPropertyPrefix("http://breakfastquay.com/rdf/dataquay/objectmapper/property/"); static Uri defaultRelationshipPrefix("http://breakfastquay.com/rdf/dataquay/objectmapper/relationship/"); class TypeMapping::D { public: D() : m_typePrefix(defaultTypePrefix), m_propertyPrefix(defaultPropertyPrefix), m_relationshipPrefix(defaultRelationshipPrefix) { } Uri getObjectTypePrefix() const { return m_typePrefix; } void setObjectTypePrefix(Uri prefix) { m_typePrefix = prefix; } Uri getPropertyPrefix() const { return m_propertyPrefix; } void setPropertyPrefix(Uri prefix) { m_propertyPrefix = prefix; } Uri getRelationshipPrefix() const { return m_relationshipPrefix; } void setRelationshipPrefix(Uri prefix) { m_relationshipPrefix = prefix; } void addTypeMapping(QString className, Uri uri) { m_typeMap[uri] = className; m_typeRMap[className] = uri; } bool getTypeUriForClass(QString className, Uri &uri) const { QHash::const_iterator i = m_typeRMap.find(className); if (i != m_typeRMap.end()) { uri = *i; return true; } return false; } bool getClassForTypeUri(Uri typeUri, QString &className) const { QHash::const_iterator i = m_typeMap.find(typeUri); if (i != m_typeMap.end()) { className = *i; return true; } return false; } QString synthesiseClassForTypeUri(Uri typeUri) const { QString s; if (getClassForTypeUri(typeUri, s)) { return s; } s = typeUri.toString(); if (!s.startsWith(m_typePrefix.toString())) { throw UnknownTypeException(s); } s = s.right(s.length() - m_typePrefix.length()); s.replace('/', "::"); return s; } Uri synthesiseTypeUriForClass(QString className) const { Uri typeUri; if (getTypeUriForClass(className, typeUri)) { return typeUri; } typeUri = Uri(QString(m_typePrefix.toString() + className) .replace("::", "/")); return typeUri; } void addTypeUriPrefixMapping(QString className, Uri prefix) { m_typeUriPrefixMap[className] = prefix; } bool getUriPrefixForClass(QString className, Uri &prefix) const { QHash::const_iterator i = m_typeUriPrefixMap.find(className); if (i != m_typeUriPrefixMap.end()) { prefix = *i; return true; } return false; } void addPropertyMapping(QString className, QString propertyName, Uri uri) { m_propertyMap[className][uri] = propertyName; m_propertyRMap[className][propertyName] = uri; } bool getPropertyUri(QString className, QString propertyName, Uri &uri) const { QHash >::const_iterator j = m_propertyRMap.find(className); if (j != m_propertyRMap.end()) { QHash::const_iterator i = j->find(propertyName); if (i != j->end()) { uri = *i; return true; } } return false; } bool getPropertyName(QString className, Uri uri, QString &propertyName) const { QHash >::const_iterator j = m_propertyMap.find(className); if (j != m_propertyMap.end()) { QHash::const_iterator i = j->find(uri); if (i != j->end()) { propertyName = *i; return true; } } return false; } private: Uri m_typePrefix; Uri m_propertyPrefix; Uri m_relationshipPrefix; QHash m_typeMap; QHash m_typeRMap; QHash m_typeUriPrefixMap; QHash > m_propertyMap; QHash > m_propertyRMap; }; TypeMapping::TypeMapping() : m_d(new D()) { } TypeMapping::TypeMapping(const TypeMapping &tm) : m_d(new D(*tm.m_d)) { } TypeMapping & TypeMapping::operator=(const TypeMapping &tm) { if (this != &tm) { delete m_d; m_d = new D(*tm.m_d); } return *this; } TypeMapping::~TypeMapping() { delete m_d; } void TypeMapping::setObjectTypePrefix(Uri prefix) { m_d->setObjectTypePrefix(prefix); } Uri TypeMapping::getObjectTypePrefix() const { return m_d->getObjectTypePrefix(); } void TypeMapping::setPropertyPrefix(Uri prefix) { m_d->setPropertyPrefix(prefix); } Uri TypeMapping::getPropertyPrefix() const { return m_d->getPropertyPrefix(); } void TypeMapping::setRelationshipPrefix(Uri prefix) { m_d->setRelationshipPrefix(prefix); } Uri TypeMapping::getRelationshipPrefix() const { return m_d->getRelationshipPrefix(); } void TypeMapping::addTypeMapping(QString className, Uri uri) { m_d->addTypeMapping(className, uri); } bool TypeMapping::getTypeUriForClass(QString className, Uri &uri) const { return m_d->getTypeUriForClass(className, uri); } bool TypeMapping::getClassForTypeUri(Uri uri, QString &className) const { return m_d->getClassForTypeUri(uri, className); } Uri TypeMapping::synthesiseTypeUriForClass(QString className) const { return m_d->synthesiseTypeUriForClass(className); } QString TypeMapping::synthesiseClassForTypeUri(Uri typeUri) const { return m_d->synthesiseClassForTypeUri(typeUri); } void TypeMapping::addTypeUriPrefixMapping(QString className, Uri prefix) { m_d->addTypeUriPrefixMapping(className, prefix); } bool TypeMapping::getUriPrefixForClass(QString className, Uri &prefix) const { return m_d->getUriPrefixForClass(className, prefix); } void TypeMapping::addPropertyMapping(QString className, QString propertyName, Uri uri) { m_d->addPropertyMapping(className, propertyName, uri); } bool TypeMapping::getPropertyUri(QString className, QString propertyName, Uri &uri) const { return m_d->getPropertyUri(className, propertyName, uri); } bool TypeMapping::getPropertyName(QString className, Uri propertyUri, QString &propertyName) const { return m_d->getPropertyName(className, propertyUri, propertyName); } } sonic-visualiser-2.3~repack1.orig/dataquay/src/objectmapper/ObjectBuilder.cpp0000644000175000017500000000342412252354725026231 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectBuilder.h" #include #include namespace Dataquay { ObjectBuilder * ObjectBuilder::getInstance() { static ObjectBuilder *instance; static QMutex mutex; QMutexLocker locker(&mutex); if (!instance) instance = new ObjectBuilder(); return instance; } } sonic-visualiser-2.3~repack1.orig/dataquay/src/objectmapper/ObjectStorer.cpp0000644000175000017500000007403112252354725026123 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectStorer.h" #include "objectmapper/ObjectBuilder.h" #include "objectmapper/ContainerBuilder.h" #include "objectmapper/TypeMapping.h" #include "PropertyObject.h" #include "Store.h" #include "../Debug.h" #include #include #include namespace Dataquay { class ObjectStorer::D { typedef QSet ObjectSet; public: struct StoreState { StoreState() { } /// Objects the customer has explicitly asked to store QObjectList requested; /// Objects needing URIs allocated ObjectSet toAllocate; /// Objects whose properties have not yet been stored ObjectSet toStore; /// Objects for which blank nodes shouldn't be used regardless of policy ObjectSet noBlanks; /// All known object-node correspondences, to be updated as we go ObjectNodeMap map; }; D(ObjectStorer *m, Store *s) : m_m(m), m_ob(ObjectBuilder::getInstance()), m_cb(ContainerBuilder::getInstance()), m_s(s), m_psp(StoreAlways), m_bp(PermitBlankObjectNodes), m_fp(FollowNone) { updatePropertyNames(); } Store *getStore() { return m_s; } void setTypeMapping(const TypeMapping &tm) { m_tm = tm; updatePropertyNames(); } const TypeMapping &getTypeMapping() const { return m_tm; } void setPropertyStorePolicy(PropertyStorePolicy psp) { m_psp = psp; } PropertyStorePolicy getPropertyStorePolicy() const { return m_psp; } void setBlankNodePolicy(BlankNodePolicy bp) { m_bp = bp; } BlankNodePolicy getBlankNodePolicy() const { return m_bp; } void setFollowPolicy(FollowPolicy fp) { m_fp = fp; } FollowPolicy getFollowPolicy() const { return m_fp; } void updatePropertyNames() { m_parentProp = Uri(m_tm.getRelationshipPrefix().toString() + "parent"); m_followProp = Uri(m_tm.getRelationshipPrefix().toString() + "follows"); } void removeObject(Node n) { Triples triples = m_s->match(Triple(n, Node(), Node())); foreach (Triple t, triples) { if (t.b.type == Node::URI) { removePropertyNodes(n, Uri(t.b.value)); } } m_s->remove(Triple(Node(), Node(), n)); } Uri store(QObject *o, ObjectNodeMap &map) { StoreState state; state.requested << o; state.map = map; collect(state); store(state); map = state.map; Node node = state.map.value(o); if (node.type != Node::URI) { // This shouldn't happen (see above) DEBUG << "ObjectStorer::store: Stored object node " << node << " is not a URI node" << endl; std::cerr << "WARNING: ObjectStorer::store: No URI for stored object!" << std::endl; return Uri(); } else { return Uri(node.value); } } void store(QObjectList ol, ObjectNodeMap &map) { StoreState state; state.requested = ol; state.map = map; collect(state); store(state); map = state.map; } void addStoreCallback(StoreCallback *cb) { m_storeCallbacks.push_back(cb); } private: ObjectStorer *m_m; ObjectBuilder *m_ob; ContainerBuilder *m_cb; Store *m_s; TypeMapping m_tm; PropertyStorePolicy m_psp; BlankNodePolicy m_bp; FollowPolicy m_fp; QList m_storeCallbacks; Uri m_parentProp; Uri m_followProp; void collect(StoreState &state) { QObjectList candidates = state.requested; state.noBlanks = ObjectSet::fromList(candidates); ObjectSet visited; // Avoid ever pushing null (if returned as absence case) as a // future candidate by marking it as used already visited << 0; // Use counter to iterate, so that when additional elements // pushed onto the end of state.desired will be iterated over for (int i = 0; i < candidates.size(); ++i) { QObject *obj = candidates[i]; visited << obj; if (!state.map.contains(obj) || state.map.value(obj) == Node()) { state.toAllocate.insert(obj); state.toStore.insert(obj); } else if (i < state.requested.size()) { // This is one of the requested objects, which were at // the start of the candidates list. It didn't hit // the previous test so it already has a node, but we // still need to store it as requested state.toStore.insert(obj); } QObjectList relatives; if (m_fp & FollowParent) { relatives << obj->parent(); } if (m_fp & FollowChildren) { relatives << obj->children(); } if (m_fp & FollowSiblings) { if (obj->parent()) { relatives << obj->parent()->children(); } } foreach (QObject *r, relatives) { if (!visited.contains(r)) { DEBUG << "ObjectStorer::collect: relative " << r << " is new, listing it as candidate" << endl; candidates << r; // Although (in PermitBlankObjectNodes mode) we // technically can use blank nodes for objects // that are not referred to as properties but are // accessible through the object tree, the result // can be rather counterintuitive -- it means we // end up with spare-looking blank nodes at top // level. Best avoided. state.noBlanks << r; } else { // We've seen this one before. If we see any // object more than once by different routes, that // implies that we can't use a blank node for it DEBUG << "ObjectStorer::collect: relative " << r << " has been seen more than once," << " ensuring it doesn't get a blank node" << endl; state.noBlanks << r; } } if (m_fp & FollowObjectProperties) { QObjectList properties = propertyObjectsOf(obj); foreach (QObject *p, properties) { if (!visited.contains(p)) { DEBUG << "ObjectStorer::collect: property " << p << " is new, listing it as candidate" << endl; candidates << p; } else { // We've seen this one before (as above) DEBUG << "ObjectStorer::collect: property " << p << " has been seen more than once," << " ensuring it doesn't get a blank node" << endl; state.noBlanks << p; } } } } DEBUG << "ObjectStorer::collect: " << "requested = " << state.requested.size() << ", toAllocate = " << state.toAllocate.size() << ", toStore = " << state.toStore.size() << endl; DEBUG << "Requested:"; foreach (QObject *obj, state.requested) DEBUG << obj; DEBUG << "toAllocate:"; foreach (QObject *obj, state.toAllocate) DEBUG << obj; DEBUG << "toStore:"; foreach (QObject *obj, state.toStore) DEBUG << obj; DEBUG << endl; } QObjectList objectsOf(QVariant v) { QObjectList objects; const char *typeName = QMetaType::typeName(v.userType()); if (!typeName) return objects; if (m_cb->canExtractContainer(typeName)) { QVariantList list = m_cb->extractContainer(typeName, v); foreach (QVariant member, list) { objects << objectsOf(member); } } else if (m_ob->canExtract(typeName)) { QObject *obj = m_ob->extract(typeName, v); if (obj) objects << obj; } return objects; } QObjectList propertyObjectsOf(QObject *o) { QObjectList pobjects; QString cname = o->metaObject()->className(); for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable()) { continue; } QString pname = property.name(); QByteArray pnba = pname.toLocal8Bit(); if (pname == "uri") continue; QVariant v = o->property(pnba.data()); if (v != QVariant()) pobjects << objectsOf(v); } return pobjects; } void store(StoreState &state) { foreach (QObject *obj, state.toAllocate) { DEBUG << "store: calling allocate(" << obj << ")" << endl; allocate(state, obj);//!!! can this fail, as it can in loader? } // store() removes from state.toStore, so we need to make a // note of the original set for calling load callbacks ObjectSet ts = state.toStore; foreach (QObject *obj, ts) { DEBUG << "store: calling store(" << obj << ")" << endl; store(state, obj); } foreach (QObject *obj, ts) { DEBUG << "store: calling callStoreCallbacks(" << obj << ")" << endl; callStoreCallbacks(state, obj); } } bool isStarType(const char *) const; bool variantsEqual(const QVariant &, const QVariant &) const; Uri getUriFrom(QObject *o) const; bool isListNode(Node n) const; void allocate(StoreState &state, QObject *o); void store(StoreState &state, QObject *o); void storeSingle(StoreState &state, QObject *o, Node node); void callStoreCallbacks(StoreState &state, QObject *o); void storeProperties(StoreState &state, QObject *o, Node node); void removeUnusedNode(Node node); void removePropertyNodes(Node node, Uri propertyUri, QSet *retain = 0); void replacePropertyNodes(Node node, Uri propertyUri, Node newValue); void replacePropertyNodes(Node node, Uri propertyUri, Nodes newValues); Nodes variantToPropertyNodeList(StoreState &state, QVariant v); Node objectToPropertyNode(StoreState &state, QObject *o); Node listToPropertyNode(StoreState &state, QVariantList list); }; bool ObjectStorer::D::isStarType(const char *typeName) const { // equivalent of: // QString(typeName).contains("*") || // QString(typeName).endsWith("Star") int i; for (i = 0; typeName[i]; ++i) { if (typeName[i] == '*') return true; } // i is now equal to length of typeName if (i >= 4 && !strcmp(typeName + i - 4, "Star")) return true; return false; } bool ObjectStorer::D::variantsEqual(const QVariant &v1, const QVariant &v2) const { if (v1 == v2) return true; if (v1.userType() != v2.userType()) return false; // "In the case of custom types, their equalness operators are not // called. Instead the values' addresses are compared." This is // acceptable for objects, but not sufficient to establish // equality for our purposes for those things that can in fact be // converted to Node. const char *typeName = QMetaType::typeName(v1.userType()); if (!typeName || isStarType(typeName) || m_cb->canExtractContainer(typeName) || m_ob->canExtract(typeName)) { // Objects, containers, weird unknown types: give up on these. // An occasional false negative is OK for us -- we claim that // the variants are equal if we return true, not that they // differ if we return false -- we are already doing better // than QVariant::operator== anyway return false; } Node n1 = Node::fromVariant(v1); Node n2 = Node::fromVariant(v2); DEBUG << "variantsEqual: comparing " << n1 << " and " << n2 << endl; return (n1 == n2); } Uri ObjectStorer::D::getUriFrom(QObject *o) const { Uri uri; QVariant uriVar = o->property("uri"); if (uriVar != QVariant()) { if (Uri::hasUriType(uriVar)) { uri = uriVar.value(); } else { uri = m_s->expand(uriVar.toString()); } } return uri; } void ObjectStorer::D::storeProperties(StoreState &state, QObject *o, Node node) { QString cname = o->metaObject()->className(); PropertyObject po(m_s, m_tm.getPropertyPrefix().toString(), node); for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable()) { continue; } QString pname = property.name(); QByteArray pnba = pname.toLocal8Bit(); if (pname == "uri") continue; QVariant value = o->property(pnba.data()); bool store = true; if (m_psp == StoreIfChanged) { if (m_ob->knows(cname)) { std::auto_ptr c(m_ob->build(cname, 0)); QVariant deftValue = c->property(pnba.data()); if (variantsEqual(value, deftValue)) { store = false; } else { DEBUG << "Property " << pname << " of object " << node << " is changed from default value " << c->property(pnba.data()) << ", writing" << endl; } } else { DEBUG << "Can't check property " << pname << " of object " << node << " for change from default value: " << "object builder doesn't know type " << cname << " so cannot build default object" << endl; } } if (store) { DEBUG << "For object " << node << " (" << o << ") writing property " << pname << " of type " << property.userType() << endl; } Uri puri; if (!m_tm.getPropertyUri(cname, pname, puri)) { puri = po.getPropertyUri(pname); } if (store) { Nodes pnodes = variantToPropertyNodeList(state, value); replacePropertyNodes(node, puri, pnodes); } else { removePropertyNodes(node, puri); } } } void ObjectStorer::D::removePropertyNodes(Node node, Uri propertyUri, QSet *retain) { Triple t(node, propertyUri, Node()); Triples m(m_s->match(t)); DEBUG << "removePropertyNodes: Node " << node << " and property " << propertyUri << " yields " << m.size() << " matching triples" << endl; foreach (t, m) { if (retain && retain->contains(t.c)) { DEBUG << "...retaining " << t.c << endl; retain->remove(t.c); } else { DEBUG << "...removing " << t.c << endl; m_s->remove(t); if (t.c == node) continue; // If this is a blank node, or if it is a node only used // as a list head, then we can safely remove it. Formerly // we removed only blank nodes here (list nodes are most // usually blank anyway), but that means we don't replace // list properties correctly with NeverUseBlankNodes if (t.c.type == Node::Blank) { removeUnusedNode(t.c); } else if (isListNode(t.c)) { removeUnusedNode(t.c); } } } } bool ObjectStorer::D::isListNode(Node n) const { Triples ts = m_s->match(Triple(n, Node(), Node())); bool isList = false; DEBUG << "isListNode: Testing node " << n << endl; // A list head should have only rdf:first and rdf:rest properties if (ts.size() == 2) { Node first = m_s->expand("rdf:first"); Node rest = m_s->expand("rdf:rest"); if ((ts[0].b == first || ts[1].b == rest) || (ts[0].b == rest || ts[1].b == first)) { isList = true; } } DEBUG << "isListNode: isList = " << isList << endl; return isList; } void ObjectStorer::D::replacePropertyNodes(Node node, Uri propertyUri, Node newValue) { QSet nodeSet; nodeSet << newValue; removePropertyNodes(node, propertyUri, &nodeSet); // nodeSet now contains only those nodes whose triples need to be // added, i.e. those not present as our properties before if (!nodeSet.empty()) { m_s->add(Triple(node, propertyUri, newValue)); } } void ObjectStorer::D::replacePropertyNodes(Node node, Uri propertyUri, Nodes newValues) { QSet nodeSet = QSet::fromList(newValues); removePropertyNodes(node, propertyUri, &nodeSet); // nodeSet now contains only those nodes whose triples need to be // added, i.e. those not present as our properties before foreach (Node pn, nodeSet) { m_s->add(Triple(node, propertyUri, pn)); } } void ObjectStorer::D::removeUnusedNode(Node node) { // The node is known to be a blank node or a list head. If it is // not referred to by anything else, then we want to remove // everything it refers to. If it happens to be a list node, then // we also want to recurse to its tail. if (m_s->matchOnce(Triple(Node(), Node(), node)) != Triple()) { // The node is still a target of some predicate, leave it alone DEBUG << "removeUnusedNode: Blank or list node " << node << " is still a target for another predicate, leaving" << endl; return; } DEBUG << "removeUnusedNode: Blank or list node " << node << " is not target for any other predicate" << endl; // check for a list tail (query first, but then delete our own // triples first so that the existence of this rdf:rest // relationship isn't seen as a reason not to delete the tail) Triples tails(m_s->match(Triple(node, m_s->expand("rdf:rest"), Node()))); DEBUG << "... removing everything with it as subject" << endl; m_s->remove(Triple(node, Node(), Node())); foreach (Triple t, tails) { DEBUG << "... recursing to list tail" << endl; removeUnusedNode(t.c); } } Nodes ObjectStorer::D::variantToPropertyNodeList(StoreState &state, QVariant v) { const char *typeName = QMetaType::typeName(v.userType()); Nodes nodes; if (!typeName) { std::cerr << "ObjectStorer::variantToPropertyNodeList: No type name?! Going ahead anyway" << std::endl; nodes << Node::fromVariant(v); return nodes; } DEBUG << "variantToPropertyNodeList: typeName = " << typeName << endl; if (m_cb->canExtractContainer(typeName)) { QVariantList list = m_cb->extractContainer(typeName, v); ContainerBuilder::ContainerKind k = m_cb->getContainerKind(typeName); if (k == ContainerBuilder::SequenceKind) { Node node = listToPropertyNode(state, list); if (node != Node()) nodes << node; } else if (k == ContainerBuilder::SetKind) { foreach (QVariant member, list) { nodes += variantToPropertyNodeList(state, member); } } } else if (m_ob->canExtract(typeName)) { QObject *obj = m_ob->extract(typeName, v); if (obj) { Node n = objectToPropertyNode(state, obj); if (n != Node()) nodes << n; } else { DEBUG << "variantToPropertyNodeList: Note: obtained NULL object from variant" << endl; } } else if (isStarType(typeName)) { // do not attempt to write binary pointers! DEBUG << "variantToPropertyNodeList: Note: Ignoring pointer type " << typeName << " that is unknown to container and object builders" << endl; return Nodes(); } else { Node node = Node::fromVariant(v); if (node != Node()) nodes << node; } return nodes; } Node ObjectStorer::D::objectToPropertyNode(StoreState &state, QObject *o) { Node pnode; DEBUG << "objectToPropertyNode: " << o << endl; if (state.map.contains(o) && state.map.value(o) != Node()) { pnode = state.map.value(o); } else { // if the object is not intended to be stored, but it has a // URI, we should nonetheless write a reference to that -- but // not put it in the map Uri uri = getUriFrom(o); if (uri != Uri()) { pnode = Node(uri); return pnode; } } return pnode; } Node ObjectStorer::D::listToPropertyNode(StoreState &state, QVariantList list) { DEBUG << "listToPropertyNode: have " << list.size() << " items" << endl; Node node, first, previous; foreach (QVariant v, list) { Nodes pnodes = variantToPropertyNodeList(state, v); if (pnodes.empty()) { std::cerr << "WARNING: ObjectStorer::listToPropertyNode: Obtained nil Node in list" << std::endl; continue; } else if (pnodes.size() > 1) { std::cerr << "WARNING: ObjectStorer::listToPropertyNode: Found set within sequence, can't handle this, using first element only" << std::endl; } Node pnode = pnodes[0]; if (m_bp != NeverUseBlankNodes) { node = m_s->addBlankNode(); } else { //!!! This is a hack -- we can give a list node a stable //!!! (and more attractive) URI by deriving it from the //!!! node it contains -- but we have no way to ensure //!!! that this is unique... hm if (pnode.type == Node::URI) { node = Node(Uri(pnode.value + "_listnode")); } else { node = Node(m_s->getUniqueUri(":listnode_")); } } if (first == Node()) first = node; if (previous != Node()) { m_s->remove(Triple(previous, m_s->expand("rdf:rest"), Node())); m_s->add(Triple(previous, m_s->expand("rdf:rest"), node)); } m_s->remove(Triple(node, m_s->expand("rdf:first"), Node())); m_s->add(Triple(node, m_s->expand("rdf:first"), pnode)); previous = node; } if (node != Node()) { m_s->remove(Triple(node, m_s->expand("rdf:rest"), Node())); m_s->add(Triple(node, m_s->expand("rdf:rest"), m_s->expand("rdf:nil"))); } return first; } void ObjectStorer::D::store(StoreState &state, QObject *o) { DEBUG << "ObjectStorer::store: Examining " << o << endl; if (!state.toStore.contains(o)) return; Node node = state.map.value(o); if (node == Node()) { // We don't allocate any nodes here -- that happened already DEBUG << "ObjectStorer::store: Strange -- object " << o << " has no node, why wasn't it allocated?" << endl; return; } storeSingle(state, o, node); DEBUG << "ObjectStorer::store: Object " << o << " has node " << node << endl; // If we have a parent with a node, write a parent property; if we // are following siblings, we need to write a follow property to // the prior sibling. We don't need to worry about actually // storing the sibling, parents or children -- they will already // be in the toStore list if we're supposed to be storing them QObject *parent = o->parent(); if (parent) { Node pn = state.map.value(parent); if (pn != Node()) { replacePropertyNodes(node, m_parentProp, pn); } } else { DEBUG << "ObjectStorer::store: Node " << node << " has no parent" << endl; m_s->remove(Triple(node, m_parentProp, Node())); } bool followsWritten = false; if (parent && (m_fp & FollowSiblings)) { QObjectList siblings = parent->children(); // find previous sibling (laboriously) QObject *previous = 0; for (int i = 0; i < siblings.size(); ++i) { if (siblings[i] == o) { if (i > 0) { previous = siblings[i-1]; } break; } } if (previous) { DEBUG << "ObjectStorer::store: Node " << node << " follows sibling object " << previous << endl; Node sn = state.map.value(previous); if (sn != Node()) { DEBUG << "ObjectStorer::store: Node " << node << " follows sibling " << sn << endl; replacePropertyNodes(node, m_followProp, sn); followsWritten = true; } else { // previous sibling has no node std::cerr << "Internal error: FollowSiblings set, but previous sibling has not been allocated" << std::endl; } } else { // no previous sibling DEBUG << "ObjectStorer::store: Node " << node << " is first child, follows nothing" << endl; } } if (!followsWritten) { m_s->remove(Triple(node, m_followProp, Node())); } DEBUG << "store: Finished with " << o << endl; } void ObjectStorer::D::allocate(StoreState &state, QObject *o) { DEBUG << "allocate " << o << endl; //!!! too many of these tests, some must be redundant Node node = state.map.value(o); if (node != Node()) { DEBUG << "allocate: object " << o << " already has node " << node << endl; return; } Uri uri = getUriFrom(o); if (uri != Uri()) { node = Node(uri); state.map.insert(o, node); state.toAllocate.remove(o); DEBUG << "allocate: object " << o << " has known uri " << uri << endl; return; } if (m_bp == PermitBlankObjectNodes && !state.noBlanks.contains(o)) { node = m_s->addBlankNode(); DEBUG << "allocate: object " << o << " being given new blank node " << node << endl; } else { QString className = o->metaObject()->className(); DEBUG << "className = " << className << endl; Uri prefix; if (!m_tm.getUriPrefixForClass(className, prefix)) { //!!! put this in TypeMapping? QString tag = className.toLower() + "_"; tag.replace("::", "_"); prefix = m_s->expand(":" + tag); } Uri uri = m_s->getUniqueUri(prefix.toString()); o->setProperty("uri", QVariant::fromValue(uri)); node = uri; DEBUG << "allocate: object " << o << " being given new URI " << uri << endl; } state.map.insert(o, node); state.toAllocate.remove(o); } void ObjectStorer::D::storeSingle(StoreState &state, QObject *o, Node node) { QString className = o->metaObject()->className(); m_s->add(Triple(node, Uri("a"), m_tm.synthesiseTypeUriForClass(className))); storeProperties(state, o, node); state.toStore.remove(o); } void ObjectStorer::D::callStoreCallbacks(StoreState &state, QObject *o) { Node node = state.map.value(o); foreach (StoreCallback *cb, m_storeCallbacks) { cb->stored(m_m, state.map, o, node); } } ObjectStorer::ObjectStorer(Store *s) : m_d(new D(this, s)) { } ObjectStorer::~ObjectStorer() { delete m_d; } Store * ObjectStorer::getStore() { return m_d->getStore(); } void ObjectStorer::setTypeMapping(const TypeMapping &tm) { m_d->setTypeMapping(tm); } const TypeMapping & ObjectStorer::getTypeMapping() const { return m_d->getTypeMapping(); } void ObjectStorer::setPropertyStorePolicy(PropertyStorePolicy policy) { m_d->setPropertyStorePolicy(policy); } ObjectStorer::PropertyStorePolicy ObjectStorer::getPropertyStorePolicy() const { return m_d->getPropertyStorePolicy(); } void ObjectStorer::setBlankNodePolicy(BlankNodePolicy policy) { m_d->setBlankNodePolicy(policy); } BlankNodePolicy ObjectStorer::getBlankNodePolicy() const { return m_d->getBlankNodePolicy(); } void ObjectStorer::setFollowPolicy(FollowPolicy policy) { m_d->setFollowPolicy(policy); } ObjectStorer::FollowPolicy ObjectStorer::getFollowPolicy() const { return m_d->getFollowPolicy(); } void ObjectStorer::removeObject(Node n) { m_d->removeObject(n); } Uri ObjectStorer::store(QObject *o) { ObjectNodeMap map; return m_d->store(o, map); } Uri ObjectStorer::store(QObject *o, ObjectNodeMap &map) { return m_d->store(o, map); } void ObjectStorer::store(QObjectList o) { ObjectNodeMap map; m_d->store(o, map); } void ObjectStorer::store(QObjectList o, ObjectNodeMap &map) { m_d->store(o, map); } void ObjectStorer::addStoreCallback(StoreCallback *cb) { m_d->addStoreCallback(cb); } } sonic-visualiser-2.3~repack1.orig/dataquay/src/objectmapper/ObjectMapperForwarder.cpp0000644000175000017500000000726412252354725027751 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectMapperForwarder.h" #include "objectmapper/ObjectMapper.h" #include #include "../Debug.h" namespace Dataquay { ObjectMapperForwarder::ObjectMapperForwarder(ObjectMapper *m, QObject *o) : QObject(m), m_mapper(m), m_source(o) { for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable() || !property.isWritable()) { continue; } if (!property.hasNotifySignal()) { DEBUG << "ObjectMapperForwarder: No notify signal for property " << property.name() << endl; continue; } // Signals can be connected to slots with fewer arguments, so // long as the arguments they do have match. So we connect // the property notify signal to our universal // property-changed slot, and use the sender() of that to // discover which object's property has changed. // Unfortunately, we don't then know which property it was // that changed, as the identity of the signal that activated // the slot is not available to us. The annoying part of this // is that Qt does actually store the identity of the signal // in the same structure as used for the sender() object data; // it just doesn't (at least as of Qt 4.5) make it available // through the public API. QString sig = QString("%1%2").arg(QSIGNAL_CODE) #if (QT_VERSION >= 0x050000) .arg(property.notifySignal().methodSignature().data()); #else .arg(property.notifySignal().signature()); #endif QByteArray ba = sig.toLocal8Bit(); if (!connect(o, ba.data(), this, SLOT(objectModified()))) { std::cerr << "ObjectMapperForwarder: Failed to connect notify signal" << std::endl; } } connect(o, SIGNAL(destroyed(QObject *)), this, SLOT(objectDestroyed())); } void ObjectMapperForwarder::objectDestroyed() { m_mapper->objectDestroyed(m_source); } void ObjectMapperForwarder::objectModified() { m_mapper->objectModified(m_source); } } sonic-visualiser-2.3~repack1.orig/dataquay/src/objectmapper/ObjectLoader.cpp0000644000175000017500000010055012252354725026047 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectLoader.h" #include "objectmapper/ObjectBuilder.h" #include "objectmapper/ContainerBuilder.h" #include "objectmapper/TypeMapping.h" #include "objectmapper/ObjectMapperExceptions.h" #include #include #include "PropertyObject.h" #include "Store.h" #include "../Debug.h" namespace Dataquay { /* * Generally we pass around a LoadState object recording current * progress and work still to do. See LoadState for the terminology * used. * * We have five phases: * * 1. Collect -- given the requested node set, fill the toAllocate, * toInitialise, and toPopulate sets based on the FollowPolicy. * * 2. Allocate -- construct new nodes for those in toAllocate that are * not yet in the map. Recurse as appropriate to parent, siblings and * children. (toAllocate contains all the nodes we will need to load, * including those we will recurse to when assigning properties for * FollowObjectProperties policy later.) * * 3. Initialise -- set the "literal" properties for each node in * toInitialise * * 4. Immediate callbacks -- call any registered immediate load * callbacks for each node (these are callbacks that may use the * "literal" data but should be called before related nodes are * loaded) * 5. Populate -- set all remaining properties for each node in * toPopulate * * 6. Final callbacks -- call any registered final load callbacks for * each node * * Notes * * We should construct a new object when: * * - a node in requested does not appear in map or is null in map * * - a node called for as parent or object property does not appear in * map and the relevant follows policy is set * * We should reload properties for an object node when: * * - the node is in requested * * - the node has just been loaded * * We should delete an object when: * * - a node in requested is in the map but not in the store * * Cycles are only a problem when loading objects -- not when setting * properties. So we need to ensure that all objects that will need * to be loaded for object properties or parents etc are identified * before we start loading, then we load relationship tree (no * cycles), then we load property objects, then we go through setting * properties on the appropriate objects. */ class ObjectLoader::D { typedef QSet NodeSet; public: struct LoadState { LoadState() : loadFlags(0) { } /// Nodes the customer has explicitly asked to load or reload Nodes requested; /// Nodes whose objects will need to be constructed if possible NodeSet toAllocate; /// Nodes pending the first (literal) property assignment NodeSet toInitialise; /// Nodes pending the full property assignment NodeSet toPopulate; /// All known node-object correspondences, to be updated as we go NodeObjectMap map; enum LoadFlags { /// Do not throw exception if RDF type unknown (for loadAll etc) IgnoreUnknownTypes = 1 << 0, }; unsigned int loadFlags; }; D(ObjectLoader *m, Store *s) : m_m(m), m_ob(ObjectBuilder::getInstance()), m_cb(ContainerBuilder::getInstance()), m_s(s), m_fp(FollowNone), m_ap(IgnoreAbsentProperties) { updatePropertyNames(); } Store *getStore() { return m_s; } void setTypeMapping(const TypeMapping &tm) { m_tm = tm; updatePropertyNames(); } const TypeMapping &getTypeMapping() const { return m_tm; } void setFollowPolicy(FollowPolicy fp) { m_fp = fp; } FollowPolicy getFollowPolicy() const { return m_fp; } void setAbsentPropertyPolicy(AbsentPropertyPolicy ap) { m_ap = ap; } AbsentPropertyPolicy getAbsentPropertyPolicy() const { return m_ap; } void updatePropertyNames() { m_parentProp = Uri(m_tm.getRelationshipPrefix().toString() + "parent"); m_followProp = Uri(m_tm.getRelationshipPrefix().toString() + "follows"); } QObject *load(Node node) { LoadState state; state.requested << node; collect(state); load(state); return state.map.value(node); } void reload(Nodes nodes, NodeObjectMap &map) { DEBUG << "reload: " << nodes << endl; LoadState state; state.requested = nodes; state.map = map; state.loadFlags = LoadState::IgnoreUnknownTypes; collect(state); load(state); map = state.map; } QObjectList loadType(Uri type) { NodeObjectMap map; return loadType(type, map); } QObjectList loadType(Uri type, NodeObjectMap &map) { return loadType(Node(type), map); } QObjectList loadType(Node typeNode, NodeObjectMap &map) { Nodes nodes; Triples candidates = m_s->match(Triple(Node(), Uri("a"), typeNode)); foreach (Triple t, candidates) { if (t.c.type != Node::URI) continue; nodes.push_back(t.a); } LoadState state; state.requested = nodes; state.map = map; collect(state); load(state); QObjectList objects; foreach (Node n, nodes) { QObject *o = map.value(n); if (o) objects.push_back(o); } return objects; } QObjectList loadAll() { NodeObjectMap map; return loadAll(map); } QObjectList loadAll(NodeObjectMap &map) { Nodes nodes; Triples candidates = m_s->match(Triple(Node(), Uri("a"), Node())); foreach (Triple t, candidates) { if (t.c.type != Node::URI) continue; nodes.push_back(t.a); } LoadState state; state.requested = nodes; state.map = map; state.loadFlags = LoadState::IgnoreUnknownTypes; collect(state); load(state); map = state.map; QObjectList objects; foreach (Node n, nodes) { QObject *o = map.value(n); if (o) objects.push_back(o); } return objects; } void addLoadCallback(LoadCallback *cb, LoadCallbackType type) { switch (type) { case ImmediateCallback: m_immediateCallbacks.push_back(cb); break; case FinalCallback: m_finalCallbacks.push_back(cb); break; } } private: ObjectLoader *m_m; ObjectBuilder *m_ob; ContainerBuilder *m_cb; Store *m_s; TypeMapping m_tm; FollowPolicy m_fp; AbsentPropertyPolicy m_ap; QList m_immediateCallbacks; QList m_finalCallbacks; Uri m_parentProp; Uri m_followProp; void collect(LoadState &state) { Nodes candidates = state.requested; NodeSet visited; // Avoid ever pushing the nil Node as a future candidate by // marking it as used already visited << Node(); // Use counter to iterate, so that when additional elements // pushed onto the end of state.desired will be iterated over for (int i = 0; i < candidates.size(); ++i) { Node node = candidates[i]; visited << node; if (!state.map.contains(node) || state.map.value(node) == 0) { if (!nodeHasTypeInStore(node)) { continue; } else { state.toAllocate.insert(node); state.toInitialise.insert(node); state.toPopulate.insert(node); } } else if (i < state.requested.size()) { // This is one of the requested nodes, which were at // the start of the candidates list if (!nodeHasTypeInStore(node)) { DEBUG << "Node " << node << " has no type in store, deleting and resetting" << endl; delete state.map.value(node); state.map.insert(node, 0); continue; } state.toInitialise.insert(node); state.toPopulate.insert(node); } Nodes relatives; if (m_fp & FollowParent) { relatives << parentOf(node); } if (m_fp & FollowChildren) { relatives << childrenOf(node); } if (m_fp & FollowSiblings) { relatives << prevSiblingOf(node) << nextSiblingOf(node); } if (m_fp & FollowObjectProperties) { relatives << potentialPropertyNodesOf(node); } foreach (Node r, relatives) { if (!visited.contains(r)) { candidates << r; } } } DEBUG << "ObjectLoader: collect: " << "requested = " << state.requested.size() << ", toAllocate = " << state.toAllocate.size() << ", toInitialise = " << state.toInitialise.size() << ", toPopulate = " << state.toPopulate.size() << endl; DEBUG << "Requested:"; foreach (Node n, state.requested) DEBUG << n; DEBUG << "toAllocate:"; foreach (Node n, state.toAllocate) DEBUG << n; DEBUG << "toInitialise:"; foreach (Node n, state.toInitialise) DEBUG << n; DEBUG << "toPopulate:"; foreach (Node n, state.toPopulate) DEBUG << n; DEBUG << endl; } bool nodeHasTypeInStore(Node node) { Triple t = m_s->matchOnce(Triple(node, Uri("a"), Node())); return (t.c.type == Node::URI); } Node parentOf(Node node) { Triple t = m_s->matchOnce(Triple(node, m_parentProp, Node())); if (t != Triple()) return t.c; else return Node(); } Nodes childrenOf(Node node) { Nodes nn; Triples tt = m_s->match(Triple(Node(), m_parentProp, node)); foreach (Triple t, tt) nn << t.a; return nn; } Node prevSiblingOf(Node node) { Triple t = m_s->matchOnce(Triple(node, m_followProp, Node())); if (t != Triple()) return t.c; else return Node(); } Node nextSiblingOf(Node node) { Triple t = m_s->matchOnce(Triple(Node(), m_followProp, node)); if (t != Triple()) return t.a; else return Node(); } Nodes orderedSiblingsOf(Node node) { Node current = node; Node prior; while ((prior = prevSiblingOf(current)) != Node()) { current = prior; } Nodes siblings; while (current != Node()) { siblings << current; current = nextSiblingOf(current); } return siblings; } Nodes orderedChildrenOf(Node node) { // We're not certain to find follows properties for all // children; if some or all are missing, we still need to // return the right number of children -- they just won't // actually be ordered Nodes children = childrenOf(node); if (children.empty()) return children; NodeSet remaining = NodeSet::fromList(children); Nodes ordered = orderedSiblingsOf(children[0]); remaining.subtract(NodeSet::fromList(ordered)); foreach (Node n, remaining) ordered.push_back(n); DEBUG << "orderedChildrenOf: Node " << node << " has " << ordered.size() << " children: " << ordered << endl; return ordered; } Nodes potentialPropertyNodesOf(Node node) { //!!! what to do about nodes that end up in candidates and so are loaded, but are never actually needed? Nodes nn; Triples tt = m_s->match(Triple(node, Node(), Node())); foreach (Triple t, tt) { if (nodeHasTypeInStore(t.c)) { nn << t.c; } else { Nodes sequence = sequenceStartingAt(t.c); foreach (Node sn, sequence) { if (nodeHasTypeInStore(sn)) { nn << sn; } } } } return nn; } Nodes sequenceStartingAt(Node node) { Nodes nn; Triple t; Node itr = node; Node nil = m_s->expand("rdf:nil"); while ((t = m_s->matchOnce(Triple(itr, m_s->expand("rdf:first"), Node()))) != Triple()) { nn << t.c; t = m_s->matchOnce(Triple(itr, m_s->expand("rdf:rest"), Node())); if (t == Triple()) break; itr = t.c; if (itr == nil) break; } if (!nn.empty()) { DEBUG << "sequenceStartingAt " << node << " has " << nn.size() << " item(s)" << endl; } return nn; } void load(LoadState &state) { foreach (Node node, state.toAllocate) { DEBUG << "load: calling allocate(" << node << ")" << endl; try { allocate(state, node); } catch (UnknownTypeException &e) { if (state.loadFlags & LoadState::IgnoreUnknownTypes) { DEBUG << "load: IgnoreUnknownTypes is set, removing object of unknown type and continuing" << endl; delete state.map.value(node); state.map.insert(node, 0); state.toInitialise.remove(node); state.toPopulate.remove(node); } else { throw; } } } // allocate() also calls initialise(), because we want the // initialise to happen before children are added to a node -- // this is just belt and braces foreach (Node node, state.toInitialise) { DEBUG << "load: calling initialise(" << node << ")" << endl; initialise(state, node); } // populate() removes from state.toPopulate, so we need to // make a note of the original set for calling load callbacks NodeSet tp = state.toPopulate; foreach (Node node, tp) { DEBUG << "load: calling populate(" << node << ")" << endl; populate(state, node); } foreach (Node node, tp) { DEBUG << "load: calling callLoadCallbacks(" << node << ")" << endl; callLoadCallbacks(state, node, m_finalCallbacks); } } QObject *parentObjectOf(LoadState &state, Node node) { Node parent = parentOf(node); QObject *parentObject = 0; if (parent != Node()) { allocate(state, parent); parentObject = state.map.value(parent); } return parentObject; } void allocate(LoadState &state, Node node) { //!!! too many of these tests, some must be redundant if (!state.toAllocate.contains(node)) return; QObject *parentObject = parentObjectOf(state, node); allocate(state, node, parentObject); } void allocate(LoadState &state, Node node, QObject *parentObject) { //!!! too many of these tests, some must be redundant if (!state.toAllocate.contains(node)) return; if (m_fp & FollowSiblings) { Nodes siblings = orderedSiblingsOf(node); foreach (Node s, siblings) { //!!! Hmm. Do we want to recurse to children of siblings if FollowChildren is set? Trouble is we don't want to recurse to siblings of siblings (that would lead to a cycle) allocateSingle(state, s, parentObject); } } QObject *o = allocateSingle(state, node, parentObject); if (state.toInitialise.contains(node)) { DEBUG << "load: calling initialise(" << node << ") from allocate" << endl; initialise(state, node); } if (m_fp & FollowChildren) { Nodes children = orderedChildrenOf(node); foreach (Node c, children) { allocate(state, c, o); } } } QObject *allocateSingle(LoadState &state, Node node) { QObject *parentObject = parentObjectOf(state, node); return allocateSingle(state, node, parentObject); } QObject *allocateSingle(LoadState &state, Node node, QObject *parentObject) { DEBUG << "allocateSingle: " << node << " (parent = " << parentObject << ")" << endl; //!!! too many of these tests, some must be redundant if (!state.toAllocate.contains(node)) { DEBUG << "already loaded: returning existing value (" << state.map.value(node) << ")" << endl; return state.map.value(node); } QObject *o = allocateObject(node, parentObject); DEBUG << "Setting object " << o << " to map for node " << node << endl; QObject *old = state.map.value(node); if (o != old) { DEBUG << "Deleting old object " << old << endl; delete old; } state.map.insert(node, o); state.toAllocate.remove(node); QObject *x = state.map.value(node); DEBUG << "New value is " << x << endl; return o; } void callLoadCallbacks(LoadState &state, Node node, QList &callbacks) { QObject *o = state.map.value(node); DEBUG << "callLoadCallbacks: " << node << " -> " << o << endl; if (!o) return; foreach (LoadCallback *cb, callbacks) { cb->loaded(m_m, state.map, node, o); } } QString getClassNameForNode(Node node); QObject *allocateObject(Node node, QObject *parent); void initialise(LoadState &, Node node); void populate(LoadState &, Node node); enum PropertyLoadType { LoadAllProperties, LoadLiteralProperties, LoadNonLiteralProperties }; void loadProperties(LoadState &, Node node, PropertyLoadType); QVariant propertyNodeListToVariant(LoadState &, QString typeName, Nodes pnodes); QObject *propertyNodeToObject(LoadState &, Node pnode); QVariant propertyNodeToVariant(LoadState &, QString typeName, Node pnode); QVariantList propertyNodeToList(LoadState &, QString typeName, Node pnode); }; void ObjectLoader::D::initialise(LoadState &state, Node node) { loadProperties(state, node, LoadLiteralProperties); callLoadCallbacks(state, node, m_immediateCallbacks); state.toInitialise.remove(node); } void ObjectLoader::D::populate(LoadState &state, Node node) { loadProperties(state, node, LoadNonLiteralProperties); state.toPopulate.remove(node); } void ObjectLoader::D::loadProperties(LoadState &state, Node node, PropertyLoadType loadType) { QObject *o = state.map.value(node); if (!o) return; QString cname = o->metaObject()->className(); CacheingPropertyObject *po = new CacheingPropertyObject (m_s, m_tm.getPropertyPrefix().toString(), node); QObject *defaultsObject = 0; for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable() || !property.isWritable()) { continue; } QString pname = property.name(); // name to use when setting on QObject QString plookup(pname); // name or URI for PropertyObject Uri puri; if (m_tm.getPropertyUri(cname, pname, puri)) { plookup = puri.toString(); } Nodes pnodes; bool haveProperty = po->hasProperty(plookup); if (haveProperty) { pnodes = po->getPropertyNodeList(plookup); if (pnodes.empty()) { haveProperty = false; } } if (loadType != LoadAllProperties) { bool literal = true; foreach (Node n, pnodes) { if (n.type != Node::Literal) { literal = false; break; } } if ( literal && (loadType == LoadNonLiteralProperties)) continue; if (!literal && (loadType == LoadLiteralProperties)) continue; } DEBUG << "For property " << pname << " of " << node << " have " << pnodes.size() << " node(s)" << endl; if (!haveProperty && m_ap == IgnoreAbsentProperties) continue; QVariant value; QByteArray pnba = pname.toLocal8Bit(); if (!haveProperty) { if (!defaultsObject) { if (m_ob->knows(cname)) { defaultsObject = m_ob->build(cname, 0); } else { DEBUG << "Can't reset absent property " << pname << " of object " << node << ": object builder " << "doesn't know type " << cname << " so cannot " << "build defaults object" << endl; } } if (defaultsObject) { DEBUG << "Resetting property " << pname << " to default" << endl; value = defaultsObject->property(pnba.data()); } } else { QString typeName = property.typeName(); DEBUG << "Setting property " << pname << " of type " << typeName << endl; value = propertyNodeListToVariant(state, typeName, pnodes); } if (!value.isValid()) { DEBUG << "Ignoring invalid variant for value of property " << pname << ", type " << property.typeName() << " of object " << node << endl; continue; } if (!o->setProperty(pnba.data(), value)) { DEBUG << "loadProperties: Property set failed " << "for property " << pname << " of type " << property.typeName() << " (" << property.userType() << ") to value of type " << value.type() << " and value " << value << " from (first) node " << pnodes[0].value << endl; DEBUG << "loadProperties: If the RDF datatype is correct, check " << "[1] that the datatype is known to Dataquay::Node for " << "node-variant conversion" << "(datatype is one of the standard set, " << "or registered with Node::registerDatatype) and " << "[2] that the Q_PROPERTY type declaration " << property.typeName() << " matches the name passed to qRegisterMetaType (including namespace)" << endl; std::cerr << "ObjectLoader::loadProperties: Failed to set property on object, ignoring" << std::endl; } } delete defaultsObject; delete po; } QVariant ObjectLoader::D::propertyNodeListToVariant(LoadState &state, QString typeName, Nodes pnodes) { if (pnodes.empty()) return QVariant(); Node firstNode = pnodes[0]; DEBUG << "propertyNodeListToVariant: typeName = " << typeName << endl; if (typeName == "") { return firstNode.toVariant(); } if (m_cb->canInjectContainer(typeName)) { QString inContainerType = m_cb->getTypeNameForContainer(typeName); ContainerBuilder::ContainerKind k = m_cb->getContainerKind(typeName); if (k == ContainerBuilder::SequenceKind) { QVariantList list = propertyNodeToList(state, inContainerType, firstNode); return m_cb->injectContainer(typeName, list); } else if (k == ContainerBuilder::SetKind) { QVariantList list; foreach (Node pnode, pnodes) { Nodes sublist; sublist << pnode; list << propertyNodeListToVariant(state, inContainerType, sublist); } return m_cb->injectContainer(typeName, list); } else { return QVariant(); } } else if (m_ob->canInject(typeName)) { QObject *obj = propertyNodeToObject(state, firstNode); QVariant v; if (obj) { v = m_ob->inject(typeName, obj); if (v == QVariant()) { DEBUG << "propertyNodeListToVariant: " << "Type of node " << firstNode << " is incompatible with expected " << typeName << endl; std::cerr << "ObjectLoader::propertyNodeListToVariant: " << "Incompatible node type, ignoring" << std::endl; //!!! don't delete the object without removing it from the map! // but which to do -- remove it, or leave it? // delete obj; } } return v; } else if (QString(typeName).contains("*") || QString(typeName).endsWith("Star")) { // do not attempt to read binary pointers! return QVariant(); } else { return propertyNodeToVariant(state, typeName, firstNode); } } QVariant ObjectLoader::D::propertyNodeToVariant(LoadState &state, QString typeName, Node pnode) { // Usually we can take the default conversion from node to // QVariant. But in two cases this will fail in ways we need to // correct: // // - The node is an untyped literal and the property is known to // have a type other than string (default conversion would produce // a string) // // - The node is a URI and the property is known to have a type // other than Uri (several legitimate property types could // reasonably receive data from a URI node) // // One case should not be corrected: // // - The node has a type but it doesn't match that of the property // // We have to fail that one, because we're not in any position to // do general type conversion here. DEBUG << "propertyNodeToVariant: typeName = " << typeName << endl; if (typeName == "") { return pnode.toVariant(); } bool acceptDefault = true; if (pnode.type == Node::URI && typeName != Uri::metaTypeName()) { DEBUG << "ObjectLoader::propertyNodeListToVariant: " << "Non-URI property is target for RDF URI, converting" << endl; acceptDefault = false; } else if (pnode.type == Node::Literal && pnode.datatype == Uri() && // no datatype typeName != QMetaType::typeName(QMetaType::QString)) { DEBUG << "ObjectLoader::propertyNodeListToVariant: " << "No datatype for RDF literal, deducing from typename \"" << typeName << "\"" << endl; acceptDefault = false; } if (acceptDefault) { return pnode.toVariant(); } QByteArray ba = typeName.toLocal8Bit(); int metatype = QMetaType::type(ba.data()); if (metatype != 0) return pnode.toVariant(metatype); else return pnode.toVariant(); } QObject * ObjectLoader::D::propertyNodeToObject(LoadState &state, Node pnode) { QObject *o = 0; if (pnode.type == Node::URI || pnode.type == Node::Blank) { o = allocateSingle(state, pnode); } else { DEBUG << "Not an object node, ignoring" << endl; } return o; } QVariantList ObjectLoader::D::propertyNodeToList(LoadState &state, QString typeName, Node pnode) { Nodes sequence = sequenceStartingAt(pnode); QVariantList list; foreach (Node node, sequence) { Nodes vnodes; vnodes << node; QVariant value = propertyNodeListToVariant(state, typeName, vnodes); if (value.isValid()) { DEBUG << "Found value: " << value << endl; list.push_back(value); } else { DEBUG << "propertyNodeToList: Invalid value in list, skipping" << endl; } } DEBUG << "propertyNodeToList: list has " << list.size() << " item(s)" << endl; return list; } QString ObjectLoader::D::getClassNameForNode(Node node) { Uri typeUri; Triple t = m_s->matchOnce(Triple(node, Uri("a"), Node())); if (t.c.type == Node::URI) typeUri = Uri(t.c.value); QString className; if (typeUri != Uri()) { try { className = m_tm.synthesiseClassForTypeUri(typeUri); } catch (UnknownTypeException) { DEBUG << "getClassNameForNode: Unknown type URI " << typeUri << endl; throw; } } else { DEBUG << "getClassNameForNode: No type URI for " << node << endl; throw UnknownTypeException(""); } if (!m_ob->knows(className)) { DEBUG << "ObjectLoader::getClassNameForNode: Unknown object class " << className << endl; throw UnknownTypeException(className); } return className; } QObject * ObjectLoader::D::allocateObject(Node node, QObject *parent) { // Note that we cannot rely on the object class from a property // declaration to know what type to construct. For example, if we // have been called as part of a process of loading something // declared as container of base-class pointers, but each // individual object is actually of a derived class, then the RDF // should specify the derived class but we will only have been // passed the base class. So we must use the RDF type. QString className = getClassNameForNode(node); DEBUG << "Making object " << node.value << " of type " << className << " with parent " << parent << endl; QObject *o = m_ob->build(className, parent); if (!o) throw ConstructionFailedException(className); if (node.type == Node::URI) { o->setProperty("uri", QVariant::fromValue(m_s->expand(node.value))); } DEBUG << "Made object: " << o << endl; return o; } ObjectLoader::ObjectLoader(Store *s) : m_d(new D(this, s)) { } ObjectLoader::~ObjectLoader() { delete m_d; } Store * ObjectLoader::getStore() { return m_d->getStore(); } void ObjectLoader::setTypeMapping(const TypeMapping &tm) { m_d->setTypeMapping(tm); } const TypeMapping & ObjectLoader::getTypeMapping() const { return m_d->getTypeMapping(); } void ObjectLoader::setFollowPolicy(FollowPolicy policy) { m_d->setFollowPolicy(policy); } ObjectLoader::FollowPolicy ObjectLoader::getFollowPolicy() const { return m_d->getFollowPolicy(); } void ObjectLoader::setAbsentPropertyPolicy(AbsentPropertyPolicy policy) { m_d->setAbsentPropertyPolicy(policy); } ObjectLoader::AbsentPropertyPolicy ObjectLoader::getAbsentPropertyPolicy() const { return m_d->getAbsentPropertyPolicy(); } QObject * ObjectLoader::load(Node node) { return m_d->load(node); } void ObjectLoader::reload(Nodes nodes, NodeObjectMap &map) { m_d->reload(nodes, map); } QObjectList ObjectLoader::loadType(Uri type) { return m_d->loadType(type); } QObjectList ObjectLoader::loadType(Uri type, NodeObjectMap &map) { return m_d->loadType(type, map); } QObjectList ObjectLoader::loadAll() { return m_d->loadAll(); } QObjectList ObjectLoader::loadAll(NodeObjectMap &map) { return m_d->loadAll(map); } void ObjectLoader::addLoadCallback(LoadCallback *cb, LoadCallbackType type) { m_d->addLoadCallback(cb, type); } } sonic-visualiser-2.3~repack1.orig/dataquay/src/objectmapper/ObjectMapper.cpp0000644000175000017500000006122712252354725026074 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "objectmapper/ObjectMapper.h" #include "objectmapper/ObjectMapperExceptions.h" #include "objectmapper/ObjectMapperForwarder.h" #include "objectmapper/ObjectLoader.h" #include "objectmapper/ObjectStorer.h" #include "objectmapper/ContainerBuilder.h" #include "objectmapper/TypeMapping.h" #include "TransactionalStore.h" #include "Connection.h" #include "PropertyObject.h" #include "../Debug.h" #include #include #include #include #include #include namespace Dataquay { class ObjectMapper::D : public QObject { struct Network { // Use Network only with mutex held please ObjectLoader::NodeObjectMap nodeObjectMap; ObjectStorer::ObjectNodeMap objectNodeMap; ObjectLoader::NodeObjectMap listNodeObjectMap; Node getNodeForObject(QObject *o) { ObjectStorer::ObjectNodeMap::const_iterator i = objectNodeMap.find(o); if (i != objectNodeMap.end()) return i.value(); return Node(); } QObject *getObjectByNode(Node n) { ObjectLoader::NodeObjectMap::const_iterator i = nodeObjectMap.find(n); if (i != nodeObjectMap.end()) return i.value(); return 0; } }; struct LoadStoreCallback : public ObjectStorer::StoreCallback, public ObjectLoader::LoadCallback { LoadStoreCallback(ObjectMapper::D *d) : m_d(d) { } void loaded(ObjectLoader *, ObjectLoader::NodeObjectMap &, Node, QObject *o) { DEBUG << "LoadStoreCallback::loaded: Object " << o << endl; m_d->manage(o); } void stored(ObjectStorer *, ObjectStorer::ObjectNodeMap &, QObject *o, Node) { DEBUG << "LoadStoreCallback::stored: Object " << o << endl; m_d->manage(o); } private: ObjectMapper::D *m_d; }; public: D(ObjectMapper *m, TransactionalStore *s) : m_m(m), m_s(s), m_c(s), m_mutex(QMutex::Recursive), m_inCommit(false), m_inReload(false), m_callback(this) { m_loader = new ObjectLoader(&m_c); m_loader->setAbsentPropertyPolicy(ObjectLoader::ResetAbsentProperties); m_loader->setFollowPolicy(ObjectLoader::FollowObjectProperties); m_loader->addLoadCallback(&m_callback, ObjectLoader::FinalCallback); m_storer = new ObjectStorer(&m_c); m_storer->setPropertyStorePolicy(ObjectStorer::StoreIfChanged); m_storer->setBlankNodePolicy(NoBlankObjectNodes); m_storer->setFollowPolicy(ObjectStorer::FollowObjectProperties); m_storer->addStoreCallback(&m_callback); connect(&m_c, SIGNAL(transactionCommitted(const ChangeSet &)), m_m, SLOT(transactionCommitted(const ChangeSet &))); } virtual ~D() { delete m_storer; delete m_loader; } TransactionalStore *getStore() { return m_s; } void setTypeMapping(const TypeMapping &tm) { QMutexLocker locker(&m_mutex); m_tm = tm; m_loader->setTypeMapping(m_tm); m_storer->setTypeMapping(m_tm); } const TypeMapping &getTypeMapping() const { return m_tm; } void setBlankNodePolicy(BlankNodePolicy bp) { m_storer->setBlankNodePolicy(bp); } BlankNodePolicy getBlankNodePolicy() const { return m_storer->getBlankNodePolicy(); } Node getNodeForObject(QObject *o) { QMutexLocker locker(&m_mutex); return m_n.getNodeForObject(o); } QObject *getObjectByNode(Node n) { QMutexLocker locker(&m_mutex); return m_n.getObjectByNode(n); } QObject *load(Node n) { QMutexLocker locker(&m_mutex); return m_loader->load(n); } QObjectList loadType(Uri u) { QMutexLocker locker(&m_mutex); return m_loader->loadType(u); } void add(QObject *o) { QMutexLocker locker(&m_mutex); try { manage(o); } catch (NoUriException) { // doesn't matter; it will be assigned one when mapped, // which will happen on the next commit because we are // adding it to the changed object map } DEBUG << "ObjectMapper::add: Adding " << o << " to changed list" << endl; m_changedObjects.insert(o); } void add(QObjectList ol) { QMutexLocker locker(&m_mutex); foreach (QObject *o, ol) { try { manage(o); } catch (NoUriException) { // doesn't matter (as above) } } DEBUG << "ObjectMapper::add: Adding " << ol.size() << " object(s) to changed list" << endl; foreach (QObject *o, ol) { m_changedObjects.insert(o); } } void manage(QObject *o) { QMutexLocker locker(&m_mutex); // Ensure that the Uri datatype has been registered. This is a // bit of a hack (void)Uri::metaTypeId(); Uri uri = o->property("uri").value(); if (uri == Uri()) { //!!! document this -- generally, document conditions for manage() to be used rather than add() throw NoUriException(o->objectName(), o->metaObject()->className()); } // An object is managed if we have it in both maps. If it's // only in one map, then it has probably been stored or loaded // by following a property or other connection, and stored in // the map by the loader/storer call, but not yet properly // managed (particularly, not yet connected to a forwarder). // This function is called from the load/store callback // specifically to deal with managing such // known-but-not-properly-managed objects before the two maps // are synchronised. If it wasn't called, such objects would // remain forever in a sort of half-managed limbo. if (m_n.objectNodeMap.contains(o) && m_n.nodeObjectMap.contains(Node(uri))) { DEBUG << "ObjectMapper::manage: Object " << o << " " << uri << " is already managed" << endl; return; } DEBUG << "ObjectMapper::manage: Managing " << o << " " << uri << endl; // The forwarder avoids us trying to connect potentially many, // many signals to the same mapper object -- which is slow. // Note the forwarder is a child of the ObjectMapper, so we // don't need to explicitly destroy it in dtor ObjectMapperForwarder *f = new ObjectMapperForwarder(m_m, o); m_forwarders.insert(o, f); m_n.objectNodeMap.insert(o, uri); m_n.nodeObjectMap.insert(uri, o); } void addListNodesFor(QObject *o) { DEBUG << "addListNodesFor(" << o << ")" << endl; if (!m_n.objectNodeMap.contains(o)) { DEBUG << "addListNodesFor(" << o << "): Object is unknown to us" << endl; return; } Node n = m_n.objectNodeMap.value(o); DEBUG << "addListNodesFor: Node is " << n << endl; ContainerBuilder *cb = ContainerBuilder::getInstance(); for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable()) { continue; } if (cb->getContainerKind(property.typeName()) == ContainerBuilder::SequenceKind) { DEBUG << "addListNodesFor: Property " << property.name() << " is a sequence kind" << endl; addListNodesForProperty(o, n, property); } } } void removeListNodesFor(QObject *o) { DEBUG << "removeListNodesFor(" << o << ")" << endl; //!!! ouch Nodes toRemove; for (ObjectLoader::NodeObjectMap::iterator i = m_n.listNodeObjectMap.begin(); i != m_n.listNodeObjectMap.end(); ++i) { if (i.value() == o) toRemove.push_back(i.key()); } foreach (Node n, toRemove) { m_n.listNodeObjectMap.remove(n); } } void addListNodesForProperty(QObject *o, Node n, const QMetaProperty &property) { //!!! todo: write a unit test! QString cname = o->metaObject()->className(); QString pname = property.name(); Uri puri; if (!m_tm.getPropertyUri(cname, pname, puri)) { PropertyObject po(m_s, m_tm.getPropertyPrefix().toString(), n); puri = po.getPropertyUri(pname); } //!!! should be matching all, surely? Node itr = m_s->matchOnce(Triple(n, puri, Node())).c; if (itr == Node()) { return; // property has no values } Node nil = m_s->expand("rdf:nil"); while (1) { Node next = m_s->matchOnce (Triple(itr, m_s->expand("rdf:rest"), Node())).c; if (next == Node()) { // This is not a list node at all! DEBUG << "addListNodesForProperty: Strange, node " << itr << " (from property URI " << puri << " of object node " << n << ", object " << o << ") is not a list node" << endl; break; } m_n.listNodeObjectMap[itr] = o; DEBUG << "addListNodesForProperty: Added node " << itr << " for object " << o << endl; if (next == nil) { // we've finished break; } itr = next; } } void manage(QObjectList ol) { foreach (QObject *o, ol) { manage(o); } } void unmanage(QObject *) { } //!!! void unmanage(QObjectList ol) { foreach (QObject *o, ol) { unmanage(o); } } void objectModified(QObject *o) { DEBUG << "ObjectMapper:: objectModified(" << o << ")" << endl; QMutexLocker locker(&m_mutex); if (m_inReload) { // This signal must have been emitted by a modification // caused by our own transactionCommitted method (see // similar comment about m_inCommit in that method). DEBUG << "(by us, ignoring it)" << endl; return; } //!!! what if the thing that changed about the object was its URL???!!! m_changedObjects.insert(o); DEBUG << "ObjectMapper::objectModified done" << endl; } void objectDestroyed(QObject *o) { DEBUG << "ObjectMapper::objectDestroyed(" << o << ")" << endl; QMutexLocker locker(&m_mutex); m_changedObjects.remove(o); if (m_forwarders.contains(o)) { delete m_forwarders.value(o); m_forwarders.remove(o); } Node node = m_n.objectNodeMap.value(o); if (node == Node()) { DEBUG << "(have no node for this)" << endl; return; } m_n.objectNodeMap.remove(o); removeListNodesFor(o); if (m_inReload) { // This signal must have been emitted by a modification // caused by our own transactionCommitted method (see // similar comment about m_inCommit in that method). // However, we can't indiscriminately ignore it -- // consider for example if user removed the triples for an // object from the store, causing us to delete the object // in our reload, but that object was the parent of // another managed object -- then we will end up here // because Qt deleted the child when the parent was // deleted, and we should take note of that. We only want // to ignore events for objects we know we are // synchronising already. if (m_reloading.contains(node)) { DEBUG << "(by us, ignoring it)" << endl; return; } // ^^^ write a unit test for this! } m_deletedObjectNodes.insert(node); DEBUG << "ObjectMapper::objectDestroyed done" << endl; } void transactionCommitted(const ChangeSet &cs) { DEBUG << "ObjectMapper::transactionCommitted" << endl; QMutexLocker locker(&m_mutex); if (m_inCommit) { // This signal must have been emitted by a commit invoked // from our own commit method. We only set m_inCommit // true for a period in which our own mutex is held, so if // it is set here, we must be in a recursive call from // that mutex section (noting that m_mutex is a recursive // mutex, otherwise we would have deadlocked). And we // don't want to update on the basis of our own commits, // only on the basis of commits happening elsewhere. DEBUG << "(by us, ignoring it)" << endl; return; } //!!! but now what? m_inReload = true; DEBUG << "ObjectMapper::transactionCommitted: Synchronising from " << cs.size() << " change(s) in transaction" << endl; #ifndef NDEBUG DEBUG << "ObjectMapper: before sync, node-object map contains:" << endl; for (ObjectLoader::NodeObjectMap::iterator i = m_n.nodeObjectMap.begin(); i != m_n.nodeObjectMap.end(); ++i) { QString n; QObject *o = i.value(); if (o) n = o->objectName(); DEBUG << i.key() << " -> " << i.value() << " [" << n << "]" << endl; } DEBUG << "ObjectMapper: before sync, object-node map contains:" << endl; for (ObjectStorer::ObjectNodeMap::iterator i = m_n.objectNodeMap.begin(); i != m_n.objectNodeMap.end(); ++i) { QString n; QObject *o = i.key(); if (o) n = o->objectName(); DEBUG << i.key() << " [" << n << "] -> " << i.value() << endl; } DEBUG << "ObjectMapper: before sync, list-node-object map contains:" << endl; for (ObjectLoader::NodeObjectMap::iterator i = m_n.listNodeObjectMap.begin(); i != m_n.listNodeObjectMap.end(); ++i) { QString n; QObject *o = i.value(); if (o) n = o->objectName(); DEBUG << i.key() << " -> " << i.value() << " [" << n << "]" << endl; } #endif //!!! if an object has been effectively deleted from the //!!! store, we can't know that without querying the store to //!!! discover whether any triples remain -- so we should let //!!! something like ObjectLoader::reload() handle deleting //!!! objects that have been removed from store foreach (const Change &c, cs) { Node subject = c.second.a; // If the subject of a change is a node for an object, // reload that object if (m_n.nodeObjectMap.contains(subject)) { m_reloading.insert(subject); continue; } // Also if the subject of a change is a list node for a // property of an object, reload that object. if (m_n.listNodeObjectMap.contains(subject)) { QObject *o = m_n.listNodeObjectMap.value(subject); DEBUG << "transactionCommitted: Node " << subject << " is a list node for object " << o << endl; if (m_n.objectNodeMap.contains(o)) { m_reloading.insert(m_n.objectNodeMap.value(o)); } } } Nodes nodes; foreach (const Node &n, m_reloading) { nodes.push_back(n); } DEBUG << "transactionCommitted: Have " << nodes.size() << " node(s) to reload" << endl; m_loader->reload(nodes, m_n.nodeObjectMap); m_reloading.clear(); // The load call will have updated m_n.nodeObjectMap; sync the // unchanged (since the last commit call) m_n.objectNodeMap // from it syncMap(m_n.objectNodeMap, m_n.nodeObjectMap); DEBUG << "ObjectMapper: after sync, object-node map contains:" << endl; for (ObjectStorer::ObjectNodeMap::iterator i = m_n.objectNodeMap.begin(); i != m_n.objectNodeMap.end(); ++i) { QString n; QObject *o = i.key(); if (o) n = o->objectName(); DEBUG << i.key() << " [" << n << "] -> " << i.value() << endl; } m_inReload = false; DEBUG << "ObjectMapper::transactionCommitted done" << endl; } void doCommit(ChangeSet *cs) { QMutexLocker locker(&m_mutex); DEBUG << "ObjectMapper::commit: Synchronising " << m_changedObjects.size() << " changed and " << m_deletedObjectNodes.size() << " deleted object(s)" << endl; //!!! if an object has been added as a new sibling of existing //!!! objects, then we presumably may have to rewrite our //!!! follows relationships? // What other objects can be affected by the addition or // modification of an object? // - Adding a new child -> affects nothing directly, as child // goes at end foreach (Node n, m_deletedObjectNodes) { m_storer->removeObject(n); } QObjectList ol; foreach (QObject *o, m_changedObjects) ol.push_back(o); m_storer->store(ol, m_n.objectNodeMap); m_inCommit = true; if (cs) { *cs = m_c.commitAndObtain(); } else { m_c.commit(); } m_inCommit = false; // The store call will have updated m_n.objectNodeMap; sync // the unchanged (since the last "external" transaction) // m_n.nodeObjectMap from it syncMap(m_n.nodeObjectMap, m_n.objectNodeMap); // If an object has list properties, then we (sadly) need to // associate all of the list nodes with the object as well in // order to ensure that it gets reloaded if the list tail // changes (i.e. if something in the list changes but its head // node does not). Note that we have to do this regardless of // whether the object is already managed -- we may have been // called from a reload callback. Quite a subtle problem that // has rather sad efficiency implications. foreach (QObject *o, m_changedObjects) { addListNodesFor(o); } m_deletedObjectNodes.clear(); m_changedObjects.clear(); DEBUG << "ObjectMapper::commit done" << endl; } void commit() { doCommit(0); } ChangeSet commitAndObtain() { ChangeSet cs; doCommit(&cs); return cs; } private: ObjectMapper *m_m; TransactionalStore *m_s; Connection m_c; TypeMapping m_tm; Network m_n; QMutex m_mutex; QHash m_forwarders; QSet m_changedObjects; QSet m_deletedObjectNodes; bool m_inCommit; bool m_inReload; QSet m_reloading; ObjectLoader *m_loader; ObjectStorer *m_storer; LoadStoreCallback m_callback; class InternalMappingInconsistency : virtual public std::exception { public: InternalMappingInconsistency(QString a, QString b) throw() : m_a(a), m_b(b) { } virtual ~InternalMappingInconsistency() throw() { } virtual const char *what() const throw() { return QString("Internal inconsistency: internal map from %1 to %2 " "contains different %2 from that found in map from " "%2 to %1").arg(m_a).arg(m_b).toLocal8Bit().data(); } protected: QString m_a; QString m_b; }; void syncMap(ObjectLoader::NodeObjectMap &target, ObjectStorer::ObjectNodeMap &source) { ObjectLoader::NodeObjectMap newMap; int inCommon = 0; for (ObjectStorer::ObjectNodeMap::iterator i = source.begin(); i != source.end(); ++i) { Node n = i.value(); if (target.contains(n)) { QObject *o = target.value(n); if (o && o != i.key()) { throw InternalMappingInconsistency("Node", "QObject"); } ++inCommon; } newMap.insert(n, i.key()); } DEBUG << "syncMap: Note: resized NodeObjectMap from " << target.size() << " to " << newMap.size() << " element(s); " << inCommon << " unchanged or trivial" << endl; target = newMap; } void syncMap(ObjectStorer::ObjectNodeMap &target, ObjectLoader::NodeObjectMap &source) { ObjectStorer::ObjectNodeMap newMap; int inCommon = 0; for (ObjectLoader::NodeObjectMap::iterator i = source.begin(); i != source.end(); ++i) { QObject *o = i.value(); if (!o) continue; if (target.contains(o)) { Node n(target.value(o)); if (n != Node() && n != i.key()) { throw InternalMappingInconsistency("QObject", "Node"); } ++inCommon; } newMap.insert(o, i.key()); } DEBUG << "syncMap: Note: resized ObjectNodeMap from " << target.size() << " to " << newMap.size() << " element(s); " << inCommon << " unchanged or trivial" << endl; target = newMap; } }; ObjectMapper::ObjectMapper(TransactionalStore *s) : m_d(new D(this, s)) { } ObjectMapper::~ObjectMapper() { delete m_d; } TransactionalStore * ObjectMapper::getStore() { return m_d->getStore(); } void ObjectMapper::setTypeMapping(const TypeMapping &tm) { m_d->setTypeMapping(tm); } const TypeMapping & ObjectMapper::getTypeMapping() const { return m_d->getTypeMapping(); } void ObjectMapper::setBlankNodePolicy(BlankNodePolicy policy) { m_d->setBlankNodePolicy(policy); } BlankNodePolicy ObjectMapper::getBlankNodePolicy() const { return m_d->getBlankNodePolicy(); } Node ObjectMapper::getNodeForObject(QObject *o) const { return m_d->getNodeForObject(o); } QObject * ObjectMapper::getObjectByNode(Node n) const { return m_d->getObjectByNode(n); } QObject * ObjectMapper::load(Node node) { return m_d->load(node); } QObjectList ObjectMapper::loadType(Uri type) { return m_d->loadType(type); } void ObjectMapper::add(QObject *o) { m_d->add(o); } void ObjectMapper::add(QObjectList ol) { m_d->add(ol); } void ObjectMapper::manage(QObject *o) { m_d->manage(o); } void ObjectMapper::manage(QObjectList ol) { m_d->manage(ol); } void ObjectMapper::unmanage(QObject *o) { m_d->unmanage(o); } void ObjectMapper::unmanage(QObjectList ol) { m_d->unmanage(ol); } void ObjectMapper::commit() { m_d->commit(); } ChangeSet ObjectMapper::commitAndObtain() { return m_d->commitAndObtain(); } void ObjectMapper::objectModified(QObject *o) { m_d->objectModified(o); } void ObjectMapper::objectDestroyed(QObject *o) { m_d->objectDestroyed(o); } void ObjectMapper::transactionCommitted(const ChangeSet &cs) { m_d->transactionCommitted(cs); } } sonic-visualiser-2.3~repack1.orig/dataquay/src/Connection.cpp0000644000175000017500000001504412252354725023141 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Connection.h" #include "TransactionalStore.h" #include "Transaction.h" namespace Dataquay { class Connection::D { public: D(TransactionalStore *ts); ~D(); bool add(Triple t); bool remove(Triple t); void change(ChangeSet changes); void revert(ChangeSet changes); bool contains(Triple t) const; Triples match(Triple t) const; ResultSet query(QString sparql) const; Node complete(Triple t) const; Triple matchOnce(Triple t) const; Node queryOnce(QString sparql, QString bindingName) const; Uri getUniqueUri(QString prefix) const; Node addBlankNode(); Uri expand(QString uri) const; void save(QString filename) const; void import(QUrl url, ImportDuplicatesMode idm, QString format); Features getSupportedFeatures() const; void commit(); ChangeSet commitAndObtain(); void rollback(); private: TransactionalStore *m_ts; Transaction *m_tx; Store *getStore() const; void start(); }; Connection::D::D(TransactionalStore *ts) : m_ts(ts), m_tx(NoTransaction) { } Connection::D::~D() { commit(); } bool Connection::D::add(Triple t) { start(); return m_tx->add(t); } bool Connection::D::remove(Triple t) { start(); return m_tx->remove(t); } void Connection::D::change(ChangeSet cs) { start(); return m_tx->change(cs); } void Connection::D::revert(ChangeSet cs) { start(); return m_tx->revert(cs); } void Connection::D::start() { if (m_tx != NoTransaction) return; m_tx = m_ts->startTransaction(); } void Connection::D::commit() { if (m_tx) { m_tx->commit(); delete m_tx; m_tx = NoTransaction; } } ChangeSet Connection::D::commitAndObtain() { ChangeSet cs; if (m_tx) { m_tx->commit(); cs = m_tx->getCommittedChanges(); delete m_tx; m_tx = NoTransaction; } return cs; } void Connection::D::rollback() { if (m_tx) { m_tx->rollback(); delete m_tx; m_tx = NoTransaction; } } Store * Connection::D::getStore() const { if (m_tx) return m_tx; else return m_ts; } bool Connection::D::contains(Triple t) const { return getStore()->contains(t); } Triples Connection::D::match(Triple t) const { return getStore()->match(t); } ResultSet Connection::D::query(QString sparql) const { return getStore()->query(sparql); } Node Connection::D::complete(Triple t) const { return getStore()->complete(t); } Triple Connection::D::matchOnce(Triple t) const { return getStore()->matchOnce(t); } Node Connection::D::queryOnce(QString sparql, QString bindingName) const { return getStore()->queryOnce(sparql, bindingName); } Uri Connection::D::getUniqueUri(QString prefix) const { return getStore()->getUniqueUri(prefix); } Node Connection::D::addBlankNode() { start(); return m_tx->addBlankNode(); } Uri Connection::D::expand(QString uri) const { return getStore()->expand(uri); } void Connection::D::save(QString filename) const { getStore()->save(filename); } void Connection::D::import(QUrl url, ImportDuplicatesMode idm, QString format) { start(); m_tx->import(url, idm, format); } Connection::Features Connection::D::getSupportedFeatures() const { return getStore()->getSupportedFeatures(); } Connection::Connection(TransactionalStore *ts) : m_d(new D(ts)) { connect(ts, SIGNAL(transactionCommitted(const ChangeSet &)), this, SIGNAL(transactionCommitted(const ChangeSet &))); connect(ts, SIGNAL(transactionCommitted()), this, SIGNAL(transactionCommitted())); } Connection::~Connection() { delete m_d; } bool Connection::add(Triple t) { return m_d->add(t); } bool Connection::remove(Triple t) { return m_d->remove(t); } void Connection::change(ChangeSet changes) { m_d->change(changes); } void Connection::revert(ChangeSet changes) { m_d->revert(changes); } bool Connection::contains(Triple t) const { return m_d->contains(t); } Triples Connection::match(Triple t) const { return m_d->match(t); } ResultSet Connection::query(QString sparql) const { return m_d->query(sparql); } Node Connection::complete(Triple t) const { return m_d->complete(t); } Triple Connection::matchOnce(Triple t) const { return m_d->matchOnce(t); } Node Connection::queryOnce(QString sparql, QString bindingName) const { return m_d->queryOnce(sparql, bindingName); } Uri Connection::getUniqueUri(QString prefix) const { return m_d->getUniqueUri(prefix); } Node Connection::addBlankNode() { return m_d->addBlankNode(); } Uri Connection::expand(QString uri) const { return m_d->expand(uri); } void Connection::save(QString filename) const { return m_d->save(filename); } void Connection::import(QUrl url, ImportDuplicatesMode idm, QString format) { return m_d->import(url, idm, format); } Connection::Features Connection::getSupportedFeatures() const { return m_d->getSupportedFeatures(); } void Connection::commit() { m_d->commit(); } ChangeSet Connection::commitAndObtain() { return m_d->commitAndObtain(); } void Connection::rollback() { m_d->rollback(); } } sonic-visualiser-2.3~repack1.orig/dataquay/src/acsymbols.c0000644000175000017500000000022112252354725022465 0ustar miramira/* These stubs are provided so that autoconf can check library * versions using C symbols only */ extern void dataquay_v_0_9_present(void) { } sonic-visualiser-2.3~repack1.orig/dataquay/src/PropertyObject.cpp0000644000175000017500000003275112252354725024021 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Uri.h" #include "PropertyObject.h" #include "Transaction.h" #include "Node.h" namespace Dataquay { QString PropertyObject::m_defaultPrefix = "property:"; PropertyObject::PropertyObject(Store *s, Uri uri) : m_store(s), m_pfx(m_defaultPrefix), m_node(uri) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, QString uri) : m_store(s), m_pfx(m_defaultPrefix), m_node(s->expand(uri)) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, Node node) : m_store(s), m_pfx(m_defaultPrefix), m_node(node) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, QString pfx, Uri uri) : m_store(s), m_pfx(pfx), m_node(uri) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, QString pfx, QString uri) : m_store(s), m_pfx(pfx), m_node(s->expand(uri)) { m_upfx = m_store->expand(m_pfx); } PropertyObject::PropertyObject(Store *s, QString pfx, Node node) : m_store(s), m_pfx(pfx), m_node(node) { m_upfx = m_store->expand(m_pfx); } PropertyObject::~PropertyObject() { } Node PropertyObject::getNode() const { return m_node; } Uri PropertyObject::getObjectType() const { Triple t = m_store->matchOnce(Triple(m_node, Uri("a"), Node())); if (t != Triple()) { return Uri(t.c.value); } else { return Uri(); } } Uri PropertyObject::getObjectType(Transaction *tx) const { Store *s = getStore(tx); Triple t = s->matchOnce(Triple(m_node, Uri("a"), Node())); if (t != Triple()) { return Uri(t.c.value); } else { return Uri(); } } bool PropertyObject::hasProperty(QString name) const { Uri property = getPropertyUri(name); Triple r = m_store->matchOnce(Triple(m_node, property, Node())); return (r != Triple()); } bool PropertyObject::hasProperty(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple r = s->matchOnce(Triple(m_node, property, Node())); return (r != Triple()); } QVariant PropertyObject::getProperty(QString name) const { Uri property = getPropertyUri(name); Triple r = m_store->matchOnce(Triple(m_node, property, Node())); if (r == Triple()) return QVariant(); return r.c.toVariant(); } QVariant PropertyObject::getProperty(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple r = s->matchOnce(Triple(m_node, property, Node())); if (r == Triple()) return QVariant(); return r.c.toVariant(); } QVariantList PropertyObject::getPropertyList(QString name) const { Uri property = getPropertyUri(name); Triples r = m_store->match(Triple(m_node, property, Node())); QVariantList vl; for (int i = 0; i < r.size(); ++i) { vl.push_back(r[i].c.toVariant()); } return vl; } QVariantList PropertyObject::getPropertyList(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triples r = s->match(Triple(m_node, property, Node())); QVariantList vl; for (int i = 0; i < r.size(); ++i) { vl.push_back(r[i].c.toVariant()); } return vl; } Node PropertyObject::getPropertyNode(QString name) const { Uri property = getPropertyUri(name); Triple r = m_store->matchOnce(Triple(m_node, property, Node())); return r.c; } Node PropertyObject::getPropertyNode(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple r = s->matchOnce(Triple(m_node, property, Node())); return r.c; } Nodes PropertyObject::getPropertyNodeList(QString name) const { Uri property = getPropertyUri(name); Triples r = m_store->match(Triple(m_node, property, Node())); Nodes n; for (int i = 0; i < r.size(); ++i) n.push_back(r[i].c); return n; } Nodes PropertyObject::getPropertyNodeList(Transaction *tx, QString name) const { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triples r = s->match(Triple(m_node, property, Node())); Nodes n; for (int i = 0; i < r.size(); ++i) n.push_back(r[i].c); return n; } QStringList PropertyObject::getPropertyNames() const { QStringList properties; Triples ts = m_store->match(Triple(m_node, Node(), Node())); for (int i = 0; i < ts.size(); ++i) { QString propertyUri = ts[i].b.value; if (propertyUri.startsWith(m_pfx)) { properties.push_back(propertyUri.remove(0, m_pfx.length())); } } return properties; } QStringList PropertyObject::getPropertyNames(Transaction *tx) const { Store *s = getStore(tx); QStringList properties; Triples ts = s->match(Triple(m_node, Node(), Node())); for (int i = 0; i < ts.size(); ++i) { QString propertyUri = ts[i].b.value; if (propertyUri.startsWith(m_pfx)) { properties.push_back(propertyUri.remove(0, m_pfx.length())); } } return properties; } void PropertyObject::setProperty(QString name, QVariant value) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples t.c = Node::fromVariant(value); m_store->add(t); } void PropertyObject::setProperty(QString name, Uri uri) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples t.c = Node(uri); m_store->add(t); } void PropertyObject::setProperty(QString name, Node node) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples t.c = node; m_store->add(t); } void PropertyObject::setProperty(Transaction *tx, QString name, QVariant value) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples t.c = Node::fromVariant(value); s->add(t); } void PropertyObject::setProperty(Transaction *tx, QString name, Uri uri) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples t.c = Node(uri); s->add(t); } void PropertyObject::setProperty(Transaction *tx, QString name, Node node) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples t.c = node; s->add(t); } void PropertyObject::setPropertyList(QString name, QVariantList values) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples for (int i = 0; i < values.size(); ++i) { t.c = Node::fromVariant(values[i]); m_store->add(t); } } void PropertyObject::setPropertyList(Transaction *tx, QString name, QVariantList values) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples for (int i = 0; i < values.size(); ++i) { t.c = Node::fromVariant(values[i]); s->add(t); } } void PropertyObject::setPropertyList(QString name, Nodes nodes) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples for (int i = 0; i < nodes.size(); ++i) { t.c = nodes[i]; m_store->add(t); } } void PropertyObject::setPropertyList(Transaction *tx, QString name, Nodes nodes) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples for (int i = 0; i < nodes.size(); ++i) { t.c = nodes[i]; s->add(t); } } void PropertyObject::removeProperty(QString name) { Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); m_store->remove(t); // remove all matching triples } void PropertyObject::removeProperty(Transaction *tx, QString name) { Store *s = getStore(tx); Uri property = getPropertyUri(name); Triple t(m_node, property, Node()); s->remove(t); // remove all matching triples } Store * PropertyObject::getStore(Transaction *tx) const { if (tx == NoTransaction) return m_store; else return tx; } Uri PropertyObject::getPropertyUri(QString name) const { if (name == "a") return m_store->expand(name); if (name.contains(':')) return m_store->expand(name); return Uri(m_upfx.toString() + name); // m_upfx is already expanded } void PropertyObject::setDefaultPropertyPrefix(QString prefix) { m_defaultPrefix = prefix; } CacheingPropertyObject::CacheingPropertyObject(Store *s, Uri uri) : m_po(s, uri), m_cached(false) { } CacheingPropertyObject::CacheingPropertyObject(Store *s, QString uri) : m_po(s, uri), m_cached(false) { } CacheingPropertyObject::CacheingPropertyObject(Store *s, QString pfx, Uri uri) : m_po(s, pfx, uri), m_cached(false) { } CacheingPropertyObject::CacheingPropertyObject(Store *s, QString pfx, QString uri) : m_po(s, pfx, uri), m_cached(false) { } CacheingPropertyObject::CacheingPropertyObject(Store *s, QString pfx, Node node) : m_po(s, pfx, node), m_cached(false) { } Uri CacheingPropertyObject::getObjectType() const { encache(); Uri key = Uri::rdfTypeUri(); if (!m_cache.contains(key) || m_cache[key][0].type != Node::URI) { return Uri(); } return Uri(m_cache[key][0].value); } bool CacheingPropertyObject::hasProperty(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); bool has = m_cache.contains(key); return has; } QVariant CacheingPropertyObject::getProperty(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); if (!m_cache.contains(key)) return QVariant(); return m_cache[key][0].toVariant(); } QVariantList CacheingPropertyObject::getPropertyList(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); if (!m_cache.contains(key)) return QVariantList(); QVariantList vl; foreach (const Node &n, m_cache[key]) { vl.push_back(n.toVariant()); } return vl; } Node CacheingPropertyObject::getPropertyNode(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); if (!m_cache.contains(key)) return Node(); return m_cache[key][0]; } Nodes CacheingPropertyObject::getPropertyNodeList(QString name) const { encache(); Uri key = m_po.getPropertyUri(name); Nodes result; if (!m_cache.contains(key)) return result; result = m_cache[key]; return result; } QStringList CacheingPropertyObject::getPropertyNames() const { return m_po.getPropertyNames(); } void CacheingPropertyObject::setProperty(QString name, QVariant value) { m_po.setProperty(name, value); m_cached = false; } void CacheingPropertyObject::setProperty(QString name, Uri value) { m_po.setProperty(name, value); m_cached = false; } void CacheingPropertyObject::setProperty(QString name, Node node) { m_po.setProperty(name, node); m_cached = false; } void CacheingPropertyObject::setPropertyList(QString name, QVariantList values) { m_po.setPropertyList(name, values); m_cached = false; } void CacheingPropertyObject::setPropertyList(QString name, Nodes nodes) { m_po.setPropertyList(name, nodes); m_cached = false; } void CacheingPropertyObject::removeProperty(QString name) { m_po.removeProperty(name); m_cached = false; } Uri CacheingPropertyObject::getPropertyUri(QString name) const { return m_po.getPropertyUri(name); } void CacheingPropertyObject::encache() const { if (m_cached) return; m_cache.clear(); Triples ts = m_po.getStore(NoTransaction) ->match(Triple(m_po.getNode(), Node(), Node())); for (int i = 0; i < ts.size(); ++i) { if (ts[i].b.type != Node::URI) continue; // shouldn't happen, but m_cache[Uri(ts[i].b.value)].push_back(ts[i].c); } m_cached = true; } } sonic-visualiser-2.3~repack1.orig/dataquay/src/RDFException.cpp0000644000175000017500000000602012252354725023326 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "RDFException.h" #include "Uri.h" #include "Node.h" #include "Triple.h" #include "Debug.h" #include #include #include namespace Dataquay { RDFException::RDFException(QString message) throw() : m_message(0) { setMessage(message); } RDFException::RDFException(QString message, QString data) throw() : m_message(0) { setMessage(QString("%1 [with string \"%2\"]").arg(message).arg(data)); } RDFException::RDFException(QString message, const Uri &uri) throw() : m_message(0) { setMessage(QString("%1 [with URI <%2>]").arg(message).arg(uri.toString())); } RDFException::RDFException(QString message, const Node &node) throw() : m_message(0) { QString s; QTextStream ts(&s); ts << node; setMessage(QString("%1 [with node <%2>]").arg(message).arg(s)); } RDFException::RDFException(QString message, const Triple &triple) throw() : m_message(0) { QString s; QTextStream ts(&s); ts << triple; setMessage(QString("%1 [with triple <%2>]").arg(message).arg(s)); } RDFException::RDFException(const RDFException &e) throw() { m_message = strdup(e.m_message); } RDFException & RDFException::operator=(const RDFException &e) throw() { if (&e == this) return *this; free(m_message); m_message = strdup(e.m_message); return *this; } RDFException::~RDFException() throw() { free(m_message); } void RDFException::setMessage(QString m) { if (m_message) free(m_message); m_message = strdup(m.toLocal8Bit().data()); DEBUG << "RDFException: " << m_message << endl; } } sonic-visualiser-2.3~repack1.orig/dataquay/src/Transaction.cpp0000644000175000017500000000305112252354725023322 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #include "Transaction.h" namespace Dataquay { Transaction *const NoTransaction = 0; } sonic-visualiser-2.3~repack1.orig/dataquay/src/backend/0000755000175000017500000000000012264464201021713 5ustar miramirasonic-visualiser-2.3~repack1.orig/dataquay/src/backend/BasicStoreRedland.cpp0000644000175000017500000010027012252354725025755 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifdef USE_REDLAND #include "BasicStore.h" #include "RDFException.h" #include #include #include #include #include #include #include #include #include "../Debug.h" #include #include namespace Dataquay { class BasicStore::D { public: D() : m_storage(0), m_model(0), m_counter(0) { m_prefixes["rdf"] = Uri("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); m_prefixes["xsd"] = Uri("http://www.w3.org/2001/XMLSchema#"); clear(); } ~D() { QMutexLocker locker(&m_librdfLock); if (m_model) librdf_free_model(m_model); if (m_storage) librdf_free_storage(m_storage); } QString getNewString() const { QString s = QString::fromLocal8Bit (QCryptographicHash::hash (QString("%1").arg(random() + time(0)).toLocal8Bit(), QCryptographicHash::Sha1).toHex()) .left(12); // This may be used as the whole of a name in some contexts, // so it must not start with a digit if (s[0].isDigit()) { s = "x" + s.right(s.length()-1); } return s; } void collision() const { // If we get a collision when generating a "random" string, // seed the random number generator (it probably means the // generator hasn't been seeded at all). But only once. static QMutex m; static bool seeded = false; static QMutexLocker l(&m); if (!seeded) return; srandom(time(0)); seeded = true; } void setBaseUri(Uri baseUri) { QMutexLocker plocker(&m_prefixLock); m_baseUri = baseUri; m_prefixes[""] = m_baseUri; } Uri getBaseUri() const { return m_baseUri; } void clear() { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::clear" << endl; if (m_model) librdf_free_model(m_model); if (m_storage) librdf_free_storage(m_storage); m_storage = librdf_new_storage(m_w.getWorld(), "trees", 0, 0); if (!m_storage) { DEBUG << "Failed to create RDF trees storage, falling back to default storage type" << endl; m_storage = librdf_new_storage(m_w.getWorld(), 0, 0, 0); if (!m_storage) throw RDFInternalError("Failed to create RDF data storage"); } m_model = librdf_new_model(m_w.getWorld(), m_storage, 0); if (!m_model) throw RDFInternalError("Failed to create RDF data model"); } void addPrefix(QString prefix, Uri uri) { QMutexLocker plocker(&m_prefixLock); m_prefixes[prefix] = uri; } bool add(Triple t) { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::add: " << t << endl; return doAdd(t); } bool remove(Triple t) { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::remove: " << t << endl; if (t.a.type == Node::Nothing || t.b.type == Node::Nothing || t.c.type == Node::Nothing) { Triples tt = doMatch(t); if (tt.empty()) return false; DEBUG << "BasicStore::remove: Removing " << tt.size() << " triple(s)" << endl; for (int i = 0; i < tt.size(); ++i) { if (!doRemove(tt[i])) { DEBUG << "Failed to remove matched triple in remove() with wildcards; triple was: " << tt[i] << endl; throw RDFInternalError("Failed to remove matched statement in remove() with wildcards"); } } return true; } else { return doRemove(t); } } void change(ChangeSet cs) { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::change: " << cs.size() << " changes" << endl; for (int i = 0; i < cs.size(); ++i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!doAdd(triple)) { throw RDFException("Change add failed: triple is already in store", triple); } break; case RemoveTriple: if (!doRemove(cs[i].second)) { throw RDFException("Change remove failed: triple is not in store", triple); } break; } } } void revert(ChangeSet cs) { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::revert: " << cs.size() << " changes" << endl; for (int i = cs.size()-1; i >= 0; --i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!doRemove(triple)) { throw RDFException("Revert of add failed: triple is not in store", triple); } break; case RemoveTriple: if (!doAdd(triple)) { throw RDFException("Revert of remove failed: triple is already in store", triple); } break; } } } bool contains(Triple t) const { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::contains: " << t << endl; librdf_statement *statement = tripleToStatement(t); if (!checkComplete(statement)) { librdf_free_statement(statement); throw RDFException("Failed to test for triple (statement is incomplete)"); } if (!librdf_model_contains_statement(m_model, statement)) { librdf_free_statement(statement); return false; } else { librdf_free_statement(statement); return true; } } Triples match(Triple t) const { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::match: " << t << endl; Triples result = doMatch(t); #ifndef NDEBUG DEBUG << "BasicStore::match result (size " << result.size() << "):" << endl; for (int i = 0; i < result.size(); ++i) { DEBUG << i << ". " << result[i] << endl; } #endif return result; } Node complete(Triple t) const { int count = 0, match = 0; if (t.a == Node()) { ++count; match = 0; } if (t.b == Node()) { ++count; match = 1; } if (t.c == Node()) { ++count; match = 2; } if (count != 1) { throw RDFException("Cannot complete triple unless it has only a single wildcard node", t); } QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::complete: " << t << endl; Triples result = doMatch(t, true); if (result.empty()) return Node(); else switch (match) { case 0: return result[0].a; case 1: return result[0].b; case 2: return result[0].c; default: return Node(); } } Triple matchOnce(Triple t) const { if (t.c != Node() && t.b != Node() && t.a != Node()) { // triple is complete: short-circuit to a single lookup if (contains(t)) return t; else return Triple(); } QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::matchOnce: " << t << endl; Triples result = doMatch(t, true); #ifndef NDEBUG DEBUG << "BasicStore::matchOnce result:" << endl; for (int i = 0; i < result.size(); ++i) { DEBUG << i << ". " << result[i] << endl; } #endif if (result.empty()) return Triple(); else return result[0]; } ResultSet query(QString sparql) const { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::query: " << sparql << endl; ResultSet rs = runQuery(sparql); return rs; } Node queryOnce(QString sparql, QString bindingName) const { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::queryOnce: " << bindingName << " from " << sparql << endl; ResultSet rs = runQuery(sparql); if (rs.empty()) return Node(); for (ResultSet::const_iterator i = rs.begin(); i != rs.end(); ++i) { Dictionary::const_iterator j = i->find(bindingName); if (j == i->end()) continue; if (j->type == Node::Nothing) continue; return *j; } return Node(); } Uri getUniqueUri(QString prefix) const { QMutexLocker locker(&m_librdfLock); DEBUG << "BasicStore::getUniqueUri: prefix " << prefix << endl; int base = (int)(long)this; // we don't care at all about overflow bool good = false; Uri uri; while (!good) { QString s = getNewString(); uri = expand(prefix + s); Triples t = doMatch(Triple(uri, Node(), Node()), true); if (t.empty()) good = true; else collision(); } return uri; } Uri expand(QString shrt) const { if (shrt == "a") { return Uri::rdfTypeUri(); } int index = shrt.indexOf(':'); if (index == 0) { // starts with colon return Uri(m_baseUri.toString() + shrt.right(shrt.length() - 1)); } else if (index > 0) { // colon appears in middle somewhere if (index + 2 < shrt.length() && shrt[index+1] == '/' && shrt[index+2] == '/') { // we have found "://", this is a scheme, therefore // the uri is already expanded return Uri(shrt); } } else { // no colon present, no possibility of expansion return Uri(shrt); } // fall through only for colon in middle and no "://" found, // i.e. a plausible prefix appears QString prefix = shrt.left(index); QString expanded; m_prefixLock.lock(); PrefixMap::const_iterator pi = m_prefixes.find(prefix); if (pi != m_prefixes.end()) { expanded = pi.value().toString() + shrt.right(shrt.length() - (index + 1)); } else { expanded = shrt; } m_prefixLock.unlock(); return Uri(expanded); } Node addBlankNode() { QMutexLocker locker(&m_librdfLock); librdf_node *node = librdf_new_node_from_blank_identifier(m_w.getWorld(), 0); if (!node) throw RDFInternalError("Failed to create new blank node"); return lrdfNodeToNode(node); } void save(QString filename) const { QMutexLocker wlocker(&m_librdfLock); QMutexLocker plocker(&m_prefixLock); DEBUG << "BasicStore::save(" << filename << ")" << endl; librdf_uri *base_uri = uriToLrdfUri(m_baseUri); librdf_serializer *s = librdf_new_serializer(m_w.getWorld(), "turtle", 0, 0); if (!s) throw RDFInternalError("Failed to construct RDF serializer"); for (PrefixMap::const_iterator i = m_prefixes.begin(); i != m_prefixes.end(); ++i) { QByteArray b = i.key().toUtf8(); librdf_serializer_set_namespace(s, uriToLrdfUri(i.value()), b.data()); } librdf_serializer_set_namespace(s, uriToLrdfUri(m_baseUri), ""); QFile f(filename); if (!f.exists()) { if (!f.open(QFile::WriteOnly)) { throw RDFException("Failed to open file for writing", filename); } f.close(); } QString tmpFilename = QString("%1.part").arg(filename); QByteArray b = QFile::encodeName(tmpFilename); const char *lname = b.data(); if (librdf_serializer_serialize_model_to_file(s, lname, base_uri, m_model)) { librdf_free_serializer(s); QFile::remove(tmpFilename); throw RDFException("Failed to export RDF model to temporary file", tmpFilename); } librdf_free_serializer(s); // New file is now completed; the following is scruffy, but // that shouldn't really matter now if (!QFile::remove(filename)) { // Not necessarily fatal DEBUG << "BasicStore::save: Failed to remove former save file " << filename << endl; } if (!QFile::rename(tmpFilename, filename)) { throw RDFException("Failed to rename temporary file to save file", filename); } } void import(QUrl url, ImportDuplicatesMode idm, QString format) { QMutexLocker wlocker(&m_librdfLock); QMutexLocker plocker(&m_prefixLock); QString base = m_baseUri.toString(); if (base == "") { // No base URI in store: use file URL as base base = url.toString(); } // Redland doesn't like file://x for relative file paths, it // insists on file:x (the opposite of Serd) QString fileUri = Uri(url).toString(); if (fileUri.startsWith("file://") && !fileUri.startsWith("file:///")) { fileUri = "file:" + fileUri.right(fileUri.length()-7); } librdf_uri *luri = librdf_new_uri (m_w.getWorld(), (const unsigned char *)fileUri.toUtf8().data()); librdf_uri *base_uri = uriToLrdfUri(Uri(base)); if (format == "") format = "guess"; librdf_parser *parser = librdf_new_parser (m_w.getWorld(), format.toLocal8Bit().data(), NULL, NULL); if (!parser) { throw RDFInternalError("Failed to construct RDF parser"); } if (idm == ImportPermitDuplicates) { // The normal Redland behaviour, so the easy case. if (librdf_parser_parse_into_model (parser, luri, base_uri, m_model)) { librdf_free_parser(parser); DEBUG << "librdf_parser_parse_into_model failed" << endl; DEBUG << "luri = " << (const char *)librdf_uri_as_string(luri) << ", base_uri = " << (const char *)librdf_uri_as_string(base_uri) << endl; throw RDFException("Failed to import model from URL", url.toString()); } } else { // ImportFailOnDuplicates and ImportIgnoreDuplicates modes // This is complicated by our desire to avoid storing any // duplicate triples on import, and optionally to be able // to fail if any are found. So we import into a separate // model and then transfer over. Not very efficient, but // scalability is not generally the primary concern for us librdf_storage *is = librdf_new_storage(m_w.getWorld(), "trees", 0, 0); if (!is) is = librdf_new_storage(m_w.getWorld(), 0, 0, 0); if (!is) { librdf_free_parser(parser); throw RDFInternalError("Failed to create import RDF data storage"); } librdf_model *im = librdf_new_model(m_w.getWorld(), is, 0); if (!im) { librdf_free_storage(is); librdf_free_parser(parser); throw RDFInternalError("Failed to create import RDF data model"); } librdf_stream *stream = 0; librdf_statement *all = 0; try { // so as to free parser and im on exception //!!! This appears to be returning success even on a //!!! syntax error -- can this be correct? if (librdf_parser_parse_into_model(parser, luri, base_uri, im)) { DEBUG << "librdf_parser_parse_into_model failed" << endl; DEBUG << "luri = " << (const char *)librdf_uri_as_string(luri) << ", base_uri = " << (const char *)librdf_uri_as_string(base_uri) << endl; throw RDFException("Failed to import model from URL", url.toString()); } all = tripleToStatement(Triple()); if (idm == ImportFailOnDuplicates) { // Need to query twice, first time to check for dupes stream = librdf_model_find_statements(im, all); if (!stream) { throw RDFInternalError("Failed to list imported RDF model in duplicates check"); } while (!librdf_stream_end(stream)) { librdf_statement *current = librdf_stream_get_object(stream); if (!current) continue; if (librdf_model_contains_statement(m_model, current)) { throw RDFDuplicateImportException("Duplicate statement encountered on import in ImportFailOnDuplicates mode"); } librdf_stream_next(stream); } librdf_free_stream(stream); stream = 0; } // Now import. Have to do this "manually" because librdf // may allow duplicates and we want to avoid them stream = librdf_model_find_statements(im, all); if (!stream) { throw RDFInternalError("Failed to list imported RDF model"); } while (!librdf_stream_end(stream)) { librdf_statement *current = librdf_stream_get_object(stream); if (!current) continue; if (idm == ImportFailOnDuplicates || // (already tested if so) !librdf_model_contains_statement(m_model, current)) { librdf_model_add_statement(m_model, current); } librdf_stream_next(stream); } librdf_free_stream(stream); stream = 0; } catch (...) { if (stream) librdf_free_stream(stream); if (all) librdf_free_statement(all); librdf_free_parser(parser); librdf_free_model(im); librdf_free_storage(is); throw; } librdf_free_model(im); librdf_free_storage(is); } int namespaces = librdf_parser_get_namespaces_seen_count(parser); DEBUG << "Parser found " << namespaces << " namespaces" << endl; for (int i = 0; i < namespaces; ++i) { const char *pfx = librdf_parser_get_namespaces_seen_prefix(parser, i); librdf_uri *uri = librdf_parser_get_namespaces_seen_uri(parser, i); QString qpfx = QString::fromUtf8(pfx); Uri quri; try { quri = lrdfUriToUri(uri); } catch (RDFIncompleteURI &) { continue; } DEBUG << "namespace " << i << ": " << qpfx << " -> " << quri << endl; // don't call addPrefix; it tries to lock the mutex, // and anyway we want to add the prefix only if it // isn't already there (to avoid surprisingly changing // a prefix in unusual cases, or changing the base URI) if (m_prefixes.find(qpfx) == m_prefixes.end()) { m_prefixes[qpfx] = quri; } } librdf_free_parser(parser); } private: class World { public: World() { QMutexLocker locker(&m_mutex); if (!m_world) { m_world = librdf_new_world(); librdf_world_open(m_world); } ++m_refcount; } ~World() { QMutexLocker locker(&m_mutex); if (--m_refcount == 0) { DEBUG << "Freeing world" << endl; librdf_free_world(m_world); m_world = 0; } } librdf_world *getWorld() const { return m_world; } private: static QMutex m_mutex; static librdf_world *m_world; static int m_refcount; }; World m_w; librdf_storage *m_storage; librdf_model *m_model; static QMutex m_librdfLock; // assume the worst typedef QHash PrefixMap; Uri m_baseUri; PrefixMap m_prefixes; mutable QMutex m_prefixLock; // also protects m_baseUri mutable int m_counter; bool doAdd(Triple t) { librdf_statement *statement = tripleToStatement(t); if (!checkComplete(statement)) { librdf_free_statement(statement); throw RDFException("Failed to add triple (statement is incomplete)"); } if (librdf_model_contains_statement(m_model, statement)) { librdf_free_statement(statement); return false; } if (librdf_model_add_statement(m_model, statement)) { librdf_free_statement(statement); throw RDFInternalError("Failed to add statement to model"); } librdf_free_statement(statement); return true; } bool doRemove(Triple t) { librdf_statement *statement = tripleToStatement(t); if (!checkComplete(statement)) { librdf_free_statement(statement); throw RDFException("Failed to remove triple (statement is incomplete)"); } // Looks like librdf_model_remove_statement returns the wrong // value in trees storage as of 1.0.9, so let's do this check // separately and ignore its return value if (!librdf_model_contains_statement(m_model, statement)) { librdf_free_statement(statement); return false; } librdf_model_remove_statement(m_model, statement); librdf_free_statement(statement); return true; } librdf_uri *uriToLrdfUri(Uri uri) const { librdf_uri *luri = librdf_new_uri (m_w.getWorld(), (const unsigned char *)uri.toString().toUtf8().data()); if (!luri) throw RDFInternalError("Failed to convert URI to internal representation", uri); return luri; } Uri lrdfUriToUri(librdf_uri *u) const { const char *s = (const char *)librdf_uri_as_string(u); if (s) return Uri(QString::fromUtf8(s)); else return Uri(); } librdf_node *nodeToLrdfNode(Node v) const { // called with m_librdfLock held librdf_node *node = 0; switch (v.type) { case Node::Nothing: return 0; case Node::Blank: { QByteArray b = v.value.toUtf8(); const unsigned char *bident = (const unsigned char *)b.data(); node = librdf_new_node_from_blank_identifier(m_w.getWorld(), bident); if (!node) throw RDFException ("Failed to construct node from blank identifier", v.value); } break; case Node::URI: { librdf_uri *uri = uriToLrdfUri(Uri(v.value)); if (!uri) throw RDFException("Failed to construct URI from value ", v.value); node = librdf_new_node_from_uri(m_w.getWorld(), uri); if (!node) throw RDFException("Failed to construct node from URI"); } break; case Node::Literal: { QByteArray b = v.value.toUtf8(); const unsigned char *literal = (const unsigned char *)b.data(); if (v.datatype != Uri()) { Uri dtu = v.datatype; librdf_uri *type_uri = uriToLrdfUri(dtu); node = librdf_new_node_from_typed_literal (m_w.getWorld(), literal, 0, type_uri); if (!node) throw RDFException ("Failed to construct node from literal of type ", v.datatype); } else { node = librdf_new_node_from_literal (m_w.getWorld(), literal, 0, 0); if (!node) throw RDFException ("Failed to construct node from literal"); } } break; } return node; } Node lrdfNodeToNode(librdf_node *node) const { Node v; if (!node) return v; if (librdf_node_is_resource(node)) { v.type = Node::URI; librdf_uri *uri = librdf_node_get_uri(node); v.value = lrdfUriToUri(uri).toString(); } else if (librdf_node_is_literal(node)) { v.type = Node::Literal; const char *s = (const char *)librdf_node_get_literal_value(node); if (s) v.value = QString::fromUtf8(s); librdf_uri *type_uri = librdf_node_get_literal_value_datatype_uri(node); if (type_uri) v.datatype = lrdfUriToUri(type_uri); } else if (librdf_node_is_blank(node)) { v.type = Node::Blank; const char *s = (const char *)librdf_node_get_blank_identifier(node); if (s) v.value = s; } return v; } librdf_statement *tripleToStatement(Triple t) const { librdf_node *na = nodeToLrdfNode(t.a); librdf_node *nb = nodeToLrdfNode(t.b); librdf_node *nc = nodeToLrdfNode(t.c); librdf_statement *statement = librdf_new_statement_from_nodes(m_w.getWorld(), na, nb, nc); if (!statement) throw RDFException("Failed to construct statement"); return statement; } Triple statementToTriple(librdf_statement *statement) const { librdf_node *subject = librdf_statement_get_subject(statement); librdf_node *predicate = librdf_statement_get_predicate(statement); librdf_node *object = librdf_statement_get_object(statement); Triple triple(lrdfNodeToNode(subject), lrdfNodeToNode(predicate), lrdfNodeToNode(object)); return triple; } bool checkComplete(librdf_statement *statement) const { if (librdf_statement_is_complete(statement)) return true; else { unsigned char *text = librdf_statement_to_string(statement); QString str = QString::fromUtf8((char *)text); std::cerr << "BasicStore::checkComplete: WARNING: RDF statement is incomplete: " << str.toStdString() << std::endl; free(text); return false; } } Triples doMatch(Triple t, bool single = false) const { // Any of a, b, and c in t that have Nothing as their node type // will contribute all matching nodes to the returned triples Triples results; librdf_statement *templ = tripleToStatement(t); librdf_stream *stream = librdf_model_find_statements(m_model, templ); librdf_free_statement(templ); if (!stream) throw RDFInternalError("Failed to match RDF triples"); while (!librdf_stream_end(stream)) { librdf_statement *current = librdf_stream_get_object(stream); if (current) results.push_back(statementToTriple(current)); if (single) break; librdf_stream_next(stream); } librdf_free_stream(stream); return results; } ResultSet runQuery(QString rawQuery) const { QString sparql; m_prefixLock.lock(); for (PrefixMap::const_iterator i = m_prefixes.begin(); i != m_prefixes.end(); ++i) { sparql += QString(" PREFIX %1: <%2> ") .arg(i.key()).arg(i.value().toString()); } m_prefixLock.unlock(); sparql += rawQuery; ResultSet returned; librdf_query *query = librdf_new_query(m_w.getWorld(), "sparql", 0, (const unsigned char *)sparql.toUtf8().data(), 0); if (!query) return returned; librdf_query_results *results = librdf_query_execute(query, m_model); if (!results) { librdf_free_query(query); return returned; } if (!librdf_query_results_is_bindings(results)) { librdf_free_query_results(results); librdf_free_query(query); return returned; } while (!librdf_query_results_finished(results)) { int count = librdf_query_results_get_bindings_count(results); Dictionary dict; for (int i = 0; i < count; ++i) { const char *name = librdf_query_results_get_binding_name(results, i); if (!name) continue; QString key = (const char *)name; librdf_node *node = librdf_query_results_get_binding_value(results, i); dict[key] = lrdfNodeToNode(node); } returned.push_back(dict); librdf_query_results_next(results); } librdf_free_query_results(results); librdf_free_query(query); // DEBUG << "runQuery: returning " << returned.size() << " result(s)" << endl; return returned; } }; QMutex BasicStore::D::m_librdfLock; QMutex BasicStore::D::World::m_mutex; librdf_world * BasicStore::D::World::m_world = 0; int BasicStore::D::World::m_refcount = 0; BasicStore::BasicStore() : m_d(new D()) { } BasicStore::~BasicStore() { delete m_d; } void BasicStore::setBaseUri(Uri uri) { m_d->setBaseUri(uri); } Uri BasicStore::getBaseUri() const { return m_d->getBaseUri(); } void BasicStore::clear() { m_d->clear(); } bool BasicStore::add(Triple t) { return m_d->add(t); } bool BasicStore::remove(Triple t) { return m_d->remove(t); } void BasicStore::change(ChangeSet t) { m_d->change(t); } void BasicStore::revert(ChangeSet t) { m_d->revert(t); } bool BasicStore::contains(Triple t) const { return m_d->contains(t); } Triples BasicStore::match(Triple t) const { return m_d->match(t); } void BasicStore::addPrefix(QString prefix, Uri uri) { m_d->addPrefix(prefix, uri); } ResultSet BasicStore::query(QString sparql) const { return m_d->query(sparql); } Node BasicStore::complete(Triple t) const { return m_d->complete(t); } Triple BasicStore::matchOnce(Triple t) const { return m_d->matchOnce(t); } Node BasicStore::queryOnce(QString sparql, QString bindingName) const { return m_d->queryOnce(sparql, bindingName); } Uri BasicStore::getUniqueUri(QString prefix) const { return m_d->getUniqueUri(prefix); } Uri BasicStore::expand(QString uri) const { return m_d->expand(uri); } Node BasicStore::addBlankNode() { return m_d->addBlankNode(); } void BasicStore::save(QString filename) const { m_d->save(filename); } void BasicStore::import(QUrl url, ImportDuplicatesMode idm, QString format) { m_d->import(url, idm, format); } BasicStore * BasicStore::load(QUrl url, QString format) { BasicStore *s = new BasicStore(); s->setBaseUri(Uri(url)); // store is empty, ImportIgnoreDuplicates is faster s->import(url, ImportIgnoreDuplicates, format); return s; } BasicStore::Features BasicStore::getSupportedFeatures() const { Features fs; fs << ModifyFeature << QueryFeature << RemoteImportFeature; return fs; } } #endif sonic-visualiser-2.3~repack1.orig/dataquay/src/backend/BasicStoreSord.cpp0000644000175000017500000007256512252354725025332 0ustar miramira/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Dataquay A C++/Qt library for simple RDF datastore management. Copyright 2009-2012 Chris Cannam. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Chris Cannam shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. */ #ifdef USE_SORD #include "BasicStore.h" #include "RDFException.h" #include #include #include #include #include #include #include #include #include "../Debug.h" #include #include #include namespace Dataquay { class BasicStore::D { public: D() : m_model(0) { m_prefixes["rdf"] = Uri("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); m_prefixes["xsd"] = Uri("http://www.w3.org/2001/XMLSchema#"); clear(); } ~D() { QMutexLocker locker(&m_backendLock); if (m_model) sord_free(m_model); } QString getNewString() const { QString s = QString::fromLocal8Bit (QCryptographicHash::hash (QString("%1").arg(rand() + time(0)).toLocal8Bit(), QCryptographicHash::Sha1).toHex()) .left(12); // This may be used as the whole of a name in some contexts, // so it must not start with a digit if (s[0].isDigit()) { s = "x" + s.right(s.length()-1); } return s; } void collision() const { // If we get a collision when generating a "random" string, // seed the random number generator (it probably means the // generator hasn't been seeded at all). But only once. static QMutex m; static bool seeded = false; static QMutexLocker l(&m); if (!seeded) return; srand(time(0)); seeded = true; } void setBaseUri(Uri baseUri) { QMutexLocker plocker(&m_prefixLock); m_baseUri = baseUri; m_prefixes[""] = m_baseUri; } Uri getBaseUri() const { return m_baseUri; } void clear() { QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::clear" << endl; if (m_model) sord_free(m_model); // Sord can only perform wildcard matches if at least one of // the non-wildcard nodes in the matched triple is the primary // term for one of its indices m_model = sord_new(m_w.getWorld(), SORD_SPO|SORD_OPS|SORD_POS, false); if (!m_model) throw RDFInternalError("Failed to create RDF data model"); } void addPrefix(QString prefix, Uri uri) { QMutexLocker plocker(&m_prefixLock); m_prefixes[prefix] = uri; } bool add(Triple t) { QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::add: " << t << endl; return doAdd(t); } bool remove(Triple t) { QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::remove: " << t << endl; if (t.a.type == Node::Nothing || t.b.type == Node::Nothing || t.c.type == Node::Nothing) { Triples tt = doMatch(t); if (tt.empty()) return false; DEBUG << "BasicStore::remove: Removing " << tt.size() << " triple(s)" << endl; for (int i = 0; i < tt.size(); ++i) { if (!doRemove(tt[i])) { DEBUG << "Failed to remove matched triple in remove() with wildcards; triple was: " << tt[i] << endl; throw RDFInternalError("Failed to remove matched statement in remove() with wildcards"); } } return true; } else { return doRemove(t); } } void change(ChangeSet cs) { QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::change: " << cs.size() << " changes" << endl; for (int i = 0; i < cs.size(); ++i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!doAdd(triple)) { throw RDFException("Change add failed: triple is already in store", triple); } break; case RemoveTriple: if (!doRemove(cs[i].second)) { throw RDFException("Change remove failed: triple is not in store", triple); } break; } } } void revert(ChangeSet cs) { QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::revert: " << cs.size() << " changes" << endl; for (int i = cs.size()-1; i >= 0; --i) { ChangeType type = cs[i].first; Triple triple = cs[i].second; switch (type) { case AddTriple: if (!doRemove(triple)) { throw RDFException("Revert of add failed: triple is not in store", triple); } break; case RemoveTriple: if (!doAdd(triple)) { throw RDFException("Revert of remove failed: triple is already in store", triple); } break; } } } bool contains(Triple t) const { QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::contains: " << t << endl; SordQuad statement; tripleToStatement(t, statement); if (!checkComplete(statement)) { throw RDFException("Failed to test for triple (statement is incomplete)"); } if (!sord_contains(m_model, statement)) { return false; } freeStatement(statement); return true; } Triples match(Triple t) const { QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::match: " << t << endl; Triples result = doMatch(t); #ifndef NDEBUG DEBUG << "BasicStore::match result (size " << result.size() << "):" << endl; for (int i = 0; i < result.size(); ++i) { DEBUG << i << ". " << result[i] << endl; } #endif return result; } Node complete(Triple t) const { int count = 0, match = 0; if (t.a == Node()) { ++count; match = 0; } if (t.b == Node()) { ++count; match = 1; } if (t.c == Node()) { ++count; match = 2; } if (count != 1) { throw RDFException("Cannot complete triple unless it has only a single wildcard node", t); } QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::complete: " << t << endl; Triples result = doMatch(t, true); if (result.empty()) return Node(); else switch (match) { case 0: return result[0].a; case 1: return result[0].b; case 2: return result[0].c; default: return Node(); } } Triple matchOnce(Triple t) const { if (t.c != Node() && t.b != Node() && t.a != Node()) { // triple is complete: short-circuit to a single lookup if (contains(t)) return t; else return Triple(); } QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::matchOnce: " << t << endl; Triples result = doMatch(t, true); #ifndef NDEBUG DEBUG << "BasicStore::matchOnce result:" << endl; for (int i = 0; i < result.size(); ++i) { DEBUG << i << ". " << result[i] << endl; } #endif if (result.empty()) return Triple(); else return result[0]; } ResultSet query(QString sparql) const { throw RDFUnsupportedError ("SPARQL queries are not supported with Sord backend", sparql); } Node queryOnce(QString sparql, QString bindingName) const { throw RDFUnsupportedError ("SPARQL queries are not supported with Sord backend", sparql); } Uri getUniqueUri(QString prefix) const { QMutexLocker locker(&m_backendLock); DEBUG << "BasicStore::getUniqueUri: prefix " << prefix << endl; bool good = false; Uri uri; while (!good) { QString s = getNewString(); uri = expand(prefix + s); Triples t = doMatch(Triple(uri, Node(), Node()), true); if (t.empty()) good = true; else collision(); } return uri; } Uri expand(QString shrt) const { if (shrt == "a") { return Uri::rdfTypeUri(); } int index = shrt.indexOf(':'); if (index == 0) { // starts with colon return Uri(m_baseUri.toString() + shrt.right(shrt.length() - 1)); } else if (index > 0) { // colon appears in middle somewhere if (index + 2 < shrt.length() && shrt[index+1] == '/' && shrt[index+2] == '/') { // we have found "://", this is a scheme, therefore // the uri is already expanded return Uri(shrt); } } else { // no colon present, no possibility of expansion return Uri(shrt); } // fall through only for colon in middle and no "://" found, // i.e. a plausible prefix appears QString prefix = shrt.left(index); QString expanded; m_prefixLock.lock(); PrefixMap::const_iterator pi = m_prefixes.find(prefix); if (pi != m_prefixes.end()) { expanded = pi.value().toString() + shrt.right(shrt.length() - (index + 1)); } else { expanded = shrt; } m_prefixLock.unlock(); return Uri(expanded); } Node addBlankNode() { QMutexLocker locker(&m_backendLock); QString blankId = getNewString(); //!!! todo: how to check whether the blank node is already in use SordNode *node = sord_new_blank(m_w.getWorld(), (uint8_t *)blankId.toUtf8().data()); if (!node) throw RDFInternalError("Failed to create new blank node"); return sordNodeToNode(node); } static size_t saveSink(const void *buf, size_t len, void *stream) { QIODevice *dev = (QIODevice *)stream; qint64 r = dev->write((const char *)buf, len); if (r < 0) throw RDFException("Write failed"); else return r; } void save(QString filename) const { QMutexLocker wlocker(&m_backendLock); QMutexLocker plocker(&m_prefixLock); DEBUG << "BasicStore::save(" << filename << ")" << endl; QByteArray bb = m_baseUri.toString().toUtf8(); SerdURI bu; if (serd_uri_parse((uint8_t *)bb.data(), &bu) != SERD_SUCCESS) { throw RDFInternalError("Failed to parse base URI", m_baseUri); } SerdNode bn = serd_node_from_string(SERD_URI, (uint8_t *)bb.data()); SerdEnv *env = serd_env_new(&bn); for (PrefixMap::const_iterator i = m_prefixes.begin(); i != m_prefixes.end(); ++i) { addToSerdNamespace(env, i.key(), i.value().toString()); } // addToSerdNamespace(env, QString(), m_baseUri.toString()); QFile f(filename); if (!f.exists()) { if (!f.open(QFile::WriteOnly)) { throw RDFException("Failed to open file for writing", filename); } f.close(); } QString tmpFilename = QString("%1.part").arg(filename); QFile tf(tmpFilename); if (!tf.open(QFile::WriteOnly)) { throw RDFException("Failed to open partial file for writing", tmpFilename); } SerdEnv *wenv = serd_env_new(&bn); SerdWriter *writer = serd_writer_new (SERD_TURTLE, SerdStyle(SERD_STYLE_ABBREVIATED | SERD_STYLE_RESOLVED | SERD_STYLE_CURIED), wenv, &bu, saveSink, &tf); serd_env_foreach(env, (SerdPrefixSink)serd_writer_set_prefix, writer); sord_write(m_model, writer, NULL); serd_writer_finish(writer); serd_writer_free(writer); serd_env_free(env); serd_env_free(wenv); tf.close(); // New file is now completed; the following is scruffy, but // that shouldn't really matter now if (!QFile::remove(filename)) { // Not necessarily fatal DEBUG << "BasicStore::save: Failed to remove former save file " << filename << endl; } if (!QFile::rename(tmpFilename, filename)) { throw RDFException("Failed to rename temporary file to save file", filename); } } void addPrefixOnImport(QString pfx, Uri uri) { DEBUG << "namespace: " << pfx << " -> " << uri << endl; // don't call addPrefix; it tries to lock the mutex, // and anyway we want to add the prefix only if it // isn't already there (to avoid surprisingly changing // a prefix in unusual cases, or changing the base URI) if (m_prefixes.find(pfx) == m_prefixes.end()) { m_prefixes[pfx] = uri; } } static SerdStatus addPrefixSink(void *handle, const SerdNode *name, const SerdNode *uri) { D *d = (D *)handle; try { QString qpfx(QString::fromUtf8((const char *)name->buf, name->n_bytes)); Uri quri(QString::fromUtf8((const char *)uri->buf, uri->n_bytes)); d->addPrefixOnImport(qpfx, quri); } catch (RDFIncompleteURI &) { } return SERD_SUCCESS; } void import(QUrl url, ImportDuplicatesMode idm, QString format) { DEBUG << "BasicStoreSord::import: " << url << endl; QMutexLocker wlocker(&m_backendLock); QMutexLocker plocker(&m_prefixLock); //!!! todo: format? QString base = m_baseUri.toString(); if (base == "") { // No base URI in store: use file URL as base base = url.toString(); } QByteArray bb = base.toUtf8(); SerdURI bu; if (serd_uri_parse((uint8_t *)bb.data(), &bu) != SERD_SUCCESS) { throw RDFInternalError("Failed to parse base URI", base); } SerdNode bn = serd_node_from_string(SERD_URI, (uint8_t *)bb.data()); SerdEnv *env = serd_env_new(&bn); QString fileUri = url.toString(); // serd_uri_to_path doesn't like the brief file:blah // convention, it insists that file: is followed by // // (the opposite of Redland) if (fileUri.startsWith("file:") && !fileUri.startsWith("file://")) { // however, it's happy with scheme-less paths fileUri = fileUri.right(fileUri.length()-5); } if (idm == ImportPermitDuplicates) { // No special handling for duplicates, do whatever the // underlying engine does SerdReader *reader = sord_new_reader(m_model, env, SERD_TURTLE, NULL); // if we have data in the store already, then we must add // a prefix for the new blank nodes we're importing to // disambiguate them if (!doMatch(Triple(), true).empty()) { serd_reader_add_blank_prefix (reader, (uint8_t *)(getNewString().toUtf8().data())); } SerdStatus rv = serd_reader_read_file (reader, (const uint8_t *)fileUri.toLocal8Bit().data()); if (rv != SERD_SUCCESS) { serd_reader_free(reader); serd_env_free(env); throw RDFException (QString("Failed to import model from URL: %1") .arg(serdStatusToString(rv)), url.toString()); } serd_reader_free(reader); } else { // ImportFailOnDuplicates and ImportIgnoreDuplicates: // import into a separate model and transfer across SordModel *im = sord_new(m_w.getWorld(), 0, false); // no index SerdReader *reader = sord_new_reader(im, env, SERD_TURTLE, NULL); // if we have data in the store already, then we must add // a prefix for the new blank nodes we're importing to // disambiguate them if (!doMatch(Triple(), true).empty()) { serd_reader_add_blank_prefix (reader, (uint8_t *)(getNewString().toUtf8().data())); } SerdStatus rv = serd_reader_read_file (reader, (const uint8_t *)fileUri.toLocal8Bit().data()); if (rv != SERD_SUCCESS) { serd_reader_free(reader); sord_free(im); serd_env_free(env); throw RDFException (QString("Failed to import model from URL: %1") .arg(serdStatusToString(rv)), url.toString()); } serd_reader_free(reader); SordQuad templ; tripleToStatement(Triple(), templ); if (idm == ImportFailOnDuplicates) { SordIter *itr = sord_find(im, templ); while (!sord_iter_end(itr)) { SordQuad q; sord_iter_get(itr, q); if (sord_contains(m_model, q)) { Triple culprit = statementToTriple(q); sord_iter_free(itr); freeStatement(templ); sord_free(im); serd_env_free(env); throw RDFDuplicateImportException("Duplicate statement encountered on import in ImportFailOnDuplicates mode", culprit); } sord_iter_next(itr); } sord_iter_free(itr); } SordIter *itr = sord_find(im, templ); while (!sord_iter_end(itr)) { SordQuad q; sord_iter_get(itr, q); if (idm == ImportFailOnDuplicates || // (already tested if so) !sord_contains(m_model, q)) { sord_add(m_model, q); } sord_iter_next(itr); } sord_iter_free(itr); freeStatement(templ); sord_free(im); } serd_env_foreach(env, addPrefixSink, this); serd_env_free(env); } private: class World { public: World() { QMutexLocker locker(&m_mutex); if (!m_world) { m_world = sord_world_new(); } ++m_refcount; } ~World() { QMutexLocker locker(&m_mutex); DEBUG << "~World: About to lower refcount from " << m_refcount << endl; if (--m_refcount == 0) { DEBUG << "Freeing world" << endl; sord_world_free(m_world); m_world = 0; } } SordWorld *getWorld() const { return m_world; } private: static QMutex m_mutex; static SordWorld *m_world; static int m_refcount; }; World m_w; SordModel *m_model; static QMutex m_backendLock; // assume the worst typedef QHash PrefixMap; Uri m_baseUri; PrefixMap m_prefixes; mutable QMutex m_prefixLock; // also protects m_baseUri bool doAdd(Triple t) { SordQuad statement; tripleToStatement(t, statement); if (!checkComplete(statement)) { throw RDFException("Failed to add triple (statement is incomplete)"); } if (sord_contains(m_model, statement)) { return false; } sord_add(m_model, statement); freeStatement(statement); return true; } bool doRemove(Triple t) { SordQuad statement; tripleToStatement(t, statement); if (!checkComplete(statement)) { throw RDFException("Failed to remove triple (statement is incomplete)"); } if (!sord_contains(m_model, statement)) { return false; } sord_remove(m_model, statement); freeStatement(statement); return true; } SordNode *uriToSordNode(Uri uri) const { SordNode *node = sord_new_uri (m_w.getWorld(), (const unsigned char *)uri.toString().toUtf8().data()); if (!node) throw RDFInternalError("Failed to convert URI to internal representation", uri); return node; } //!!! utility function to extract string value from node would be more useful Uri sordNodeToUri(const SordNode *n) const { if (!n || sord_node_get_type(n) != SORD_URI) { return Uri(); } const uint8_t *s = sord_node_get_string(n); if (s) return Uri(QString::fromUtf8((char *)s)); else return Uri(); } SordNode *nodeToSordNode(Node v) const { // called with m_backendLock held SordNode *node = 0; switch (v.type) { case Node::Nothing: return 0; case Node::Blank: { QByteArray b = v.value.toUtf8(); const unsigned char *bident = (const unsigned char *)b.data(); node = sord_new_blank(m_w.getWorld(), bident); if (!node) throw RDFException ("Failed to construct node from blank identifier", v.value); } break; case Node::URI: { node = uriToSordNode(Uri(v.value)); if (!node) throw RDFException("Failed to construct node from URI"); } break; case Node::Literal: { QByteArray b = v.value.toUtf8(); const unsigned char *literal = (const unsigned char *)b.data(); if (v.datatype != Uri()) { SordNode *typeNode = uriToSordNode(v.datatype); node = sord_new_literal(m_w.getWorld(), typeNode, literal, 0); if (!node) throw RDFException ("Failed to construct node from literal of type ", v.datatype); } else { node = sord_new_literal(m_w.getWorld(), 0, literal, 0); if (!node) throw RDFException ("Failed to construct node from literal"); } } break; } return node; } Node sordNodeToNode(const SordNode *node) const { Node v; if (!node) return v; SordNodeType type = sord_node_get_type(node); switch (type) { case SORD_URI: v.type = Node::URI; v.value = sordNodeToUri(node).toString(); break; case SORD_BLANK: v.type = Node::Blank; //!!! utility function for this -- types and what if it's null? v.value = QString::fromUtf8((char *)sord_node_get_string(node)); break; case SORD_LITERAL: v.type = Node::Literal; //!!! utility function for this -- types and what if it's null? v.value = QString::fromUtf8((char *)sord_node_get_string(node)); v.datatype = sordNodeToUri(sord_node_get_datatype(node)); break; } return v; } void tripleToStatement(Triple t, SordQuad q) const { q[0] = nodeToSordNode(t.a); q[1] = nodeToSordNode(t.b); q[2] = nodeToSordNode(t.c); q[3] = 0; } void freeStatement(SordQuad q) const { // Not for removing statements from the store for (int i = 0; i < 4; ++i) { sord_node_free(m_w.getWorld(), (SordNode *)q[i]); } } Triple statementToTriple(const SordQuad q) const { Triple triple(sordNodeToNode(q[0]), sordNodeToNode(q[1]), sordNodeToNode(q[2])); return triple; } bool checkComplete(const SordQuad q) const { if (!q[0] || !q[1] || !q[2]) { std::cerr << "BasicStore::checkComplete: WARNING: RDF statement contains one or more NULL nodes" << std::endl; return false; } if ((sord_node_get_type(q[0]) == SORD_URI || sord_node_get_type(q[0]) == SORD_BLANK) && (sord_node_get_type(q[1]) == SORD_URI)) { return true; } else { std::cerr << "BasicStore::checkComplete: WARNING: RDF statement is incomplete: [" << sord_node_get_string(q[0]) << "," << sord_node_get_string(q[1]) << "," << sord_node_get_string(q[2]) << "]" << std::endl; return false; } } void addToSerdNamespace(SerdEnv *env, QString key, QString value) const { QByteArray b = key.toUtf8(); QByteArray v = value.toUtf8(); SerdNode name = serd_node_from_string(SERD_URI, (uint8_t *)b.data()); SerdNode uri = serd_node_from_string(SERD_URI, (uint8_t *)v.data()); serd_env_set_prefix(env, &name, &uri); // copies name, uri } Triples doMatch(Triple t, bool single = false) const { // Any of a, b, and c in t that have Nothing as their node type // will contribute all matching nodes to the returned triples Triples results; SordQuad templ; tripleToStatement(t, templ); SordIter *itr = sord_find(m_model, templ); while (!sord_iter_end(itr)) { SordQuad q; sord_iter_get(itr, q); results.push_back(statementToTriple(q)); if (single) break; sord_iter_next(itr); } sord_iter_free(itr); freeStatement(templ); return results; } QString serdStatusToString(SerdStatus s) { switch (s) { case SERD_SUCCESS: return "Success"; case SERD_FAILURE: return "Non-fatal failure"; case SERD_ERR_UNKNOWN: return "Unknown error"; case SERD_ERR_BAD_SYNTAX: return "Invalid syntax"; case SERD_ERR_NOT_FOUND: return "Not found"; case SERD_ERR_BAD_ARG: return "Bad argument"; case SERD_ERR_ID_CLASH: return "Blank node ID clash"; case SERD_ERR_BAD_CURIE: return "Bad abbreviated URI"; case SERD_ERR_INTERNAL: return "Internal error in Serd"; } return QString("Unknown Serd error type"); } }; QMutex BasicStore::D::m_backendLock; QMutex BasicStore::D::World::m_mutex; SordWorld * BasicStore::D::World::m_world = 0; int BasicStore::D::World::m_refcount = 0; BasicStore::BasicStore() : m_d(new D()) { } BasicStore::~BasicStore() { delete m_d; } void BasicStore::setBaseUri(Uri uri) { m_d->setBaseUri(uri); } Uri BasicStore::getBaseUri() const { return m_d->getBaseUri(); } void BasicStore::clear() { m_d->clear(); } bool BasicStore::add(Triple t) { return m_d->add(t); } bool BasicStore::remove(Triple t) { return m_d->remove(t); } void BasicStore::change(ChangeSet t) { m_d->change(t); } void BasicStore::revert(ChangeSet t) { m_d->revert(t); } bool BasicStore::contains(Triple t) const { return m_d->contains(t); } Triples BasicStore::match(Triple t) const { return m_d->match(t); } void BasicStore::addPrefix(QString prefix, Uri uri) { m_d->addPrefix(prefix, uri); } ResultSet BasicStore::query(QString sparql) const { return m_d->query(sparql); } Node BasicStore::complete(Triple t) const { return m_d->complete(t); } Triple BasicStore::matchOnce(Triple t) const { return m_d->matchOnce(t); } Node BasicStore::queryOnce(QString sparql, QString bindingName) const { return m_d->queryOnce(sparql, bindingName); } Uri BasicStore::getUniqueUri(QString prefix) const { return m_d->getUniqueUri(prefix); } Uri BasicStore::expand(QString uri) const { return m_d->expand(uri); } Node BasicStore::addBlankNode() { return m_d->addBlankNode(); } void BasicStore::save(QString filename) const { m_d->save(filename); } void BasicStore::import(QUrl url, ImportDuplicatesMode idm, QString format) { m_d->import(url, idm, format); } BasicStore * BasicStore::load(QUrl url, QString format) { BasicStore *s = new BasicStore(); QString su = url.toString(); Uri baseUri(su.replace(" ", "%20")); s->setBaseUri(baseUri); // store is empty, ImportIgnoreDuplicates is faster s->import(url, ImportIgnoreDuplicates, format); return s; } BasicStore::Features BasicStore::getSupportedFeatures() const { Features fs; fs << ModifyFeature; return fs; } } #endif sonic-visualiser-2.3~repack1.orig/dataquay/src/backend/define-check.cpp0000644000175000017500000000033012252354725024726 0ustar miramira #ifdef USE_REDLAND #ifdef USE_SORD #error Only one of USE_REDLAND and USE_SORD may be defined #endif #endif #ifndef USE_REDLAND #ifndef USE_SORD #error One of USE_REDLAND or USE_SORD must be defined #endif #endif sonic-visualiser-2.3~repack1.orig/dataquay/doc-overview0000644000175000017500000000656512252354725022113 0ustar miramiranamespace Dataquay { /** \mainpage Dataquay \section about About Dataquay %Dataquay is a free open source library that provides a friendly C++ API for the Redland and Sord RDF data stores using Qt4 classes and containers. %Dataquay is intended to be simple to use and easy to integrate. It is principally intended for use in Qt-based applications that would like to use an RDF datastore as backing for in-memory project data, to avoid having to provide application data-specific file formats and to make it easy to augment the data with descriptive metadata pulled in from external sources. %Dataquay is also intended to be useful for applications whose primary purpose is not related to RDF but that have ad-hoc RDF needs for metadata management. \section contents What's in Dataquay? %Dataquay contains C++ abstractions for the RDF Node and Triple (or statement), and for the RDF Store. The standard BasicStore offers simple add, remove, matching, and querying functions and file I/O. Also provided is TransactionalStore, a transactional interface to the store that offers per-thread isolation, atomic commit, and a Connection class in the style of a traditional relational database interface. %Dataquay also offers ObjectMapper, a facility which can take care of a complete object hierarchy, map it to the RDF store, and synchronise in both directions any changes to the hierarchy or the store. Arbitrary mappings between C++ class and property names and RDF URIs can be specified using TypeMapping. The mapping is flexible enough to allow you to load many publicly generated Linked Data sources directly into object class hierarchies, if you wish (although this is not usually an ideal way to handle unpredictable data sources). The classes that manage the object-to-store and store-to-object mapping can also be used separately, as ObjectStorer and ObjectLoader. \section start Start Here... If you want your application to have access to RDF metadata but you are not intending to make RDF data the core of the application, then you probably want to focus on BasicStore. This can load and save RDF and perform queries, matches, and updates in a simple form. If you need to carry out updates to RDF data, particularly in a multi-threaded application, then you should look at TransactionalStore and its related Connection class. If you would like to use an RDF store as a "hibernation" mechanism for store and recall of an object hierarchy in an open and portable manner, then you could consider using a BasicStore, wrapping that in a TransactionalStore, and using ObjectMapper to deal with the hibernation side of things. In any of these cases you'll also want to look closely at the Uri, Node, and Triple classes. \section status Development Status Certain aspects of %Dataquay are still somewhat provisional, and the API may continue to change until the 1.0 release. However, most of the API design is likely to remain as it is now and the library has been reasonably well tested. The main focus for 1.0 is to expand the test suite and produce some more example code. Those activities might show up other things that need doing too, though. \section licence Licence %Dataquay is published under a liberal BSD-style licence, similar to (and of course compatible with) the Apache licence used by Redland. You can use it without fee in open-source or proprietary applications. See the COPYING file for details. */ } sonic-visualiser-2.3~repack1.orig/sonic-visualiser.desktop0000644000175000017500000000061312252354725022624 0ustar miramira[Desktop Entry] Name=Sonic Visualiser Exec=sonic-visualiser Terminal=false Type=Application Icon=sv-icon Categories=Application;Multimedia;Audio;AudioVideo MimeType=application/x-sonicvisualiser;application/x-sonicvisualiser-layer;application/x-ogg;audio/mp3;audio/mpeg;audio/mpegurl;audio/x-flac;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-wav;audio/wav;application/ogg;audio/x-vorbis+ogg sonic-visualiser-2.3~repack1.orig/x-sonicvisualiser-layer.desktop0000644000175000017500000000023612252354725024127 0ustar miramira[Desktop Entry] Command=Sonic Visualiser layer file Hidden=false MimeType=application/x-sonicvisualiser-layer Patterns=*.svl;*.SVL Icon=sv-icon Type=MimeType sonic-visualiser-2.3~repack1.orig/.hgsub0000644000175000017500000000044012252354725017041 0ustar miramirasvcore = https://code.soundsoftware.ac.uk/hg/svcore svgui = https://code.soundsoftware.ac.uk/hg/svgui svapp = https://code.soundsoftware.ac.uk/hg/svapp dataquay = https://bitbucket.org/breakfastquay/dataquay sv-dependency-builds = https://code.soundsoftware.ac.uk/hg/sv-dependency-builds sonic-visualiser-2.3~repack1.orig/platform-dataquay.pri0000644000175000017500000000060312252354725022100 0ustar miramira exists(config.pri) { include(./config.pri) } CONFIG += staticlib DEFINES -= USE_REDLAND QMAKE_CXXFLAGS -= -I/usr/include/rasqal -I/usr/include/raptor2 EXTRALIBS -= -lrdf DEFINES += USE_SORD # Libraries and paths should be added by config.pri win32-g++: { INCLUDEPATH += ../sv-dependency-builds/win32-mingw/include LIBS += -L../../sv-dependency-builds/win32-mingw/lib } sonic-visualiser-2.3~repack1.orig/configure0000755000175000017500000103736212252354725017655 0ustar miramira#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Sonic Visualiser 2.3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: cannam@all-day-breakfast.com about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Sonic Visualiser' PACKAGE_TARNAME='sonic-visualiser' PACKAGE_VERSION='2.3' PACKAGE_STRING='Sonic Visualiser 2.3' PACKAGE_BUGREPORT='cannam@all-day-breakfast.com' PACKAGE_URL='' ac_unique_file="main/main.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" enable_option_checking=no ac_subst_vars='LTLIBOBJS LIBOBJS subdirs QMAKE_CONFIG HAVES CXXFLAGS_MINIMAL CUT SHA1SUM MAKEDEPEND XARGS PERL X11_LIBS X11_CFLAGS id3tag_LIBS id3tag_CFLAGS mad_LIBS mad_CFLAGS fishsound_LIBS fishsound_CFLAGS oggz_LIBS oggz_CFLAGS lrdf_LIBS lrdf_CFLAGS libpulse_LIBS libpulse_CFLAGS JACK_LIBS JACK_CFLAGS portaudio_2_0_LIBS portaudio_2_0_CFLAGS liblo_LIBS liblo_CFLAGS serd_LIBS serd_CFLAGS sord_LIBS sord_CFLAGS rubberband_LIBS rubberband_CFLAGS vamphostsdk_LIBS vamphostsdk_CFLAGS vamp_LIBS vamp_CFLAGS samplerate_LIBS samplerate_CFLAGS sndfile_LIBS sndfile_CFLAGS fftw3f_LIBS fftw3f_CFLAGS fftw3_LIBS fftw3_CFLAGS bz2_LIBS bz2_CFLAGS QMAKE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG EGREP GREP CXXCPP MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM ac_ct_CXX CXXFLAGS CXX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR bz2_CFLAGS bz2_LIBS fftw3_CFLAGS fftw3_LIBS fftw3f_CFLAGS fftw3f_LIBS sndfile_CFLAGS sndfile_LIBS samplerate_CFLAGS samplerate_LIBS vamp_CFLAGS vamp_LIBS vamphostsdk_CFLAGS vamphostsdk_LIBS rubberband_CFLAGS rubberband_LIBS sord_CFLAGS sord_LIBS serd_CFLAGS serd_LIBS liblo_CFLAGS liblo_LIBS portaudio_2_0_CFLAGS portaudio_2_0_LIBS JACK_CFLAGS JACK_LIBS libpulse_CFLAGS libpulse_LIBS lrdf_CFLAGS lrdf_LIBS oggz_CFLAGS oggz_LIBS fishsound_CFLAGS fishsound_LIBS mad_CFLAGS mad_LIBS id3tag_CFLAGS id3tag_LIBS X11_CFLAGS X11_LIBS' ac_subdirs_all='svcore svgui svapp' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures Sonic Visualiser 2.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/sonic-visualiser] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Sonic Visualiser 2.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debug support [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path bz2_CFLAGS C compiler flags for bz2, overriding pkg-config bz2_LIBS linker flags for bz2, overriding pkg-config fftw3_CFLAGS C compiler flags for fftw3, overriding pkg-config fftw3_LIBS linker flags for fftw3, overriding pkg-config fftw3f_CFLAGS C compiler flags for fftw3f, overriding pkg-config fftw3f_LIBS linker flags for fftw3f, overriding pkg-config sndfile_CFLAGS C compiler flags for sndfile, overriding pkg-config sndfile_LIBS linker flags for sndfile, overriding pkg-config samplerate_CFLAGS C compiler flags for samplerate, overriding pkg-config samplerate_LIBS linker flags for samplerate, overriding pkg-config vamp_CFLAGS C compiler flags for vamp, overriding pkg-config vamp_LIBS linker flags for vamp, overriding pkg-config vamphostsdk_CFLAGS C compiler flags for vamphostsdk, overriding pkg-config vamphostsdk_LIBS linker flags for vamphostsdk, overriding pkg-config rubberband_CFLAGS C compiler flags for rubberband, overriding pkg-config rubberband_LIBS linker flags for rubberband, overriding pkg-config sord_CFLAGS C compiler flags for sord, overriding pkg-config sord_LIBS linker flags for sord, overriding pkg-config serd_CFLAGS C compiler flags for serd, overriding pkg-config serd_LIBS linker flags for serd, overriding pkg-config liblo_CFLAGS C compiler flags for liblo, overriding pkg-config liblo_LIBS linker flags for liblo, overriding pkg-config portaudio_2_0_CFLAGS C compiler flags for portaudio_2_0, overriding pkg-config portaudio_2_0_LIBS linker flags for portaudio_2_0, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config libpulse_CFLAGS C compiler flags for libpulse, overriding pkg-config libpulse_LIBS linker flags for libpulse, overriding pkg-config lrdf_CFLAGS C compiler flags for lrdf, overriding pkg-config lrdf_LIBS linker flags for lrdf, overriding pkg-config oggz_CFLAGS C compiler flags for oggz, overriding pkg-config oggz_LIBS linker flags for oggz, overriding pkg-config fishsound_CFLAGS C compiler flags for fishsound, overriding pkg-config fishsound_LIBS linker flags for fishsound, overriding pkg-config mad_CFLAGS C compiler flags for mad, overriding pkg-config mad_LIBS linker flags for mad, overriding pkg-config id3tag_CFLAGS C compiler flags for id3tag, overriding pkg-config id3tag_LIBS linker flags for id3tag, overriding pkg-config X11_CFLAGS C compiler flags for X11, overriding pkg-config X11_LIBS linker flags for X11, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Sonic Visualiser configure 2.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to cannam@all-day-breakfast.com ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Sonic Visualiser $as_me 2.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf will set CXXFLAGS; we don't usually want it to, because we # either define our own flags (at least if GCC is in use) or else use # the user's preferences. We need to ensure CXXFLAGS is only set if # the user has expressly set it. So, save the user's (or empty) # setting now and restore it after Autoconf has done its bit of # piddling about. USER_CXXFLAGS="$CXXFLAGS" # If the user supplied CFLAGS but not CXXFLAGS, use CFLAGS instead if test x"$USER_CXXFLAGS" = x; then if test x"$CFLAGS" != x; then USER_CXXFLAGS="$CFLAGS" fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # These are the flags Autoconf guesses for us; we use them later if # the user has set none and we are not using GCC (so lack our own # preferred flags) AUTOCONF_CXXFLAGS="$CXXFLAGS" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake.exe", so it can be a program name with args. set dummy qmake.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin/ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="$QTDIR/bin/qmake.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake-qt5" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_QMAKE="qmake" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$QMAKE = x ; then as_fn_error $? " Failed to find the required qmake-qt5 or qmake program. Please ensure you have the necessary Qt5 development files installed, and if necessary set QTDIR to the location of your Qt5 installation. " "$LINENO" 5 fi # Suitable versions of qmake should print out something like: # # QMake version 2.01a # Using Qt version 4.6.3 in /usr/lib # # This may be translated, so we check only for the numbers (2.x and 4.x # in that order). # QMAKE_VERSION_OUTPUT=`$QMAKE -v` case "$QMAKE_VERSION_OUTPUT" in *5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&5 $as_echo "$as_me: WARNING: *** The version of qmake found in \"$QMAKE\" looks like it might be from the wrong version of Qt (Qt5 is required). Please check that this is the correct version of qmake for Qt5 builds. " >&2;} esac case "`uname`" in *Darwin*) QMAKE="$QMAKE -spec macx-g++";; esac SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING" SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING" SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE" # Now we have: USER_CXXFLAGS contains any flags the user set # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought # we should use. If we have GCC, we override the latter but then # allow ourselves to be overridden (later) by the former CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS" CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS" CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS" if test "x$GCC" = "xyes"; then CXXFLAGS_DEBUG="-Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe" CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe" CXXFLAGS_MINIMAL="-g0 -O0" fi CXXFLAGS_BUILD="$CXXFLAGS_RELEASE" SV_DEFINES_BUILD="$SV_DEFINES_RELEASE" QMAKE_CONFIG="release" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; { $as_echo "$as_me:${as_lineno-$LINENO}: enabling debug build" >&5 $as_echo "$as_me: enabling debug build" >&6;} QMAKE_CONFIG="debug" CXXFLAGS_BUILD="$CXXFLAGS_DEBUG" SV_DEFINES_BUILD="$SV_DEFINES_DEBUG" fi if test x"$USER_CXXFLAGS" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&5 $as_echo "$as_me: The CXXFLAGS environment variable is set to \"$USER_CXXFLAGS\"." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Overriding default compiler flags with the above user setting." >&5 $as_echo "$as_me: Overriding default compiler flags with the above user setting." >&6;} CXXFLAGS_BUILD="$USER_CXXFLAGS" CXXFLAGS_MINIMAL="$USER_CXXFLAGS" fi CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done SV_MODULE_MODULE=bz2 SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=bzlib.h SV_MODULE_LIB=bz2 SV_MODULE_FUNC=BZ2_bzReadOpen SV_MODULE_HAVE=HAVE_$(echo bz2 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$bz2_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $bz2_CFLAGS" LIBS="$LIBS $bz2_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bz2" >&5 $as_echo_n "checking for bz2... " >&6; } if test -n "$bz2_CFLAGS"; then pkg_cv_bz2_CFLAGS="$bz2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$bz2_LIBS"; then pkg_cv_bz2_LIBS="$bz2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bz2_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then bz2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else bz2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$bz2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else bz2_CFLAGS=$pkg_cv_bz2_CFLAGS bz2_LIBS=$pkg_cv_bz2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $bz2_CFLAGS";LIBS="$LIBS $bz2_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3 SV_MODULE_VERSION_TEST="fftw3 >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3 SV_MODULE_FUNC=fftw_execute SV_MODULE_HAVE=HAVE_$(echo fftw3 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS" LIBS="$LIBS $fftw3_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3" >&5 $as_echo_n "checking for fftw3... " >&6; } if test -n "$fftw3_CFLAGS"; then pkg_cv_fftw3_CFLAGS="$fftw3_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3_LIBS"; then pkg_cv_fftw3_LIBS="$fftw3_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3_CFLAGS=$pkg_cv_fftw3_CFLAGS fftw3_LIBS=$pkg_cv_fftw3_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3_CFLAGS";LIBS="$LIBS $fftw3_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=fftw3f SV_MODULE_VERSION_TEST="fftw3f >= 3.0.0" SV_MODULE_HEADER=fftw3.h SV_MODULE_LIB=fftw3f SV_MODULE_FUNC=fftwf_execute SV_MODULE_HAVE=HAVE_$(echo fftw3f | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fftw3f_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS" LIBS="$LIBS $fftw3f_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw3f" >&5 $as_echo_n "checking for fftw3f... " >&6; } if test -n "$fftw3f_CFLAGS"; then pkg_cv_fftw3f_CFLAGS="$fftw3f_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fftw3f_LIBS"; then pkg_cv_fftw3f_LIBS="$fftw3f_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fftw3f_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fftw3f_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fftw3f_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fftw3f_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fftw3f_CFLAGS=$pkg_cv_fftw3f_CFLAGS fftw3f_LIBS=$pkg_cv_fftw3f_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fftw3f_CFLAGS";LIBS="$LIBS $fftw3f_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sndfile SV_MODULE_VERSION_TEST="sndfile >= 1.0.16" SV_MODULE_HEADER=sndfile.h SV_MODULE_LIB=sndfile SV_MODULE_FUNC=sf_open SV_MODULE_HAVE=HAVE_$(echo sndfile | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sndfile_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS" LIBS="$LIBS $sndfile_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sndfile" >&5 $as_echo_n "checking for sndfile... " >&6; } if test -n "$sndfile_CFLAGS"; then pkg_cv_sndfile_CFLAGS="$sndfile_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sndfile_LIBS"; then pkg_cv_sndfile_LIBS="$sndfile_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sndfile_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sndfile_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sndfile_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sndfile_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sndfile_CFLAGS=$pkg_cv_sndfile_CFLAGS sndfile_LIBS=$pkg_cv_sndfile_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sndfile_CFLAGS";LIBS="$LIBS $sndfile_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=samplerate SV_MODULE_VERSION_TEST="samplerate >= 0.1.2" SV_MODULE_HEADER=samplerate.h SV_MODULE_LIB=samplerate SV_MODULE_FUNC=src_new SV_MODULE_HAVE=HAVE_$(echo samplerate | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$samplerate_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS" LIBS="$LIBS $samplerate_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for samplerate" >&5 $as_echo_n "checking for samplerate... " >&6; } if test -n "$samplerate_CFLAGS"; then pkg_cv_samplerate_CFLAGS="$samplerate_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$samplerate_LIBS"; then pkg_cv_samplerate_LIBS="$samplerate_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_samplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then samplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else samplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$samplerate_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else samplerate_CFLAGS=$pkg_cv_samplerate_CFLAGS samplerate_LIBS=$pkg_cv_samplerate_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS";LIBS="$LIBS $samplerate_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=vamp SV_MODULE_VERSION_TEST="vamp >= 2.1" SV_MODULE_HEADER=vamp/vamp.h SV_MODULE_LIB= SV_MODULE_FUNC= SV_MODULE_HAVE=HAVE_$(echo vamp | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$vamp_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $vamp_CFLAGS" LIBS="$LIBS $vamp_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vamp" >&5 $as_echo_n "checking for vamp... " >&6; } if test -n "$vamp_CFLAGS"; then pkg_cv_vamp_CFLAGS="$vamp_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamp_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$vamp_LIBS"; then pkg_cv_vamp_LIBS="$vamp_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamp_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then vamp_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else vamp_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$vamp_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else vamp_CFLAGS=$pkg_cv_vamp_CFLAGS vamp_LIBS=$pkg_cv_vamp_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $vamp_CFLAGS";LIBS="$LIBS $vamp_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=vamphostsdk SV_MODULE_VERSION_TEST="vamp-hostsdk >= 2.5" SV_MODULE_HEADER=vamp-hostsdk/PluginLoader.h SV_MODULE_LIB=vamp-hostsdk SV_MODULE_FUNC=libvamphostsdk_v_2_5_present SV_MODULE_HAVE=HAVE_$(echo vamphostsdk | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$vamphostsdk_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $vamphostsdk_CFLAGS" LIBS="$LIBS $vamphostsdk_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vamphostsdk" >&5 $as_echo_n "checking for vamphostsdk... " >&6; } if test -n "$vamphostsdk_CFLAGS"; then pkg_cv_vamphostsdk_CFLAGS="$vamphostsdk_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamphostsdk_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$vamphostsdk_LIBS"; then pkg_cv_vamphostsdk_LIBS="$vamphostsdk_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_vamphostsdk_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then vamphostsdk_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else vamphostsdk_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$vamphostsdk_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else vamphostsdk_CFLAGS=$pkg_cv_vamphostsdk_CFLAGS vamphostsdk_LIBS=$pkg_cv_vamphostsdk_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $vamphostsdk_CFLAGS";LIBS="$LIBS $vamphostsdk_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=rubberband SV_MODULE_VERSION_TEST="rubberband" SV_MODULE_HEADER=rubberband/RubberBandStretcher.h SV_MODULE_LIB=rubberband SV_MODULE_FUNC=rubberband_new SV_MODULE_HAVE=HAVE_$(echo rubberband | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$rubberband_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS" LIBS="$LIBS $rubberband_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rubberband" >&5 $as_echo_n "checking for rubberband... " >&6; } if test -n "$rubberband_CFLAGS"; then pkg_cv_rubberband_CFLAGS="$rubberband_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$rubberband_LIBS"; then pkg_cv_rubberband_LIBS="$rubberband_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_rubberband_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then rubberband_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else rubberband_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$rubberband_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else rubberband_CFLAGS=$pkg_cv_rubberband_CFLAGS rubberband_LIBS=$pkg_cv_rubberband_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $rubberband_CFLAGS";LIBS="$LIBS $rubberband_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=sord SV_MODULE_VERSION_TEST="sord-0 >= 0.5" SV_MODULE_HEADER=sord/sord.h SV_MODULE_LIB=sord-0 SV_MODULE_FUNC=sord_world_new SV_MODULE_HAVE=HAVE_$(echo sord | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$sord_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $sord_CFLAGS" LIBS="$LIBS $sord_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sord" >&5 $as_echo_n "checking for sord... " >&6; } if test -n "$sord_CFLAGS"; then pkg_cv_sord_CFLAGS="$sord_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sord_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$sord_LIBS"; then pkg_cv_sord_LIBS="$sord_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_sord_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sord_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else sord_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$sord_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else sord_CFLAGS=$pkg_cv_sord_CFLAGS sord_LIBS=$pkg_cv_sord_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $sord_CFLAGS";LIBS="$LIBS $sord_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=serd SV_MODULE_VERSION_TEST="serd-0 >= 0.5" SV_MODULE_HEADER=serd/serd.h SV_MODULE_LIB=serd-0 SV_MODULE_FUNC=serd_reader_read_file SV_MODULE_HAVE=HAVE_$(echo serd | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$serd_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $serd_CFLAGS" LIBS="$LIBS $serd_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for serd" >&5 $as_echo_n "checking for serd... " >&6; } if test -n "$serd_CFLAGS"; then pkg_cv_serd_CFLAGS="$serd_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_serd_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$serd_LIBS"; then pkg_cv_serd_LIBS="$serd_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_serd_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then serd_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else serd_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$serd_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else serd_CFLAGS=$pkg_cv_serd_CFLAGS serd_LIBS=$pkg_cv_serd_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $serd_CFLAGS";LIBS="$LIBS $serd_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE" else as_fn_error $? "Failed to find header $SV_MODULE_HEADER for required module $SV_MODULE_MODULE" "$LINENO" 5 fi if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else as_fn_error $? "Failed to find library $SV_MODULE_LIB for required module $SV_MODULE_MODULE" "$LINENO" 5 fi fi fi SV_MODULE_MODULE=liblo SV_MODULE_VERSION_TEST="" SV_MODULE_HEADER=lo/lo.h SV_MODULE_LIB=lo SV_MODULE_FUNC=lo_address_new SV_MODULE_HAVE=HAVE_$(echo liblo | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$liblo_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $liblo_CFLAGS" LIBS="$LIBS $liblo_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for liblo" >&5 $as_echo_n "checking for liblo... " >&6; } if test -n "$liblo_CFLAGS"; then pkg_cv_liblo_CFLAGS="$liblo_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$liblo_LIBS"; then pkg_cv_liblo_LIBS="$liblo_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_liblo_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then liblo_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else liblo_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$liblo_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else liblo_CFLAGS=$pkg_cv_liblo_CFLAGS liblo_LIBS=$pkg_cv_liblo_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $liblo_CFLAGS";LIBS="$LIBS $liblo_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=portaudio_2_0 SV_MODULE_VERSION_TEST="portaudio-2.0 >= 19" SV_MODULE_HEADER=portaudio.h SV_MODULE_LIB=portaudio SV_MODULE_FUNC=Pa_IsFormatSupported SV_MODULE_HAVE=HAVE_$(echo portaudio_2_0 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$portaudio_2_0_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS" LIBS="$LIBS $portaudio_2_0_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio_2_0" >&5 $as_echo_n "checking for portaudio_2_0... " >&6; } if test -n "$portaudio_2_0_CFLAGS"; then pkg_cv_portaudio_2_0_CFLAGS="$portaudio_2_0_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$portaudio_2_0_LIBS"; then pkg_cv_portaudio_2_0_LIBS="$portaudio_2_0_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_portaudio_2_0_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$portaudio_2_0_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else portaudio_2_0_CFLAGS=$pkg_cv_portaudio_2_0_CFLAGS portaudio_2_0_LIBS=$pkg_cv_portaudio_2_0_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS";LIBS="$LIBS $portaudio_2_0_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=JACK SV_MODULE_VERSION_TEST="jack >= 0.100" SV_MODULE_HEADER=jack/jack.h SV_MODULE_LIB=jack SV_MODULE_FUNC=jack_client_open SV_MODULE_HAVE=HAVE_$(echo JACK | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$JACK_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $JACK_CFLAGS";LIBS="$LIBS $JACK_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=libpulse SV_MODULE_VERSION_TEST="libpulse >= 0.9" SV_MODULE_HEADER=pulse/pulseaudio.h SV_MODULE_LIB=pulse SV_MODULE_FUNC=pa_stream_new SV_MODULE_HAVE=HAVE_$(echo libpulse | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$libpulse_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS" LIBS="$LIBS $libpulse_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpulse" >&5 $as_echo_n "checking for libpulse... " >&6; } if test -n "$libpulse_CFLAGS"; then pkg_cv_libpulse_CFLAGS="$libpulse_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libpulse_LIBS"; then pkg_cv_libpulse_LIBS="$libpulse_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libpulse_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libpulse_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else libpulse_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libpulse_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else libpulse_CFLAGS=$pkg_cv_libpulse_CFLAGS libpulse_LIBS=$pkg_cv_libpulse_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libpulse_CFLAGS";LIBS="$LIBS $libpulse_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=lrdf SV_MODULE_VERSION_TEST="lrdf >= 0.2" SV_MODULE_HEADER=lrdf.h SV_MODULE_LIB=lrdf SV_MODULE_FUNC=lrdf_init SV_MODULE_HAVE=HAVE_$(echo lrdf | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$lrdf_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS" LIBS="$LIBS $lrdf_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrdf" >&5 $as_echo_n "checking for lrdf... " >&6; } if test -n "$lrdf_CFLAGS"; then pkg_cv_lrdf_CFLAGS="$lrdf_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$lrdf_LIBS"; then pkg_cv_lrdf_LIBS="$lrdf_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_lrdf_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then lrdf_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else lrdf_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$lrdf_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else lrdf_CFLAGS=$pkg_cv_lrdf_CFLAGS lrdf_LIBS=$pkg_cv_lrdf_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $lrdf_CFLAGS";LIBS="$LIBS $lrdf_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=oggz SV_MODULE_VERSION_TEST="oggz >= 1.0.0" SV_MODULE_HEADER=oggz/oggz.h SV_MODULE_LIB=oggz SV_MODULE_FUNC=oggz_run SV_MODULE_HAVE=HAVE_$(echo oggz | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$oggz_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $oggz_CFLAGS" LIBS="$LIBS $oggz_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oggz" >&5 $as_echo_n "checking for oggz... " >&6; } if test -n "$oggz_CFLAGS"; then pkg_cv_oggz_CFLAGS="$oggz_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$oggz_LIBS"; then pkg_cv_oggz_LIBS="$oggz_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_oggz_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then oggz_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else oggz_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$oggz_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else oggz_CFLAGS=$pkg_cv_oggz_CFLAGS oggz_LIBS=$pkg_cv_oggz_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $oggz_CFLAGS";LIBS="$LIBS $oggz_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=fishsound SV_MODULE_VERSION_TEST="fishsound >= 1.0.0" SV_MODULE_HEADER=fishsound/fishsound.h SV_MODULE_LIB=fishsound SV_MODULE_FUNC=fish_sound_new SV_MODULE_HAVE=HAVE_$(echo fishsound | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$fishsound_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS" LIBS="$LIBS $fishsound_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fishsound" >&5 $as_echo_n "checking for fishsound... " >&6; } if test -n "$fishsound_CFLAGS"; then pkg_cv_fishsound_CFLAGS="$fishsound_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$fishsound_LIBS"; then pkg_cv_fishsound_LIBS="$fishsound_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_fishsound_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then fishsound_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else fishsound_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$fishsound_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else fishsound_CFLAGS=$pkg_cv_fishsound_CFLAGS fishsound_LIBS=$pkg_cv_fishsound_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $fishsound_CFLAGS";LIBS="$LIBS $fishsound_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=mad SV_MODULE_VERSION_TEST="mad >= 0.15.0" SV_MODULE_HEADER=mad.h SV_MODULE_LIB=mad SV_MODULE_FUNC=mad_decoder_init SV_MODULE_HAVE=HAVE_$(echo mad | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$mad_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $mad_CFLAGS" LIBS="$LIBS $mad_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mad" >&5 $as_echo_n "checking for mad... " >&6; } if test -n "$mad_CFLAGS"; then pkg_cv_mad_CFLAGS="$mad_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$mad_LIBS"; then pkg_cv_mad_LIBS="$mad_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_mad_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then mad_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else mad_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$mad_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else mad_CFLAGS=$pkg_cv_mad_CFLAGS mad_LIBS=$pkg_cv_mad_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $mad_CFLAGS";LIBS="$LIBS $mad_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi SV_MODULE_MODULE=id3tag SV_MODULE_VERSION_TEST="id3tag >= 0.15.0" SV_MODULE_HEADER=id3tag.h SV_MODULE_LIB=id3tag SV_MODULE_FUNC=id3_tag_new SV_MODULE_HAVE=HAVE_$(echo id3tag | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$id3tag_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS" LIBS="$LIBS $id3tag_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for id3tag" >&5 $as_echo_n "checking for id3tag... " >&6; } if test -n "$id3tag_CFLAGS"; then pkg_cv_id3tag_CFLAGS="$id3tag_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$id3tag_LIBS"; then pkg_cv_id3tag_LIBS="$id3tag_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_id3tag_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then id3tag_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else id3tag_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$id3tag_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else id3tag_CFLAGS=$pkg_cv_id3tag_CFLAGS id3tag_LIBS=$pkg_cv_id3tag_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $id3tag_CFLAGS";LIBS="$LIBS $id3tag_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi # Link in -lX11 if it exists -- this is for the X error handler SV_MODULE_MODULE=X11 SV_MODULE_VERSION_TEST="x11 >= 1.0.0" SV_MODULE_HEADER=X11/X.h SV_MODULE_LIB=x11 SV_MODULE_FUNC=XGetErrorText SV_MODULE_HAVE=HAVE_$(echo X11 | tr 'a-z' 'A-Z') SV_MODULE_FAILED=1 if test -n "$X11_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;} CXXFLAGS="$CXXFLAGS $X11_CFLAGS" LIBS="$LIBS $X11_LIBS" SV_MODULE_FAILED="" fi if test -z "$SV_MODULE_VERSION_TEST" ; then SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE fi if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11" >&5 $as_echo_n "checking for X11... " >&6; } if test -n "$X11_CFLAGS"; then pkg_cv_X11_CFLAGS="$X11_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X11_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$X11_LIBS"; then pkg_cv_X11_LIBS="$X11_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5 ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X11_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then X11_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` else X11_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$X11_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;} else X11_CFLAGS=$pkg_cv_X11_CFLAGS X11_LIBS=$pkg_cv_X11_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $X11_CFLAGS";LIBS="$LIBS $X11_LIBS";SV_MODULE_FAILED="" fi fi if test -n "$SV_MODULE_FAILED"; then as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED="" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;} fi if test -z "$SV_MODULE_FAILED"; then if test -n "$SV_MODULE_LIB"; then as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5 $as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$SV_MODULE_LIB $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $SV_MODULE_FUNC (); int main () { return $SV_MODULE_FUNC (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$SV_MODULE_LIB" else { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5 $as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;} fi fi fi fi subdirs="$subdirs svcore svgui svapp" ac_config_files="$ac_config_files config.pri version.h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Sonic Visualiser $as_me 2.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Sonic Visualiser config.status 2.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.pri") CONFIG_FILES="$CONFIG_FILES config.pri" ;; "version.h") CONFIG_FILES="$CONFIG_FILES version.h" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if ! $QMAKE -r sonic-visualiser.pro; then as_fn_error $? "qmake failed: Command was \"$QMAKE -r\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&5 $as_echo "$as_me: Configuration complete. Please check the above messages for any warnings that you might care about, and then run \"make\". The file config.pri contains the configuration settings for qmake. If you want to adjust these by hand, edit config.pri and run \"$QMAKE -r\" again to regenerate the Makefile. " >&6;} sonic-visualiser-2.3~repack1.orig/config.pri.in0000644000175000017500000000062612252354725020324 0ustar miramira CONFIG += @QMAKE_CONFIG@ DEFINES += @HAVES@ QMAKE_CC = @CC@ QMAKE_CXX = @CXX@ QMAKE_LINK = @CXX@ QMAKE_CFLAGS += @CFLAGS@ QMAKE_CXXFLAGS += @CXXFLAGS@ QMAKE_LFLAGS += @LDFLAGS@ linux*:LIBS += -lasound macx*:DEFINES += HAVE_COREAUDIO macx*:LIBS += -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices LIBS += @LIBS@ sonic-visualiser-2.3~repack1.orig/COPYING0000644000175000017500000003543312252354725016775 0ustar miramira GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS sonic-visualiser-2.3~repack1.orig/x-sonicvisualiser.desktop0000644000175000017500000000023012252354725023007 0ustar miramira[Desktop Entry] Command=Sonic Visualiser session file Hidden=false MimeType=application/x-sonicvisualiser Patterns=*.sv;*.SV Icon=sv-icon Type=MimeType sonic-visualiser-2.3~repack1.orig/README.OSC0000644000175000017500000002141512252354725017240 0ustar miramira OSC control of Sonic Visualiser =============================== Sonic Visualiser can be controlled remotely using the Open Sound Control protocol. This facility requires Steve Harris's liblo (Lite OSC) library to have been available when Sonic Visualiser was built. Sonic Visualiser opens a single OSC port on startup. The URL of this port is printed to standard output on startup, or can be read from the About box on the Help menu. OSC commands accepted by Sonic Visualiser take the form: ://:/ [ ...] For example, "osc.udp://localhost:12654/play 2.0" will play the current session from time 2.0 seconds. Methods that manipulate panes or layers act on the currently selected pane or layer. Use the setcurrent method to choose the right target for subsequent such methods. If you need an OSC client, there is a small program in the svcore library at svcore/data/osc/sv-osc-send.c that sends an OSC method and arguments to a given URL -- this is not specific to SV but will work with it. To compile that program you should only have to run $ gcc sv-osc-send.c -o sv-osc-send -llo provided you have liblo installed. Then there is a small shell script in the same directory, called sv-command, that provides a basic command shell for Sonic Visualiser. Start SV first, then sv-command should find its OSC port from the system process table when you start it. For example: $ PATH=.:$PATH ./sv-command # Set PATH so it can find sv-osc-send /open snare_hex.wav /add spectrogram /set layer Colour Sunset /play /quit $ OSC methods available ===================== Main window methods ------------------- /open Open a new file (of type determined by Sonic Visualiser). If it is an audio file, use it to replace the existing main audio file (if any). /openadditional Open a new file. If it is an audio file, open it in a new pane in addition to the existing audio file (if any). /recent /last Open the 'th most recent file from the Recent Files menu, counting from 1 for the most recent file opened. "last" is a synonym for "recent 1". /save Save the current session in as an SV session file. This action will try to fail rather than overwrite an existing file, but you probably shouldn't rely on that. /export Export the (first) selected area of the main audio file (or all of it, if there is no selection) in , as a WAV file. This action will try to fail rather than overwrite an existing file, but you probably shouldn't rely on that. /jump /jump end /jump selection Jump the playback position to time (in seconds); or to the end of the file; or to the start of the current selection. /play /play /play selection Start playback. If a time is given, start from that time in seconds. If the word "selection" is given instead, play the current selection. /stop Stop playback. /loop on /loop off Switch playback loop mode on or off. /select /select all /select none Select the region from times to in seconds; or select the whole file; or clear the selection. If there is a layer selected that can be used as a snap guide for the selection, then the selection will be snapped to it (in the same manner as when making selections interactively). /addselect Make an additional selection (leaving any existing selection in place) from times to in seconds. /undo /redo Undo the last editing operation; redo the last undone operation. Note that most of the classic editing operations (copy and paste etc) are not controllable via OSC, but undo may still be useful because Sonic Visualiser considers actions such as adding a pane to be undoable editing operations as well. /add /add Add a new pane containing a layer of the given type, based on the main audio file. If no is specified, use all available channels. Useful s are: waveform spectrogram spectrum timeruler The following s are less useful, because they create empty layers which there is currently no OSC support for editing: timeinstants timevalues notes text colour3dplot /set /set pane /set layer Set a main window control; a property of the current pane; or a property of the current layer. Accepted main window s are: gain whose values are linear multipliers (i.e. 1.0 == unity gain). speedup takes a value of a percentage increase in playback speed, so 0 is the default playback speed, 100 sets double the default speed, and -100 sets half the default speed (yes, I know, it's nonsense, sorry). overlays controls the verbosity level of the text overlays on each pane, from 0 (everything off) to 2 (everything on). zoomwheels controls whether the zoom wheels are displayed (1) or not (0). propertyboxes controls whether the property boxes are displayed (1) or not (0). For pane and layer properties, the control name is the displayed name of the given property (though you may use "-" or "_" in place of any spaces in the name if it's easier for you). The value may be the displayed value or underlying integer for the property. Some examples: /set pane Global-Scroll off /set pane Follow_Playback Scroll /set layer Colour Blue /set layer Scale-Units dB /set layer Frequency-Scale Log Note that while you can use "-" or "_" in place of spaces in the property name, you cannot currently do so in the value text. If this is a problem for you, you might be able to set the value as an integer instead (all layer properties can be set this way). /setcurrent /setcurrent Make the given (a number counting from 1 for the topmost pane) and optionally the given on that pane (a number counting from 1 for the "frontmost" layer) the current pane and layer for subsequent pane and layer operations. /delete pane /delete layer Delete the current pane or layer. /zoom /zoom in /zoom out /zoom default Zoom to a given zoom , given in audio sample frames per pixel; or zoom in or out one step from the current level; or return to the default zoom level. This method acts on the current pane (it only affects all panes if set to Global Zoom, which is the default). /zoomvertical /zoomvertical in /zoomvertical out /zoomvertical default Change the vertical zoom and origin so as to show the value range from to in the vertical scale; or zoom in or out vertically; or return to the default vertical zoom level. The effect of this method is heavily dependent on the current layer. /transform Transform the current main audio file using the named transform. Transforms are named according to the scheme type:source:plugin:output For example, the percussion onset detector from the Vamp example plugin set can be invoked via /transform vamp:vamp-example-plugins:percussiononsets:onsets If the output is omitted, the first is used. Note that you need to use the plugin and output name, not description: in this case "percussiononsets" rather than "Simple Percussion Onset Detector". There is not yet any way to run a transform via OSC on any but the main audio file, nor with any but its default parameters, processing block/step size, or channel selection. /resize /resize pane Resize the main window to width and height (if the window system permits); resize the current pane to height if possible (!!! not yet working). /quit Exit the program abruptly without saving. Handy things still missing from the OSC interface include: * the ability to run transforms with non-default parameters or starting from different source models * the ability to add layers to a pane (without transform) * the ability to add panes (and layers) showing any but the main model * the ability to set play parameters on a layer/model and show/hide it * the ability to set the vertical zoom range (vital for spectrogram) * the ability to import and export layers * a working pane resize * quick shortcuts to Melodic Range Spectrogram, Peak Frequency Spectrogram * the ability to rename a layer sonic-visualiser-2.3~repack1.orig/README0000644000175000017500000000755212252354725016623 0ustar miramira Sonic Visualiser ================ Sonic Visualiser is a program for viewing and analysing the contents of music audio files. With Sonic Visualiser you can: * Load audio files in various formats (WAV/AIFF, plus Ogg and mp3 if compiled in) and view their waveforms * Look at audio visualisations such as spectrogram views, with interactive adjustment of display parameters * Annotate audio data by adding labelled time points and defining segments, point values and curves * Run feature-extraction plugins to calculate annotations automatically, using algorithms such as beat trackers, pitch detectors and so on * Import annotation data from various text formats and MIDI files * Play back the original audio with synthesised annotations, taking care to synchronise playback with the display position * Slow down and speed up playback and loop segments of interest, including seamless looping of complex non-contiguous areas * Export annotations and audio selections to external files. Sonic Visualiser can also be controlled remotely using the Open Sound Control (OSC) protocol (if support is compiled in). Credits ------- Sonic Visualiser was developed at the Centre for Digital Music, Queen Mary, University of London. http://www.elec.qmul.ac.uk/digitalmusic/ The main program is by Chris Cannam, with additional DSP and program design work by Christian Landone. Thanks also to Craig Sapp for his suggestions and useful feedback. Code copyright 2005-2007 Chris Cannam and copyright 2006-2013 Queen Mary, University of London, except where indicated in the individual source files. This work was partially funded by the European Commission through the SIMAC project IST-FP6-507142 and the EASAIER project IST-FP6-033902. This work was partially funded by the Arts and Humanities Research Council through its Research Centre for the History and Analysis of Recorded Music (CHARM). This work was partially funded by the Engineering and Physical Sciences Research Council through the OMRAS2 project EP/E017614/1. This work was partially funded by the Engineering and Physical Sciences Research Council through the Musicology for the Masses project EP/I001832/1. Sonic Visualiser is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. Sonic Visualiser may also make use of the following libraries: * Qt5 -- Copyright Digia Oyj, distributed under the LGPL * JACK -- Copyright Paul Davis, Jack O'Quin et al, under the LGPL * PortAudio -- Copyright Ross Bencina, Phil Burk et al, BSD license * Ogg decoder -- Copyright CSIRO Australia, BSD license * MAD mp3 decoder -- Copyright Underbit Technologies Inc, GPL * libsamplerate -- Copyright Erik de Castro Lopo, GPL * libsndfile -- Copyright Erik de Castro Lopo, LGPL * FFTW3 -- Copyright Matteo Frigo and MIT, GPL * Rubber Band -- Copyright Chris Cannam, GPL * Vamp plugin SDK -- Copyright Chris Cannam and QMUL, BSD license * LADSPA plugin SDK -- Copyright Richard Furse et al, LGPL * RtMIDI -- Copyright Gary P. Scavone, BSD license * Dataquay -- Copyright Breakfast Quay, BSD license * Sord and Serd -- Copyright David Robillard, BSD license * Redland -- Copyright Dave Beckett and the University of Bristol, LGPL/Apache license * liblo OSC library -- Copyright Steve Harris, GPL (Some distributions of Sonic Visualiser may have one or more of these libraries statically linked.) Many thanks to their authors. Compiling Sonic Visualiser -------------------------- If you are planning to compile Sonic Visualiser from source code, please read the file INSTALL.txt. More information ---------------- For more information about Sonic Visualiser, please go to http://www.sonicvisualiser.org/

Path "%1" is not a fileInteractiveFileFinder*Vaechny soubory (*.*)All files (*.*)InteractiveFileFinderVaechny podporovan soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl)  rkou oddlen datov soubory (*.csv) Mezerou oddlen soubory .lab (*.lab) Soubory RDF (%2) Soubory MIDI (*.mid) Textov soubory (*.txt) Vaechny soubory (*.*)All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinderVaechny podporovan soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl)  rkou oddlen datov soubory (*.csv) Mezerou oddlen soubory .lab (*.lab) Soubory RDF (%2) Textov soubory (*.txt) Vaechny soubory (*.*)All supported files (%1 %2) Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) Space-separated .lab files (*.lab) RDF files (%2) Text files (*.txt) All files (*.*)InteractiveFileFinderJVaechny podporovan soubory (*.sv %1 %2 %3) Soubory XML Sonic Visualiser Layer (*.svl) Zvukov soubory (%1) Soubory Layer (%2) Soubory RDF (%3) Vaechny soubory (*.*)All supported files (*.sv %1 %2 %3) Sonic Visualiser session files (*.sv) Audio files (%1) Layer files (%2) RDF files (%3) All files (*.*)InteractiveFileFinderVaechny podporovan soubory (%1 %2) Soubory XML Sonic Visualiser Layer (*.svl) Zvukov soubory (%2) Soubory RDF (%1) Vaechny soubory (*.*)vAll supported files (*.sv %1 %2) Sonic Visualiser session files (*.sv) Audio files (%2) RDF files (%1) All files (*.*)InteractiveFileFinderTZvukov soubory (%1) Vaechny soubory (*.*) Audio files (%1) All files (*.*)InteractiveFileFinder ZruaitCancelInteractiveFileFinderAdresY vybrnDirectory selectedInteractiveFileFinder8Soubor se nepodaYilo otevYtFailed to open fileInteractiveFileFinder<Umstn se nepodaYilo otevYtFailed to open locationInteractiveFileFinder"Soubor neexistujeFile does not existInteractiveFileFinder&Soubor ji~ existuje File existsInteractiveFileFinder"Soubor je przdn File is emptyInteractiveFileFinder&Soubor nen  itelnFile is not readableInteractiveFileFinderXObrzkov soubory (%1) Vaechny soubory (*.*) Image files (%1) All files (*.*)InteractiveFileFinderNajt soubor...Locate file...InteractiveFileFinder Vybrn ne-souborNon-file selectedInteractiveFileFinderZadejte, prosm, adresu (URL), kter se m pou~t pro tento soubor:*Please enter the URL to use for this file:InteractiveFileFinderSoubory PNG (Portable Network Graphics) (*.png) Vaechny soubory (*.*)7Portable Network Graphics files (*.png) All files (*.*)InteractiveFileFinder`Vybrat soubor, do kterho se m provst vyvedenSelect a file to export toInteractiveFileFinder0Vybrat soubor se sezenmSelect a session fileInteractiveFileFinderVybrat soubor Select fileInteractiveFileFinderXSoubory XML Sonic Visualiser Layer (*.svl)  rkou oddlen datov soubory (*.csv) Soubory RDF/Turtle (%1) Soubory MIDI (*.mid) Textov soubory (*.txt) Vaechny soubory (*.*)Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) MIDI files (*.mid) Text files (*.txt) All files (*.*)InteractiveFileFinder.Soubory XML Sonic Visualiser Layer (*.svl)  rkou oddlen datov soubory (*.csv) Soubory RDF/Turtle (%1) Textov soubory (*.txt) Vaechny soubory (*.*)Sonic Visualiser Layer XML files (*.svl) Comma-separated data files (*.csv) RDF/Turtle files (%1) Text files (*.txt) All files (*.*)InteractiveFileFinderSoubory se sezenm programu Sonic Visualiser (*.sv) Vaechny soubory (*.*)5Sonic Visualiser session files (*.sv) All files (*.*)InteractiveFileFinderSoubory se sezenm programu Sonic Visualiser (*.sv) Soubory RDF (%1) Vaechny soubory (*.*)DSonic Visualiser session files (*.sv) RDF files (%1) All files (*.*)InteractiveFileFinder&Pou~t adresu (URL)Use URLInteractiveFileFinder,Pou~t adresu (URL)... Use URL...InteractiveFileFinderbZvukov soubory WAV (*.wav) Vaechny soubory (*.*)'WAV audio files (*.wav) All files (*.*)InteractiveFileFinder snmky framesItemEditDialog sek secItemEditDialog usek usecItemEditDialog ZruaitCancelItemEditDialogDoba trvn: Duration:ItemEditDialogOKOKItemEditDialogVlastnosti PropertiesItemEditDialogNastavit znovuResetItemEditDialog Text:Text:ItemEditDialog as:Time:ItemEditDialogNa asovnTimingItemEditDialogHodnota:Value:ItemEditDialog&& KeyReference"</b>&nbsp;(%1)<b> (%1) KeyReference4<i>nebo</i>&nbsp;<b>%1</b>or %1 KeyReferencePSonic Visualiser: Odkaz na klvesy a mya)Sonic Visualiser: Key and Mouse Reference KeyReference.Hrub po tadlo (doby):Coarse counter (bars):LabelCounterInputDialog2Citliv po tadlo (doby):Fine counter (beats):LabelCounterInputDialog$Nastavit po tadla Set CountersLabelCounterInputDialog%1%1Labeller %1 %2%1.%2Labeller: slo snmku zvukovho vzorkuAudio sample frame numberLabeller$Cyklick po tadloCyclical counterLabellerVCyklick dvourovHov po tadlo (takt/doba)%Cyclical two-level counter (bar/beat)Labeller@Doba trvn od pYedchoz polo~ky Duration since the previous itemLabellerDDoba trvn po nsledujc polo~kuDuration to the following itemLabellerBody attko Label PointsLabeller}dn  slovn No numberingLabellerNStejn jako nejbli~a pYedchoz polo~ka!Same as the nearest previous itemLabeller(Jednoduch po tadloSimple counterLabellerTempo (po et dero za minutu; zm: bpm) zalo~en na dob trvn od pYedchoz polo~ky1Tempo (bpm) based on duration since previous itemLabellerTempo (po et dero za minutu; zm: bpm) zalo~en na dob trvn po nsledujc polo~ku/Tempo (bpm) based on duration to following itemLabeller as v sekundchTime in secondsLabellerlHodnota vyta~en ze attku u polo~ky (kde je to mo~n)6Value extracted from the item's label (where possible)Labeller6Barevn trojrozmrn nkresColour 3D PlotLayerSmazat mYenDelete MeasurementLayerObrzkyImagesLayer VrstvaLayerLayerUdlat mYenMake MeasurementLayerNotyNotesLayerOblastiRegionsLayerPravtkoRulerLayerSpektrogram SpectrogramLayerSpektrumSpectrumLayerTextTextLayerOkam~iky  asu Time InstantsLayerKus  asu Time SliceLayerHodnoty  asu Time ValuesLayer$ asov probh vlnyWaveformLayer(Zdroje zvukovch datAudio Data SourcesLayerTreeDialogPYehled vrstev Layer SummaryLayerTreeDialog Tabulky a vrstvyPanes and LayersLayerTreeDialog VrstvaLayerLayerTreeModel ModelModelLayerTreeModelPYehrvanPlayedLayerTreeModelUkzanShownLayerTreeModel<b>Vybrat stopu pro zaveden</b><p> Tento soubor mo~ete zavst jen jako jednu poznmkovou vrstvu, ale soubor obsahuje vce ne~ jednu stopu, nebo noty na vce ne~ jednom kanlu.<p>Vyberte, prosm, stopu nebo slou en stopy, je~ si pYejete zavst:Select track to import