From 2cb59920fbcc6943797744a036b2a007317d2453 Mon Sep 17 00:00:00 2001 From: Lyubomir Marinov Date: Fri, 3 Dec 2010 14:02:45 +0000 Subject: [PATCH] Tunes the implementation of the blocking PortAudio stream interface op top of the non-blocking one, and the echo canellation. --- lib/native/mac/libjportaudio.jnilib | Bin 494792 -> 494792 bytes lib/native/windows-64/jportaudio.dll | Bin 144384 -> 144384 bytes lib/native/windows/jportaudio.dll | Bin 133120 -> 132608 bytes .../portaudio/AudioQualityImprovement.c | 7 +- ...icator_impl_neomedia_portaudio_PortAudio.c | 193 +++++++++--------- 5 files changed, 105 insertions(+), 95 deletions(-) diff --git a/lib/native/mac/libjportaudio.jnilib b/lib/native/mac/libjportaudio.jnilib index 4dfc943f03fb4079eef6fbbe3e03856578e6a928..684da1bfa7dfcead5283c18f3aeafcfe2dbe8235 100755 GIT binary patch delta 18461 zcmc(He^^x2*8e_-IRuIhC@Lz-pre42!p#&DYe+|jgu;@dQp4MiYhAk+3u?^483c;c zQ7<&=#!@e)mX_TxEiko)G=;Jon0nE)u(Uf9{Xk2@H0S$SXCKt=egAm>_&(2j9$|gf z-fOSD_S$Q&y=TtG##MtGR}HQ$j0~^r%~<_LiB)bZj@%g%c}TwFjXBCgcRTl_Y(D$u z)VbRn(P`$Y{7A27Xb;OPyCtS(StGQHM|SBb?B2XRk5u{@o;=MnZQC0|pOLyhvjKH8 ztPxASo3{O7*chq%{p-659`Mc|zM*%&VT_sMJk%;zJze@;m_OH>m~f-?ckk?kiSn7j z-Zcqhq+;*Egjv#O-ju|ADcM_<*f%V$Nn)jYqwn{|74-EUPFx$S*&|hZSX1Dm{V-qG z6hlQOt3No+>rNUhz3*L{G*r^OA0*u>IlRhMLs^Rmx?J?;p}T=p=~etR2vY`^^!k)`(}tGT-jFKSbhsckOloSLFewwko5 zv7~w=RBQHA5v)Tq0 zohrS|T;1HJ@q3;!se9BTn*C6Sy-m9(TAgVPLy(zB!BcxM%Bj&>_Ad39|3qgn=$2-+ zMHQV2{1u&)7Pm6PSI;xMf!wmewaPn(ib?km&-r~)eC z(y~gpTFZ`rcNS<hLkWw&)S9IMV#)qRHCqobg|ppWRNfQ_^6WJ4~Mgdjts| z`#@q#Z_lBcWBv?Sm-MA(kC0kbmo;oZrix~h2xsyP>O8pEm1ft*BEg zzSOkG9LKa-=ytY6Jr;6zvNk1V{0C1ztW8M{nIfFxvYOn~@u&_w0|K=+Lv5ukF|Ht-FKCI zw~KVy!&J9@Ic(H&W7OPAtr+XnqUBmudxe_2M9WQ7bIY{c<(iDahv~iNR?dVwvglHMRj$mwRY@?iTak#-qL4yfhuAlMp6i z8r2qUFF#-C&~i6ns8-Fs8m%pwy-~|O02G75SS@!iNVI16p(GOK+UsF1d_+M4rLbx{ zsXN;jFn5!byL!KU1KFmV6|~pD>hbm(bJ;(c`%2&Yd=iGRL1dSr&r6H9F!Pd!;V1L5 zTXYN4wFh!Uj(HV*s0~R+_uHFE>wfzoB3I_PyvbY^My|GR(sH+qv^Nh#n#gY5Z$D0A z<8zO@dbpMG_SUCDRlB84S669Lk+PvtA!%E)L5&(`F+IY(>X{sTJCYl-W-*C z$nf2={d!WkYEmD=r1nzHz5z3`Voyo&1{39)6(1lM7(o<)fxsix@Lrgv$CCR>FfmMF z+2@7b)Q&PF$R!Xg*-KF>GSk8WwYbfg>OP0QV&*_U56DbWA?wae1pJl?*^{A@k; z6K(1hx0JW*Zqj4xr}y;vrR*8_jkX=#a(CChVBe0E_5UU6N}?H?I-$7CTvkE7>+u&j z4p>^e3Hh}z`VPEBcGAGd?zcyGO-e5EK&6@+LCZTgOsk+7xjNwBNnx>Wuy^+LgWWIC z8AIP%R5*0M$(jt}cTwp+$_bmO^qRE!F=|j=ULmAoN&0q@-jAWrz9N}!_5W3uEV@;* zx1mY_QDYE-ch{Zn>(M~&*+Z7Z>e+|9eZw~tD{`7GFS zU(xMIgwPX4YcdZ-+U!^os@7}GWyeU{6g}a7tkQ{eX{tVc_Oe}8_dK^sq%Y+`J;{HbQ-8;SOM#ss!c6vV;Z5<#KN8jJH z$EB2ZvZwvpq%q`*ik&Z{#80>%4dJ63_f3kBaLj?B`d&C$FD^{cCedE17p01#iAM9} zo!*%#15-bH7v2!ZBNGI4`J#8*_f~3?^o+Yruh(633b6fk@7yuN2mR#?0#KN-9;NSz zv{!hW+UnnP+57sKSocOdmhV2K;x_fH+Ie+b4a`JS5sKnB3`eg8G@|*UjjwQ^7>z#6 zvCt2-xmW@1m9!_LTYK0w3j09dnhirgo~C)vkLxd8?~P0wFzzg^)=Kplj%U}jT5{?4 zW~d+hN4{l z+l;<{v^QKiixgo~JfuDmsdoBV2PKq4>a7-7;6Ljfc~hc$!L3)<|CJL&>HFBdXs%ug zhda#b6FK8 z+YPr&jd;X7sx)rB#GVN?mo;Gz6+3N>px41P3tbNOtvF+ZP&-zRL=6AwfLvH>3% zb!D`<&6-Solp1{uMYWdOj9zZN+KXIxPgf7_B6;C7Vubp0h$8dzKjQZZTQb_6xGy4b z5*%$+-@c8HMelYRK7SAa@q3>Kl60$ZJZnCY7ZG?(56Ba?XtHt>>FD$ihEMbfn5RuO zskfRu&)f}vm4AyNA`rw;On9~Ekk+^Spt-CDI?tMu?X?IP6IpQpGvZl9UM{DhP0?fL z9!w&6^a))$vUHrcTYAE6w~_!R`Z<_t^jg%cO%WYazoTf<&{I!3jKp14_f3XS7jZ@1 z!t?~`xOaVeVfZTSs1ymSyq1Xx>FTdg9g2VqR#wu{02TAlNcWQ3;eV|CznqkU6)Cn; zuY2N?;qRUk>SlN^PK+D$)&;UO3{yxa*Dj6pIU|tpn|IvJ_x0XyKLBU3)bsEcf=x1) zd%PQNPMb6phUi=8b5A4Wu1Ez&lY#bTWXE<5gAdiu-DtbdmM1Os25DMoRlg52ym7Y- z>NADpix2IeI)=J=k7hgY2k-P-#w4a)`GlkH(eAR8A9VK9CZ%h4*;H(Nxu?Kir!9;w z4|?CYW$ZNc*QigYmfdE4^CPY3l=;mL>C7(=w=Ip1YWeZePyO%~KKj#PG=h3U%pzBq z{6}lCzjR7Z|E;|O>zzJMY#U`uluQfrp!vRxr%jVg<-To)GbG70Ew8-Ed+gRnO_L_0 zXzHY);nI)m|D5%vba30ei&aYe5M%bj3JdUF12@Cs(b&bQybbsz19t!`y+k>~ND2%b34GYV7T^@fQQH*Y*b+AN*dtQ*o4NC8-_B_Iv>(m72=u*bA z*D{NPS=#s^h)CHy!Ylt(n#f&V`R~$h9=lu~7rwWv9Z#>8llY3|a=g6J&+C`VBc%*} zYPtL;X*|zbA=`)Uxxwj>{+`k$PiDB*k91x&<<17aVTC+eYT$=fpu2D$u~MESeaLfG z%2Op5uU;v~No#ohN{CG4e&Sp_jLQ?GIeaqL+ZA&8hCZLT77bir^RQ_5`gW&#?@!KY z!Anhi7nc*FEM1)wb+9{Xxpf7+c;5vcTMcy%K5vDbg3Yd{2X-0gah;ps zbRECJS$y*}XYrs(PR}HSpB(y-D_qRb?H*IS>#2bYG8W5YJh9B8rn5Yke7V3C65<@K z!l{F#BgI3`9C6Q%>FZw9|A>p-7VWkjjLujqMR;5+WrDBuvO`*X&P|@Tt(EddzsOj| z8WstBVB||ETO;kQh-DF@Jxt12%X||shzS|Fm8n?q1EJT~B=!?f&p5r+a)yv^ypc z?T}u&06o#<(?#X$;n&V0_lrK*7@P+i!`v@5+JN(+|B@KcQ3(UGU)vwb3rOdpz1y4) zcK?SoR~d^jrnN^yVCQ7iGaCO?4A9w_&K@dBXVx?iKJ3k8iJnVrUP&x7dFQb77aCZa zgAKe9%5!KST|b_C7+bXAb?2h5cRCk+xQ*YkPVU1k8)an#3dnK~LjPTw+OUvUrUidB zQG>L294@EUFO-=2GgengIlQKwF+^jUTg)(<>lwr>o>?rpWFm`kACr!_*7k~ampN>4wcOS?7j9twrq^ukk3uOy*Wf*}_cJ3S;c_oX`2;tOx@;*6s zXGYLZGewT2I{M-HYvum#C&bEh{V>5vyX-mR51# zh}%68%XpTtj4dD0GAZ3Pg-Pa1QCShZ#N25cVXD!Xc zs#$0_*X3%Cblu++Io^UC)D25qjij^^i{)lB{Wwgq}24^;glw zc6bvWb+68eb}!6~cKvw(g3is?c?Po_7yCB464bq_mGZz`i*1w#W;&QOSB#$W zz^XGaChd}?vvSe;*PRF)$t$t6Mc0)&y%{WhQKIHt^yo{@MbEECUg#I)jyV`jBPWAy z`h}spTI8|I^~tfwS3Wk};f80)-HR`>0wl)BQ8;C|ceXnx)L{M7Qa9~!x*taLvU?7@ zTmu(SBR$cqK5D|qH)OoPlK*$c^evyT8wRYYrBxI`h9O{U%$_?LE8hF0v-tEv=b}ko zJ<-t184G&ZI~u(}dKW^u29-`)uoTWEbC`)+>><&;rv=ZY{0}N(GHPka&5 zc}V<t2*^NnP1uWQ_>g zTpg14q^n*4?WGkmbHbvB}_|VW7Bls5%cgY&^U5O5QR~#M9Q&-D<+%K$y0-MoUmqA?$ z%KuXV8n!@whS8z@KRV3)4|#pl!iW9OXOBV|;>C&8V@bnX6_Tw+@=?!UWWdx6TISOd6fL)OkV%8oXpEMVzfVV-$r?e^c(+rqnsdJqFV=`KgKNS4=~v$zsh*lCOJ*i#kThOkGd_J z@S522J>rnqiOYES01uge?Uo)8wRo3)x1mOO~< zp_JK1YcOjyd&sjM3kfd?U~(Sh9x}|&q73f}zg#e5W9K4Q_?#oIY15Cm9?S0=yD`M? zdLBIM743Ruq|=o@AUX|3IHYH@N0#A0xkelyyNpFPsQYY-{A>^YXq()lSFrY$_nBOJ z;_rz@U|YHKT{+fNIq2_+E4RrpJn~D~^xXD$<+|3O5iO5_e7t)`We^14DK1-2$5#K4ZlgI1<=pU<>d`fqQ!x z>vOYNazmDxQ^0IAglvrU?P1^?;KvP|54_L7m5lX^6Sy}z=(j-N80hKuvB1MTjKvHx z$}PZMGLVlsBFg*u5JCM%3Z{>bvHorYcK{y}xG%~FBpMAWfy)h?5B#-(875$iA>RzV zMBw3(z$XNbLEG3-0@E2a)XwXoB`_uwICUCC~;5q|0*M*gs`bF}g zRi;>Eg7hj=)&srT`oRV~f#;zWPg_6lqR0Vt+dEA2B+1X?&zh!2`SE6)p0L|>!u)j$ z&YDJtL_U%=Z|Onnuf6Jr&2<&p&c@f(pEGqv(N`-Jx#JTHa)S(BJ!X`dJB?hRKgQrI)-8tl`&q?^K{HdrvRaWviggE7LV+qJS2tjq8`fV2@dsN zO@Tqr>O&x#h%KCQ)kflH;MG%?%?`Sv;?Ue-{!#qX9?CfR{B$1HQ%UW;XF3V#Pt6^}+n6KpbD&Q;Cz_=kN7YhD-JQG=$^d!B@-e zUv+iX6gV3=g%qYV zQ~fgA{HDul%kb>7)}T*(`){Rk&1KE=d&;i4?{qziv&(TE0Xrhg@VKloxbB1lH?yaH zpSg6hHOHaa>)W%hIGJUs7qgPu9phUa=385*ElnSlsTEoi9kXz`<{fb6WQZ`Tr{Ff_b}ZKQjGVL+o*9KwMp~)&>E8NBf`pm>&nutO!*3p-3?8TM^UtCy z1A7n*Qzz0rsY094a)*o|U(+~PNp00HNRh4~Ch#O)sbOj}HQf$#c>>-Q1hRr$8mPoX z2|L>scioAnc?1UdH3-ury@8&^>pA15KsH{9 zIvv{1YE+QuJb%6}TJ&JH`dgOy&DT9-tF|8L08Tn>eik3N;ejXTW~pCgA+&uZwA8$) zPDSxT6o2Dig}YAKNvAPK!?VR%7pD2=3f+1BbpU|@@YB_h5q5q{ zb}A&M+i95jgZ~S<-84N0EgVbl%5fy^gT6$66Wwt78@$86i&k>tS`amk2lqHa>=g*e z$}DX+T`)qB@3MN}3I1>&Wt{t(XovHdwqhP+@KS790cLu?eKiEHW(!Q}E-Sg)|0u%! z%Kg7@P@=DgH2|5~WNQJ*k=wfh_*XI|snec%zCB;eq4=HUrj_wirh3AG+j5}}bq{h- zW{Ar=7tvXnC7pL*i7as=$fYg1!c6Il?D4-WO8XysSs{9%Me=HDDYQ8y>UW$Nca z`)c8%@wuzb9FvL8SLcTmhg;3Sy# zjfDP1#XXJUkDlTG?5zxyGZylndMgRCbs>+9R{G1~3;DQcWyDP_5QY=S?3)xLA)n~! zH{8EdFD*>HCeeobUlE1r5X<*(e1^XitqkZs6@}E!?|Fv%qLn@a67&L*GG_s|zhS&? zW!xO2B*mVksDXlBsLR-8Tzt7xANyrKBSx{x8#4GaG0NZ>R)|te!!&fU(??NJkb$sO z_hOIgZ&;k~U%NoKV+;ZkFL$weaO}}$`Lnc#JF>LLJDUP7NQf-UV+Sf3@~6M?2L>ub zEYtK?=2z0Wx(^<9XtBr(4_R?tJBzOysN{E_fTWmRe#%@Xn|MU5k~Y+j6tSp-!?;m|Jkc2iTUS2K~`zc(*~yq#<-8T31{R;80sVJN4epWw#sCd^7*+ zASKmJ*E||w7VcdrovOIzQE%`a;LYW4z)9xkU)9&H4Lh(sGVmf5#d#pcGPGO#bH}0! zis%I>KbwJDB$1?U9hyHQ7tSKQhE&T7adBppvPxG=mqpCayQd1hX_@NO$iPj+ARgZ; zqN8IO=@;+)$sg-+VI$QScnC7r?hOvjmZ&$TJAzo);4Qk5=fRVA{`?~@7L?MMa0}d| zP73RCMfqEd-3$2%Sfl2$SD+WSJBsT4FI|VP_qyEmH{CuFO1*9|#`%mc8>t+{f%vTX zUR&5%hdJ4YDR2ZHKo!lydH(rerT@*eF*-^o;E+*W})Ei#~P7=tM>ic>%GKsf7XtD=n~@ZhZU(g@IN0Wh^1SEKW)8e-OD| z*KqysHH_eYjZM6&5JH-?WH1J}JG9X={09~qlfm0I&eEX^_B=7;G zaQ~!y63p18-|pCr_Wx1z8vo3qWb|{Cx)Yf*(xKgfeA9&M9rwhRA1oTiN5w1sCr@bF z)0Hup_8i@Wg`F*qYKQsF2FHU39WCEF9z966JRE9E>OsdZXXsYPJMC{$s%Q$_2cJAL zs%}%fvP6~|>u$6vcgoVnx{Be-bFw_BlSd^fm*qjf@Td{WmvY4Uy0ascA(He^U7utn z?G@>Py4w#b`G>E)v{C43+3A~E%&ogzIa>9Or=Mz3I z@GQd30%sE5EAWkk>jjP{yhY$1glhzLU&sZsTrj5zR|wof*d_38!UY0vrp6Bmyn=9^ zz$JvU1b&>bP2hV8j}h2TI8oqK!m%^m`p5zZxap^cq`#c_vxd5gK&qyn+cy1 zcq8Fff!7f}An+Q(K7m&e-Y)P8!kYxH0(J*h3uY-*R0^yTE)%$%uv6d?!t(?!CY&$u z0>U!{E+Xs@cs}8DfgdNFBJiVxtvYrOx{>B1MpVQTju5y9VJ7ee+&T&Te6Q|_(}ev3 zw-7!q@NUA*0&ga~SKt+d>jl0*9d8l1h{|i+f|*0ia)Gl6R|u@nu}ffmjtd0V=lCIk z^*PQHSfAr8f%Q4I39L`?7=iUEP84`+23Zs<7=4Z-1=i=-B(Ofmowz`WSkdSBJAw5% zZsWiGBXpWO4BPiiWVAD8oGI`SMkZqsERk)Y0)|i4F}N%i!zA1<3Sk3rw`d?UrNlC& zHkQd9pm>=s`v&3d#9$`p4`vMSMr9u;Zgz#(;uy=1V{%O#lW@@~BqfQ-wh_!^8OcIw zM=}L}qQh9-@i#-$Q72HM&RhFQrldEq- zNhjX{a%E`u@zlei3EXlx)YOCie#v4qEanaGkS-L>z0%SA9i$6IPQK%v&>NJ!fX)02 z1eKow+xSWJuUHkvd}PXKsfJG{;^8HNY$Z}jVxy%39#s#L&ocy>Pb7!0BVyw%^%$bV z=(!t@+7@b6u;nM-&2QQPABIt{3A}PgXxJ4;^yl%%LlaiMi;*0HD5HzIcoy)g?HEZ! z7`8)%Aw3WCs;|(xnM5a}+=C=dPqZ!?>O#@nS-ji3p?~PH9k`M%{^EI*&v_?wXpd7U zYBq{EC!h3)#>H40orLflx$03R3*~;Exf5ft<%{YmJhdHt*X|6p&@gvmE^H5rs;Bsz z?QpOQwpa4hU1-$#CsFe}Z+Q=%{SGzo5Nf0f9<>`YFcYiAM-Z})3fbAz|48KkYAn2D zH@xZNTOlCD@Bp~*w7&?sJU-`>&~d!xx6m-Sea?H3aPn2}LB5_h5$EI5`=r;9U(BcP zgkCyl=kWROhu(o1Yxks=79uHJ`T!)7rxNMla|BmKB!xE!?hFz1w?{9WPQ=Dbh*tBI4r>MB4ZnQ5fH(i%chiWkjTa zZx!UED2)0DlZ7ZFlEX_t!mC|kj$h*O--jkgbVuA2ixLl?{t-+pLy?0geT*h;d=5ys zW04SeSqLQKX0VU9kU$I%KLCP-dH|DN$*T_NwlsjO{AXww?>vCqX5;aQCJCA9lhCO! zaor~n!gz^by#EZH8a@|CBzk)2*%bHu7N8Uj8~zCy3qJ!A&OAcqkDQV!DyM&{SC$a5 z@vTHW{3H>CeX~w7h+uLBStklxh_rF31*Dm$3NlBKDk5#Xfe89-(d|w;2!eG$q=K&^ z0`m_-B%e#4!9k7m$5MFiH`W&tUI(B583ZEvIwCgSLIk5d1cKQmg4q?MibxG_AX3ZE z910yLhds|n91b0e4(1$2X#uYy;^7TMU>K2n9)CnHoPGorZQ^tOMakm`l1C+Pp_)oA z{R^akrxL*c1gRnd-wJYu2voJ|WI7Qn7(up*!jpnT9o0oLh+vruvhFDQcJg({5IHlj zmE>`#Ko9|@k<3VCyAC0DgYq35Wx-u5}x?7@c$A$3o9G&{dxtz_XNcKTs;wbM|j01AuwI+*7XKEj<*D` zTN_*tJ+S0WoA_&QVIRRvW48{Ud!-f|O#(vm0+l8jrQK)~jT2tSlz*uYX&sST-a-U( z&<27zAcE;6Qp>AA!kM9Djxc*Q(x;7|A%PSge-gyPr=P?qtGPN;68M z`Bs#MCmQT9E?t)l=juL$Hu`KI7ODI0aLX0Z!}Vxc4-~oNo&ovc#S? zPd~-%AORmgLnMtSeFNg*b3nrD>xH=PYW*-%&6~c#kYe}+60`8se}g0vxj~tMwU@%z zQArvgFZ2 zgVgXjMErb};9A;YLkbw=4BJ2Eu`bgeDB#&PplFw5+L8|$qL~yhrQqPYPvGJ%2->5m$rqDprSk;{ws>oP;?PR5y%5EM!W9xDIp=G zb4HL)dn+`l2OafWXNWFhc@^p~2^Y{hywNDdWYcGYScF9@zxN_W9K+R%FtC<4fP`1i z60OH`iG~WXO+4um#IU&&LF%~#>1N(Q9F{Y<@Cy1r1@Ii;^J$l`B0F37oZqm)C-Tj| zK|GS5Br=!xzYGE!h-~625p+zXlV2c$?K%h&!yhH$;p>9vriQl!LsQI{)@z>)*Nt#@ zT~6rwgQ1`M2?-krT}QzOMg5s=@c7WEKNKSRbrpPoq-QIBh{uOW{b@3Ie4x~yue*4B zu%t(ZEactvDN}z2hyvz|7yPXTUprjz_{$=_1N!qCdb<9&2%kXphqeYXpvK_o1g{&2 z52W<`YVaurKNNw{Q>wc>;<_Q--Sqc6^lXU43wj9J4E`;Hr;p6^42lx2V`0^nn=saf8Qq0{W8* zeN^9UOmDftw;B8~gQxEk=%L%?B;RK6n!)SeGoU^o_+IqogZ|uvxT6LI{3Ps}gYO^o yXAI2N?HVEYXAK_TVd&4ly6T4tJ_&v#dHQ~Xo&tlfF^0d};0x;Jq+R!?8UGK9&>TYm delta 18575 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 diff --git a/lib/native/windows-64/jportaudio.dll b/lib/native/windows-64/jportaudio.dll index df055927674b14bfb56de577ef337a2e0f9fef99..cab3f2db4851b88d8643b0cce2c1227e26ea106c 100644 GIT binary patch delta 16857 zcmb_@d3;P)`}jOJnJh?dNG2ltGKnOTNDxGXj3nGN6GDOnMH@m(Nh=7&APL484X1k1 zR=uw-l%fWMswP2VD-pG~8m(o<8vB;!{+@I19Z_$;zxSUvpU;_RJBU>XS3b zHmdlM3<8%$2rMOM$cM_TkO-9A+{qbSo_0Xyl-;OTR)H3Z(vf$I@PQEFDO&V{*?MKY~JE zZ7mQ40hwu~SJ={lh@+9XI%>pwuV_&ser$Y2vh_!@#!=%i8x2^zOjjLwhFPm7b6UI& zBgo|zLztgyNkYp`%&J=QUQ2(NL6)?PXH#mi0fv@b+2JCkWuG6ZZRr)`OL-*+!a4o< z;UlfCNENUFsS50;dlm&!))Xl=N;jM!o~_oj?S8`64{Ygtg+j4A9Dgjq8G z8A3if4hlA4F0!c|LA9<2b}bs1j(l_!chT}5S?O|Kmy@nPHki|&9-6AJ8IsMF+zQ0l zIKv2aanakHAtQ@MnkT4MCNK(p6EZl?kP^;rnbKWrY~`AsP{}Slk1n)^l)!XjD<`e~ zk92*5rSH$Ql_{|tOhJ7oK^2GI%POWi2&#o>h}soY2Pvj2yUmuC(I5?mathGh3_%r% zGIq;{#hk&kNEBv|=JZxB;R(m~eL_84Jw`nks1SXR<|6JDd1V?~#l}@=*qt7rS>%CT zS^-=_<@7tWnqE|${ys)kC`PmvJ(N`x=?2P<1ywg1PsxG6xQgK;N4=>Tv0oa6^oUB@ zI&H+^BHsbn#DDTY6*zqcXMNs;L#6tvJEOSyjoka``lp;x8?T6~OOI%#i)eF zOELHmY;wsh?6*pE?PPUAaWS8yM+cXevSrW zBnxOje~%7WIADPx3QP>qt4NnfwCpw3Vi!gX ztpk`&&&a0Mfx&Z8N&`%l19S`hJKYdVT-yW_w>GU{F7a#Q3xxD&6XZ4TsUVbNy>PAm z2)6A$>z1R=viO9NDQ)I?9y;8dyuS7dMJCOGb)<#65A+~m?g6@QkjWX9S&sxkYm7hq zSP-g9R*H?#r>Z%w?6Kivbv@E)`m046gR4GAooqR!#yVvc2E>b^(O+M;0yakZ-DObB zWQsf}z5#J|aU+AxFMEu?oFN&fTwgb?Oh7BFXvIja#JysspJ-;>D`xUVGb=@+ZFYu%gvA2+POc7t<{%o#YP(X+3QoBFl3-1iz|oceKzWhWxuCFA#1W_H8hg4 z$3+9_9G~$YHu_37)Trghl_V;PA~Eg7?3&bpR;(y$hkd4us3#e!VE1{Q=}ahDi{1g} zYObKVOXjLFvv8!YRL>P-W0zw1G;p@m3ym7sl4pow_9`sXgC&b?4V;^$MUX_aC@HoF zw$urArI>*&TSEdoRX)YlVm74f4;Hn-Z9!0lpm(i)LasHA4Dj^P4Z8Q3+EXRg!U)#c7Ihb|g2vLUb4R)5SW2lh)D8MS%m1YFuV* zOA}qO?f$&YZJb_MPoILSGKqc{rBa5vEG##&s;#t6uf(e|L!rEfbTI(>ok>O}# z+}u-8VA~4F9PcjomfTr(6GZ_N(OJr|i;q>2rD)e4kgr)W6?XboSgosbmDE0m~CPj0E|@oecXS~-78F_({x zap$1MAg*=T)h6s}9U9J2=Nht|(%CH!ZL49bI*T)uP)8`tp@s_CQX?9|HD6m+$1W|z zEZ_{$`Y7yaLlP6s;7PEl1~V3`h+Cd?#K8Wb`AeHY^9qM@JSM~T z7L=#!AErk%rY9W8)L)(Ekgh*~ixg*~>Mq%izT*Y4CJS7bn#$ zHBOmX>Togi0Zs}<$$rozTw<3lM57!$Nz>PJ`sZ3)bC=_ZNes8B+eX~BzM%n*mRce< zfOZT9@7)|cp~2J8MUlP=WB28(skfwMy1Aow(dEUu*496wHOa78v4EW{r8#F{#9rYH za}^H!Pm4h1CDbRE;`X-z>skwO65FOE`PF{|uw+5N73TgAWMW`C^Te5$1EV3FTn!8a zN8%6^qFdKOp(rn>rzIz@WJb7R7hTMX+h`5xxtV2$i=9&q8s9WbpX3D1#3DCT8LiMG z<}i0gArv{&Gu(c<-*EW@@yJoZoxH(rsY=uoO><1tjMuQARHQD_6pC7gWlQK#)fMf` z%&*|`tMEj6(vpsc`O3_9DlB$5dQTemQ0FC2f$dv$vmBf8a&1v4O!YzY8K$qAj8T8o zW|e?>ZwTEP!eEa6g0rriC_~d*{(-b`25)BZ0?7-_W2S|W?V%lEq<>67_W{M8K3r>a4#kxkKjtup? z?l0T#LAm0csbTm?p`J6SVxNHgCXf-=I82Ms`T-&=yq^OtjaEJW)X}q820F!%;o7 zS$&cpInY7v|K(GRs_bHsFNy`#HecGn^Ogl$kz1oIAr4VN%9|3+R=b5aCvG2Ky>{ILeAOC|8Smx(nFLC5YB2 z%kY=})hMUS7`;U)EeBONcWRWwo{+5Q_Q3~h#2$0nPZLdFt9N<06B$OAXsn~vSLu}& zvMM?REab=NfR|%|Qr)N>opqb#GcIo>V;k;+9BxVw224j`Bh|Fq-S6-vCpqeyw40Jz&aTMK} zGjrav=kx?;RQlAAxLEg$czBww3ECWp*<&+bVqlgNrk7Fw8uEkxhh z2ry>0f0fl&)D;h#Mr9<%&Xzh$y3es9>QWw!(|RA5CmQNQ(XOX*ooM(sy5Jd=^Cjgq zq*t7eXClVQmVPHm9HgKJ)R4(>-kvFGL!2~~Kx*GR3Fk|nL^v;vuFS4t17pNe&I~Oo-HITtw;+U`o zvZ%{9%=)F^j!CvXVnfWlRVeW zxuP{FR}xj%w|hi4SGmZhDLWx4Ml7zw29>K#jLW5$LD>z%FRLhaPgFYJA>VfmgP+N{ zuKq2mZi8a>HB9I4mUn9lM&i{i#C$3z}eA?vFKF_t7%Q*I{=>(r=)Zy z`#Q-^3TE10C)1P0!;hps$+PX|YjPXVBU^F<;wsAO^s1G_rI!y=bd5yz3S|agBLjO) zhAX79*C;3@LA@t49#_fo-eciA^0ap^X3`bXJ-Ig%eTB?Oj=^zXpWGXbTar1Z=ugr~ zV}z@uLbH&0^AD2Vrx)Y*2hsN#2>&J*`vfrl4y3V9AY<=9{8JK`bO(}`65RJUrTAot ztx@J*l~yI})$aT0ZuBH0$@znX$l?d$?3+B3Ly z2I}`u8^{^)M5fs#o`lbH`uq5F$)2S2>jP%8px-2TNJ9H{Ac0&wGhrJU%JsKPR4`;c zH^{}`4o`u`G3r3AA-;+@rr%?tOs41QWx(V$k$D*#T)WbJS61jFknY+BXf#D+E&`_g z3smqh)%5oO?CM_!U`I8QrU6~yV-lamF(EIAE~_i-Cp)vW?va~l4@6ZY(OsX-tQAxT zh-zQ}Gv*2DI&g@q7B{DtjVEOFz)1Lo930re#SM2|oA+bnuYrXwou4&x1Tu4w8NMN% zvfqM7>pso~KlMYDVvlk93*r^ca+WSVctYdwi6Z$v$Io*)YTz-hh5j54Tj22h1?7Uu z;UT$_vj85G34^D?N^%*0SCgSbdNT2k$ciCdnaoGz=OMo{z7I{ChyDq$kSx!O!wGpH zFAVmPn|TSCe4)cME^TlES;O%rFQ}&9AybBR@O+LF>2+sa@0hj^^8zOKU*!1ku?+l+ z#E(d3d~TEJBf2o5w@u%T=*Pen)1#5^Fia#My?(s3|8C|kJHo1?>0w(@X zGIo46ll&*yGu{W*na+$q&A=nFX~HGO;dioRVg?3uZsHHj;7er1d+)Wb#{0gt78hUf z0kNPuV{)Gq1g=g?#m8J-a7B!_UrPE+9t69{ipk}E!V+9I2dC+O*5qjPzYNyu4-Vz@ zC-6D1(QnogQ=dXp3ue@O)03Io7`SWtc6I_V@6Rz^onr>)^)tmd(?29%&CPf2DN%kO zlGgJq%!Cigi+TCbWEwSp1;8fqsH6}|NI_{A=WnNpwcMwh)|Dy&7xWEflbH7pl6DI^ z`mH=jr&=fc)#z*D9&3#KAPt`%4QLQl?;Rv#7ktXNRS{<4HrQ+0v9KG1&l7L!{g^o) zm|87v!N9kswo5M9x12Ib%v{Xa-$-Nmhj5-0FM9#MnTnQ!1KcFjRvuvdw~?N!lHe?v zxhe#HH?3LK8ZbMyu1*0xdARz0CS8|)p(JR1 zFf(u{Nn8IW>?G^ff8{(PN9>HLIb`4lwR1;_D$F5skYXfiLJrx8)ah(db7T%VhtztB zdMk%0zfF(qIv87=%0`{D#$qnhbXBwvMjOzq*3(e&cP25|O@5vf5jeL&~Z%Rb}Xfpm(qH{Zm z`XGvII@Qnla0kg`6lpwF5v`D@83;7HBJrwZdF+U1+rGZW96v=u)wIPJ@UM|#joBTD z^%sAq9TH_A?CJi_qa-4$11UJ2l4!zV_T+f53Ebu=FKuvOOg#yaBq4$)OZhB zm>hEuXm<6&jI(4v7gG{1Uo-z$?)fx;t{!^O0CP@CcC9<$p;hJM3?Nat%apq6}htw=STdd{z-@?1m_ z`sD_auGe{}A;+)hGLr&GxaDoeHGnL!41^!ZCCdnAq(A9toe9@WX6t-l@_kK-H>>Ef z)O2eWFfr{+v+nc)xMTX^?jSq(g1A2T3XewQWHw!TadWtez-vocpd`J$&}|o z%!rocljniDeRv0YwVv%MC7!_y%9A&7Ta<^D-TEIzqw4Xk`;}?P)2q&2Kc2}Pz6v0NW&%`Yc0vm`YSg$&SxcTG>oLqx2(u&0)(0N?(;}DXgbbSiPy_C`xpHYqDr?$KNXa zB30-}D}0KQzv-`{+%j1o13XFTsm=8Flpgyxd!I@6zPN^xj28k~(d5O9x<6?53+1nq z@KY4$pF3gW#M2WJTXYur=~c)1cJY2)VB#UZb5~qv1L^DCl&H z&@4VT3KUc~IK=34eB}Y$SJ+Zlyi{=pKSJ3?)dZ@Cu!o`bWSY8qTt(;bLStHnDe zPf??4FzSg)ysCB;i6hi0V^ zNy*EmbQ3466#3=$V&pC~bg_a_<>tr_08r@~sOaULWm-SlE@eKgi4X0l%&4Tx2U1^4 z)HsP+D^c%A)M|;EAW=zi6ksFP}-0cNF%>@R;CrXm;HVJ)j zYgE|9gNNnoI9S{u@{L03MjVSs3658~JxV zp${|hp?R|>+_8tb=Ffegf`R?~NPqBZvH6x%Px&1`*B>I8Ik)&t{t(6F-r_I#LjaR_ zi+|w{?coR?5&#jdYjHbZhgzs7W${gZSOA2%OcZ%mk++FA27ot{c9Y)_03Dd|H_c}P zpc}(W=_UA^V_jt z56rvg`SEd}Wn$0sJL5p(nk^mw39C7t8jbb>g>?;M}j2{dqt zU)TxO!Pk6;&cORFMbr3gQ5k*%LgROtk91rGVxhCn^Oriqa3(kg2eiXYpW zPj(mek0M3&lD5f6{C6@Ey+tO!VT0;rOLHn!??Y9W5Vayb0#|0nekEKF{^9xi)TJ?l) zN`;F|$RYk>8gOvhtnLdw!1z`3ntl-MvZ0#3>~5m*_+91;`+*lTtD0Zj4>~iWs`;P# z!DP6`cjTZF=JNMAh-5GC$9G2fvDHfIx90&qG99+M&PQfi++)$oyZd=dIs|$hLLTkj zq!);!vf&j}8b55mIq(gPgK?_j-^~CYMpwlz%z%z9ysM;M@%x^y$N+yg|4N&mR5n*t zTxq_O0Rw;usN{QRLQG4cLZO%zN@I9rF3yDh3=_7GKQsWs+o$fM6UO5<>p?x{eM-M6 zNMncH##nNryP=SdP5XU(+bmoeJooY4v!E~3@wzOy-Mw@#ZnO3H4F~HX(AYzVA_HT; zBev{YB-mj!D9Ed)3=@4VPOa(9Uk-%Nz`1mfG=OvY^lT_@y#-0F(Z0+{8YxwYxh@;h zz}xyze2*l4yfN_Rf z{IY!L2|w}2^Pw$l;jiUGKW6eqzT+6swusm$_OM^XM!sweR(9RUuO9=k@EL!83|wN; z=9zbo1y5j-=9*6yKpn%pGu!;tJK*a8r}(PL5Dy2C0`#dL4n zul?}!OYcE14^KwrD3r;EC!=znjSvq{My38WI^s3D=L)`T1}uS_e4Cl@Rxnk+&qe}X zJn@;A4!1pA7E@^*X}8Ql*bv*9@0 z=Y8hDa%R*r^OiX<4ULd$(6xMtT;(Jub`CGd?;D`b>d?6mqQHGUR{Z=EZzG5QKrh<|LJ zVubIN3^$t(Be=5$%r<8eV1NmkWghx5xZ5)=ip>*O!rhjP-$e79U&4GPtT5MafCp~O zJA?VtdtfM|9n8o40AIqt&8L2Vk3e_LNZ+Unples$lT6$6 z9?NupS?(!AoBWb2m!U3nfy~$}LkGFS(!VQ)PLt_~Q=r8(&=aH}JRi!Ne~6V-yOes6~y^OcAV7@|-DZQ}P_}Q$;+&?V^b_eB^$7F5s8` z6;0OoK40-meuAaU+gZGC1?+^!{HY3f1J?2Wl`w<}AHYwmgdn)eudIX&*Ht;Rj^A(_73OO)zChA$9!CD3}e)>f@&tB`hzm8(cczSYmtK=FRKIf)p~pa ze4fXTHDjC>v=@DS#BZ*KB=?hVEAW%$l3RsRMZ61|`KD?})6GBu{Yop)qHBv7z6iyD z;tq5A_}@`dql_P?P&nHwDr%G+5tAFx1yNM}E{xVqt3Y&{gdP%9_F^9fO%lgqMj`DX7 zgRfgBI=Fg^xH@7&t>e9qz#PXfu{#CT5&nxK(3S}s$L~4uZbeD8WnEhhdNpKrAsB|_?)r)`eV>BTZvNq-e>An^xh8f8s%MVH2o7) zJ3hoZ$7ELq9z%={n79Jar2yaCVg2)BcL{vt&+wN=c36{;Ic(~AE?>0( zQQTfr!uZ7FFe&(CD3uhkVq!Mm{IvPXM<~H5vW-7_97g&M6!nmP1Cb*9I7;oJHj#C)800>*8m)!nZyN-BlMgm>+nd zdcl?~!Zy%tQgwnKc@oC98;GKtD!ILE*#o?W<54c&Tf_f)5~iqrPR7&C;(Fw=Wfx@G zDt=5I3r)a>Vc z{V80O*7ARy0-uzLl#5&VVLZIK=w#xajT1jutd#5W-hW6^WXbSe{P16(9TVG|pY{th zdi6j)yWnGnez?b$eTAb%oz6<)7oUcXOnwso!)f@y@Asa#`mDz@9qor`NW#8h!|8F> zEi@;If8z|K!e;)XGoXU4{8winK{p30+-FDlEfrxNzC<6X{6NHWWk`8>_|FsJzf-+w zvaH~xzAV$QBc4%(v9iM8R}|<0_7%DY4dSEv+^YK;{>`&^8X3@&*PVqvt{*0f@m{CB ztV`rioW*NvS|b1KEM8~U@~U$%Eg%k6@NRWpV<4;sW-`Q~v4&$Z|7x$GmY7AHtzD zekGrF5qdMl-T4IkG3;N4~t}=9$VP6}R_4>+i zjtp&jo-#e{HE7eDB=e8U&=#O>r_2bGp@R$`Pn24)Q-(I$7J#kZHCbNpn&GcyzN^f) z1^Bf{@_$knWZ+tePB`b?Z^__OGSdA=2&a<;HB8h+w;-GC5})Uo-2 zft>?8#m2=3#>MxDjqTAX)_nH{oV3@C&TJCyYMV>8OjB6+n(S4*{}HYe#-Ni;SQ1|; zU&uIxdtc$ds`J0Wog~LwGtJcv;O(T-J#G>zvD9OsxZ;TfDNal9YqX7TgQ@>TZqxfe zpiWqaPF_4}60~TjCl-oF$&li-_`XKl_%_(;zsPNR{|R-HgGLNuIyxGU&qzuj&7j z&Z|7#s|3Y!(7nR}V8wrtzfwo{kA~Kwftz^XZp2==g@xj+ zWFEz7`BmoI=-1)i|00+4ar|GeXrn(v1LM$<6T+w1YKmKANO4-uy++&kHaPyj$j9kq zL$(U9!$W8wABSS0TqyoA77A_U%U5t4?^Sr<|0553Rq_AAw?8#EHNrLK-STijFt-2S zme0`UW7)1Fi4T0R zcwu>}6@+tG4q;i3WhItkEaS1{V&SkjVR@P%2)nQ>!jg-H%Mdhzl@kPCBq+3?V+zm7 zFcF=;O0SgptI_E$EX62a7UX4~%P=`iYu|ST;qE(v5QVT2VJq`hdnUlqF89t;-mw)E zq$`h7D7IoLjKu#$!%~iAEtaiVDzMaIsmIcQrLY6)U@6D47E3LbdMpZGg(4P91(sSY z^;iP^kcTB1OBR+wEag}#u+(Fj8-jSKqK%>=42{#`gB384(dON)nCU^SY@6;{+bu455{{T;oc=7-M delta 16943 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 diff --git a/lib/native/windows/jportaudio.dll b/lib/native/windows/jportaudio.dll index 9ac8b02f48e199d7e6b49b5231b85062a9b24eb9..6b32241b023b96835cfb1198817107d70df0ab8a 100644 GIT binary patch delta 9204 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 aN0|(GK1^qxWnN^8naxZ^XN~4k)c*jy9nZ-C delta 9249 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 BsNw(s diff --git a/src/native/portaudio/AudioQualityImprovement.c b/src/native/portaudio/AudioQualityImprovement.c index 2569f38f0..3fe58f5ef 100644 --- a/src/native/portaudio/AudioQualityImprovement.c +++ b/src/native/portaudio/AudioQualityImprovement.c @@ -561,7 +561,7 @@ AudioQualityImprovement_unload() if (AudioQualityImprovement_sharedInstancesMutex) { Mutex_free(AudioQualityImprovement_sharedInstancesMutex); - AudioQualityImprovement_sharedInstances = NULL; + AudioQualityImprovement_sharedInstancesMutex = NULL; } } @@ -580,9 +580,8 @@ AudioQualityImprovement_updatePlayDelay(AudioQualityImprovement *aqi) else { playDelay - = (aqi->inputLatency + aqi->outputLatency) - / ((aqi->frameSize / sizeof(spx_int16_t)) - / (aqi->sampleRate / 1000)); + = (aqi->outputLatency * aqi->sampleRate) + / ((aqi->frameSize / sizeof(spx_int16_t)) * 1000); if (playDelay < MIN_PLAY_DELAY_IN_FRAMES) playDelay = MIN_PLAY_DELAY_IN_FRAMES; } diff --git a/src/native/portaudio/net_java_sip_communicator_impl_neomedia_portaudio_PortAudio.c b/src/native/portaudio/net_java_sip_communicator_impl_neomedia_portaudio_PortAudio.c index a03ddaba2..6c41dab38 100644 --- a/src/native/portaudio/net_java_sip_communicator_impl_neomedia_portaudio_PortAudio.c +++ b/src/native/portaudio/net_java_sip_communicator_impl_neomedia_portaudio_PortAudio.c @@ -125,6 +125,7 @@ static void PortAudioStream_retain(PortAudioStream *stream); static const char *AUDIO_QUALITY_IMPROVEMENT_STRING_ID = "portaudio"; #define LATENCY_HIGH net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_LATENCY_HIGH #define LATENCY_LOW net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_LATENCY_LOW +#define LATENCY_UNSPECIFIED net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_LATENCY_UNSPECIFIED JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_free @@ -397,17 +398,20 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1OpenStream if (stream->audioQualityImprovement) { - const PaStreamInfo *streamInfo; - AudioQualityImprovement_setSampleRate( stream->audioQualityImprovement, (int) sampleRate); - streamInfo = Pa_GetStreamInfo(stream->stream); - if (streamInfo) + if (stream->pseudoBlocking) { - stream->inputLatency - = (jlong) (streamInfo->inputLatency * 1000); + const PaStreamInfo *streamInfo; + + streamInfo = Pa_GetStreamInfo(stream->stream); + if (streamInfo) + { + stream->inputLatency + = (jlong) (streamInfo->inputLatency * 1000); + } } } } @@ -472,20 +476,18 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1ReadStream { PortAudioStream *portAudioStream = (PortAudioStream *) stream; PaError errorCode; + jlong framesInBytes = frames * portAudioStream->inputFrameSize; if (portAudioStream->pseudoBlocking) { - PortAudioStream_retain(portAudioStream); if (Mutex_lock(portAudioStream->inputMutex)) errorCode = paInternalError; else { jlong bytesRead = 0; - jlong totalBytesToRead - = frames * portAudioStream->inputFrameSize; errorCode = paNoError; - while (bytesRead < totalBytesToRead) + while (bytesRead < framesInBytes) { jlong bytesToRead; @@ -502,7 +504,7 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1ReadStream continue; } - bytesToRead = totalBytesToRead - bytesRead; + bytesToRead = framesInBytes - bytesRead; if (bytesToRead > portAudioStream->inputLength) bytesToRead = portAudioStream->inputLength; memcpy( @@ -517,7 +519,20 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1ReadStream } Mutex_unlock(portAudioStream->inputMutex); } - PortAudioStream_release(portAudioStream); + + /* Improve the audio quality of the input if possible. */ + if ((paNoError == errorCode) + && portAudioStream->audioQualityImprovement) + { + AudioQualityImprovement_process( + portAudioStream->audioQualityImprovement, + AUDIO_QUALITY_IMPROVEMENT_SAMPLE_ORIGIN_INPUT, + portAudioStream->sampleRate, + portAudioStream->sampleSizeInBits, + portAudioStream->channels, + portAudioStream->inputLatency, + data, framesInBytes); + } } else { @@ -535,7 +550,7 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1ReadStream portAudioStream->sampleSizeInBits, portAudioStream->channels, portAudioStream->inputLatency, - data, frames * portAudioStream->inputFrameSize); + data, framesInBytes); } } } @@ -599,7 +614,14 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1WriteStream jbyte *bufferBytes; jbyte* data; PortAudioStream *portAudioStream; + jint i; PaError errorCode = paNoError; + jlong framesInBytes; + AudioQualityImprovement *audioQualityImprovement; + double sampleRate; + unsigned long sampleSizeInBits; + int channels; + jlong outputLatency; bufferBytes = (*env)->GetByteArrayElements(env, buffer, NULL); if (!bufferBytes) @@ -607,72 +629,78 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1WriteStream data = bufferBytes + offset; portAudioStream = (PortAudioStream *) stream; + framesInBytes = frames * portAudioStream->outputFrameSize; + audioQualityImprovement = portAudioStream->audioQualityImprovement; + sampleRate = portAudioStream->sampleRate; + sampleSizeInBits = portAudioStream->sampleSizeInBits; + channels = portAudioStream->channels; + outputLatency = portAudioStream->outputLatency; if (portAudioStream->pseudoBlocking) { - PortAudioStream_retain(portAudioStream); - if (Mutex_lock(portAudioStream->outputMutex)) - errorCode = paInternalError; - else + for (i = 0; i < numberOfWrites; i++) { - jlong bytesWritten = 0; - jlong totalBytesToWrite - = numberOfWrites * frames * portAudioStream->outputFrameSize; - - errorCode = paNoError; - while (bytesWritten < totalBytesToWrite) + if (Mutex_lock(portAudioStream->outputMutex)) + errorCode = paInternalError; + else { - size_t outputCapacity - = portAudioStream->outputCapacity - - portAudioStream->outputLength; - jlong bytesToWrite; + jlong bytesWritten = 0; - if (JNI_TRUE == portAudioStream->finished) + errorCode = paNoError; + while (bytesWritten < framesInBytes) { - errorCode = paStreamIsStopped; - break; + size_t outputCapacity + = portAudioStream->outputCapacity + - portAudioStream->outputLength; + jlong bytesToWrite; + + if (JNI_TRUE == portAudioStream->finished) + { + errorCode = paStreamIsStopped; + break; + } + if (outputCapacity < 1) + { + ConditionVariable_wait( + portAudioStream->outputCondVar, + portAudioStream->outputMutex); + continue; + } + + bytesToWrite = framesInBytes - bytesWritten; + if (bytesToWrite > outputCapacity) + bytesToWrite = outputCapacity; + memcpy( + ((jbyte *) portAudioStream->output) + + portAudioStream->outputLength, + data + bytesWritten, + bytesToWrite); + + portAudioStream->outputLength += bytesToWrite; + bytesWritten += bytesToWrite; } - if (outputCapacity < 1) + Mutex_unlock(portAudioStream->outputMutex); + } + + if (paNoError == errorCode) + { + if (audioQualityImprovement) { - ConditionVariable_wait( - portAudioStream->outputCondVar, - portAudioStream->outputMutex); - continue; + AudioQualityImprovement_process( + audioQualityImprovement, + AUDIO_QUALITY_IMPROVEMENT_SAMPLE_ORIGIN_OUTPUT, + sampleRate, sampleSizeInBits, channels, + outputLatency, + data, framesInBytes); } - bytesToWrite = totalBytesToWrite - bytesWritten; - if (bytesToWrite > outputCapacity) - bytesToWrite = outputCapacity; - memcpy( - ((jbyte *) portAudioStream->output) - + portAudioStream->outputLength, - data + bytesWritten, - bytesToWrite); - portAudioStream->outputLength += bytesToWrite; - bytesWritten += bytesToWrite; + data += framesInBytes; } - Mutex_unlock(portAudioStream->outputMutex); } - PortAudioStream_release(portAudioStream); } else { - PaStream *paStream; - AudioQualityImprovement *audioQualityImprovement; - double sampleRate; - unsigned long sampleSizeInBits; - int channels; - jlong outputLatency; - long framesInBytes; - jint i; - - paStream = portAudioStream->stream; - audioQualityImprovement = portAudioStream->audioQualityImprovement; - sampleRate = portAudioStream->sampleRate; - sampleSizeInBits = portAudioStream->sampleSizeInBits; - channels = portAudioStream->channels; - outputLatency = portAudioStream->outputLatency; - framesInBytes = frames * portAudioStream->outputFrameSize; + PaStream *paStream = portAudioStream->stream; for (i = 0; i < numberOfWrites; i++) { @@ -893,13 +921,15 @@ PortAudio_fixInputParametersSuggestedLatency if (deviceInfo) { - if (inputParameters->suggestedLatency == LATENCY_LOW) + PaTime suggestedLatency = inputParameters->suggestedLatency; + + if ((suggestedLatency == LATENCY_LOW) + || (suggestedLatency == LATENCY_UNSPECIFIED)) { inputParameters->suggestedLatency = deviceInfo->defaultLowInputLatency; } - else if ((inputParameters->suggestedLatency == LATENCY_HIGH) - || (inputParameters->suggestedLatency == 0)) + else if (suggestedLatency == LATENCY_HIGH) { inputParameters->suggestedLatency = deviceInfo->defaultHighInputLatency; @@ -920,13 +950,15 @@ PortAudio_fixOutputParametersSuggestedLatency( if (deviceInfo) { - if (outputParameters->suggestedLatency == LATENCY_LOW) + PaTime suggestedLatency = outputParameters->suggestedLatency; + + if ((suggestedLatency == LATENCY_LOW) + || (suggestedLatency == LATENCY_UNSPECIFIED)) { outputParameters->suggestedLatency = deviceInfo->defaultLowOutputLatency; } - else if ((outputParameters->suggestedLatency == LATENCY_HIGH) - || (outputParameters->suggestedLatency == 0)) + else if (suggestedLatency == LATENCY_HIGH) { outputParameters->suggestedLatency = deviceInfo->defaultHighOutputLatency; @@ -1256,17 +1288,6 @@ PortAudioStream_pseudoBlockingCallback memcpy(inputInStream, input, inputLength); stream->inputLength += inputLength; - /* Improve the audio quality of the specified input if possible. */ - if (stream->audioQualityImprovement) - { - AudioQualityImprovement_process( - stream->audioQualityImprovement, - AUDIO_QUALITY_IMPROVEMENT_SAMPLE_ORIGIN_INPUT, - stream->sampleRate, stream->sampleSizeInBits, stream->channels, - stream->inputLatency, - inputInStream, inputLength); - } - ConditionVariable_notify(stream->inputCondVar); Mutex_unlock(stream->inputMutex); } @@ -1285,21 +1306,11 @@ PortAudioStream_pseudoBlockingCallback if (availableOutputLength < outputLength) { memset( - ((jbyte *) stream->output) + availableOutputLength, + ((jbyte *) output) + availableOutputLength, 0, outputLength - availableOutputLength); } - if (stream->audioQualityImprovement) - { - AudioQualityImprovement_process( - stream->audioQualityImprovement, - AUDIO_QUALITY_IMPROVEMENT_SAMPLE_ORIGIN_OUTPUT, - stream->sampleRate, stream->sampleSizeInBits, stream->channels, - stream->outputLatency, - output, outputLength); - } - ConditionVariable_notify(stream->outputCondVar); Mutex_unlock(stream->outputMutex); }