From 40b4bda26bd46c7316b412aa915b5138d588f0ae Mon Sep 17 00:00:00 2001 From: laurentgom Date: Sun, 22 Mar 2009 18:36:03 +0000 Subject: [PATCH] Fixed Listener's functions being private in SFML.Net Added a function to set a sound's position relative to the listener git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1059 4e206d99-4929-0410-ac5d-dfc041789085 --- CSFML/VC2005/csfml-audio-d.def | 6 +++ CSFML/VC2005/csfml-audio.def | 6 +++ CSFML/include/SFML/Audio/Music.h | 22 +++++++++ CSFML/include/SFML/Audio/Sound.h | 22 +++++++++ CSFML/include/SFML/Audio/SoundStream.h | 22 +++++++++ CSFML/src/SFML/Audio/Music.cpp | 21 +++++++++ CSFML/src/SFML/Audio/Sound.cpp | 21 +++++++++ CSFML/src/SFML/Audio/SoundStream.cpp | 21 +++++++++ dotnet/extlibs/csfml-audio.dll | Bin 102400 -> 102400 bytes dotnet/extlibs/csfml-graphics.dll | Bin 1163264 -> 1163264 bytes dotnet/extlibs/csfml-window.dll | Bin 40960 -> 40960 bytes dotnet/src/Audio/Listener.cs | 6 +-- dotnet/src/Audio/Music.cs | 63 ++++++++++++++++--------- dotnet/src/Audio/Sound.cs | 19 ++++++++ dotnet/src/Audio/SoundRecorder.cs | 12 ++--- dotnet/src/Audio/SoundStream.cs | 59 +++++++++++++++-------- dotnet/src/Graphics/RenderWindow.cs | 2 +- include/SFML/Audio/Sound.hpp | 19 ++++++++ include/SFML/Audio/SoundStream.hpp | 2 + src/SFML/Audio/Sound.cpp | 24 ++++++++++ 20 files changed, 295 insertions(+), 52 deletions(-) diff --git a/CSFML/VC2005/csfml-audio-d.def b/CSFML/VC2005/csfml-audio-d.def index 5e2d700e8..ebfb7f04e 100644 --- a/CSFML/VC2005/csfml-audio-d.def +++ b/CSFML/VC2005/csfml-audio-d.def @@ -21,11 +21,13 @@ EXPORTS sfMusic_SetPitch sfMusic_SetVolume sfMusic_SetPosition + sfMusic_SetRelativeToListener sfMusic_SetMinDistance sfMusic_SetAttenuation sfMusic_GetPitch sfMusic_GetVolume sfMusic_GetPosition + sfMusic_IsRelativeToListener sfMusic_GetMinDistance sfMusic_GetAttenuation sfMusic_GetPlayingOffset @@ -42,12 +44,14 @@ EXPORTS sfSound_SetPitch sfSound_SetVolume sfSound_SetPosition + sfSound_SetRelativeToListener sfSound_SetMinDistance sfSound_SetAttenuation sfSound_SetPlayingOffset sfSound_GetPitch sfSound_GetVolume sfSound_GetPosition + sfSound_IsRelativeToListener sfSound_GetPlayingOffset sfSound_GetMinDistance sfSound_GetAttenuation @@ -84,12 +88,14 @@ EXPORTS sfSoundStream_SetPitch sfSoundStream_SetVolume sfSoundStream_SetPosition + sfSoundStream_SetRelativeToListener sfSoundStream_SetMinDistance sfSoundStream_SetAttenuation sfSoundStream_SetLoop sfSoundStream_GetPitch sfSoundStream_GetVolume sfSoundStream_GetPosition + sfSoundStream_IsRelativeToListener sfSoundStream_GetMinDistance sfSoundStream_GetAttenuation sfSoundStream_GetLoop diff --git a/CSFML/VC2005/csfml-audio.def b/CSFML/VC2005/csfml-audio.def index fb211e825..3bf96b32d 100644 --- a/CSFML/VC2005/csfml-audio.def +++ b/CSFML/VC2005/csfml-audio.def @@ -21,11 +21,13 @@ EXPORTS sfMusic_SetPitch sfMusic_SetVolume sfMusic_SetPosition + sfMusic_SetRelativeToListener sfMusic_SetMinDistance sfMusic_SetAttenuation sfMusic_GetPitch sfMusic_GetVolume sfMusic_GetPosition + sfMusic_IsRelativeToListener sfMusic_GetMinDistance sfMusic_GetAttenuation sfMusic_GetPlayingOffset @@ -42,12 +44,14 @@ EXPORTS sfSound_SetPitch sfSound_SetVolume sfSound_SetPosition + sfSound_SetRelativeToListener sfSound_SetMinDistance sfSound_SetAttenuation sfSound_SetPlayingOffset sfSound_GetPitch sfSound_GetVolume sfSound_GetPosition + sfSound_IsRelativeToListener sfSound_GetPlayingOffset sfSound_GetMinDistance sfSound_GetAttenuation @@ -84,12 +88,14 @@ EXPORTS sfSoundStream_SetPitch sfSoundStream_SetVolume sfSoundStream_SetPosition + sfSoundStream_SetRelativeToListener sfSoundStream_SetMinDistance sfSoundStream_SetAttenuation sfSoundStream_SetLoop sfSoundStream_GetPitch sfSoundStream_GetVolume sfSoundStream_GetPosition + sfSoundStream_IsRelativeToListener sfSoundStream_GetMinDistance sfSoundStream_GetAttenuation sfSoundStream_GetLoop diff --git a/CSFML/include/SFML/Audio/Music.h b/CSFML/include/SFML/Audio/Music.h index cc87f42a1..bdad5b4be 100644 --- a/CSFML/include/SFML/Audio/Music.h +++ b/CSFML/include/SFML/Audio/Music.h @@ -184,6 +184,17 @@ CSFML_API void sfMusic_SetVolume(sfMusic* Music, float Volume); //////////////////////////////////////////////////////////// CSFML_API void sfMusic_SetPosition(sfMusic* Music, float X, float Y, float Z); +//////////////////////////////////////////////////////////// +/// Make the music's position relative to the listener's +/// position, or absolute. +/// The default value is false (absolute) +/// +/// \param Music : Music to modify +/// \param Relative : True to set the position relative, false to set it absolute +/// +//////////////////////////////////////////////////////////// +CSFML_API void sfMusic_SetRelativeToListener(sfMusic* Music, sfBool Relative); + //////////////////////////////////////////////////////////// /// Set the minimum distance - closer than this distance, /// the listener will hear the music at its maximum volume. @@ -237,6 +248,17 @@ CSFML_API float sfMusic_GetVolume(sfMusic* Music); //////////////////////////////////////////////////////////// CSFML_API void sfMusic_GetPosition(sfMusic* Music, float* X, float* Y, float* Z); +//////////////////////////////////////////////////////////// +/// Tell if the music's position is relative to the listener's +/// position, or if it's absolute +/// +/// \param Music : Music to check +/// +/// \return sfTrue if the position is relative, sfFalse if it's absolute +/// +//////////////////////////////////////////////////////////// +CSFML_API sfBool sfMusic_IsRelativeToListener(sfMusic* Music); + //////////////////////////////////////////////////////////// /// Get the minimum distance of a music /// diff --git a/CSFML/include/SFML/Audio/Sound.h b/CSFML/include/SFML/Audio/Sound.h index eb7b2d443..d694f8986 100644 --- a/CSFML/include/SFML/Audio/Sound.h +++ b/CSFML/include/SFML/Audio/Sound.h @@ -150,6 +150,17 @@ CSFML_API void sfSound_SetVolume(sfSound* Sound, float Volume); //////////////////////////////////////////////////////////// CSFML_API void sfSound_SetPosition(sfSound* Sound, float X, float Y, float Z); +//////////////////////////////////////////////////////////// +/// Make the sound's position relative to the listener's +/// position, or absolute. +/// The default value is false (absolute) +/// +/// \param Sound : Sound to modify +/// \param Relative : True to set the position relative, false to set it absolute +/// +//////////////////////////////////////////////////////////// +CSFML_API void sfSound_SetRelativeToListener(sfSound* Sound, sfBool Relative); + //////////////////////////////////////////////////////////// /// Set the minimum distance - closer than this distance, /// the listener will hear the sound at its maximum volume. @@ -212,6 +223,17 @@ CSFML_API float sfSound_GetVolume(sfSound* Sound); //////////////////////////////////////////////////////////// CSFML_API void sfSound_GetPosition(sfSound* Sound, float* X, float* Y, float* Z); +//////////////////////////////////////////////////////////// +/// Tell if the sound's position is relative to the listener's +/// position, or if it's absolute +/// +/// \param Sound : Sound to check +/// +/// \return sfTrue if the position is relative, sfFalse if it's absolute +/// +//////////////////////////////////////////////////////////// +CSFML_API sfBool sfSound_IsRelativeToListener(sfSound* Sound); + //////////////////////////////////////////////////////////// /// Get the minimum distance of a sound /// diff --git a/CSFML/include/SFML/Audio/SoundStream.h b/CSFML/include/SFML/Audio/SoundStream.h index 9b3f0f960..5fe452266 100644 --- a/CSFML/include/SFML/Audio/SoundStream.h +++ b/CSFML/include/SFML/Audio/SoundStream.h @@ -157,6 +157,17 @@ CSFML_API void sfSoundStream_SetVolume(sfSoundStream* SoundStream, float Volume) //////////////////////////////////////////////////////////// CSFML_API void sfSoundStream_SetPosition(sfSoundStream* SoundStream, float X, float Y, float Z); +//////////////////////////////////////////////////////////// +/// Make the sound stream's position relative to the listener's +/// position, or absolute. +/// The default value is false (absolute) +/// +/// \param SoundStream : Sound stream to modify +/// \param Relative : True to set the position relative, false to set it absolute +/// +//////////////////////////////////////////////////////////// +CSFML_API void sfSoundStream_SetRelativeToListener(sfSoundStream* SoundStream, sfBool Relative); + //////////////////////////////////////////////////////////// /// Set the minimum distance - closer than this distance, /// the listener will hear the sound stream at its maximum volume. @@ -219,6 +230,17 @@ CSFML_API float sfSoundStream_GetVolume(sfSoundStream* SoundStream); //////////////////////////////////////////////////////////// CSFML_API void sfSoundStream_GetPosition(sfSoundStream* SoundStream, float* X, float* Y, float* Z); +//////////////////////////////////////////////////////////// +/// Tell if the sound stream's position is relative to the listener's +/// position, or if it's absolute +/// +/// \param SoundStream : Sound stream to check +/// +/// \return sfTrue if the position is relative, sfFalse if it's absolute +/// +//////////////////////////////////////////////////////////// +CSFML_API sfBool sfSoundStream_IsRelativeToListener(sfSoundStream* SoundStream); + //////////////////////////////////////////////////////////// /// Get the minimum distance of a sound stream /// diff --git a/CSFML/src/SFML/Audio/Music.cpp b/CSFML/src/SFML/Audio/Music.cpp index 647e82ff0..b946a2e92 100644 --- a/CSFML/src/SFML/Audio/Music.cpp +++ b/CSFML/src/SFML/Audio/Music.cpp @@ -198,6 +198,17 @@ void sfMusic_SetPosition(sfMusic* Music, float X, float Y, float Z) } +//////////////////////////////////////////////////////////// +/// Make the music's position relative to the listener's +/// position, or absolute. +/// The default value is false (absolute) +//////////////////////////////////////////////////////////// +void sfMusic_SetRelativeToListener(sfMusic* music, sfBool Relative) +{ + CSFML_CALL(music, SetRelativeToListener(Relative == sfTrue)); +} + + //////////////////////////////////////////////////////////// /// Set the minimum distance - closer than this distance, /// the listener will hear the music at its maximum volume. @@ -255,6 +266,16 @@ void sfMusic_GetPosition(sfMusic* Music, float* X, float* Y, float* Z) } +//////////////////////////////////////////////////////////// +/// Tell if the music's position is relative to the listener's +/// position, or if it's absolute +//////////////////////////////////////////////////////////// +CSFML_API sfBool sfMusic_IsRelativeToListener(sfMusic* Music) +{ + CSFML_CALL_RETURN(Music, IsRelativeToListener(), sfFalse); +} + + //////////////////////////////////////////////////////////// /// Get the minimum distance of a music //////////////////////////////////////////////////////////// diff --git a/CSFML/src/SFML/Audio/Sound.cpp b/CSFML/src/SFML/Audio/Sound.cpp index 2b6f22b6a..dd2a64a71 100644 --- a/CSFML/src/SFML/Audio/Sound.cpp +++ b/CSFML/src/SFML/Audio/Sound.cpp @@ -168,6 +168,17 @@ void sfSound_SetPosition(sfSound* Sound, float X, float Y, float Z) } +//////////////////////////////////////////////////////////// +/// Make the sound's position relative to the listener's +/// position, or absolute. +/// The default value is false (absolute) +//////////////////////////////////////////////////////////// +void sfSound_SetRelativeToListener(sfSound* Sound, sfBool Relative) +{ + CSFML_CALL(Sound, SetRelativeToListener(Relative == sfTrue)); +} + + //////////////////////////////////////////////////////////// /// Set the minimum distance - closer than this distance, /// the listener will hear the sound at its maximum volume. @@ -231,6 +242,16 @@ void sfSound_GetPosition(sfSound* Sound, float* X, float* Y, float* Z) } +//////////////////////////////////////////////////////////// +/// Tell if the sound's position is relative to the listener's +/// position, or if it's absolute +//////////////////////////////////////////////////////////// +CSFML_API sfBool sfSound_IsRelativeToListener(sfSound* Sound) +{ + CSFML_CALL_RETURN(Sound, IsRelativeToListener(), sfFalse); +} + + //////////////////////////////////////////////////////////// /// Get the minimum distance of a sound //////////////////////////////////////////////////////////// diff --git a/CSFML/src/SFML/Audio/SoundStream.cpp b/CSFML/src/SFML/Audio/SoundStream.cpp index d89196294..3208c0373 100644 --- a/CSFML/src/SFML/Audio/SoundStream.cpp +++ b/CSFML/src/SFML/Audio/SoundStream.cpp @@ -195,6 +195,17 @@ void sfSoundStream_SetPosition(sfSoundStream* SoundStream, float X, float Y, flo } +//////////////////////////////////////////////////////////// +/// Make the sound stream's position relative to the listener's +/// position, or absolute. +/// The default value is false (absolute) +//////////////////////////////////////////////////////////// +void sfSoundStream_SetRelativeToListener(sfSoundStream* SoundStream, sfBool Relative) +{ + CSFML_CALL(SoundStream, SetRelativeToListener(Relative == sfTrue)); +} + + //////////////////////////////////////////////////////////// /// Set the minimum distance - closer than this distance, /// the listener will hear the sound stream at its maximum volume. @@ -258,6 +269,16 @@ void sfSoundStream_GetPosition(sfSoundStream* SoundStream, float* X, float* Y, f } +//////////////////////////////////////////////////////////// +/// Tell if the sound stream's position is relative to the listener's +/// position, or if it's absolute +//////////////////////////////////////////////////////////// +CSFML_API sfBool sfSoundStream_IsRelativeToListener(sfSoundStream* SoundStream) +{ + CSFML_CALL_RETURN(SoundStream, IsRelativeToListener(), sfFalse); +} + + //////////////////////////////////////////////////////////// /// Get the minimum distance of a sound stream //////////////////////////////////////////////////////////// diff --git a/dotnet/extlibs/csfml-audio.dll b/dotnet/extlibs/csfml-audio.dll index a15fb3d65be3085efd89c963fce50ecd35afdaca..cc3a3ca69db7aa99e603ee46934440d31630f893 100644 GIT binary patch delta 8410 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 F{{Zyx^4kCa delta 8068 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 W(jT6TgC|oB^WaJO@E-4wM*k0b6KHq< delta 26885 zcmeIbd3;RQAOC;vnVHN*a6=M7kPyT^lUb9QNrJ>08cR`vP)n+o&{(P}u`eTp2}fH? z?4dzOxM^vHq@)C)Xe=d&c2cULDQS!RUT0=P^wY=h`*{5R`Tg^qN1r+OyqB||bI(0@ zMw60yCMESu9Ge#9C4B3@So$4BXmUt z5AK-{#|^f9%(vou**4>EitQwCAph*K{mr)_&th#Y$t>P2>oc;Zu5Zp5fm@U>x1Jt# zO3oF&`An*c>urk=*YJ&PSH!twU92tIqZQxKmf$fBe@i_M^WiqyAd&B5Yt(Qn-#$xf z*o7x)M{IV_-Q@CUTZ-2pzMrksE0S+%YwxY%V{9Y5&5i9PqL>^N5Pmu$Ab}fjCL$n0 zn=gp=!=th?y&Dt0k?pKc962z|rfnR>$J!P&Zb_1dW$kJ_oshHdX8HK4d8F2-+5aK6 zbwh1M%|7QF*gkB&4@r8r=uZlMw@qjf!%wp1wP-`053oIKF_EkuU>oe$h3p?-TjDo@ z=d$klH6YD@>tCZahFG6imu8}Ym*ghYind?spXJd?O~{t0tccb+o;*Eb`=m_^eva*n zHfEogyN;R#qGmCUnsp3hHJf4ky-hpb$JV&5s-d6LM9%6hh)k=n#kAeT8*P8J?ff6w zwziPKuSoIHtUm)s@g)7I?cMgH_*u5>_V1A&df4iB7|dkjJ4EvOtS>tpBxGs#teDQV zd6Ij?7T4t$vbL*jfU0-X9$g(Z(&R>;>ERkaJEHREhueNs{a4v~ zW;IcN#q*!ot^~E@Lu}83+VQJw{+e!13E3B#wOnK3`M9in?N**xcV~^)A5`%6EHCp* zo?Ot_JVU#X1G{aJq4VqB+AWCVwy}{KJz$WHZ`asX7P^wJZA%C{h{^|qPv!e(*}^kr z{0Lh_L={=FCo3}YAHsLEb?tSJ8Rl(ZW3qjm*x4+44#k8S{5D7W9SwPP}lvX#T)$yo7=!5l9X;M9(aQs@V8|T zx=hm2ZOaGm;x)F;@BT^(n%bHS`HK{!+q{OpL(+e>O&I!j>!ikx6jtV0qXIgPTTz!) z<-O6PMl8w?Jmro_gSqlB-L_;{9N)tBcvvO*yOGWQUSDLd9ljM4eoF_hVya)7vUDGhlJRr0Qs-SHnpAdAeqemQ4wxW5S&NBWu%wWjr%zz39ITu06?GwP=|PjqACL zEd-Iv0z6&IijgH_cC085e#`oFnLCjUwJT|tyL?yM`4t_T{_=~X>`C)Gan@G}*U^EF z214-eobJeCgo@Lz77jxaVm<~hPf1-ETK-xHv_qU0k z{nyeZ+6H{4@*Q3LR{hv=+C%PKOCz#2e|DPZS7nX+;xqd_p9r4`eA0Y~jh@ z2eNh@oKN`9SpkRZ6Mk%#HhZ0nq#Vd9kk<2LQI2i&SNeK=bKZ=^6UVZ4e3ikIwMT6O zj%oOqtR=_x%J@E6T~2K0$)0SR>O`l*C*K#yhJ#t-zsJJysV)0#KXPZcO?GZStPh&-M*ccz`}0y4VxN}P=JIp}-`lqF#}Bb&$%~hf1s~dy zi}#YhH`eNe;y9q4UrrW;@KJ+gke@j1^owJp4LmZYX; z_5UfF=euQXy?vQy>qE&5xo2f7CAT#LY?Y;|TKUe{=2lti2U(Yu zNo?UL{fa)6_#0%;ap_DBkNahU^w(E>XIZ1KvfbFc&E&1C0(`N37(Gf;Xup;vg?__( z@_eW?=v&^8_n&guVKsVGCO^XZVB{(B&D3?Q6CX&aC-_W4E*y}0oZ^3~MQ&%()`fgm zw-lE7SUS0oZ_Br$sfBzTmR0(ykl(|b=9NUa-D#7SeM+5KzE*91 zI9>K9f1OXF+n(_)XwowbiExQs%gE|^(y71r#{xM%Lpn@Ib9cU*bg3R0;m)^|IyEI} zZX|CIz35L2yt|}qNow&ek_NJ|q{V!9tMc+ZC5YC3FRYR27BDTfU%1qFd*$pI@=moe56a_d#&|Tyf!wr6LoYw136~-xr@-vDDKkSnd$qKD%P64+OVQ z+GqEb+O{XlF${W2hdPl?azzwsg;1RLR$0)UB$jN|TGNh=3`qb!i*| z(J`z2rKe$}JrCIX~}xhmT#GRTftd}`dWMV z4jLG3KkSJ4S$p^;M|I)`K$3QwUf4id^7H7E4aAe5D7jH`OK7UPq`-D(F|u|QU{yd8 zBFNucdbyP-Yw>ZCVlP=DClv+Ks{N!LPrg4RNe9TEJlXyoJ&;Mvm?94|iAlx>N^P@A zlRD(mA*uTba?HykdYgia1MCm~e%%>Bck`^R+zO?Kq$>I4_Vtq{wUP}X{6OhsYned!-t=r+*-X9@4G)xc zAbWaAQvzih2>*d3?*KEB)1Ah2lKn~wyGgw|%L?m}0xzN%ju8Q=6`tBunH+(fS|C2G*%ln;k;J5gFsHMbJP?s(*X_2?mXJQ z_BxqA-%9GZPS#E&-&~+Wx69hQuf4#s4#hJl3l0h zv;#6s=} zTORySl5^G}9j%e!*8btng{9abin2yVSo=pfMc+9@?$$`b+TXDrWlQwyZ)7*gk4Gu} zR%YSnN>{&?VUxWpi++DnmQU^+rfW{gDoEKOdi0zufbPwc#gP$jBJNW6d|5vkxwT(f zcSaT_6{W-=fwb;GEr((OTM!fx%j^HeFM3ikgc)OMNfJ6y8LjdVN3ZsIXUlQp=Dyh&}ogETl;9#e;GQA>v-3BhTG*=>yh;D=&zY_HCgbT)a;PlqcxK0a!uYy zhMC>-x_q7&u`ZLodo2IQgIt?=O%SgVDv@b?6r4Iiw^@&q-1MGdN@0W@jzMr41_8s>x-=wp&L53o>Uh`^;nGFZoThXKpMGO8TDJ?_s7!4|| zIjEQ|=X*)YY{dkg>^de*JEHj8ojk~rK0KxP-W`3SyQnxQC(F0dpMOw<^F3(WD~hhX zT>9XO!dp%*Zl(*071v3{CMo8+Vk%D-e<2m#P~<7diS^Rj62&RL<%!h2&KqIZp~}+wWM+WZuv?+j<##())7x3Ls(ExTGY<%qKprvgF3m5 zBqhD*;ZAOo`TkOi&TjrPzN6Gt?G}W=Z;@td-0JaUjhQadx&^SMQ|oqwSJPOX+c;7f zPEYIHCi3q~o%L>;@ql5G&Kupnc1NbmBi*j?XrIwN-4=^vMKk(fC=7|zZwi4vmoIMh_ThpX`)Pwf0M}4h?4#%y&;E4mLVV zVcyF1GPc4tR{G1m7Y^gm5ptXuStA16u{w!Z1QV%yb7d2+me9S&&XNj;SQ7#S>=vW# zeWB)<)zTbXm#P@WrV{|)C<)0Mb$gwm@CO7!JFlGjY- z{bqa<>92Lll)7X^kz`F%R?5hlLTSlPWivwZFVda6mBaaHTD4obo$S9L?bxGSCFd=Y zDnq$nAZv2zoowXMQguX{c0w5?l0&cjwm9xxu3*iUR@D?qvOiIX7kj2SY;KqJl29L zFCU1L2L}j~xPf*>Z6q$Nh{CvtmaiBb5MT`#V73A`uV;B~39?1!c;t;5304m)nZ#EW z;rJtoZJ`S6{Cl+Msj{0v--uPsC)#?!{s~U4*m11;DIa!X!A_c7-n>0-BFP!Otrvi>U)5G@)n!;X0!zz^itsUnm-iQCke~>c)L30yH z&_xx>6u;2_la=OA zG&=O>=gMb%uJlu-vJuZ$N`L+ZX;ArAJesU)&T-o+ab?w2u)occ@C=WkWGX+6`OjG^ zXEm()q1u4X{zqx4!|awkOYpVUt)wUZQTi!e?)2w>lxoqb9g0qOe{Iqv`X97D>|f_& zdSdOwa)OySt6tUBw{?T8*JpYDTR4kA0`mcbhMXv;YhNhU&XVLNG+`w<|3cZxDX4Ph zt9YsO=PPL2m&(aLPyeUc7CnlHo0CVse69>(?ekJOjrWs=yizu+(_+Q{7!P=+kf(Ww z{LI)zb>(zjEkV_sL!9mAxjZoRO@|F=)!+aZK7~Umg7@tQ{L>rucRM&2pb$m z4TPpJYTH0C6MG3A-#}=~7t!Pf!u$Lq`lNyI2l4TyKQ}}Yzff;aVFYiLX0Sjutxlya zX>Ak<_oU6egJW0sb@1`zFR{PZH!$L z?kQDXae0DxMj_JTR>J4wy_iD2_~y)xMujK4?!EZ?gve3Ln=wU>8 z0h7Q$TvsB5h3JiIU(gZ+g2UijkOT5TXP^b!+X!MhH~_N2*B}?128G}2DlguhJ#q30u#VwFayj1n}8meK{wz7dV%JkJxBrb!D0{q+`ejmsLXHmc+ za1Go7_kbNdZk;HI6}b2taB%8@Fa(5yC@>6+0^`6W5D#X7d0-(}4pxIy@Ht2WyFmsx zii}Tz8=wG`faBmPxBwo3E4A?FXK=fX^lPBdo##2)xxLVicc;VJ3x{i6>FnsOVt8`&-7SS*KuM0r?RSQyEkM> z7H|5KO8A5nb)m!6LLV0HRtsr@>NvYy#rn|xLBeESq{o7U3ChZEm~e>{s1X!=i$cVr zIx1Lbjpv-j z!48l8!9oX|7hew+nhFI5!^cu(H(?CO$dvblZA@pV0v<{oAP2s0Ge!O>spR5&JPhB^}9RP$u@Z8 zh%1*cGN*K5`v}469+1NLLX#{|A$_BhRwv`bc3lFVKJ)CW> zKQyT?{i2_cAf}vhd<((1%IgvOC@zAw=r4Fdsp~Jy!(Hrff1%WklxNe8?+T-3OS)Im zenW+3b;ozFtXdJt_Fp-B-lYLUgj49TUxwhm^Y;*G_E5oHM&7$hmkbwXHSGH1^D6A- zJL0A`@ZF)#OEZH+y^UU-^{YAIY){Fj9%6>mXyye}N_ZuCA@4#0zFV+HXcxIb2!Iu0!an|c$3`FI<`))Zk>^Xrqb8i8XV19X@oh)qEq z@YiJN=@h|FrVK=#}& zju7YVJsmwW$HaD6_&NqQuz8a_;{^%oSF!Y@W;&GVpx6XvK28!^kQSlzodrS* z-a;>~7Fy7H3xpt=v;ei6+?{S;AoS;N(I*SAFZRdLaD^kShCUqX`?qfEJU|6(k&Tf%9s71402S|YS;HarrmhLn#9 zJ{rT|tvX#aIeX$v$lEQu3~|S3boIn+7O&A0EMBuGdj8Aa@V33Z(ZBS{8u~XqaWB}> z6DN*uhPn;LU+Q4QOh!+ z2VX`PFB77O+2ZV?4C=oecjN^|XJ_0sIQobzHPGb?;k7{Tln*dDJLx2iSs`?Y{0_r{ z^@8=nnWd~X*~ji@uB@_h)(b0^7Ojq{=%rP7y6B>%^^=8;B^zcq4LyynRH zmwnHF*&E)rw>SEiURgt5W8|nEBS$<~^m^o|*~p>I7Gj+Et7)?}fNoMIflLyRwOItSP2E_C!7jHJ_a_8K(vcQj{>@Ge@rUW%aOKcf*TLLiC1 zK&PhQCiILhOA%t+gIlnzT0pe*w*3PAJw*s5iJfSdwSty>e4dV9E3_ri=jrOTaJWYI ztQC5=pJ>S(e3?T&{c9~8W_F~(>x2;UK_Q*F4i4dkbjvz8oTkz`VSsz8BL_d`u$Ow; z;4r)c9c)8o0tGtDCa6do8BMndF(gh&-BJaE=hm~%7D@ID7`WhMIrdyw)d!>sn`F~s zs%ZQY!P`5g>h;J$i?Wp+uO(ur?|Pwe(}}o;x`x%Fc>w~?wDnVSqwSqX(CGC-Kr{RB zDy;U-&)XIUhF8&(R-rk*tdO}LBd*hMdTBj+C$LOt31_o}GJ65JR< zk>~~?wARiIY#X1vY6GPkgqhwm5d9c52K~T?AZY__NrfQNYZx6uh0*P#p;cA&kLI$X zurih{L)=v?$4MtnJ4DP!)hl|N3S9yYVoi0-<$eNgc3AUoS3R#{x4aD*&#Q1$CfKK> zQ}srnJ@J1*M{X242>GZe^qXnQM!}o^neN$$&F>0Yu~B%hVT<>wn3G?XS1fjOu(~jm zuH7hj;R^@S?9Z@0=MT_}p9@u_|594?h0uw#SW2tD5C)Q_-_b#vu+slS7j8nQH9td3 zHVHk5_h}lq8DaD9X#8djA7eh)bMxML zdTTRUxWP?_p3kCRZxK3}dTx0BR@1aa+|@LWrc%C%zuklV*Hgc(f>(oypTF(UXcz6d zRcJ$|ouJd8=PT)wt%4bqIJFgvZ2#R*O4HVhKi)1CeIu zt#73{Z42$PUC@)Eo9M*tLW_VQ$5CPd<|2ygjxRF6W!*-HOJi3t{=lnSoXPw`PjAQ2 zFQ5;$<2+{<6?OPY*ac?M*5}nTgLi zn5=i1Tx2Hw$`_psD9e6YZC#OQ?Ng2v+cEPfW?R zH`c>mTR*b)u_NvC%sQJ{*MW6%zvE@!q3xY@&JVHn$%V~6W@BeI_VdmfwS1GJ@^y-? z{O2)iU+SAK_%td`t4^!JS(ScF*^Bl~7aBK8f30+RHe<>J`U#Xi8@E+^x;vZow*n}y z6w-`zp-rOkJPIR2VH{J=Sz6eYqOiM|T|U#_FZ?h45~h#10Da#7=vjk|XZlS{zoS~8 z+^@K7PF!_)imiP{T!Ep585S_ZPhiMw-hFLz#oDI`CQX=01v4226E+mc3?#$)*}Y6j zt5Ynu_IU*BM`vIiNHg{dO&UF$Sgmx8s$)zULx0*UG-{NNwZ&QITx*}>@JwdP<+RQ| z!I#W5(RTZ=5FEdVY-gWi+1ksxdSV>+voAQwzRzFwei{8_pU||H8`5Dz_!Zr{Pw;A1 z!aV#P9=FOKHe?>RTpo4H=p}drWv;Kz*;TCdr;&415gdQOAZ0b&>~Ji1Ii8@+zZ84} z$G-M+)wL({OJROX;Fp|S!oGOxo=eAmDYW&-XYweAJch{^NuPfyC~+K9M0aH1DRn2k znSpJ;{Sx)xFZlHRqwF8t@P)j$hCxI=GU#;~2`xk?uwi12d=!l~7+}x)FMCgBpH3I= z$Nu2TWx9XA(7Ij6AK)%?xfdq)yHZwASY7`@Yo7wN{N_Bk4Ws|SEisdsXQ3;cgA#3# z6Nxr)EFaawpPAocc2?N2=3388`k}elE~0GWqw4fs4!+DmyaI>eE{Ab%Iq2Uw40q13 zho|5X!93czJT$LM;hJX!%p{(fxWOd3-w$QE`bvbQWq}W?^RKQSGu=u5IUuw(2v^~e zg^qL8FQ;ryeKtsP7M#pr!|Lp>)y_HAKG|rTFy=gtzIRaY^-(4~uX6QJzH?Qn!?Y#UbdCqJ}7wW?9ArwcaBn7 zQHAt+tW2e@GOb)tT_)FnoyOAjrR_3>ripP5Q;cy(@h6R`Hoax-Q;gzwVW!d7ko*)R z&zgspRht~Q_Q`>XJ2RQbO!~mYiZ#H~k!GdTFKg8H`Oqo5Y+TD>uEv&w|@XxtM z3p4RFPp}{x?hLkV+@CF>}}Gbl2&RkTgc>og;lNN@p3Jvk}1bBB|bSZHxL`_iea5dj;=y;AHmi% zCzGjyS)CFKNjZYZnv3a z6O%l}sI~ShDJx`>0wyV;&5sC;g!Vh|+>%rA6K!$?&wPH=d_-s-7;_s2pTNbjY*hcr zu`}_w*J9lF7aqa8hy*%) zD7JK^_vq52Lg#mV?!(^SY5&@q-DAJ|8rJblD|?+98oNNr77eVz&V_7v^*nX0!fTk< zPFhP6nl=-#kU5ilVeM0iBu6r35lixmZ|Q(^p<%OOEVY`;ekW$~f|-2iG^s0$V+(_0 zA5eD%T`LKm-BqQ~tG;D*jLT#v^Aujrua(%p98guYLtul((Ewk?@9;oZp_tC*{3_Fo zxZ7}Qmjq4hg0+9S{Hhxp;Wo$nXU8x3S|eSYR-REX5!NN{jDo#@c3!=3T~$ARRwwZl zdpS_mdKl)BG{E0OAtZV}##<~90-}K%V4n!32d4tD;FX&PX9x3fy$&1z`M?((e<*Tk zU@4ddVnGxzgB#GZPsK}-D*{KsMlc!Zf&8VI$k|_rTrOAz;y@s<|08l4;Kkn}w;Qwv zv9FK-xB=Q%Av16mcyk_{5tRIeG=K;eR*GElbCDYcil2$xV&Dd{{}j2gKm^$pA~(Du zQRFiJ5V=vH^r^^g0b@Z+aQTVItpoi*J@BYp!97mIpHgrOTn1-BE;tGffP6IjYA_eXfOF4e%Je0z=Bs z|2>e13Iu=#fPkmS{5HV5A?{mn7Bcp^^$6qOH<7yqE@OoM3SNN*khcV#ff+=BQD7=q z2vWgzZ~zp5$ABOW??n7*1GJzA7y{zJT(Amk0hu5NoCWL?z%m5Y9~G9Fa8Ml&nSmEZ zpS+1z%d3By&3?ZS4~p|dE|~opJ7%2Un8}l;y+0=5gK1MaPFo=2!-;M1mdAcZ6pLDN zVjAMvkXK)CT&B(!KrK)k)B*02I=}A3FKYG5hg~cu&XTr`u6Kv$Q=|oB>fv{`5%im} z^%`}$#njJ~V*F>E7`}lMhn*Hh)n;Vz1zcw0ZMlmDNl7Mrq3iv6T^i@Wr2H%=mYin4 z7EcPVcsV$fb@=u}h1OrkX&;?5f8tTVF_&vm%e`c7;SSyRniCc~xN<-$@|FyVKi=mWGM9_$1a zfT@_hoIW`%Hmt?mRv}6p(Pq&u3ziD|8FnngnpGmjp}GqdUi0$biw&C<)UaS>Ek@i9oSCV=7h5FOG=T-zX^z0f?G`vIH~{eT zd#?5#fir>;UIBv+=Ro4s1Yu{1i9cUz?b?sE=%B=f=-|t7z|7W=iq)*O@O~u&V_-2>F)|hp54$eo{`g>B#iJSuFSotU2Cs*( zI%^;5e-VA5g@`ppw;HM_hpKM8OT-G8rs{MGD!Lqw;>c>j!iGhM!R0ZGIr!kXOS8pWJPL*kQJ#7LRR!H zuJ9d%>^3|MA^YXj7=%iMQxIZmav!_mOAz8)=GWnw% z%5lNkrhSI9AbNz=J(ubzW9#=_s%Z$BDGON{KXI9|W-DN(j*;)z$sNb9%noA5C)4G} zA}ncE4i#)zeSPWP%c4d#`Cl$2|KXD2a+!zFF+S^x``?VuLfZAR*p?3dK@9M!ghh27 z1f06EjC`oa6|qs>*cvX;^w1AtU$1$vsJ33^vfkvh&a7d5g;_VHvFAj&&kv9zP41>k z&su}S!D{u0^pPKM8n`2@PFq{UK-9SutY~pH6h6aTp0PDNQ(Xp*5#(500|w#3f<{NN|Xnd1g8j@YU$k@VnZ)qNLh!7_$n-G30A6fI^c$Dy4G!7Lw==( z+)zW#(J?nsv8WoNj!e{)rr#9ZWf!^%blL^c-)9&Ob*no&4%aNNIS8FA(xe*hna&g! z))3utigwo!3Dn~j@;zHaq;-mJ)eyxxMUQKURyjpn_M1BAI7JO=h)SKJfEps~sD46@ z`Whnaq?o8z4N;s^G`xl=)hU`>LzL?j&95PP

eIA;J#eHX5?%hA3}#c$RYjB;g#G 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 diff --git a/dotnet/src/Audio/Listener.cs b/dotnet/src/Audio/Listener.cs index da0c2237f..03f97daa4 100644 --- a/dotnet/src/Audio/Listener.cs +++ b/dotnet/src/Audio/Listener.cs @@ -20,7 +20,7 @@ namespace SFML /// Global volume of all sounds, in range [0 .. 100] (default is 100) /// //////////////////////////////////////////////////////////// - static float GlobalVolume + public static float GlobalVolume { get {return sfListener_GetGlobalVolume();} set {sfListener_SetGlobalVolume(value);} @@ -31,7 +31,7 @@ namespace SFML /// 3D position of the listener (default is (0, 0, 0)) /// //////////////////////////////////////////////////////////// - static Vector3 Position + public static Vector3 Position { get {Vector3 v; sfListener_GetPosition(out v.X, out v.Y, out v.Z); return v;} set {sfListener_SetPosition(value.X, value.Y, value.Z);} @@ -43,7 +43,7 @@ namespace SFML /// (default is (0, 0, -1)) /// //////////////////////////////////////////////////////////// - static Vector3 Target + public static Vector3 Target { get {Vector3 v; sfListener_GetTarget(out v.X, out v.Y, out v.Z); return v;} set {sfListener_SetTarget(value.X, value.Y, value.Z);} diff --git a/dotnet/src/Audio/Music.cs b/dotnet/src/Audio/Music.cs index 988761ea7..41be7c6e1 100644 --- a/dotnet/src/Audio/Music.cs +++ b/dotnet/src/Audio/Music.cs @@ -165,6 +165,19 @@ namespace SFML set {sfMusic_SetPosition(This, value.X, value.Y, value.Z);} } + //////////////////////////////////////////////////////////// + ///

+ /// Is the music's position relative to the listener's position, + /// or is it absolute? + /// Default value is false (absolute) + /// + //////////////////////////////////////////////////////////// + public bool RelativeToListener + { + get {return sfMusic_IsRelativeToListener(This);} + set {sfMusic_SetRelativeToListener(This, value);} + } + //////////////////////////////////////////////////////////// /// /// Minimum distance of the music. Closer than this distance, @@ -213,70 +226,76 @@ namespace SFML } #region Imports - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern IntPtr sfMusic_CreateFromFile(string Filename); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] unsafe static extern IntPtr sfMusic_CreateFromMemory(char* Data, uint SizeInBytes); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_Destroy(IntPtr MusicStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_Play(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_Pause(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_Stop(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern SoundStatus sfMusic_GetStatus(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfMusic_GetDuration(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern uint sfMusic_GetChannelsCount(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern uint sfMusic_GetSampleRate(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_SetPitch(IntPtr Music, float Pitch); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_SetLoop(IntPtr Music, bool Loop); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_SetVolume(IntPtr Music, float Volume); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_SetPosition(IntPtr Music, float X, float Y, float Z); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] + static extern void sfMusic_SetRelativeToListener(IntPtr Music, bool Relative); + + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_SetMinDistance(IntPtr Music, float MinDistance); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_SetAttenuation(IntPtr Music, float Attenuation); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern bool sfMusic_GetLoop(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfMusic_GetPitch(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfMusic_GetVolume(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfMusic_GetPosition(IntPtr Music, out float X, out float Y, out float Z); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] + static extern bool sfMusic_IsRelativeToListener(IntPtr Music); + + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfMusic_GetMinDistance(IntPtr Music); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfMusic_GetAttenuation(IntPtr Music); [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] diff --git a/dotnet/src/Audio/Sound.cs b/dotnet/src/Audio/Sound.cs index d6d499ede..93eb34481 100644 --- a/dotnet/src/Audio/Sound.cs +++ b/dotnet/src/Audio/Sound.cs @@ -159,6 +159,19 @@ namespace SFML set {sfSound_SetPosition(This, value.X, value.Y, value.Z);} } + //////////////////////////////////////////////////////////// + /// + /// Is the sound's position relative to the listener's position, + /// or is it absolute? + /// Default value is false (absolute) + /// + //////////////////////////////////////////////////////////// + public bool RelativeToListener + { + get {return sfSound_IsRelativeToListener(This);} + set {sfSound_SetRelativeToListener(This, value);} + } + //////////////////////////////////////////////////////////// /// /// Minimum distance of the sound. Closer than this distance, @@ -238,6 +251,9 @@ namespace SFML [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSound_SetPosition(IntPtr Sound, float X, float Y, float Z); + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] + static extern void sfSound_SetRelativeToListener(IntPtr Sound, bool Relative); + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSound_SetMinDistance(IntPtr Sound, float MinDistance); @@ -256,6 +272,9 @@ namespace SFML [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSound_GetPosition(IntPtr Sound, out float X, out float Y, out float Z); + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] + static extern bool sfSound_IsRelativeToListener(IntPtr Sound); + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfSound_GetMinDistance(IntPtr Sound); diff --git a/dotnet/src/Audio/SoundRecorder.cs b/dotnet/src/Audio/SoundRecorder.cs index 3f39c5a54..1c8e79d04 100644 --- a/dotnet/src/Audio/SoundRecorder.cs +++ b/dotnet/src/Audio/SoundRecorder.cs @@ -157,22 +157,22 @@ namespace SFML private StopCallback myStopCallback; #region Imports - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern IntPtr sfSoundRecorder_Create(StartCallback OnStart, ProcessCallback OnProcess, StopCallback OnStop, IntPtr UserData); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundRecorder_Destroy(IntPtr SoundRecorder); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundRecorder_Start(IntPtr SoundRecorder, uint SampleRate); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundRecorder_Stop(IntPtr SoundRecorder); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern uint sfSoundRecorder_GetSampleRate(IntPtr SoundRecorder); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern bool sfSoundRecorder_CanCapture(); #endregion } diff --git a/dotnet/src/Audio/SoundStream.cs b/dotnet/src/Audio/SoundStream.cs index c8d019c32..b0c4a8063 100644 --- a/dotnet/src/Audio/SoundStream.cs +++ b/dotnet/src/Audio/SoundStream.cs @@ -130,6 +130,19 @@ namespace SFML set {sfSoundStream_SetPosition(This, value.X, value.Y, value.Z);} } + //////////////////////////////////////////////////////////// + /// + /// Is the sound stream's position relative to the listener's position, + /// or is it absolute? + /// Default value is false (absolute) + /// + //////////////////////////////////////////////////////////// + public bool RelativeToListener + { + get {return sfSoundStream_IsRelativeToListener(This);} + set {sfSoundStream_SetRelativeToListener(This, value);} + } + //////////////////////////////////////////////////////////// /// /// Minimum distance of the sound stream. Closer than this distance, @@ -275,64 +288,70 @@ namespace SFML private short[] myTempBuffer; #region Imports - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern IntPtr sfSoundStream_Create(StartCallbackType OnStart, GetDataCallbackType OnGetData, uint ChannelsCount, uint SampleRate, IntPtr UserData); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_Destroy(IntPtr SoundStreamStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_Play(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_Pause(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_Stop(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern SoundStatus sfSoundStream_GetStatus(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern uint sfSoundStream_GetChannelsCount(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern uint sfSoundStream_GetSampleRate(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_SetLoop(IntPtr SoundStream, bool Loop); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_SetPitch(IntPtr SoundStream, float Pitch); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_SetVolume(IntPtr SoundStream, float Volume); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_SetPosition(IntPtr SoundStream, float X, float Y, float Z); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] + static extern void sfSoundStream_SetRelativeToListener(IntPtr SoundStream, bool Relative); + + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_SetMinDistance(IntPtr SoundStream, float MinDistance); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_SetAttenuation(IntPtr SoundStream, float Attenuation); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern bool sfSoundStream_GetLoop(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfSoundStream_GetPitch(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfSoundStream_GetVolume(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern void sfSoundStream_GetPosition(IntPtr SoundStream, out float X, out float Y, out float Z); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] + static extern bool sfSoundStream_IsRelativeToListener(IntPtr SoundStream); + + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfSoundStream_GetMinDistance(IntPtr SoundStream); - [DllImport("csfml-audio")] + [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] static extern float sfSoundStream_GetAttenuation(IntPtr SoundStream); [DllImport("csfml-audio"), SuppressUnmanagedCodeSecurity] diff --git a/dotnet/src/Graphics/RenderWindow.cs b/dotnet/src/Graphics/RenderWindow.cs index 3b23ee2ce..9553c9e77 100644 --- a/dotnet/src/Graphics/RenderWindow.cs +++ b/dotnet/src/Graphics/RenderWindow.cs @@ -519,7 +519,7 @@ namespace SFML [DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity] static extern void sfRenderWindow_EnableKeyRepeat(IntPtr This, bool Enable); - [DllImport("csfml-graphics")] + [DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity] unsafe static extern void sfRenderWindow_SetIcon(IntPtr This, uint Width, uint Height, byte* Pixels); [DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity] diff --git a/include/SFML/Audio/Sound.hpp b/include/SFML/Audio/Sound.hpp index cced19e1c..a7369fc38 100644 --- a/include/SFML/Audio/Sound.hpp +++ b/include/SFML/Audio/Sound.hpp @@ -159,6 +159,16 @@ public : //////////////////////////////////////////////////////////// void SetPosition(const Vector3f& Position); + //////////////////////////////////////////////////////////// + /// Make the sound's position relative to the listener's + /// position, or absolute. + /// The default value is false (absolute) + /// + /// \param Relative : True to set the position relative, false to set it absolute + /// + //////////////////////////////////////////////////////////// + void SetRelativeToListener(bool Relative); + //////////////////////////////////////////////////////////// /// Set the minimum distance - closer than this distance, /// the listener will hear the sound at its maximum volume. @@ -227,6 +237,15 @@ public : //////////////////////////////////////////////////////////// Vector3f GetPosition() const; + //////////////////////////////////////////////////////////// + /// Tell if the sound's position is relative to the listener's + /// position, or if it's absolute + /// + /// \return True if the position is relative, false if it's absolute + /// + //////////////////////////////////////////////////////////// + bool IsRelativeToListener() const; + //////////////////////////////////////////////////////////// /// Get the minimum distance /// diff --git a/include/SFML/Audio/SoundStream.hpp b/include/SFML/Audio/SoundStream.hpp index 8cc2024b8..db0b19e93 100644 --- a/include/SFML/Audio/SoundStream.hpp +++ b/include/SFML/Audio/SoundStream.hpp @@ -53,11 +53,13 @@ public : using Sound::SetPitch; using Sound::SetVolume; using Sound::SetPosition; + using Sound::SetRelativeToListener; using Sound::SetMinDistance; using Sound::SetAttenuation; using Sound::GetPitch; using Sound::GetVolume; using Sound::GetPosition; + using Sound::IsRelativeToListener; using Sound::GetMinDistance; using Sound::GetAttenuation; diff --git a/src/SFML/Audio/Sound.cpp b/src/SFML/Audio/Sound.cpp index 01d792b83..17f8fab2b 100644 --- a/src/SFML/Audio/Sound.cpp +++ b/src/SFML/Audio/Sound.cpp @@ -175,6 +175,17 @@ void Sound::SetPosition(const Vector3f& Position) } +//////////////////////////////////////////////////////////// +/// Make the sound's position relative to the listener's +/// position, or absolute. +/// The default value is false (absolute) +//////////////////////////////////////////////////////////// +void Sound::SetRelativeToListener(bool Relative) +{ + ALCheck(alSourcei(mySource, AL_SOURCE_RELATIVE, Relative)); +} + + //////////////////////////////////////////////////////////// /// Set the minimum distance - closer than this distance, /// the listener will hear the sound at its maximum volume. @@ -263,6 +274,19 @@ Vector3f Sound::GetPosition() const } +//////////////////////////////////////////////////////////// +/// Tell if the sound's position is relative to the listener's +/// position, or if it's absolute +//////////////////////////////////////////////////////////// +bool Sound::IsRelativeToListener() const +{ + ALint Relative; + ALCheck(alGetSourcei(mySource, AL_SOURCE_RELATIVE, &Relative)); + + return Relative != 0; +} + + //////////////////////////////////////////////////////////// /// Get the minimum distance ////////////////////////////////////////////////////////////