From 299147ce9b7abedec3012f654ba86a2a2b290038 Mon Sep 17 00:00:00 2001 From: Joshua Tam <297250+joshuatam@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:02:23 +0800 Subject: [PATCH 1/4] feat: Add DirectAudio driver support Introduces DirectAudio as a new audio driver option for Wine. This driver provides direct audio output to Android's AAudio, bypassing PulseAudio or ALSA middleware, potentially improving audio latency and compatibility for users. Thanks for the interesting work from @The412Banner --- THIRD_PARTY_NOTICES | 41 +++++++++ app/src/main/assets/directaudio-20260812.tzst | Bin 0 -> 13662 bytes .../ui/screen/xserver/XServerScreen.kt | 19 +++- .../winlator/container/ContainerManager.java | 85 ++++++++++++++++++ app/src/main/res/values/arrays.xml | 1 + 5 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 app/src/main/assets/directaudio-20260812.tzst diff --git a/THIRD_PARTY_NOTICES b/THIRD_PARTY_NOTICES index 39a4ef02ef..00b5de4f8a 100644 --- a/THIRD_PARTY_NOTICES +++ b/THIRD_PARTY_NOTICES @@ -342,6 +342,47 @@ for more details. Full license text: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html +## DirectAudio + +**Library:** DirectAudio v1 (winedirectaudio.drv) +**Author:** The412Banner +**Source:** https://github.com/The412Banner/directaudio +**License:** LGPL-2.1-or-later (GNU Lesser General Public License v2.1 or later) + +DirectAudio is a native Wine → Android AAudio mmdevapi driver that provides +direct audio output without requiring PulseAudio or ALSA middleware. The +precompiled arm64ec binaries (winedirectaudio.drv and winedirectaudio.so) are +included in `app/src/main/assets/directaudio-20260812.tzst` and are extracted +at runtime into the Wine prefix when the user selects DirectAudio as their +audio driver. + +The driver derives from and links Wine's LGPL mmdevapi internals and is +modelled on winecoreaudio.drv, requiring it to remain under LGPL-2.1. + +Copyright © 2026 The412Banner. As required by LGPL-2.1, the complete source +code is available at: + https://github.com/The412Banner/directaudio + +Users may rebuild the driver from source or substitute their own build by +replacing the files in the wineprefix `lib/wine/aarch64-windows/` and +`lib/wine/aarch64-unix/` directories. + +### License Text: LGPL-2.1 + +This library is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at +your option) any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License +for more details. + +Full license text: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + +--- + ## Achievement Sound "Achievement sound from [Pixabay](https://pixabay.com), [Pixabay Content License](https://pixabay.com/service/license-summary/). diff --git a/app/src/main/assets/directaudio-20260812.tzst b/app/src/main/assets/directaudio-20260812.tzst new file mode 100644 index 0000000000000000000000000000000000000000..18314bce4185e6c06324c1d0e7dcc81a77c9aa48 GIT binary patch literal 13662 zcmV-kHKEEVwJ-euh%6ZZ*5!yj&|2rXgOf&308l!cT^=AMUbrT@!3}b6UIvFA=~LSa z7S@8uK3N6m>yk4Q>sqgEh3KJy3;_!n=Gm89rg{Kw0C)huenQe^f^mmix-25%(Peyc zj4#;IRfH|<|Mv@5M%-Yp2Kb`(XK}XMZC!1-oQ=h;&#E}xio@w_;x`5Q-k>YHz_IUz zWqdbJQ&W}IVc>2#4Be^$|9tYVv+S$t$F5ux{1^7Ot*pALuYQhIKZaiy1`)a??L~T# z2JZrlf#dUh^nbDNmUCmVnN$e&u>b!je%f;0+kaPf-`F%^dh(1A?xno{zW@Jw%Kytk zSWeM@zT4*p?L$02;QD{{We@VP&v=ed@{gkboA>-@=edc$W1GMX=n}7d8LB!jJHG!P zCI1sC`~m|e>f`gj2b6Wq^Z9)$|D*mlGU1=#e}5!vo5wRWq?0@Im#v8^f6vU%X=Bik zUU;aP2Pm3k;X+*-vM&?j_vCK>vQ?PPQ2udf9=7YM6?`RYFJw{UQ^y*In*YC8*Tm!V zr)Ar4v}{qA#&gKg%xsFR3U+OsAeO_kUq}1(?DDCj@lkYo2l{CTjvLYx7>d0BQ~Wpc(9w(` zkY{YAgKrTtXI=H5%Gqfkm}@p~J932G=DgtY$l{44G_2&8icI6p$;=WUKq>S>!9kIR z02q*wPZ#HDgMnp}rh>*Zu#u-!Iv;BDQ_scZpHtUYCH>l16;7IsmTJ zN#tfutYz{6A`Po|TP)Lk#HmlmG0efu@T_{hEV$3EQjb+I{c1n?50hoL&$ajkcUZ9e z;^4TqZ~Uiq8u8sG#|{C3j^F?Vw(6Z*^FVd)t$m@o#Bf4}uXsM6P~HZd>+lVP1SEe8isg zpog|vw_qDG#2hfWp}GKw!Fv*myfXs=24DkT0e%W~+#pUszzfqrzyJek26_bo7>I&J z7Kc(8n2AqT6k@V&>dNQr*MHnRa&3kKlvUuq&Ynko{r#{TL;?VG0x$pp03`sR000mH z0386}09X(_5di?06axTcq^v2_yc`k%0Mtm}3^3_wpab(S0MtJL26zAx;5L8(1cAGP zV;rKtASbMp1OUPX79NmI2k0E>Hdmy}zA=c2QP+mfjg2{eD_wOM3Ez9CTlQK1k&8Q^ z9sXBFXw`$qRc`X(*2mvss!6262_VP@6Kt9CWZ}}jtDZV)rq{Ib50&pNRkO=@TfD{M@05bl+`difLzaIbr z^?Ly-(vfUU5J)La2R!;B_bewIu|3sPZ31xsc2Us5ciDbGOravCk{;)h-K^@(Nj*T*a+5TZd8D(b(9XA^*R(mXN(=3bF>52D1hj@FdYef^%eOMCc?D zT%dPjSdEr5bdiC}7A;v`NQFk$!2l=8@Pc3w+XA`*9|b%!nMf3gAXN|A)*&?wi@~U- z;a&DdBavdm4KG|q6@yqF26B=iiQqCy*aT%3^x7RdBXXTA6%d>*JMm9uJ;N^sMf9H? z{iSmBm+~(LMRPM_;{4YUgzEAi%+UlUM9Y5zK+yhi%u)S&0q_4Vq`9n>*W|yt)B>T} zLH}G*wxFVzF>z|)PBcXSQWyXA&uRJ3vuI(oWm7EvpGEhyfVBV`lD231ALUj3L+6fm z|394?%9vT{2>EYjol&5GAVL3qH*T<%ffL*R1=JS!SK!Ua=>AV&_}>fuBQW>&Uv)fS zYVG3xHFUsX{;8%<{->bwe;MEtQvPQik~uTCr5X~F5nCGjZ@@e2p#Gu4{}1C|HX2|S z(f=Pgoqkb|Z)2?x;9(rVq>5T4lYAUGHoO6ECu!*r=C%L#I`1G`e*UfWk>>Ko(VcqqvdB`<@U*3})o-qh+Hy?Qmdh>DPsysA{N zZ1nByjg3yB)Mrku@w~Fax<;*cezigc_Nju1hzQB(ZUHrMw}3{c(kIp(y^>aO+)(KA zKH+8J#S@UtjfhNSiBLeLUs*0bzq&qCRIhJ!)r>Z;(X5o~Kl;^t`^&@&t}p6M0E!!G z;za}1Dc0S>3o315snV(yN{to~Ej2xiH{cg|su?f!DW1m{y^jCKTA%vNzpK#y`lZMI z)kpvO(r@~I+3rXVl?jcxj7fs$g;2L6$D|Q51Knjd$qJy#9D9v9LcpQ|9!`ioiBKZJ zg{z_&A+juxv_Q`dOqSg-KWR9FHWWoj4T*N_22ccmG85Y%ZHX+9)tKMTV%1L+ ziRB1f1QL>6fLDbBDavh`#lLt+USWu;*(23$ z)I&WnKvD8;__4-ob6`e}4RAj%nQgBtTp4cZ;#WN|HP=945oxYXp ziuz#K>($!ynm%!4zp}85jvA;o;B`g)YG$R>uP>;znqNJ!QRsVRJ*QaBt0va#`lbA< z>k~Wm)kXc1s`8>ntyM6r^y+E7RpAt)D3$umnVdcftr~EB z=2PE<{jy@es#sX6^lGJg;dn;#W|kGSiH%OLQRr0qrHo>)nqE<^=hcbIoVrG_u)dT{ zF6`9O(tlk=voNS%Ri@|_^%{+edR3>`tEiUMjOa9rDxJDkov_lU4eWCXta`ryX{#A84eO^5d7})3(wJOCv zxu{Gouqm)>^oxd7lnP6YUawzFSQ)={tzuoHSTAW-^oo^cqu6IOhjjX+O0k;H>{YY* zvQgO#YLGlDZr*<uvxW;5B!)QsjaDQD zD0*me#dX9(rPV8xy3~Qtyf0$q(csBOcaf;?JSa8?si*r}IM2#*_WOyc{l1}?$9f+U zR}X&_T3)ARBA)LfBzAF{_kCOf`SoNWK{H3uMb4qGMVKrCo*pW3%{@6do~Fx&^3!I=1EDrRqwJF<=`^rrc;MR%nyP939qUL6LcdyFrx z6@=>Tya}|sJ@&=1f*8FW{^E9?z>1e~wuI?V#&$qX7Gpa*?n*t!ks+(pT1LjIFvGkA z(Eu5C#h%L$S-N`~GP2dcCe!IUS8938%=h9{0^BbF=c6OW=eQ*qQ1So5SLj(N2Qztl z)z|m6R-B1@H&29;fAJh!7Tf0;owg;fZCH4l?Ize1+&lqL%|h&eZ-@6P70>5Jd665~!! zs?ooW_xm^A0VyBP6H)W1GY~u7D7iAwbMF5M3@3U;@bI9CTx$BMME?NrwNf2Nw!Aym zWOP5)M_ibojf{oBymsp`sj!D1X|?f&5o(BlCBK}7H#c3c-xX*u!i7cQ#k zqTqJkvweSqd@29%!f+~J$((^^Mh)$T2Nv zhO6=YFJWAw?&IR`M=|cR{K_k~WVA3y4Bw;aAJusLAcX1jy-Dc$y9hPGivyX)<;%(t%|gi}tm=OBTGO<>Sb`( z+Z4fY8I8sNhQ6Nwjs(t(M`VJ%NoIGUwdW5xGUgqVh>bfTvbr>rUt~v;CYWFk)WMqbM;R|hMqmoN^i8)$1|Pb%2@h)QIt>8EC%GlY_%^ zWJyb(r-jh@`IvoB4cT$&7UMo?8qfSCZD)r2{!Huq3$JP){yvUWN(*91_3z!XyArUT zkwBjAgHyCYesLVFoA<>{k+7l}{cPfk6QgEN6X4{oz^_i=3J|1hJL>5)a^BG+o`uNa zj2P$jBw3f1UH@mqZBG(~bP=?qw4EuX{jiZB9cyIUSx9Ml5lCt0VAu1`xB~Flx-z^g z6XFteA?Lz;;d}zymiaDjnS+{HpfWFsOr+|u-EB}0Ne^}y^k1c&|5Qz~4Q#qW zxPZ+|(uAT2lM_8JL^97&N0fmg;woeN7eZxV(+hi%*_LUv5m=}#9Lw|-gY$MC!R!&2 zJ!e;&-~O}eJF2tIJ^YU~EJM^~(@MeqM{l$mkRXxr4>ijcgG{;>1v{wYRSo}iP|#J` z+|m~%FX!O0XJbGoIm*wfC`M&bxE3HpPpoJQ44p#$e?{adJi94WxP=qWERyaHGb8L{ zspt{^&3{~Ww(vQ=Y!W62%4)rlNBJseF<3^fax&1v;!r_I43z!%f`<8wrUf*Avw?@! zWj9KYQ`Y_~u$6(#GLkS=-<8>-P8^Mhda8KCs$iEQvf8%Ew8^T4?)bNHQ@xuEp8uF7 z5_YJ$BdPnJgUa0hR5f(@D7-rlF%TxfNd%*CxBsaqBuGf4pfJtt7XE1*UHnH`!~b&d z#PTi%vor?2B=;SK0{Hk;@?-y_v}!io07X;`_Md|o*hy$25r(asi6FH-&7zxa~4+-Up*T9`@*G7-X{78!aDBty6okqskKrRXcCx{RR5rxDFB8WdH9K-*RLPFRFss{m_Y3O-cr@yud`c63;{xGHOrE6c`ksVN#Wa~naV zpej?jiQ4{O3=*Q?Oa))rNn3##Q44}`D_l#7HK5$a=sNP`XErd4=j~(>$EtKG2WqIl zN&>dspIgZnt`KZ2`(M(PbeGP)$|JEPMhxhgc4P7NPvHHq@fkEbSKMf9rxp4Ker2Tx z1gy14%fIr`7R>!6VqbiNT!^EkZW)T-CueMX^S%1(W5qUq9AVS0zbk%aAV4plyv)NZ zQ~Rf?!b?Gf%tKbHnH`tbb*%&(@-BI67CKJbaeYY28IO5uocw;;&YgdN;qqp%5h6TR zFn(ZdQSY7feqbX$<}Y3EJ9Fan11I5+_1ct(b21mjIFUnyaneD2Nt@?0PPlSs(%~>i zd+VZ@A=)|Y4VH)-^1wzf9U=_(#b`NiI0l`0Y$rRt@92cuf7q5rY0h4_u7^6K`ey_C z&g=ReXJ4Er&))dKB>6Z)cR?3Fe!#g9`;j9z6oV0YhX?!J0B5|udF<;&(eN$_dn+oK z>22=?Pq$HQRqk-53Q}KR()dVTZFYO zY7#@x{JxClyYAQ>iJIE-O-N{r$3rf4Yhfqh?d8N$x+g4J*~;7hQ{6A|YC7;RBENIS7xR zKEoB`Fm&8~KgAaxAZ)>Sjm-;fj)=JXh4#xG-qY_M2&dv^^4}j|{Kbz$+C>$u%!Tt_ zfHU4+SAnSs#tbw_xd#^6fpYwEz>=7Hc$_vu^}L4Y(`)+Xfy6ieqglK>0|Pk-`OIO| z)Q)JnepVum^(x{BPhUqrB{e%OYIbT!eCpHV&2rWnAG{>|qQ1STL*Fo+d=D3Y?*{pT zt!MNq)3&7CA|+c_xJCVmg&1VC=)%hygP&Z<1av>$n1~i#8y5?7Pl5(Wv!|^ZM@UOZOKP;m;9!uWvjGP=x+o)TEI_(~#L>`%&dU%ex(uE) z@!}|KEJuFI;^$gw_A(eDojJ@GzwsHlxH^HmLW{C3hbD0%!eo;07jzPy1WdwN*hzR% zorI(KCE-Y45^kcGgd2HaxXsLcq-O)eYx%3gm0f6%0*~4E+B(w> zE#Ll^v)t!8?u#>#b=c0GVjM)bJ3#kq1kjfEwXJXd2ugBm^c{^pQb4!(zL$K;b1}xn z8A;UMDL4ru06|J9A*VbRA0OV2t|#%r&W;aE*ZZ(=b5k>Q{f-JYHoy$J{-&+2g>wxp zvP~Bo(RMP{NK0-1 zX!I>IYx{`ziN*gG^NS}9iSZ?&ujv4=wnrqbG1?0m+lZUZ@yHMo`J^<}dDsbzX@IStx$^|ey{{T|v5yLEjHB{1Ar8)@36CXUTkn?zha7^v5OPE5>SQF}0-0x*nv)&DTh2F@Yd8 zVl=hlw2T5d{Op39-*=4fCx$rmxoMdp-9cxIibA5bPQ>eMLtTgwkv@|AW9 zp}VhFHPgTg{^g*5t0y-1O7T}xu4fii3WYwc&FVGxdgfeU)oY3-wJP-E`8FWb#p(qm3qUHQklVhP&_==%5qzv! zd7w-K+5m;T))e zNLk5HJ^?ui$;vMTw6$1rRFrQn(#KE?W5o^8+EJ~mfF0^yaR;daA$G7*kH7=6M$ZBs#%7G+L5hdD ztp?_%RWpxGnsI)qFmo-^-BKCov^lcqswaelpj_~aL-0N%rNvJqtBCgq zRX$ddZa&f^n@^pL(&J6m^)QoYA>xwT5M#-z5XfW{kCo(-N1DWW>ST7uI|9AK9N~51 zlDW=UQmcbZ;yG-|&ygmHa_Zy}$D6!yn8}`-xa9C=EU9*bOqLC;B*8;xGCcgG6+}0g zgTRwSLU8gZ)Fyj`ck<1KE$OszCfRI0xePj!QG%cB0)aRkwbvB7XSpPj9hdB4Ym>Kq zi+@Y@8jk*CA0fRK`AZ^wH*SQv@5(St9HIQ9i3>O$Wgg0`vAZB^xt{|!w5y*AHz^5D zfFGDi{2}-sw#+4zSZr_XmZ<)pTf;AIn|Aoz7Hqd<^lwc9`!bCBF(4a3DxRSN!)qVO z!N*$@0pq2~;Jm;N#>6m}2#Y@}E{*$eQm;(_a!)l^Epd?f-h3qvSSC!S|uG)Ou>I}OJC2pjnWj{%a6>&NEB0hDl6y_K|&oD z%lQ!|l5pAxhJO%Q?@GvmJ+T~quDu3KQao&Y#A^m zVpYm0jL77 z&k2t>dEtT>Zvr7hgb<1j#24xhfW156%HW$aWU}<&K?I^>Ju=1{ z?5@bIfpVjNZ59~ru}mp<9Idqp=O#f3z~pGyX}C92-#}^oStJZLxtdDEd7TPaGM_B? z3Wb=*= z?LO+^Df1}`&Zz#mlzNf4t#ZtPTL}Wva+r9gg4-Bc4_j*5Y_{lkk}{*!eU&Y?YEbwg zU_3tYbKm##C&ln@?&Elw`JU_~o~1yChpsLdvlySrs83%gp3KUPVyn3?x+`MH{9 zDL0suto`s>GQzCn^8?m{Dii`Vjc9_TVh|1{V=yQq#t>q>06+i)AbDC8smlTQ#_en2)Tc4B_WYwPxaV`qi(?FmM}^^=r7*kjUK7quOU*6)W0i(>K)M zdkrnywnNS%q|XrDwRn&F+?8opm+S}=q|7_~<)E$wZjCF?4mXtycSz78fLsZI16szY)i=J@@>w}-4 ztGS~2Gktr}ssBQb$O{J!%uI;-M$soor_4LQwnvxlbKactk6~8hOsrwaDcZ0@=QEL* z*TCg(5N9zi?*4V?>+GtB8HdFuyyJtRi?f0B-7-^XB^%OLl3=rd!^J>{eaZ0LK&kba z3w?gLVw!ngwPPjd7d{Krp$RA5y0RR`^1l?Svg8}Co6tz^646GsUtr0freXt`aOW~ zH|k$9?uqiwaQIVwU%qW#h+FU`v)k-U!@VCvVcoz`Gr`(FSzfTM;Kt-eAMY{q!3Opf zPJh(AJ2h|0YLA!!tmNZ7`*Gi;+@trx20AbaDMqjS{0Z)qtHG@?-cDWC#x30f`6-cm z6Ynse$uT45&QKjJhZw*3P@c!T?E!K(@H;xolw~npvD5(H2Nb!CJ+4!zS?Xr=oBfU# zP%sCEfUYs5q;xCC3^8eVsI9%2P2X~x)3F&))sVRgh}y?6`RqQsvc-26W+*Idrfm^IA>{=O!MW>Dqd z4C{SoE%-oT9QRt=-}*H?jiEEnf8n?0io31TKF_`M^lMg+e0aicrT4lOyEa4n54x8U z*&7y`D{js&(hbt{pu4c103NPnmI~f2)%+Mh#%!ToWNq2X=i7mA3sm}frh|96shg#1 zk>pN{`@A-E96c-vYh0SSVR+2-9=_F_??q16C!D(}J*&pctUo!9>3?Te5x7$7#Yr!J z>z{m|ZMo}XghwIn`}yvi|G3?0*>Dp6@cx#tE_e9^Tg0_~tR_#4@~np=-c;OfJzu+1 zLn{2Qc>}OnkO@Z}K0+h%p!7D`&7X8mmIYdk`69`W*MaX$FEcLoGp`x8_<`?_;XjI5 zId=ZQ24=QxaV@@jf8WEdeIh5l^XWKaLM0D)JpM4W#;~D{lheD~(hIoM=NJ82IG={w zc(i^b8F$wlp1PKr8i=s$CvsBrm3oQCkz+>C^&sV6OB}#hoyEyl4?^ssY!}MQ%j~!D z%dTHk{mzm(%b$M&)NJf(^=P%3*prkwBrL0mRsUwVSAt(`jpIRm%he9k2}QFa^uwGZ z=AZDeXcs3Br^_iS_r1&d!_UR_8Ggai2W01OVy@JO0?eRK1pcumPq!-;p0@ckD$m;i z!Ga<)j(TT(7-@(@6BY&-6y;I*64V@ zC=q<%e{fvb-~A#zBL0E!X8v#MPr7Tg^G2IZNNfTyHUTZ)j^1ZZ=`VC1%>lD~Hk=im-$4rZ^Kdygqc3C>Ze8`iAnCkhjN0>6$WuCf~jz-bU zt(u(kzn+xb@s=B`RZsUF_$-f8+UwU(cn_KKrQ~&IzE>Om$tkEKNngNzGUUu=^7k(_ zC_lXKB5Di<(->XI;kgtbJxBV9HsYuAS)nGqshe(>q-H6H@ZW6UUt{uQv(t#6dnIr{9?VPjtp2 zWZQME&-7RQ*|%BE-{Ny;m(}C#osG}P`~?Nc+2|YdnooQ6GpFwlo&O30Vfj;ZQP}o`09$nVWY%g4GiUp6gej&wG=7`rp1tmn9=q+{~f&vAS$e(Tq1@ zDd99kryV$L54Bn*+2G0+3uRj(}h8hSh-&s)2x{_Diwa`a-cc0JzayDZN#NP`(S&7&J! ztnwHGyUtP~FV7<{QBPGKpxgxOi(^ylK47kmoTr@&Los#&Yiw?MFLL>z3o`yxian?5 z4;?RfS?+MV4}<@9v3I9=${&zlb5SFTp9c51cUxoAMPwYCfb%YNK637by9B8+3w5;~ zUiJpKZ}f@tWv0Wg^!%DHFPZyA_WwUtCg!|W5${JR#WzqyN3U;m?m4gi1v2X*&Cw~g zcNgjc61$dpc&=Ybl3()sn9`xN&d%SsY-bcj=NIo?mFt)rc978i4#Bv&Y@z~Fgvi6!FNIvtw?rlg15 z?k^o3bT8mPcHOSEM8$V~4qS9WQQ7~2t-A7m#PqKk#pW|AgJh9yj^ge2tz6IQ_rDsS z_s#ew#+^jheF!}HG9Ezv_wwRX;_h&?R(J&ZeJ)nYO;2aNZ?W0jxAwZBHYDdWXK1!L(XFVwbz+DaAq>R zgWgZl<8`;x-i-_48`~?nZrSVbc36seW+EedZpnYJ@q<7AMn?Xs?<#Rlb{8t9SwADh zcL!|Ia32qg8PJ}(?`5CQj?1-3N_YlGVoZ%w_9jh^lWwP{c(3|h_!@#gm0Uh5L9aHSHGpoNv+&6HFC(V?SuUhmq)G-c^ zi@bRW(q=8|tqI&`%S=ZObB#7ffCC>tw_Ta?%pMOVpRIWwo3r~L6nb41Y}D|`o7iy6 z{>9Aa{BiB?dS@vzdS|t!&w9$dPLGrA{r=@<-%);}ge?-Wi1T6t+q3o?mXi zQJkuxKPaE_!@~|`-nH&q!;Rv|$l3laAoopgeGUh-yZC*%-_?@B z+cxozqU-+P`23An@Z!(q_HaZw6&tRM+lhV6_%t{DI#QY{-V`3^yN}4LFjo}@X6_x+ zpZ;aXxUH_iqd)3Pm;22Xk;6Q@(rh+8R`#+j=4B2;dSb;fk~?5s_)U6&T%+f==sgK-fU1{^c_;9&*3W2Q{CPu`(Zc-miE!_ z?KsDAGVML9j;}xM5UYLN;s5W6F|z*@sR#Y+&5cujOy3v?XNF}aM|8*?S8Kw+<8qLF zV^R2j1V&bGnW1O}sRz(*!q=uf@cLdc`i1oZn1Gu_SGRaO+w^(EoKU&_R?Twx3h^)< z8rkwnXIFAu*;!DYPr2J+{dR)6OMX5Q($U{ow!g*qN zvrRs3!OXDt3gtV>p6X&x?*D74^Q}#n!|oU78aIf&>QI_I~`Hk;|E zvP$*PPgD-vh?%w#m?a%K;4fkU3l)ieCR`IE{M45r9U>kmeP$dptaICcNi3G#Wa+>@ z+;w(ouPCPC`S7TaR#!CF-Tt*nK3Sa@^dLEImN z8_}NeP1!#AYfoQ~YCcu?)qZYB?qO}8Z3lWdqF%rLfx`_x4mrDK%v|X}X?;F7h}d^F@Af z-GqnAolK|OTQLA#GHGjt>)T~F%DTTRV0o)QePybg5i#KP^D%pOXy6{W2n6GW5Par| zcKop;Lw6c!nlFRY3p6S?pBv!+X=yxEdQvS{a<(>4FZtXic>Q-HasN2s z141zg`r^iw=#c8Cst+O!hWAYQs8&mL7bk%Y%pLZ=pOM->Pndp#`|4n>CE>g2$;A!~ z;j$tExtg=mJ+dNOes`|v9Nl12mrE|Xyf#3dLNgdFttAEP_=ES^=b$4vkWXk!Rl{H-e;IOr;% z>A%lR8P33$y}v{2DKmK@BS5d7>xFk|*;zoqI6R;l@^A2*iwYRmQ*S2VUyJ=B1ZR1- z`PWa(dfp#N9kQ~Y8_=7To4^c6jb#pf$e5D;*e5MolGr}?6cww}h~tS=tX64Ar9s5W zOD!c&=%qw?10F1L4=JsZ&0obdS!Sk)XCFM1UqR@cgbRZ1*c(9%HKbVP!Cf$sp2>d{ z4(H^@Jpk?Ah)}YkzZhB;v@wI*&7BqDdh`}~=?S!YG`h#Q{Qly*KP)$g5 z%ogV4+^Ts|vN3+-2iO_BSiJ`9?>dyCh|8QbzMWYA&H3vdAda5Wb{uTzo;4}vK#0m$ z|A>H&@Qxwwm}Io0rJ)U)1mt%^X{MS#*-TTC%yYmvg+R1+`fs` z`_iNR=R@O{&CNUCo!4l@9nt4DK;jIzwD)gf^uF}a|I?xQWqbEdcjqgw@=(*$F&*K8 zvuI?a{xNsYUF0$jmhaWC_IHp)l&|iBrqa_GIN5XqAY`J$)k=LZAt}%B&6w0ylZ|Og z?8zYQC5BRHXC^TrJGgt-n=T2@@UDmDoYH&QD?qSxV(1Djtv^TBC;%$> z*26;b#>BjviMn?;(}4(l6Jz06#JwV>e8gSsLVw2Igs!km$W#x1l=3n`58_w0_4v#9 zH$rgK-EM)S6ks+2(4g(Q9l+(Ao{0homA)Z0$lx#0CSzgfNYu_` zW&+pu9MF_zLd55+7#w)|6bEku@ET^a!v3}=4W^`#$QSa{6@67QhM(4U8w(PBJOMyY zrfkpI&E2*xm?!0R8-Er$WH9@!fGs`#tj1=uK*7D9vF^*t}n4=*dcr{&VLB=T5!?lvQa( zlhh%tB`dLypbTMMUdQ-3anzx#@S~GM0nJvviv4x-s36&tW7)9@ItVbYsz8iEKwuS_;^QS wxZYh0P?{#CZ=>o?IIg3=V@K=}MA08J9e}_Pfql)W1m54kfB|5y{@8n+39_;uX#fBK literal 0 HcmV?d00001 diff --git a/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt b/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt index e9c423e026..d06c2759e4 100644 --- a/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt +++ b/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt @@ -5004,7 +5004,7 @@ private suspend fun setupWineSystemFiles( } // Always refresh components files - refreshComponentsFiles(context) + refreshComponentsFiles(context, container, imageFs, containerManager) // Normalize dxwrapper for state (dxvk includes version for extraction switch) if (xServerState.value.dxwrapper == "dxvk") { @@ -5172,7 +5172,12 @@ private suspend fun applyGeneralPatches( WinlatorPrefManager.putString("current_box64_version", "") } -private fun refreshComponentsFiles(context: Context) { +private fun refreshComponentsFiles( + context: Context, + container: Container, + imageFs: ImageFs, + containerManager: ContainerManager +) { val extractionPairs = listOf( "pulseaudio-gamenative-20260612.tzst" to File(context.filesDir, "pulseaudio") ) @@ -5182,6 +5187,14 @@ private fun refreshComponentsFiles(context: Context) { context.assets, TarCompressorUtils.Type.ZSTD ) + + // Extract DirectAudio driver files if the container uses DirectAudio + if (container.audioDriver == "directaudio") { + val containerDir = container.rootDir + if (!containerManager.extractDirectAudio(imageFs, containerDir)) { + Log.e("XServerScreen", "Failed to extract DirectAudio driver files") + } + } } /** @@ -6007,6 +6020,8 @@ private fun changeWineAudioDriver(audioDriver: String, container: Container, ima registryEditor.setStringValue("Software\\Wine\\Drivers", "Audio", "alsa") } else if (audioDriver == "pulseaudio") { registryEditor.setStringValue("Software\\Wine\\Drivers", "Audio", "pulse") + } else if (audioDriver == "directaudio") { + registryEditor.setStringValue("Software\\Wine\\Drivers", "Audio", "directaudio") } else if (audioDriver == "disabled") { registryEditor.setStringValue("Software\\Wine\\Drivers", "Audio", "") } diff --git a/app/src/main/java/com/winlator/container/ContainerManager.java b/app/src/main/java/com/winlator/container/ContainerManager.java index 13b45c0dd7..ca8565200f 100644 --- a/app/src/main/java/com/winlator/container/ContainerManager.java +++ b/app/src/main/java/com/winlator/container/ContainerManager.java @@ -335,6 +335,91 @@ public void onProgress(float progress) { } } + /** + * Extracts DirectAudio driver files (winedirectaudio.drv and winedirectaudio.so) + * from the bundled directaudio-20260812.tzst archive into the Wine installation, + * then copies the .drv to the container's system32 directory. + * + * Files are placed at: + * - imageFs/opt/wine/lib/wine/aarch64-windows/winedirectaudio.drv (source) + * - imageFs/opt/wine/lib/wine/aarch64-unix/winedirectaudio.so (stays here) + * - containerDir/.wine/drive_c/windows/system32/winedirectaudio.drv (copied) + * + * @param imageFs The ImageFs instance to get the Wine installation path + * @param containerDir The container root directory + * @return true if extraction succeeded, false otherwise + */ + public boolean extractDirectAudio(ImageFs imageFs, File containerDir) { + try { + // Extract the archive to a temporary directory + File tempDir = new File(context.getCacheDir(), "directaudio_temp"); + if (tempDir.exists()) { + FileUtils.delete(tempDir); + } + if (!tempDir.mkdirs()) { + Log.e("ContainerManager", "Failed to create temp directory for directaudio"); + return false; + } + + boolean extracted = TarCompressorUtils.extract( + TarCompressorUtils.Type.ZSTD, + context.getAssets(), + "directaudio-20260812.tzst", + tempDir, + null + ); + + if (!extracted) { + Log.e("ContainerManager", "Failed to extract directaudio archive"); + FileUtils.delete(tempDir); + return false; + } + + // Source files from extracted archive (files are in root of archive) + File drvSrc = new File(tempDir, "winedirectaudio.drv"); + File soSrc = new File(tempDir, "winedirectaudio.so"); + + if (!drvSrc.exists() || !soSrc.exists()) { + Log.e("ContainerManager", "DirectAudio files not found in archive"); + FileUtils.delete(tempDir); + return false; + } + + // Destination directories + File wineLibDir = new File(imageFs.getWinePath(), "lib/wine"); + File aarch64WindowsDir = new File(wineLibDir, "aarch64-windows"); + File aarch64UnixDir = new File(wineLibDir, "aarch64-unix"); + File system32Dir = new File(containerDir, ".wine/drive_c/windows/system32"); + + aarch64WindowsDir.mkdirs(); + aarch64UnixDir.mkdirs(); + system32Dir.mkdirs(); + + // Copy files to their destinations + File drvWineDest = new File(aarch64WindowsDir, "winedirectaudio.drv"); + File soWineDest = new File(aarch64UnixDir, "winedirectaudio.so"); + File drvSystem32Dest = new File(system32Dir, "winedirectaudio.drv"); + + boolean success = FileUtils.copy(drvSrc, drvWineDest) && + FileUtils.copy(soSrc, soWineDest) && + FileUtils.copy(drvSrc, drvSystem32Dest); + + // Clean up temp directory + FileUtils.delete(tempDir); + + if (success) { + Log.d("ContainerManager", "DirectAudio driver installed successfully"); + } else { + Log.e("ContainerManager", "Failed to copy DirectAudio files"); + } + + return success; + } catch (Exception e) { + Log.e("ContainerManager", "Error extracting DirectAudio: " + e.getMessage()); + return false; + } + } + public boolean extractContainerPatternFile(String wineVersion, ContentsManager contentsManager, File containerDir, OnExtractFileListener onExtractFileListener) { WineInfo wineInfo = WineInfo.fromIdentifier(context, contentsManager, wineVersion); if (WineInfo.isMainWineVersion(wineVersion)) { diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index ebf7459ebf..a7f62975cb 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -71,6 +71,7 @@ ALSA PulseAudio + DirectAudio Disabled From ce65a54f2b5ff6d81549ec006f60b8146ecf504d Mon Sep 17 00:00:00 2001 From: Joshua Tam <297250+joshuatam@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:36:34 +0800 Subject: [PATCH 2/4] make directaudio only selectable when using proton 11 arm64ec --- .../ui/component/dialog/GeneralTab.kt | 59 +++++++++++++++++-- app/src/main/res/values/arrays.xml | 2 +- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/app/gamenative/ui/component/dialog/GeneralTab.kt b/app/src/main/java/app/gamenative/ui/component/dialog/GeneralTab.kt index 66653ed568..5a7d30ec35 100644 --- a/app/src/main/java/app/gamenative/ui/component/dialog/GeneralTab.kt +++ b/app/src/main/java/app/gamenative/ui/component/dialog/GeneralTab.kt @@ -12,6 +12,7 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf @@ -44,6 +45,28 @@ import com.winlator.contents.ContentProfile import com.winlator.xenvironment.components.PulseAudioComponent import java.util.Locale +/** + * Checks if DirectAudio is supported for the given wine version and container variant. + * DirectAudio is only supported on Proton 11 with bionic variant. + */ +private fun isDirectAudioSupported(wineVersion: String, containerVariant: String): Boolean { + return wineVersion.startsWith("proton-11", ignoreCase = true) && + wineVersion.contains("arm64ec", ignoreCase = true) && + containerVariant.equals(Container.BIONIC, ignoreCase = true) +} + +/** + * Returns a validated audio driver. If DirectAudio is selected but not supported + * for the given wine version and variant, returns "pulseaudio" instead. + */ +private fun getValidatedAudioDriver(config: ContainerData): String { + return if (config.audioDriver == "directaudio" && !isDirectAudioSupported(config.wineVersion, config.containerVariant)) { + "pulseaudio" + } else { + config.audioDriver + } +} + @Composable fun GeneralTabContent( state: ContainerConfigState, @@ -181,6 +204,7 @@ fun GeneralTabContent( graphicsDriverVersion = "", graphicsDriverConfig = newCfg.toString(), box64Version = "0.3.6", + audioDriver = getValidatedAudioDriver(config.copy(wineVersion = defaultGlibcWine, containerVariant = newVariant)), ) } else { val defaultBionicDriver = StringUtils.parseIdentifier(state.bionicGraphicsDrivers.first()) @@ -225,6 +249,7 @@ fun GeneralTabContent( graphicsDriverConfig = newCfg.toString(), box64Version = "0.3.7", dxwrapperConfig = currentConfig.toString(), + audioDriver = getValidatedAudioDriver(config.copy(wineVersion = newWine, containerVariant = newVariant)), ) } }, @@ -248,11 +273,18 @@ fun GeneralTabContent( ContentProfile.ContentType.CONTENT_TYPE_WINE } state.launchManifestContentInstall(manifestEntry, expectedType) { - state.config.value = config.copy(wineVersion = selectedId) + state.config.value = config.copy( + wineVersion = selectedId, + audioDriver = getValidatedAudioDriver(config.copy(wineVersion = selectedId)) + ) } return@SettingsListDropdown } - state.config.value = config.copy(wineVersion = selectedId.ifEmpty { state.bionicWineOptions.labels[idx] }) + val newWineVersion = selectedId.ifEmpty { state.bionicWineOptions.labels[idx] } + state.config.value = config.copy( + wineVersion = newWineVersion, + audioDriver = getValidatedAudioDriver(config.copy(wineVersion = newWineVersion)) + ) }, ) } @@ -314,14 +346,33 @@ fun GeneralTabContent( state = config.portraitMode, onCheckedChange = { state.config.value = config.copy(portraitMode = it) }, ) + // Sync audioDriverIndex when config.audioDriver changes (e.g., when wine version changes) + LaunchedEffect(config.audioDriver) { + val driverIndex = state.audioDrivers.indexOfFirst { + StringUtils.parseIdentifier(it) == config.audioDriver + } + if (driverIndex >= 0 && driverIndex != state.audioDriverIndex.value) { + state.audioDriverIndex.value = driverIndex + } + } SettingsListDropdown( colors = settingsTileColors(), title = { Text(text = stringResource(R.string.audio_driver)) }, value = state.audioDriverIndex.value, items = state.audioDrivers, onItemSelected = { - state.audioDriverIndex.value = it - state.config.value = config.copy(audioDriver = StringUtils.parseIdentifier(state.audioDrivers[it])) + val selectedDriver = StringUtils.parseIdentifier(state.audioDrivers[it]) + // If DirectAudio is selected but wine version is not Proton 11 or variant is not bionic, revert to PulseAudio + if (selectedDriver == "directaudio" && !isDirectAudioSupported(config.wineVersion, config.containerVariant)) { + val pulseaudioIndex = state.audioDrivers.indexOfFirst { + StringUtils.parseIdentifier(it) == "pulseaudio" + }.coerceAtLeast(0) + state.audioDriverIndex.value = pulseaudioIndex + state.config.value = config.copy(audioDriver = "pulseaudio") + } else { + state.audioDriverIndex.value = it + state.config.value = config.copy(audioDriver = selectedDriver) + } }, ) if (config.audioDriver == "pulseaudio") { diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index a7f62975cb..4f40977851 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -71,7 +71,7 @@ ALSA PulseAudio - DirectAudio + DirectAudio (Proton 11 arm64ec only) Disabled From 66fbbac7de2a5a268095e8d123e7904ee969b788 Mon Sep 17 00:00:00 2001 From: The412Banner <205237651+The412Banner@users.noreply.github.com> Date: Wed, 12 Aug 2026 06:39:02 -0400 Subject: [PATCH 3/4] assets: update DirectAudio driver (switching + guarded setUsage) (#7) Rebuilt directaudio-20260812.tzst from The412Banner/directaudio branch feat/directaudio-switching-usage (v1 + the two #1806 review comments): - broadened AAudio error-callback recovery (INVALID_STATE/INVALID_HANDLE/ TIMEOUT as well as DISCONNECTED), matching module-aaudio-sink.c, with a stream-identity guard + no-lost-wakeup reopen gate (device-proven, 7 route/bg-fg cycles, no drops). - AAUDIO_USAGE_GAME via dlsym + android_get_device_api_level()>=28 guard (the unixlib direct-links libaaudio; a direct ref would fail .so load on minSdk 26 / Android 8). Same filename/layout; arm64ec, 16KB-page .so (loads on 4KB+16KB). --- app/src/main/assets/directaudio-20260812.tzst | Bin 13662 -> 14017 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/main/assets/directaudio-20260812.tzst b/app/src/main/assets/directaudio-20260812.tzst index 18314bce4185e6c06324c1d0e7dcc81a77c9aa48..40271a7f59c3de5475b52a15ef7c50d0718f9d46 100644 GIT binary patch literal 14017 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 literal 13662 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 From 600958b1fe156f37b78eae940a81c16e1ea9fb7f Mon Sep 17 00:00:00 2001 From: The412Banner <205237651+The412Banner@users.noreply.github.com> Date: Fri, 14 Aug 2026 12:24:47 -0400 Subject: [PATCH 4/4] assets: update DirectAudio driver to v1.2.1 (+ diagnostics build) (#8) Two upstream fixes since the driver currently bundled here (v1.1): v1.2 - mmdevapi MIDI notify thread spun a CPU core for the whole session. midi_get_driver was unimplemented, so DirectAudio became its own MIDI driver and mmdevapi spawned notify_thread(), which loops on midi_notify_wait - a contractually BLOCKING call. The stub returned immediately and never wrote the uninitialised `quit`, so it spun forever (mmdevapi_midi_n held 34079 of 34314 utime jiffies on device). That black-screened heavy DX12 titles and silently cost every other game a core. Fix mirrors winepulse.drv: return L"alsa" so MIDI is delegated to winealsa. v1.2.1 - permanent audio loss on rapid background/foreground. The guest freezes, the in-process AAudio stream starves, AudioTrack disables itself after the underruns and auto-restarts, but the data callback never resumes - and this raises NO error, so the driver's only stream-rebuild path never ran. Adds a stall watchdog (callback silent 1s with voices playing => recreate), fixes a liveness counter that only incremented inside a TRACE_ON() test, and stops the adaptive buffer treating a frozen guest as timing pressure (it was inflating 192 -> 5568 frames, 4ms -> 116ms, permanently). Verified on device across 7 games (D3D9/11/12, WASAPI/FAudio/DirectSound): zero underruns, and for the bg/fg bug specifically - 5 stream rebuilds with no audible dropout, plus 5 minutes of normal play with 0 false rebuilds. Both archives ship so you can choose: directaudio-20260813.tzst release build (default) directaudio-20260813-diagnostics.tzst same driver + 23 logcat probes ContainerManager picks via the DIRECTAUDIO_ASSET constant - one line to swap. Note the release build now logs stream rebuilds itself ("DirectAudio: reopen: "), so the diagnostics archive is only needed for per-callback detail. Driver source + full notes: https://github.com/The412Banner/directaudio/releases/tag/directaudio-v1.2.1 --- app/src/main/assets/directaudio-20260812.tzst | Bin 14017 -> 0 bytes .../directaudio-20260813-diagnostics.tzst | Bin 0 -> 15773 bytes app/src/main/assets/directaudio-20260813.tzst | Bin 0 -> 14578 bytes .../winlator/container/ContainerManager.java | 15 +++++++++++++-- 4 files changed, 13 insertions(+), 2 deletions(-) delete mode 100644 app/src/main/assets/directaudio-20260812.tzst create mode 100644 app/src/main/assets/directaudio-20260813-diagnostics.tzst create mode 100644 app/src/main/assets/directaudio-20260813.tzst diff --git a/app/src/main/assets/directaudio-20260812.tzst b/app/src/main/assets/directaudio-20260812.tzst deleted file mode 100644 index 40271a7f59c3de5475b52a15ef7c50d0718f9d46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14017 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 diff --git a/app/src/main/assets/directaudio-20260813-diagnostics.tzst b/app/src/main/assets/directaudio-20260813-diagnostics.tzst new file mode 100644 index 0000000000000000000000000000000000000000..55ff0bb2066707d60853856239a60728898cc2dc GIT binary patch literal 15773 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%0Dn{6c5Tf*mU}b-v?2Qk{Zv<~9(! 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 b*n)UyO!vG0jRJT(Ab{)8@4oa^ZY~|Ghqg<% literal 0 HcmV?d00001 diff --git a/app/src/main/assets/directaudio-20260813.tzst b/app/src/main/assets/directaudio-20260813.tzst new file mode 100644 index 0000000000000000000000000000000000000000..914f9faf3a00c4bd650e82eb1a9897e65c0c5717 GIT binary patch literal 14578 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/winlator/container/ContainerManager.java b/app/src/main/java/com/winlator/container/ContainerManager.java index ca8565200f..313e7cc9c2 100644 --- a/app/src/main/java/com/winlator/container/ContainerManager.java +++ b/app/src/main/java/com/winlator/container/ContainerManager.java @@ -337,7 +337,7 @@ public void onProgress(float progress) { /** * Extracts DirectAudio driver files (winedirectaudio.drv and winedirectaudio.so) - * from the bundled directaudio-20260812.tzst archive into the Wine installation, + * from the bundled DirectAudio archive into the Wine installation, * then copies the .drv to the container's system32 directory. * * Files are placed at: @@ -349,6 +349,17 @@ public void onProgress(float progress) { * @param containerDir The container root directory * @return true if extraction succeeded, false otherwise */ + /** + * Which DirectAudio build to install. Both archives ship in assets/: + * directaudio-20260813.tzst - release build (default) + * directaudio-20260813-diagnostics.tzst - identical driver plus logcat probes + * under the "DirectAudio" tag + * Point this at the -diagnostics archive when tracing an audio issue on a title. + * The release build already logs stream rebuilds ("DirectAudio: reopen: "), + * so the diagnostics build is only needed for per-callback detail. + */ + private static final String DIRECTAUDIO_ASSET = "directaudio-20260813.tzst"; + public boolean extractDirectAudio(ImageFs imageFs, File containerDir) { try { // Extract the archive to a temporary directory @@ -364,7 +375,7 @@ public boolean extractDirectAudio(ImageFs imageFs, File containerDir) { boolean extracted = TarCompressorUtils.extract( TarCompressorUtils.Type.ZSTD, context.getAssets(), - "directaudio-20260812.tzst", + DIRECTAUDIO_ASSET, tempDir, null );