winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
May 2021
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
770 discussions
Start a n
N
ew thread
Jacek Caban : winepulse: Move mult_* functions to separated file.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: 8ea23d0d44ced0ce7dadc9b2546cbc56f6bce364 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=8ea23d0d44ced0ce7dadc9b2…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu May 13 16:04:38 2021 +0200 winepulse: Move mult_* functions to separated file. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winepulse.drv/Makefile.in | 1 + dlls/winepulse.drv/mmdevdrv.c | 1995 +-------------------------------------- dlls/winepulse.drv/mult.c | 2011 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 2014 insertions(+), 1993 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=8ea23d0d44ced0ce7dad…
1
0
0
0
Jacek Caban : winepulse: Set pulse master volume to 0 when session is muted.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: 0b0ae164f4ccebf4b5bc1bb1529a90786d2d5941 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0b0ae164f4ccebf4b5bc1bb1…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu May 13 16:04:23 2021 +0200 winepulse: Set pulse master volume to 0 when session is muted. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winepulse.drv/mmdevdrv.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index fc9077b41ce..e638c815ba4 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -249,21 +249,25 @@ static void silence_buffer(pa_sample_format_t format, BYTE *buffer, UINT32 bytes static int write_buffer(const ACImpl *This, BYTE *buffer, UINT32 bytes) { const float *vol = This->pulse_stream->vol; + UINT32 i, channels, mute = 0; BOOL adjust = FALSE; - UINT32 i, channels; BYTE *end; if (!bytes) return 0; - if (This->session->mute) - { - silence_buffer(This->pulse_stream->ss.format, buffer, bytes); - goto write; - } /* Adjust the buffer based on the volume for each channel */ channels = This->pulse_stream->ss.channels; for (i = 0; i < channels; i++) + { adjust |= vol[i] != 1.0f; + if (vol[i] == 0.0f) + mute++; + } + if (mute == channels) + { + silence_buffer(This->pulse_stream->ss.format, buffer, bytes); + goto write; + } if (!adjust) goto write; end = buffer + bytes; @@ -525,7 +529,8 @@ static DWORD WINAPI pulse_timer_cb(void *user) static void set_stream_volumes(ACImpl *This) { - pulse->set_volumes(This->pulse_stream, This->session->master_vol, This->vol, + float master_vol = This->session->mute ? 0.0f : This->session->master_vol; + pulse->set_volumes(This->pulse_stream, master_vol, This->vol, This->session->channel_vols); } @@ -2633,13 +2638,18 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, { AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); AudioSession *session = This->session; + ACImpl *client; TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); if (context) FIXME("Notifications not supported yet\n"); + pulse->lock(); session->mute = mute; + LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) + set_stream_volumes(client); + pulse->unlock(); return S_OK; }
1
0
0
0
Jacek Caban : winepulse: Adjust pulse stream volumes for session volumes.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: 131b7fd5e16a3da17aed28e86933074c5d663d9f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=131b7fd5e16a3da17aed28e8…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu May 13 16:04:14 2021 +0200 winepulse: Adjust pulse stream volumes for session volumes. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winepulse.drv/mmdevdrv.c | 14 +++++++++----- dlls/winepulse.drv/pulse.c | 4 ++-- dlls/winepulse.drv/unixlib.h | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 8933a95d834..fc9077b41ce 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -248,7 +248,7 @@ static void silence_buffer(pa_sample_format_t format, BYTE *buffer, UINT32 bytes static int write_buffer(const ACImpl *This, BYTE *buffer, UINT32 bytes) { - float vol[PA_CHANNELS_MAX]; + const float *vol = This->pulse_stream->vol; BOOL adjust = FALSE; UINT32 i, channels; BYTE *end; @@ -263,10 +263,7 @@ static int write_buffer(const ACImpl *This, BYTE *buffer, UINT32 bytes) /* Adjust the buffer based on the volume for each channel */ channels = This->pulse_stream->ss.channels; for (i = 0; i < channels; i++) - { - vol[i] = This->pulse_stream->vol[i] * This->session->channel_vols[i]; adjust |= vol[i] != 1.0f; - } if (!adjust) goto write; end = buffer + bytes; @@ -528,7 +525,8 @@ static DWORD WINAPI pulse_timer_cb(void *user) static void set_stream_volumes(ACImpl *This) { - pulse->set_volumes(This->pulse_stream, This->session->master_vol, This->vol); + pulse->set_volumes(This->pulse_stream, This->session->master_vol, This->vol, + This->session->channel_vols); } HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, const WCHAR ***ids, GUID **keys, @@ -2728,6 +2726,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( { AudioSessionWrapper *This = impl_from_IChannelAudioVolume(iface); AudioSession *session = This->session; + ACImpl *client; TRACE("(%p)->(%d, %f, %s)\n", session, index, level, wine_dbgstr_guid(context)); @@ -2745,6 +2744,8 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( pulse->lock(); session->channel_vols[index] = level; + LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) + set_stream_volumes(client); pulse->unlock(); return S_OK; @@ -2775,6 +2776,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( { AudioSessionWrapper *This = impl_from_IChannelAudioVolume(iface); AudioSession *session = This->session; + ACImpl *client; int i; TRACE("(%p)->(%d, %p, %s)\n", session, count, levels, @@ -2794,6 +2796,8 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( pulse->lock(); for(i = 0; i < count; ++i) session->channel_vols[i] = levels[i]; + LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) + set_stream_volumes(client); pulse->unlock(); return S_OK; } diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c index 02f4d11a7f1..e2af68ea922 100644 --- a/dlls/winepulse.drv/pulse.c +++ b/dlls/winepulse.drv/pulse.c @@ -1005,12 +1005,12 @@ static HRESULT WINAPI pulse_stop(struct pulse_stream *stream) } static void WINAPI pulse_set_volumes(struct pulse_stream *stream, float master_volume, - const float *volumes) + const float *volumes, const float *session_volumes) { unsigned int i; for (i = 0; i < stream->ss.channels; i++) - stream->vol[i] = volumes[i] * master_volume; + stream->vol[i] = volumes[i] * master_volume * session_volumes[i]; } static const struct unix_funcs unix_funcs = diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h index 8636f11d6f5..54c6ab66303 100644 --- a/dlls/winepulse.drv/unixlib.h +++ b/dlls/winepulse.drv/unixlib.h @@ -81,6 +81,6 @@ struct unix_funcs void (WINAPI *read)(struct pulse_stream *stream); HRESULT (WINAPI *stop)(struct pulse_stream *stream); void (WINAPI *set_volumes)(struct pulse_stream *stream, float master_volume, - const float *volumes); + const float *volumes, const float *session_volumes); HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config); };
1
0
0
0
Jacek Caban : winepulse: Adjust pulse stream volumes for master volume.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: 8060e56b26add8eafffb211119798569ea3188ff URL:
https://source.winehq.org/git/wine.git/?a=commit;h=8060e56b26add8eafffb2111…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu May 13 16:03:58 2021 +0200 winepulse: Adjust pulse stream volumes for master volume. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winepulse.drv/mmdevdrv.c | 7 +++++-- dlls/winepulse.drv/pulse.c | 5 +++-- dlls/winepulse.drv/unixlib.h | 3 ++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 2a9ebd86c3a..8933a95d834 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -264,7 +264,7 @@ static int write_buffer(const ACImpl *This, BYTE *buffer, UINT32 bytes) channels = This->pulse_stream->ss.channels; for (i = 0; i < channels; i++) { - vol[i] = This->pulse_stream->vol[i] * This->session->master_vol * This->session->channel_vols[i]; + vol[i] = This->pulse_stream->vol[i] * This->session->channel_vols[i]; adjust |= vol[i] != 1.0f; } if (!adjust) goto write; @@ -528,7 +528,7 @@ static DWORD WINAPI pulse_timer_cb(void *user) static void set_stream_volumes(ACImpl *This) { - pulse->set_volumes(This->pulse_stream, This->vol); + pulse->set_volumes(This->pulse_stream, This->session->master_vol, This->vol); } HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, const WCHAR ***ids, GUID **keys, @@ -2593,6 +2593,7 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( { AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); AudioSession *session = This->session; + ACImpl *client; TRACE("(%p)->(%f, %s)\n", session, level, wine_dbgstr_guid(context)); @@ -2606,6 +2607,8 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( pulse->lock(); session->master_vol = level; + LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) + set_stream_volumes(client); pulse->unlock(); return S_OK; diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c index f0bfcd98b7d..02f4d11a7f1 100644 --- a/dlls/winepulse.drv/pulse.c +++ b/dlls/winepulse.drv/pulse.c @@ -1004,12 +1004,13 @@ static HRESULT WINAPI pulse_stop(struct pulse_stream *stream) return hr; } -static void WINAPI pulse_set_volumes(struct pulse_stream *stream, const float *volumes) +static void WINAPI pulse_set_volumes(struct pulse_stream *stream, float master_volume, + const float *volumes) { unsigned int i; for (i = 0; i < stream->ss.channels; i++) - stream->vol[i] = volumes[i]; + stream->vol[i] = volumes[i] * master_volume; } static const struct unix_funcs unix_funcs = diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h index 7b5c5400a1f..8636f11d6f5 100644 --- a/dlls/winepulse.drv/unixlib.h +++ b/dlls/winepulse.drv/unixlib.h @@ -80,6 +80,7 @@ struct unix_funcs void (WINAPI *release_stream)(struct pulse_stream *stream, HANDLE timer); void (WINAPI *read)(struct pulse_stream *stream); HRESULT (WINAPI *stop)(struct pulse_stream *stream); - void (WINAPI *set_volumes)(struct pulse_stream *stream, const float *volumes); + void (WINAPI *set_volumes)(struct pulse_stream *stream, float master_volume, + const float *volumes); HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config); };
1
0
0
0
Jacek Caban : winepulse: Store volume levels in pulse_stream.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: bca0706f3a93fa0a57f4dbdc6ae541e8f25afb34 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=bca0706f3a93fa0a57f4dbdc…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu May 13 16:03:38 2021 +0200 winepulse: Store volume levels in pulse_stream. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winepulse.drv/mmdevdrv.c | 9 ++++++++- dlls/winepulse.drv/pulse.c | 13 ++++++++++++- dlls/winepulse.drv/unixlib.h | 2 ++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 589a87076ff..2a9ebd86c3a 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -264,7 +264,7 @@ static int write_buffer(const ACImpl *This, BYTE *buffer, UINT32 bytes) channels = This->pulse_stream->ss.channels; for (i = 0; i < channels; i++) { - vol[i] = This->vol[i] * This->session->master_vol * This->session->channel_vols[i]; + vol[i] = This->pulse_stream->vol[i] * This->session->master_vol * This->session->channel_vols[i]; adjust |= vol[i] != 1.0f; } if (!adjust) goto write; @@ -526,6 +526,11 @@ static DWORD WINAPI pulse_timer_cb(void *user) return 0; } +static void set_stream_volumes(ACImpl *This) +{ + pulse->set_volumes(This->pulse_stream, This->vol); +} + HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, const WCHAR ***ids, GUID **keys, UINT *num, UINT *def_index) { @@ -870,6 +875,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, if (SUCCEEDED(hr)) { hr = get_audio_session(sessionguid, This->parent, This->channel_count, &This->session); if (SUCCEEDED(hr)) { + set_stream_volumes(This); list_add_tail(&This->session->clients, &This->entry); } else { pulse->release_stream(This->pulse_stream, NULL); @@ -2038,6 +2044,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( for (i = 0; i < count; ++i) This->vol[i] = levels[i]; + set_stream_volumes(This); out: pulse->unlock(); return hr; diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c index fed34167018..f0bfcd98b7d 100644 --- a/dlls/winepulse.drv/pulse.c +++ b/dlls/winepulse.drv/pulse.c @@ -755,7 +755,7 @@ static HRESULT WINAPI pulse_create_stream(const char *name, EDataFlow dataflow, struct pulse_stream **ret) { struct pulse_stream *stream; - unsigned int bufsize_bytes; + unsigned int i, bufsize_bytes; HRESULT hr; if (FAILED(hr = pulse_connect(name))) @@ -765,6 +765,8 @@ static HRESULT WINAPI pulse_create_stream(const char *name, EDataFlow dataflow, return E_OUTOFMEMORY; stream->dataflow = dataflow; + for (i = 0; i < ARRAY_SIZE(stream->vol); ++i) + stream->vol[i] = 1.f; hr = pulse_spec_from_waveformat(stream, fmt); TRACE("Obtaining format returns %08x\n", hr); @@ -1002,6 +1004,14 @@ static HRESULT WINAPI pulse_stop(struct pulse_stream *stream) return hr; } +static void WINAPI pulse_set_volumes(struct pulse_stream *stream, const float *volumes) +{ + unsigned int i; + + for (i = 0; i < stream->ss.channels; i++) + stream->vol[i] = volumes[i]; +} + static const struct unix_funcs unix_funcs = { pulse_lock, @@ -1013,6 +1023,7 @@ static const struct unix_funcs unix_funcs = pulse_release_stream, pulse_read, pulse_stop, + pulse_set_volumes, pulse_test_connect, }; diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h index ca764afa19d..7b5c5400a1f 100644 --- a/dlls/winepulse.drv/unixlib.h +++ b/dlls/winepulse.drv/unixlib.h @@ -49,6 +49,7 @@ struct pulse_stream DWORD flags; AUDCLNT_SHAREMODE share; HANDLE event; + float vol[PA_CHANNELS_MAX]; INT32 locked; UINT32 bufsize_frames, real_bufsize_bytes, period_bytes; @@ -79,5 +80,6 @@ struct unix_funcs void (WINAPI *release_stream)(struct pulse_stream *stream, HANDLE timer); void (WINAPI *read)(struct pulse_stream *stream); HRESULT (WINAPI *stop)(struct pulse_stream *stream); + void (WINAPI *set_volumes)(struct pulse_stream *stream, const float *volumes); HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config); };
1
0
0
0
Jacek Caban : winepulse: Move pulse_stop to unix lib.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: b1ddfca16e4696a52adf2bdd8333eeffb3c6170c URL:
https://source.winehq.org/git/wine.git/?a=commit;h=b1ddfca16e4696a52adf2bdd…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu May 13 16:03:29 2021 +0200 winepulse: Move pulse_stop to unix lib. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winepulse.drv/mmdevdrv.c | 34 +++------------------------- dlls/winepulse.drv/pulse.c | 52 +++++++++++++++++++++++++++++++++++++++++++ dlls/winepulse.drv/unixlib.h | 1 + 3 files changed, 56 insertions(+), 31 deletions(-) diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 0e1da1364fa..589a87076ff 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -1223,40 +1223,12 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) { ACImpl *This = impl_from_IAudioClient3(iface); - HRESULT hr = S_OK; - pa_operation *o; - int success; - TRACE("(%p)\n", This); - pulse->lock(); - hr = pulse_stream_valid(This); - if (FAILED(hr)) { - pulse->unlock(); - return hr; - } - - if (!This->pulse_stream->started) { - pulse->unlock(); - return S_FALSE; - } + if (!This->pulse_stream) + return AUDCLNT_E_NOT_INITIALIZED; - if (This->dataflow == eRender) { - o = pa_stream_cork(This->pulse_stream->stream, 1, pulse_op_cb, &success); - if (o) { - while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) - pulse->cond_wait(); - pa_operation_unref(o); - } else - success = 0; - if (!success) - hr = E_FAIL; - } - if (SUCCEEDED(hr)) { - This->pulse_stream->started = FALSE; - } - pulse->unlock(); - return hr; + return pulse->stop(This->pulse_stream); } static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c index d434f47d6dc..fed34167018 100644 --- a/dlls/winepulse.drv/pulse.c +++ b/dlls/winepulse.drv/pulse.c @@ -200,11 +200,23 @@ static void pulse_started_callback(pa_stream *s, void *userdata) TRACE("%p: (Re)started playing\n", userdata); } +static void pulse_op_cb(pa_stream *s, int success, void *user) +{ + TRACE("Success: %i\n", success); + *(int*)user = success; + pulse_broadcast(); +} + static void silence_buffer(pa_sample_format_t format, BYTE *buffer, UINT32 bytes) { memset(buffer, format == PA_SAMPLE_U8 ? 0x80 : 0, bytes); } +static BOOL pulse_stream_valid(struct pulse_stream *stream) +{ + return pa_stream_get_state(stream->stream) == PA_STREAM_READY; +} + static HRESULT pulse_connect(const char *name) { if (pulse_ctx && PA_CONTEXT_IS_GOOD(pa_context_get_state(pulse_ctx))) @@ -951,6 +963,45 @@ static void WINAPI pulse_read(struct pulse_stream *stream) } } +static HRESULT WINAPI pulse_stop(struct pulse_stream *stream) +{ + HRESULT hr = S_OK; + pa_operation *o; + int success; + + pulse_lock(); + if (!pulse_stream_valid(stream)) + { + pulse_unlock(); + return AUDCLNT_E_DEVICE_INVALIDATED; + } + + if (!stream->started) + { + pulse_unlock(); + return S_FALSE; + } + + if (stream->dataflow == eRender) + { + o = pa_stream_cork(stream->stream, 1, pulse_op_cb, &success); + if (o) + { + while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) + pulse_cond_wait(); + pa_operation_unref(o); + } + else + success = 0; + if (!success) + hr = E_FAIL; + } + if (SUCCEEDED(hr)) + stream->started = FALSE; + pulse_unlock(); + return hr; +} + static const struct unix_funcs unix_funcs = { pulse_lock, @@ -961,6 +1012,7 @@ static const struct unix_funcs unix_funcs = pulse_create_stream, pulse_release_stream, pulse_read, + pulse_stop, pulse_test_connect, }; diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h index c725082e96d..ca764afa19d 100644 --- a/dlls/winepulse.drv/unixlib.h +++ b/dlls/winepulse.drv/unixlib.h @@ -78,5 +78,6 @@ struct unix_funcs struct pulse_stream **ret); void (WINAPI *release_stream)(struct pulse_stream *stream, HANDLE timer); void (WINAPI *read)(struct pulse_stream *stream); + HRESULT (WINAPI *stop)(struct pulse_stream *stream); HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config); };
1
0
0
0
Jacek Caban : winepulse: Move pulse_read to unix lib.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: a5d4079c8285c10ab2019c9fd9d19a6b22babb76 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=a5d4079c8285c10ab2019c9f…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu May 13 16:03:19 2021 +0200 winepulse: Move pulse_read to unix lib. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winepulse.drv/mmdevdrv.c | 92 +------------------------------------- dlls/winepulse.drv/pulse.c | 101 ++++++++++++++++++++++++++++++++++++++++++ dlls/winepulse.drv/unixlib.h | 1 + 3 files changed, 103 insertions(+), 91 deletions(-) diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index d0d497c4bbb..0e1da1364fa 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -434,96 +434,6 @@ static void pulse_write(ACImpl *This) This->pulse_stream->pa_held_bytes -= to_write; } -static void pulse_read(ACImpl *This) -{ - size_t bytes = pa_stream_readable_size(This->pulse_stream->stream); - - TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(This->pulse_stream->stream)->fragsize); - - bytes += This->pulse_stream->peek_len - This->pulse_stream->peek_ofs; - - while (bytes >= This->pulse_stream->period_bytes) { - BYTE *dst = NULL, *src; - size_t src_len, copy, rem = This->pulse_stream->period_bytes; - - if (This->pulse_stream->started) { - LARGE_INTEGER stamp, freq; - ACPacket *p, *next; - - if (!(p = (ACPacket*)list_head(&This->pulse_stream->packet_free_head))) { - p = (ACPacket*)list_head(&This->pulse_stream->packet_filled_head); - if (!p) return; - if (!p->discont) { - next = (ACPacket*)p->entry.next; - next->discont = 1; - } else - p = (ACPacket*)list_tail(&This->pulse_stream->packet_filled_head); - } else { - This->pulse_stream->held_bytes += This->pulse_stream->period_bytes; - } - QueryPerformanceCounter(&stamp); - QueryPerformanceFrequency(&freq); - p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; - p->discont = 0; - list_remove(&p->entry); - list_add_tail(&This->pulse_stream->packet_filled_head, &p->entry); - - dst = p->data; - } - - while (rem) { - if (This->pulse_stream->peek_len) { - copy = min(rem, This->pulse_stream->peek_len - This->pulse_stream->peek_ofs); - - if (dst) { - memcpy(dst, This->pulse_stream->peek_buffer + This->pulse_stream->peek_ofs, copy); - dst += copy; - } - - rem -= copy; - This->pulse_stream->peek_ofs += copy; - if(This->pulse_stream->peek_len == This->pulse_stream->peek_ofs) - This->pulse_stream->peek_len = This->pulse_stream->peek_ofs = 0; - - } else if (pa_stream_peek(This->pulse_stream->stream, (const void**)&src, &src_len) == 0 && src_len) { - - copy = min(rem, src_len); - - if (dst) { - if(src) - memcpy(dst, src, copy); - else - silence_buffer(This->pulse_stream->ss.format, dst, copy); - - dst += copy; - } - - rem -= copy; - - if (copy < src_len) { - if (src_len > This->pulse_stream->peek_buffer_len) { - HeapFree(GetProcessHeap(), 0, This->pulse_stream->peek_buffer); - This->pulse_stream->peek_buffer = HeapAlloc(GetProcessHeap(), 0, src_len); - This->pulse_stream->peek_buffer_len = src_len; - } - - if(src) - memcpy(This->pulse_stream->peek_buffer, src + copy, src_len - copy); - else - silence_buffer(This->pulse_stream->ss.format, This->pulse_stream->peek_buffer, src_len - copy); - - This->pulse_stream->peek_len = src_len - copy; - This->pulse_stream->peek_ofs = 0; - } - - pa_stream_drop(This->pulse_stream->stream); - } - } - - bytes -= This->pulse_stream->period_bytes; - } -} - static DWORD WINAPI pulse_timer_cb(void *user) { LARGE_INTEGER delay; @@ -595,7 +505,7 @@ static DWORD WINAPI pulse_timer_cb(void *user) This->pulse_stream->lcl_offs_bytes %= This->pulse_stream->real_bufsize_bytes; This->pulse_stream->held_bytes -= adv_bytes; }else if(This->dataflow == eCapture){ - pulse_read(This); + pulse->read(This->pulse_stream); } }else{ This->pulse_stream->last_time = now; diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c index 260723815f6..d434f47d6dc 100644 --- a/dlls/winepulse.drv/pulse.c +++ b/dlls/winepulse.drv/pulse.c @@ -851,6 +851,106 @@ static void WINAPI pulse_release_stream(struct pulse_stream *stream, HANDLE time RtlFreeHeap(GetProcessHeap(), 0, stream); } +static void WINAPI pulse_read(struct pulse_stream *stream) +{ + size_t bytes = pa_stream_readable_size(stream->stream); + + TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(stream->stream)->fragsize); + + bytes += stream->peek_len - stream->peek_ofs; + + while (bytes >= stream->period_bytes) + { + BYTE *dst = NULL, *src; + size_t src_len, copy, rem = stream->period_bytes; + + if (stream->started) + { + LARGE_INTEGER stamp, freq; + ACPacket *p, *next; + + if (!(p = (ACPacket*)list_head(&stream->packet_free_head))) + { + p = (ACPacket*)list_head(&stream->packet_filled_head); + if (!p) return; + if (!p->discont) { + next = (ACPacket*)p->entry.next; + next->discont = 1; + } else + p = (ACPacket*)list_tail(&stream->packet_filled_head); + } + else + { + stream->held_bytes += stream->period_bytes; + } + NtQueryPerformanceCounter(&stamp, &freq); + p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; + p->discont = 0; + list_remove(&p->entry); + list_add_tail(&stream->packet_filled_head, &p->entry); + + dst = p->data; + } + + while (rem) + { + if (stream->peek_len) + { + copy = min(rem, stream->peek_len - stream->peek_ofs); + + if (dst) + { + memcpy(dst, stream->peek_buffer + stream->peek_ofs, copy); + dst += copy; + } + + rem -= copy; + stream->peek_ofs += copy; + if(stream->peek_len == stream->peek_ofs) + stream->peek_len = stream->peek_ofs = 0; + + } + else if (pa_stream_peek(stream->stream, (const void**)&src, &src_len) == 0 && src_len) + { + copy = min(rem, src_len); + + if (dst) { + if(src) + memcpy(dst, src, copy); + else + silence_buffer(stream->ss.format, dst, copy); + + dst += copy; + } + + rem -= copy; + + if (copy < src_len) + { + if (src_len > stream->peek_buffer_len) + { + RtlFreeHeap(GetProcessHeap(), 0, stream->peek_buffer); + stream->peek_buffer = RtlAllocateHeap(GetProcessHeap(), 0, src_len); + stream->peek_buffer_len = src_len; + } + + if(src) + memcpy(stream->peek_buffer, src + copy, src_len - copy); + else + silence_buffer(stream->ss.format, stream->peek_buffer, src_len - copy); + + stream->peek_len = src_len - copy; + stream->peek_ofs = 0; + } + + pa_stream_drop(stream->stream); + } + } + + bytes -= stream->period_bytes; + } +} + static const struct unix_funcs unix_funcs = { pulse_lock, @@ -860,6 +960,7 @@ static const struct unix_funcs unix_funcs = pulse_main_loop, pulse_create_stream, pulse_release_stream, + pulse_read, pulse_test_connect, }; diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h index 51c850ac1ae..c725082e96d 100644 --- a/dlls/winepulse.drv/unixlib.h +++ b/dlls/winepulse.drv/unixlib.h @@ -77,5 +77,6 @@ struct unix_funcs const WAVEFORMATEX *fmt, UINT32 *channel_count, struct pulse_stream **ret); void (WINAPI *release_stream)(struct pulse_stream *stream, HANDLE timer); + void (WINAPI *read)(struct pulse_stream *stream); HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config); };
1
0
0
0
Jacek Caban : configure: Try using pure clang as a cross compiler when mingw is not available.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: b070eb78cc1e9684f841317f1126e47d09ed0f99 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=b070eb78cc1e9684f841317f…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Mon May 17 18:41:56 2021 +0200 configure: Try using pure clang as a cross compiler when mingw is not available. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- aclocal.m4 | 8 ++++---- configure | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index bd8ca6b33e5..52b7efc5a03 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -218,18 +218,18 @@ dnl AC_DEFUN([WINE_CHECK_MINGW_PROG], [case "$host_cpu" in aarch64*) - ac_prefix_list="aarch64-w64-mingw32-clang aarch64-w64-mingw32-gcc" ;; + ac_prefix_list="aarch64-w64-mingw32-clang aarch64-w64-mingw32-gcc clang" ;; arm*) - ac_prefix_list="armv7-w64-mingw32-clang armv7-w64-mingw32-gcc" ;; + ac_prefix_list="armv7-w64-mingw32-clang armv7-w64-mingw32-gcc clang" ;; i[[3456789]]86*) ac_prefix_list="m4_foreach([ac_wine_prefix],[w64-mingw32, pc-mingw32, mingw32msvc, mingw32], m4_foreach([ac_wine_cpu],[i686,i586,i486,i386],[ac_wine_cpu-ac_wine_prefix-gcc ])) m4_foreach([ac_wine_cpu],[i686,i586,i486,i386],[ac_wine_cpu-w64-mingw32-clang ]) - mingw32-gcc" ;; + mingw32-gcc clang" ;; x86_64) ac_prefix_list="m4_foreach([ac_wine_prefix],[pc-mingw32, w64-mingw32, mingw32msvc], m4_foreach([ac_wine_cpu],[x86_64,amd64],[ac_wine_cpu-ac_wine_prefix-gcc ])) - m4_foreach([ac_wine_cpu],[x86_64,amd64],[ac_wine_cpu-w64-mingw32-clang ])" ;; + m4_foreach([ac_wine_cpu],[x86_64,amd64],[ac_wine_cpu-w64-mingw32-clang ]) clang" ;; *) ac_prefix_list="" ;; esac diff --git a/configure b/configure index 7c2e31de5af..ac738ca964b 100755 --- a/configure +++ b/configure @@ -9660,16 +9660,16 @@ then case "x$with_mingw" in x|xyes) case "$host_cpu" in aarch64*) - ac_prefix_list="aarch64-w64-mingw32-clang aarch64-w64-mingw32-gcc" ;; + ac_prefix_list="aarch64-w64-mingw32-clang aarch64-w64-mingw32-gcc clang" ;; arm*) - ac_prefix_list="armv7-w64-mingw32-clang armv7-w64-mingw32-gcc" ;; + ac_prefix_list="armv7-w64-mingw32-clang armv7-w64-mingw32-gcc clang" ;; i[3456789]86*) ac_prefix_list="i686-w64-mingw32-gcc i586-w64-mingw32-gcc i486-w64-mingw32-gcc i386-w64-mingw32-gcc i686-pc-mingw32-gcc i586-pc-mingw32-gcc i486-pc-mingw32-gcc i386-pc-mingw32-gcc i686-mingw32msvc-gcc i586-mingw32msvc-gcc i486-mingw32msvc-gcc i386-mingw32msvc-gcc i686-mingw32-gcc i586-mingw32-gcc i486-mingw32-gcc i386-mingw32-gcc i686-w64-mingw32-clang i586-w64-mingw32-clang i486-w64-mingw32-clang i386-w64-mingw32-clang - mingw32-gcc" ;; + mingw32-gcc clang" ;; x86_64) ac_prefix_list="x86_64-pc-mingw32-gcc amd64-pc-mingw32-gcc x86_64-w64-mingw32-gcc amd64-w64-mingw32-gcc x86_64-mingw32msvc-gcc amd64-mingw32msvc-gcc - x86_64-w64-mingw32-clang amd64-w64-mingw32-clang " ;; + x86_64-w64-mingw32-clang amd64-w64-mingw32-clang clang" ;; *) ac_prefix_list="" ;; esac
1
0
0
0
Rémi Bernon : explorer: Create systray for the null graphics driver.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: 2027c8ee1fb9c47d11995ac842cb924e938589b1 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=2027c8ee1fb9c47d11995ac8…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri May 14 13:40:08 2021 +0200 explorer: Create systray for the null graphics driver. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- programs/explorer/desktop.c | 20 ++++++++------------ programs/explorer/systray.c | 2 +- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c index 51d1535aea6..2ba276f52cb 100644 --- a/programs/explorer/desktop.c +++ b/programs/explorer/desktop.c @@ -959,6 +959,7 @@ void manage_desktop( WCHAR *arg ) const WCHAR *name = NULL; BOOL enable_shell = FALSE; void (WINAPI *pShellDDEInit)( BOOL ) = NULL; + HMODULE shell32; /* get the rest of the command line (if any) */ while (*p && !is_whitespace(*p)) p++; @@ -1028,20 +1029,15 @@ void manage_desktop( WCHAR *arg ) initialize_display_settings(); initialize_appbar(); - if (graphics_driver) - { - HMODULE shell32; - - if (using_root) enable_shell = FALSE; + if (using_root) enable_shell = FALSE; - initialize_systray( graphics_driver, using_root, enable_shell ); - if (!using_root) initialize_launchers( hwnd ); + initialize_systray( graphics_driver, using_root, enable_shell ); + if (!using_root) initialize_launchers( hwnd ); - if ((shell32 = LoadLibraryW( L"shell32.dll" )) && - (pShellDDEInit = (void *)GetProcAddress( shell32, (LPCSTR)188))) - { - pShellDDEInit( TRUE ); - } + if ((shell32 = LoadLibraryW( L"shell32.dll" )) && + (pShellDDEInit = (void *)GetProcAddress( shell32, (LPCSTR)188))) + { + pShellDDEInit( TRUE ); } } diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c index 161b4b57e58..0c978451151 100644 --- a/programs/explorer/systray.c +++ b/programs/explorer/systray.c @@ -900,7 +900,7 @@ void initialize_systray( HMODULE graphics_driver, BOOL using_root, BOOL arg_enab WNDCLASSEXW class; static const WCHAR classname[] = {'S','h','e','l','l','_','T','r','a','y','W','n','d',0}; - if (using_root) wine_notify_icon = (void *)GetProcAddress( graphics_driver, "wine_notify_icon" ); + if (using_root && graphics_driver) wine_notify_icon = (void *)GetProcAddress( graphics_driver, "wine_notify_icon" ); icon_cx = GetSystemMetrics( SM_CXSMICON ) + 2*ICON_BORDER; icon_cy = GetSystemMetrics( SM_CYSMICON ) + 2*ICON_BORDER;
1
0
0
0
Rémi Bernon : user32: Duplicate klid to HKL high word in LoadKeyboardLayoutW.
by Alexandre Julliard
17 May '21
17 May '21
Module: wine Branch: master Commit: 50ca64fcdf00e782213a541c7d128fdf5815a9e8 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=50ca64fcdf00e782213a541c…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri May 14 13:40:07 2021 +0200 user32: Duplicate klid to HKL high word in LoadKeyboardLayoutW. When high word is 0, and unless it has an explicit layout id. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/input.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 5d9bbe14cd6..ba0292c8f88 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -1548,7 +1548,8 @@ HKL WINAPI LoadKeyboardLayoutW( const WCHAR *name, UINT flags ) FIXME_(keyboard)( "name %s, flags %x, semi-stub!\n", debugstr_w( name ), flags ); tmp = wcstoul( name, NULL, 16 ); - layout = UlongToHandle( tmp ); + if (HIWORD( tmp )) layout = UlongToHandle( tmp ); + else layout = UlongToHandle( MAKELONG( LOWORD( tmp ), LOWORD( tmp ) ) ); wcscpy( layout_path, L"System\\CurrentControlSet\\Control\\Keyboard Layouts\\" ); wcscat( layout_path, name );
1
0
0
0
← Newer
1
...
34
35
36
37
38
39
40
...
77
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Results per page:
10
25
50
100
200