From b3fa7044dca9912ae83ba85a5646044b0634a16f Mon Sep 17 00:00:00 2001
From: Vincent Lucas <chenzo@jitsi.org>
Date: Thu, 20 Dec 2012 20:47:34 +0000
Subject: [PATCH] Adds capability for Windows to retrieve the model identifier
 for audio devices. But there is still some issues with using it. Thus,
 disables temporaly the use of model identifier.

---
 lib/native/windows-64/jnwincoreaudio.dll      | Bin 53925 -> 55426 bytes
 lib/native/windows/jnwincoreaudio.dll         | Bin 51840 -> 53877 bytes
 .../org_jitsi_impl_neomedia_CoreAudioDevice.c |  15 ++
 src/native/windows/coreaudio/lib/device.c     | 209 ++++++++++++++++--
 src/native/windows/coreaudio/lib/device.h     |   3 +
 .../jitsi/impl/neomedia/device/Devices.java   |  10 +-
 .../impl/neomedia/device/PortAudioSystem.java |   2 +
 7 files changed, 217 insertions(+), 22 deletions(-)

diff --git a/lib/native/windows-64/jnwincoreaudio.dll b/lib/native/windows-64/jnwincoreaudio.dll
index 2b0bac5c104f9894577c899445f278dbbcbcd7ce..6ded173cda25bc7c162b9ed4e9a55f7719c94cd0 100644
GIT binary patch
delta 17189
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
EpEsIRrvLx|

delta 15459
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
aI*z`7`f+>S2Qzv5p}*b^w4dwvv+&=_7>ykO

diff --git a/lib/native/windows/jnwincoreaudio.dll b/lib/native/windows/jnwincoreaudio.dll
index 9f1768b7f65952c06ff79882bce8525e5083cea3..cbc7a20c6ee184e2d022b518df7f39569e42ad82 100644
GIT binary patch
delta 15265
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
EU$yS+6#xJL

delta 13659
zcmcgydstM}+TSw_I10+B10tdfI_h}IX1L8B<^m-arg_NBNQsLIiXzU3gOP`vF`%4A
zY;>tXS%H|^MN`K*mX?E1SYH?FcupEx)UnPObPkny$UM&XTYD~hw*2)y&v(Af^Ro8(
zt@pOx^{&g_dw$&)X4@6!+_La+wL6z-WSHkf4Aa9zOo|kVV;M8UFiOw}hRKqnl!0s@
zMrG#i#S9}s4I*4gTeup)A7^d<GI973hG_&7<3<^=J!xEcKf|acxRLZQOdJ_`P%dd>
zm_7ibW?4$AEnu}(;2$+)CQpebX>7Qo8fa6<mBpytvnp2<TZ-XKBpRHcD9{G-l_*iv
zygey4-o_NUXO;MPI4|H0=jY>OmN<SyV+5*hkQDR;Su9Q*+J!r6Y#Z4mPSo`HYgBc}
z<uhGUzHT|~3mW=CRM!sICt{N*E^7_L*d<DPyJxqIVd}eER~=HBTUQ(+O392d%_?)f
zJ9^tRgsj#ha*VgNp^a%KrIP7W!R9$Q9u0j__3o<ATFd}y2gK2Je}nQ)i82v|=f&0J
zPm(0Dt&MysnUO<9Qi38MYr6eHqUgG4nBZ!#SNAnU`KE9*)pu77>3?#3IW)A$c9VO<
zCmZ0KsJ26X0<Fx_f-_N!#(gE#>-9Fg34m##-9W!QVbPFw+uyg`(Xzr1^^YKj!zWC0
zmch?(3Q~d2a4O-uqg|nQ8h8Jb;pK<Oui=WjyHsX$N=l1x+D^@SGN9th&6{3tpub}&
z@FNAXl@f_hhC$(xamLJtNPa}}WSh!d^>7QrMb}c}IgP;E%au|pL(SR^O3$m~h$|u~
z5uE6f*I`jA95qU%qg<(~?U>o_Y_LpWJZog+mk8~sWutxK_I#y;icTCy3`1072jaQ0
zxmEE`@#L`~8u7dF<j4?%*cMOzF(iBJbU*L=S2n`;+P(zGBBio3T;5FPNvB)2qZkH2
zRPPr~47TSya;~-`>Wq{r<?3u$Xnj81FgWs+xsb@STa;OFAjc7AuTf^(7bzv^BTZn&
zo}lzP_fbuKQTF%fK;4I=qyrUQ_cUz>Vl72^#$gSkf}ok4ked^d+B;!jX8q??MtiE#
zGY71W(T;4GL?FRuM=ZTN4uaP{026S?fFNceh}j5YPHo40WK6>bShSpWM8Z!Q3`7OJ
zgETd^Jqvw{s_m2aKBw{aK7*)}LV31Chc1u<@*2s@LvS-S#w>}U$a68}l3f&uj7=jp
zsk|`m45mb%6w@O@<F4&UXm2@=2}F&|K^N(8(=0;nFitSKv*2`;=f5#gIX(&?3hk($
zph?jCjxV(vPD6-kNjO7(k<JiHo+FB(F>^bfMW)2aIfHV9vE5P~G<LVpSWbvB)h)&p
z%gLsp_fBhD#xM;zB71v7_E1@EPrpYU!!Xl28fuhs`+UUL;>)yS%gEKCQ>}qcEfU(9
zza!YGUZpeWO{S15is$mEVV2|5T=RE+3U#F9s=a?{LE*!E_!fuiuu7E2w+Bsm`ih0|
zyNvpkpODr;4~jyiB}ykBk1HDy=O7<!hYr%!5Wa;Wd}OjrCeGVVW<*wr&pk`_Mk@0H
z5xGyOp+BUrufhw?lE0^|sMmI|8uwDZn>j-9eLKj6sKXf!8733ASjeB_);RA%IkyN$
z*MA8COahkX&0B>CU9Jd|ORhw2CwNvBl8E7o_-(*-?^PvZP9no|rL}!@)$qnB&XBC(
zNx{LKEwo*;laH_r8id0X0i^e3x+n#MCm14$aw`eS_r4osS|~JfnW(IRdC=SBU&sTo
z%og%y^9rx52^kIP9YQ`f#PPfWVa#(;ztWG?pq@9JnhMEi=Kk8gIK)svW7vO#+>~Vm
zhx0+9YT2$}pFAHtEL7cwx^LE=3ift^P~5$fI7b@9iW}sUk*P}p-Mq!di4Ys!e4&kh
zp<dgeT6)2Ap@&bJTdb_wMe;|b4neO}*b~X!v59fJsh+_8XvY$SbtewHBiR%?<?bRh
z+S?I;I2wQ@Xyr}>01_xL7XaM{(G?sLu(7c|C+z2!wmZS329r1DR2%7y-I{~lOAJhD
z8P*vdMJtfP5y3LDc0gp&*LKADHgBxNCskc4^XA{_f6L!XosKZ9%VKX=ZM%em<n)+Q
zoj*Vl`EHfDAz!KV&zt7qT*@o3?MUgO&qdqc)`2$9pGZO6#L?JmF$v=8KZxG;4Z7fn
zNoXb{PA_UEpT<p&^tDPH<9D_ZZ(KUi^s$E9UwMeecRsiDlsX%*B~k{Jx%Uvwm)e0W
z%LlZ_4dvLJ$2;3d%h+VmTyk#ge8?xoCrxmIx3*7K@5W9gkFLLjMDxbv(j7petlLeB
z;>S*fVMjJAf#Xug94YWz^p1AJWB<3;OV?Ro>fNL{K6WZ?@)QGhw!}dW5gO9&n<Ed{
zzk6^oMmWDSJg%8sidR_Cj#$$rJ6oBE1-vx@$O#qJi`(eG+JPa_+xBpy5gEO0Ap+7u
zVVu3{w*hUL>91@?#bH#Vb~2Sh-srmNU_MEi9kZnv#_0N90JZH=7$<=1?{SQdesevk
z8JCvS1AjZ`bU+2;DZGJ6R&tdKB_~bU$>-yy7g4Fob1e$^r|H&QYk2IVdbd^9d#Lt(
z5wz;lXv1SKwov~?=N+>8&n@544Kx8-u?$KaSrRVe=(zY6!MbnJ)G+5Pq8J4+lAjP4
z?H>v3;2Ws(q&8u(7)5tN{u1bQ%=QhyY^ftlFa{r7#~5HRFb1#D;J<~sGjO#?Z4jjg
zh(s7Jb$Yuvq#>8{DMo4|+sDUP&70uY?_P_tzS|P*l|Rqbdqwc0>L;j`O@Z3v-*D#Y
zh+EpO>FyO{&z&uD$m=O1PB;C%?>8KuLSyI{u7t1kA6O!OX{Y(u8BXg6KGVCC`c&ID
zzlDWM^!&x0yKvMolF1V$h-@T#!sPUPE<zHVfD||ZVUp$m(EQW>zBgt*?(FT}m?BzY
zq9bWkTvV&u$cqz{5zyLdu#pcYOtH4m^RJ>+WgaSF+;9PR)P>do_|iHPHD4N2hg<uA
z`COXQ-(sMy&AIB0seuvfIp}=UGxW@|)mQh%WaEaOiKu4IdL7py^&Gt)4@|ymiqrW3
zm+A?SuY);nOcuBt<M&Y0w{4;K#@sftGcj!l*IM32x)NhVt>pW}Sy?hD;?72MF>e)q
z4fZfpl=j&YpQ;wB$<FDsBf~jIeTJZFkz(Q`YA9c+z@csk29565LRVt;w2~&pbe-Qk
z*I7TKBS&h#M~c3AF5+Ym6f5WYDe1l7xKr8+=^KjlGDyQhS&I!fm}XTyo#FJB#x*Es
z@XK{LIW}bCR38@|5pHRvXHITcrm|>%*7Ggak6sc~v7(JUm$Xy#JW)?vBHHV6OdKLc
ztcdc-$#QOR%svyX`yk&N!;Q)!A5`xKNHQn4xcVncMaZ$=ro18A?RtIcD`Iij@2;iO
z2gKr`1Fi>dds8gBk3^}>qAu5C>KDRAZ6qPRRJ6oZn?5Ui)J#~>xIM>zgjc)lKfSGf
z#?`J*5ycjyGtB0FN+<1a5pth)dhRnM%2*)!*|o+vP9!dRhHNoqiR7*iOoifDL$YsV
zv3{Y0Z{tydIeF(ZF4G<B#G)6;;n~lNQ=f6&n=KQIdm3GZcReN&Uuq;@-K`T}Xe48E
zGQ?et<bj-Z)2}wF%om3b(Es5~lgiwkt*p5?T#CD|+BV5Bvub>Ztcm<1CsSP1L~fsZ
zSRB_xzMk7Ap4mk9-jfrR3hsvWqKm12$!j9l?oo>sO++<sT9guaujWGA`P&ptu7~H9
ziehI1xs<OoZ!TBjeL+^(1^4;M>LzkwegW02yLY-+-Q+5{H)e=f+2pEOR3#dd2Z_!)
z<yLf$j`1ZN^)7@fn}~GrL*mq?*5!-Crcg7OMb+4Ayq6X!W#@;hfczXS%T~&Mjvfh#
z^Wig_T=s`9iennNp+qWMq}ZYiSX-a>bd!zw?67@kaj@Q)R2w;!pFNDuU91Z&``TQ?
z9yW@^tJ=uif;+^PHnO!~<8TY7CJy;p=ed)NE;Q1Hg@uK2R7)wGnS~MLlpzVb-#*w%
zJ}7(;X_i!!Ku-nr*PweQbd$M7|4!g6=PPppa%$=XCwHXPwX9ekW<||0{y3M=RWdq}
zTWJMTjGjR}Qn&Bnn?<j=e9hy$!$X)wflexL8uoT|hO3~3Tew1Gojw?WWqJ?LY2%2Q
zNlkxV712W3+VNoQIcPZTGca$kfmm<X+f=EYlk>Zk(60HM6Q?NAl#I3F*i?I6Y?%Ya
ztB#5KpNwIEppxqtzXHx8)fE7|fA%dtY{<R40^3FHQ8*AzW$1aTL9(Gi@*Wl7dP`SB
z$klepmlm{BD;W+>eeHEo6^<|T1&-Xmp}-Dx*86A5K`xcVmHAcnHsQhE$QiH<`Nj9L
zp+S;`-iKQ9uUgy^vw=Ag232@lLZ#>tPy9<ecaR=W7pXx#A_b*sBj^ZrTk`Q7B6-8z
zN?J<uu!>wSjgQ@@GPhk16P?+7T>%Fl+1VgzZ&lmK^p#Vjkg+FV>2c+)JTDd<BAV5e
z;<{(aORFD1<@eQ7MTcCI*1R4;L+oJSxo_))=X7I%hjbmGQS&?s%@jjwG6<aKzfiZI
z(YP@OB5TixkR_f{K(u%CEk^?8z8t%1oX333>*e;4nT|A?T2x6h9=>Vx|H?h=w_?)V
zSD8Tb)Vz@<X2O*fn2g+>4d&yN8Bbn*<|4R?b0oHNn&w3i!0sZ)yNWn!+rRAv3h!hO
zOgf$3$p`)Ad4GAtUov<DK-(|2S$#KM{)Rq(DfKf%`O6c2yxCv6{bh&0?Dv-+`Admk
z?wr4V*<ZfqFMIsu4W<9)s=plYmuI=M)XDw1o?d^S*d^QG6z!;%ifcBJVbxQkG5$vo
zhXvnfojf}BbhayLgIjcL<Go>F3yRm0+>Nuy<ByGz;J$>kJhn)@pqO}T)MUn{iG2H}
z(ZTx<Hw_c5C*Roq(7MGY63Z0ism;HKBaO0}$y1LnupXJOGS}VZBjUfW_m_&0ww`$^
zvl~Qtn^D^Q_bdEmK*#^Gv~miw{7Pj0(sPf>+yQC^QH3S`lHTWr+}~>Ke2Bw=ww}BB
z4hAs3M3T_T5kHd|WmgUigUp~TkOBrN7VbCvm$~2vRf4E;HOhd(G}INKP@{o+iqjc5
zx1zMHqRjFrv!HkZ6Qc%@i%k84kKDMg%O$JpEUxeC4vR?F6aCgi3*PnPsyO1?_3(y`
zp`=1R8&m{x${D5^WQ)Zr1hUb4yt86(zZvbFAo)>-Sq^f6egowkLp%0SF%yRO?BRGR
zzPjR(vWn&FDocv1R+O!qwW7S7xu=*kY#A37ijxCdGK4_SmU!~<yF<wW`-EE?<iu*f
zeK2^NdlYfr%H40jMenqyW(!5Po}Pl)P$tUAbyMGcSO0qqV`yWT<L&^0uMzJf9>7$f
zz_k^a{0u%dSXF0m+yLc)%0Z8V8bJp^r$C>8JfH!Pyd7FVS)g1{DaZzT0kj|VHs~zq
zGUys8f_va&m;{v5K^dSN&_YlFsI-HzG8MR~20adX3bX^X2ecn_81yE{4f+st9`r5f
zAD{t{1l=70iU%n{vp_6}UfC$~K&wGDer#}Ot^cpR9o*Rm(2M{3-nyo5D-ydJozWtz
z8=?3Q(!4nf7tEQTlFUsIn3BU*C|N@*|B3sx>o+W~wD`=cU_6x8m6t^LT*FMM7LnmQ
zBc(D07Vkur*)?)^k4QGQM`ca`$(mK>IJ|HI+Aj*HAMxBIyzvgJMf-&IdF^5CXWE<E
z7<L>xjm={3V}EBy>5_D;ZmzCGSEFmt?bW@d`%w3d?q}W53|q$jjCV3V$@nhgM#h`^
z35Giid4@8>W<#T4zu_IjX9kbqH-pTWWZYtW(RjqzY5dB#&{SsHXd<RpOy8LzGZQi&
z%v_gg&tw#sXI2qbE%hYzo$4I*!|M0cAFF><Cu%gBwHl&%UUN<}B{?(sbn>^!|4P1@
z9G5aZ#gwu*r8wn}DSJ{5r?^s1q<orkG3AGpf2Q0>8JRjUbw=uasjE}XskYQ7Qum~`
zrk+Y|PyJi!^;CIUQrewq1!<3_J(u=&+F#RtNV}OfGJR6|?djIL(if+fq+8Q>r0-2X
zp8jq6P;I<cshz1cYL{tOYPV^3YG2SE(7vWUsda15B1+xbZ?r#Xf7iyd3U&%RlTBt<
zu@!6``yP9ay}*9W_OU;+F}fK#jZUjurdy?Z6485B_nGcX-FLcv-8G#kBQhf?BPBzZ
z(VcN6qu-kGYsO-Ig?_z$w|>9=kiJv@rT!cJ-}O@rsfLFPj~HqUFB?u8+6|u@{$?0%
z)EM73x{YUze>Pq+KADMR%)*yi6nCKC&!)v{Khkv@el!8d#VUcKTzx?OH}xXT5>1h2
zwWdb%j%IDLI%Q)@UCNs&-=y@W+@EG$nbw*1OWH8wX47udPbQ{_VYWc<7fpEbnB-qm
z?@YTV?di0}v@g=*wY#-F+B?`>_CfY__9ONS_OH4t=ux;a(imr)X-qTDGcGbNGgcb^
zXxwVtWqjFq*!Y(5wDE$m*Z8aPhEZygn-Wd8nbJ-7m>w{#G1ZxNm|iv=vzpGDE|_{u
zeWr<-w`Xq2Y|T88`E};^ne_8^9vnHHoRVTsIhs<OaW<nX<7=cGqnGO^>2K3(^b7S%
z^vm?C^_BXK`p5N8>38U#)$i56qCcj8TYpCXq5gBk@>~56`k(dJ^<u*?!zcq3+I%0d
zrE0Z0Rn1^^b}~#Ca9MhkR;De|uF$U1mTS#gi?&)@qqS-4v|F@WwNB(gqjrzBS-Ver
z5ZQ1<dt7@$dkQ(xfvosQ+oe6HJ+Hlp2wm2Cw0+us?N#l7_J)>WC9IT<Vr8tHjbjs#
zGfGy4tWmS6EXx|$EGwJM=CJb-)<tX{o6i=pE09p-teLg2)ocxGLuzedx3W%lC)>#G
zVVl`~>_PT5_6U2NJ;9!0-E0SYmhE9LvmT^gKOJ=RMus9v9j8uE<EF<~$M<lxR2@Z;
zkjr)ZhBKlaFIc8fk(*wIS&0dWH710`cZ+Wxj7>shE%Dpc66-<KoDzDTP%vVS;V1lW
z79e**lPx@yXBX9tw-vn970M$(3{ck}L}rzim6t$B0rGjbqGUtaa#H)k$OtDmi-rU|
z+KXBj4obZ4<3M@@$a_E(!$Ns_fMf}f>p*1q(E_h$S{QyyAV4yKWZ`W)&y!aGs9yj*
z0)+lJgJ;?WL?%EE0dWhE{|3?(L;~HPNM3wpl1Rz@pGJC{6C*s}>luO0<7Gd-`TL9n
z*k_PAEt5pIld_h?Y1gPx3@+~m-Z(POAQF(#kfV@ECx2;4jEDtCv&<jaF;h`HGKgPC
zZr__YhDBQuzQ_yhXOfb=i4pgsO&06dGOZM~ESyh$oP~vjYm3V&7-tX(_>oOMgY2W!
zW<Yk#cGPTR0<r<lyU2{zNo0EKaI&;@bm2>s2WuhU&vqcPv7yLisx^oN^xPZFE!;4_
zfrq~WJWI&Ot%(uCk<GdBfs9K+&4!;6@D?>d+ydloDlsmUrv!*ofNY{t0%Qje1>X7d
znp>$J0n(-d)GUB515x7#CqA)&>-k*P6p-$HlgO9*h7svYu@PQsU_xMk6ENMfCfq8w
zl05WMVuT)TMH7hn)rq1tqy@m;0L(sM9ntJhjCcru%?GR}j{;Z?!0iJzkhcAaV``{K
z+O7IGl7H==BzBuP-J3|}fk~4U4+NO#2sBW|K_t+fTJq$9Nm>Q=20l9U*Fw!fq;T!B
z%JPy5rVAgmgrRtfd~+Z%q7~fgCH~GAxu|nX0-V%t2N1Ua=>pOdL;{}BA8zm~=2zem
zURNpda3ILhSc%N|Oe*x~dGgl5MC)|4F<4;v9<e~&0%Q&lSy3p@B8n7;B85P*1jrg7
z&C5c0{s_dqJQT4P0P0#13hktdN<xul%2OJOyh@Rkp~#y+dR7IHK$!NDH(pMRXh)l@
z%pVN>XQ(Mw-^#fUQQ!mmHF)?dplv^w%?G*vuW<ig<NhBZk*_93T%~%;xr{o_0bT$_
zYdN5h-2dt%YY~0`<_mLSVM%3W#X9`3h)1d_@XN6^M|h;vTxCJ9&W9k6RF+vvm}(v=
zwyeX?ofuhpKo9kLm=up)JkQ#awad+qGHz=SqD*oyF#@qfAOixPX+X9Fk;2l_@~ZW#
z7#oi~vV1+wc4rWwno}UPDu@&=FD|D)i95T-8t}2OkoFYG!85Hav6NJ7VETDvy`^&b
zs!B#GaM1+S2YH^gKGnHAQoL+kCEoC#2qM&>d63FmgX0#T;|~Jr2{IMJSjF<S<}Lw3
zdu9$IRMB!s(aY=g{TvX#Dg;8mtMbS$Ao56t!PduMJID1pwS}`rDxH%)=$%1|&ifJC
z?&JA8km?F@;?M-^HQYL(fmaYclxhz3WCoB^0-g*YxdJ42kkmRLI|V#X_<5*5K1X(0
z0hQx?L3bw~^cs*=0<rgjY!M*cKvoEln?UHr2Wt$DKlE3ce6VH!=?F?;tFA6DB<Bvx
ztSlOY!nqW|*??D9#_=dZkXj(rZJy^vAeVy%sK%o}@DhumbKcjzb|8%co^Pyx=*27g
z705Xd?|U?QLc_)@N&<3FpeO~1(AaDs39!o#?ouE{LCwAxST`~Xf$G&@+9y!G2?)J-
z7q<b~3cbAQ13;<;QfCKAT>ugVJ^XP09Er(uTp)IHkk}~5NCf>zqFQkA4y6G}1wzB@
z3-vrd4{z)tAm;?ON`Y8~X=3+_@v56BBFKiLKvoFS_FW*^0@W9Q$OTSc1wzm1{IE)(
z<2CxOfDhv+KzRaWIuLsC4jF(bf$-U|07#U;SivBv4M3y<o;ps?s8B^a0Tm4;;$!Ny
z^hY`L;_bdM2<ZgUC-C+QAi{C@evs5P4hdb_!pV!rCRL2X6M{<M;Z%wU7Qs0{gkCKH
zf)g?~KOl^&luDuGqq+%*8CLmR*gb-%U8(X`+E78ak3iZS9YLyH6Rq_5g~o@M_y`Dn
z)TTCkc76aNoR!ysAX7r5BJdbfB#2M~5PI>WHw#FIATe^RfCdC&i-GjxfXjEP5{S_E
z%|LPlQZE3Zivr(`!$9f;JZFK>iy!FjXzZvG%tJm^uMT30L`RziiYCym3lyn=^b2@Q
zln3GCjok-?e#YfHwo-;g!7YF`fQj~lXL=e)xq#;okh22hEg&8N(g}pdf;WE=h#6{m
z&DVg44CLiE60MSvSV6(gZ&@RNEE1?x0XZQ+(tuP~geKK&AoSwRJ~#+j2jqxAkIg!W
zX*Y++LKM9YL<!Y=I<;{;q0{RVAap2s^A{-(hJo+(4?wyE<_AV13qBG+5m+p)3Nm#f
z5Q~5(3kbdVdGZjDd;!l!AeRMt_5cYasc&|@F^U<<D4>WB{+Ur^)t@F>FZnI--TB!s
z9ngT2Djwf&2yDg!p%*Wu1#(`%GaE>a09geDK!}vhI!MuWAX^1uE+7g)d_VR}@e%g`
zi4*Y96z}IAbpuPxa3I3{DN&A5p%>o|J)Ic><bEJFfkVrH&_MDL+6ZL6fM@q0Jud+<
z2zWZ=n42sV@x%MYAhCY}xhfE2@EuRskBLBJ2!?NoDZIbDq{N(+D(r?HJoMr-;4UCq
z3h})!03@6M6+p5C=C=a5==$`n(PHtlG34^eDa5%YPWV|a@?DJ(=(i`32j5K+f{(mw
z6av1_hBJiVw5KMMHK!*E!L6rrgh0<0`eAV-$#jR4f1e&dxbZgk7!q@857E7I(ly&%
oC3c-XGeqp_?l>LhI(BxB#1;SXXfava8RyFX^jk5>{e1HO0OARG&;S4c

diff --git a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
index 2afc9305..68d3704f 100644
--- a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
+++ b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
@@ -49,6 +49,21 @@ Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceNameBytes
     return deviceNameBytes;
 }
 
+JNIEXPORT jbyteArray JNICALL
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceModelIdentifierBytes
+  (JNIEnv *env, jclass clazz, jstring deviceUID)
+{
+    const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
+    char * deviceModelIdentifier = getDeviceModelIdentifier(deviceUIDPtr);
+    jbyteArray deviceModelIdentifierBytes
+        = getStrBytes(env, deviceModelIdentifier);
+    // Free
+    free(deviceModelIdentifier);
+    env->ReleaseStringUTFChars(deviceUID, deviceUIDPtr);
+
+    return deviceModelIdentifierBytes;
+}
+
 JNIEXPORT jint JNICALL
 Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume)
diff --git a/src/native/windows/coreaudio/lib/device.c b/src/native/windows/coreaudio/lib/device.c
index 5895b46f..ebeb979f 100644
--- a/src/native/windows/coreaudio/lib/device.c
+++ b/src/native/windows/coreaudio/lib/device.c
@@ -16,6 +16,7 @@
 #include <commctrl.h> // Must be defined after mmdeviceapi.h
 #include <endpointvolume.h> // Must be defined after mmdeviceapi.h
 
+
 /**
  * Functions to list, access and modifies audio devices via coreaudio.
  *
@@ -31,6 +32,16 @@ IAudioEndpointVolume * getEndpointVolume(
 void freeEndpointVolume(
         IAudioEndpointVolume * endpointVolume);
 
+char* getDeviceDescription(
+        const char * deviceUID);
+
+char* getDeviceInterfaceName(
+        const char * deviceUID);
+
+char* getDeviceProperty(
+        const char * deviceUID,
+        PROPERTYKEY propertyKey);
+
 int setDeviceVolume(
         const char * deviceUID,
         float volume);
@@ -38,8 +49,15 @@ int setDeviceVolume(
 float getDeviceVolume(
         const char * deviceUID);
 
+// Definitions find in "functiondiscoverykeys_devpkey.h" but not found by
+// MINGW64 TDM-gcc compiler.
+DEFINE_PROPERTYKEY(PKEY_DeviceInterface_FriendlyName,  0x026e516e, 0xb814, 0x414b, 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22, 2); // DEVPROP_TYPE_STRING
+DEFINE_PROPERTYKEY(PKEY_Device_DeviceDesc,             0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 2);     // DEVPROP_TYPE_STRING
 DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName,           0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14);    // DEVPROP_TYPE_STRING
 
+
+DEFINE_PROPERTYKEY(PKEY_Device_BusNumber,              0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 23);    // DEVPROP_TYPE_UINT32
+
 /**
  * Initializes the COM component. This function must be called first in order to
  * able each following function to work correctly. Once finished, the caller of
@@ -224,7 +242,8 @@ void freeEndpointVolume(
 
 /**
  * Returns the device name for the given device. Or NULL, if not available. The
- * returned string must be freed by the caller.
+ * returned string must be freed by the caller. The device name is composed of
+ * the device description and of the device interface name.
  *
  * @param device The device to get the name from.
  *
@@ -234,10 +253,162 @@ void freeEndpointVolume(
 char* getDeviceName(
         const char * deviceUID)
 {
-    size_t deviceNameLength;
-    char * deviceName = NULL;
-    PROPVARIANT propertyDeviceName;
-    PropVariantInit(&propertyDeviceName);
+    return getDeviceProperty(deviceUID, PKEY_Device_FriendlyName);
+}
+
+/**
+ * Returns the device model identifier for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ *
+ * @param device The device to get the name from.
+ *
+ * @return The device model identifier for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ */
+char* getDeviceModelIdentifier(
+        const char * deviceUID)
+{
+    int deviceModelIdentifierLength;
+    char * deviceModelIdentifier = NULL;
+    char * deviceDescription;
+    char * deviceInterface;
+    char * genericDeviceInterface;
+
+    if((deviceDescription = getDeviceDescription(deviceUID)) == NULL)
+    {
+        fprintf(stderr,
+                "getDeviceModelIdentifier (coreaudio/device.c): \
+                    \n\tgetDeviceDescription\n");
+        fflush(stderr);
+        return NULL;
+    }
+    if((deviceInterface = getDeviceInterfaceName(deviceUID)) == NULL)
+    {
+        fprintf(stderr,
+                "getDeviceModelIdentifier (coreaudio/device.c): \
+                    \n\tgetDeviceInterfaceName\n");
+        fflush(stderr);
+        return NULL;
+    }
+
+    // A USB device (without a serial ID) puts into a USB port will add the
+    // port number (if greater than 1) with the following prefix: "X- "
+    // (with X the port number).
+    genericDeviceInterface = deviceInterface;
+    // First skip the number at the beginning of the prefix.
+    while(genericDeviceInterface[0] != '\0'
+            && genericDeviceInterface[0] >= '0'
+            && genericDeviceInterface[0] <= '9')
+    {
+        ++genericDeviceInterface;
+    }
+    // Then skips the "-".
+    if(genericDeviceInterface[0] != '\0'
+            && genericDeviceInterface[0] == '-')
+    {
+        ++genericDeviceInterface;
+    }
+    // Finally skips the " ".
+    if(genericDeviceInterface[0] != '\0'
+            && genericDeviceInterface[0] == ' ')
+    {
+        ++genericDeviceInterface;
+    }
+    // If we have reached the end of the string, then the string does not
+    // contain the prefix.
+    if(genericDeviceInterface[0] == '\0')
+    {
+        genericDeviceInterface = deviceInterface;
+    }
+
+    // Finally, concatenate the device description and its generic device
+    // interface.
+    deviceModelIdentifierLength
+        = strlen(deviceDescription) + 2 + strlen(genericDeviceInterface) + 2;
+    if((deviceModelIdentifier
+                = (char*) malloc(deviceModelIdentifierLength * sizeof(char)))
+            == NULL)
+    {
+        fprintf(stderr,
+                "getDeviceModelIdentifier (coreaudio/device.c): \
+                    \n\tmalloc\n");
+        fflush(stderr);
+        return NULL;
+    }
+    if(snprintf(
+            deviceModelIdentifier,
+            deviceModelIdentifierLength,
+            "%s (%s)",
+            deviceDescription,
+            genericDeviceInterface) != (deviceModelIdentifierLength - 1))
+    {
+        free(deviceModelIdentifier);
+        fprintf(stderr,
+                "getDeviceModelIdentifier (coreaudio/device.c): \
+                    \n\tsnprintf\n");
+        fflush(stderr);
+        return NULL;
+    }
+
+    // Frees memory.
+    free(deviceDescription);
+    free(deviceInterface);
+
+    return deviceModelIdentifier;
+}
+
+/**
+ * Returns the device description for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller. The device
+ * description is a generic name such as "microphone", "speaker", etc.
+ *
+ * @param device The device to get the name from.
+ *
+ * @return The device description for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ */
+char* getDeviceDescription(
+        const char * deviceUID)
+{
+    return getDeviceProperty(deviceUID, PKEY_Device_DeviceDesc);
+}
+
+/**
+ * Returns the device interface name for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller. The device
+ * interface name describes the way the device is connected, such as "USB audio
+ * adapter".
+ *
+ * @param device The device to get the name from.
+ *
+ * @return The device interface name for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ */
+char* getDeviceInterfaceName(
+        const char * deviceUID)
+{
+    return getDeviceProperty(deviceUID, PKEY_DeviceInterface_FriendlyName);
+}
+
+/**
+ * Returns the device property for the given device. Or NULL, if not available.
+ * The returned string must be freed by the caller.
+ *
+ * @param device The device to get the name from.
+ * @param propertyKey The requested property (i.e. PKEY_Device_FriendlyName for
+ * the device name).
+ *
+ * @return The device property for the given device. Or NULL, if not available.
+ * The returned string must be freed by the caller.
+ */
+char* getDeviceProperty(
+        const char * deviceUID,
+        PROPERTYKEY propertyKey)
+{
+    size_t devicePropertyLength;
+    char * deviceProperty = NULL;
+    PROPVARIANT propertyDevice;
+    PropVariantInit(&propertyDevice);
     IPropertyStore * properties = NULL;
 
     // Gets the audio device.
@@ -245,7 +416,7 @@ char* getDeviceName(
     if(device == NULL)
     {
         fprintf(stderr,
-                "getDeviceName (coreaudio/device.c): \
+                "getDeviceProperty (coreaudio/device.c): \
                     \n\tgetDevice\n");
         fflush(stderr);
         return NULL;
@@ -255,35 +426,39 @@ char* getDeviceName(
     if(device->OpenPropertyStore(STGM_READ, &properties) != S_OK)
     {
         fprintf(stderr,
-                "getDeviceName (coreaudio/device.c): \
+                "getDeviceProperty (coreaudio/device.c): \
                     \n\tIMMDevice.OpenPropertyStore\n");
         fflush(stderr);
         return NULL;
     }
-    if(properties->GetValue(PKEY_Device_FriendlyName, &propertyDeviceName)
+    if(properties->GetValue(propertyKey, &propertyDevice)
             != S_OK)
     {
         fprintf(stderr,
-                "getDeviceName (coreaudio/device.c): \
+                "getDeviceProperty (coreaudio/device.c): \
                     \n\tIPropertyStore.GetValue\n");
         fflush(stderr);
         return NULL;
     }
-    deviceNameLength = wcslen(propertyDeviceName.pwszVal);
-    if((deviceName = (char *) malloc((deviceNameLength + 1) * sizeof(char)))
+    devicePropertyLength = wcslen(propertyDevice.pwszVal);
+    if((deviceProperty
+                = (char *) malloc((devicePropertyLength + 1) * sizeof(char)))
             == NULL)
     {
         fprintf(stderr,
-                "getDeviceName (coreaudio/device.c): \
+                "getDeviceProperty (coreaudio/device.c): \
                     \n\tmalloc\n");
         fflush(stderr);
         return NULL;
     }
-    if(wcstombs(deviceName, propertyDeviceName.pwszVal, deviceNameLength + 1)
-            != deviceNameLength)
+    if(wcstombs(
+                deviceProperty,
+                propertyDevice.pwszVal,
+                devicePropertyLength + 1)
+            != devicePropertyLength)
     {
         fprintf(stderr,
-                "getDeviceName (coreaudio/device.c): \
+                "getDeviceProperty (coreaudio/device.c): \
                     \n\twcstombs\n");
         fflush(stderr);
         return NULL;
@@ -291,9 +466,9 @@ char* getDeviceName(
 
     // Frees.
     freeDevice(device);
-    PropVariantClear(&propertyDeviceName);
+    PropVariantClear(&propertyDevice);
 
-    return deviceName;
+    return deviceProperty;
 }
 
 /**
diff --git a/src/native/windows/coreaudio/lib/device.h b/src/native/windows/coreaudio/lib/device.h
index abc05f2e..0fc0417f 100644
--- a/src/native/windows/coreaudio/lib/device.h
+++ b/src/native/windows/coreaudio/lib/device.h
@@ -28,6 +28,9 @@ void freeDevice(
 char* getDeviceName(
         const char * deviceUID);
 
+char* getDeviceModelIdentifier(
+        const char * deviceUID);
+
 int setInputDeviceVolume(
         const char * deviceUID,
         float volume);
diff --git a/src/org/jitsi/impl/neomedia/device/Devices.java b/src/org/jitsi/impl/neomedia/device/Devices.java
index 5bad919c..c7e9ca32 100644
--- a/src/org/jitsi/impl/neomedia/device/Devices.java
+++ b/src/org/jitsi/impl/neomedia/device/Devices.java
@@ -73,7 +73,7 @@ public ExtendedCaptureDeviceInfo getDevice(
                 ExtendedCaptureDeviceInfo activeDevice = activeDevices.get(i);
 
                 if(!devicePreferences.contains(
-                            activeDevice.getModelIdentifier()))
+                            activeDevice.getIdentifier()))
                 {
                     // Adds the device in the preference list (to the end of the
                     // list, but the save device will push it to the top of
@@ -98,7 +98,7 @@ public ExtendedCaptureDeviceInfo getDevice(
                         // If we have found the "preferred" device among active
                         // device.
                         if(devicePreference.equals(
-                                activeDevice.getModelIdentifier()))
+                                activeDevice.getIdentifier()))
                         {
                             return activeDevice;
                         }
@@ -210,7 +210,7 @@ private void saveDevice(
         String selectedDeviceIdentifier
             = (device == null)
                 ? NoneAudioSystem.LOCATOR_PROTOCOL
-                : device.getModelIdentifier();
+                : device.getIdentifier();
 
         // Sorts the user preferences to put the selected device on top.
         addToDevicePreferences(
@@ -306,7 +306,7 @@ private void addToDevicePreferences(
                     for(ExtendedCaptureDeviceInfo activeDevice : activeDevices)
                     {
                         if(devicePreference.equals(
-                                    activeDevice.getModelIdentifier())
+                                    activeDevice.getIdentifier())
                                 || devicePreference.equals(
                                         NoneAudioSystem.LOCATOR_PROTOCOL))
                         {
@@ -337,7 +337,7 @@ private void renameOldFashionedIdentifier(
         for(ExtendedCaptureDeviceInfo activeDevice : activeDevices)
         {
             String name = activeDevice.getName();
-            String id = activeDevice.getModelIdentifier();
+            String id = activeDevice.getIdentifier();
 
             // We can only switch to the new fashioned notation, only if the OS
             // API gives us a unique identifier (different from the device
diff --git a/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java b/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java
index 43bb6a92..104bf1b1 100644
--- a/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java
+++ b/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java
@@ -264,6 +264,7 @@ protected void doInitialize()
             = new LinkedList<ExtendedCaptureDeviceInfo>();
         final boolean loggerIsDebugEnabled = logger.isDebugEnabled();
 
+        CoreAudioDevice.initDevices();
         for (int deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++)
         {
             long deviceInfo = Pa.GetDeviceInfo(deviceIndex);
@@ -397,6 +398,7 @@ else if (maxOutputChannels > 0)
                 }
             }
         }
+        CoreAudioDevice.freeDevices();
 
         /*
          * Make sure that devices which support both capture and playback are
-- 
GitLab