Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
cb37c43d
Commit
cb37c43d
authored
Jan 18, 2006
by
Alex Villacís Lasso
Committed by
Alexandre Julliard
Jan 18, 2006
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msacm: Implement acmDriverPriority with driver priority/enabled saving.
Foundation for notification broadcasts with support for deferred notification.
parent
8d520161
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
250 additions
and
38 deletions
+250
-38
driver.c
dlls/msacm/driver.c
+84
-38
internal.c
dlls/msacm/internal.c
+160
-0
wineacm.h
dlls/msacm/wineacm.h
+6
-0
No files found.
dlls/msacm/driver.c
View file @
cb37c43d
...
...
@@ -404,22 +404,9 @@ MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpe
*/
MMRESULT
WINAPI
acmDriverPriority
(
HACMDRIVERID
hadid
,
DWORD
dwPriority
,
DWORD
fdwPriority
)
{
PWINE_ACMDRIVERID
padid
;
CHAR
szSubKey
[
17
];
CHAR
szBuffer
[
256
];
LONG
lBufferLength
=
sizeof
(
szBuffer
);
LONG
lError
;
HKEY
hPriorityKey
;
DWORD
dwPriorityCounter
;
TRACE
(
"(%p, %08lx, %08lx)
\n
"
,
hadid
,
dwPriority
,
fdwPriority
);
padid
=
MSACM_GetDriverID
(
hadid
);
if
(
!
padid
)
{
WARN
(
"invalid handle
\n
"
);
return
MMSYSERR_INVALHANDLE
;
}
/* Check for unknown flags */
if
(
fdwPriority
&
~
(
ACM_DRIVERPRIORITYF_ENABLE
|
ACM_DRIVERPRIORITYF_DISABLE
|
...
...
@@ -441,33 +428,91 @@ MMRESULT WINAPI acmDriverPriority(HACMDRIVERID hadid, DWORD dwPriority, DWORD fd
WARN
(
"invalid flag
\n
"
);
return
MMSYSERR_INVALFLAG
;
}
/* According to MSDN, ACM_DRIVERPRIORITYF_BEGIN and ACM_DRIVERPRIORITYF_END
may only appear by themselves, and in addition, hadid and dwPriority must
both be zero */
if
((
fdwPriority
&
ACM_DRIVERPRIORITYF_BEGIN
)
||
(
fdwPriority
&
ACM_DRIVERPRIORITYF_END
))
{
if
(
fdwPriority
&
~
(
ACM_DRIVERPRIORITYF_BEGIN
|
ACM_DRIVERPRIORITYF_END
))
{
WARN
(
"ACM_DRIVERPRIORITYF_[BEGIN|END] cannot be used with any other flags
\n
"
);
return
MMSYSERR_INVALPARAM
;
}
if
(
dwPriority
)
{
WARN
(
"priority invalid with ACM_DRIVERPRIORITYF_[BEGIN|END]
\n
"
);
return
MMSYSERR_INVALPARAM
;
}
if
(
hadid
)
{
WARN
(
"non-null hadid invalid with ACM_DRIVERPRIORITYF_[BEGIN|END]
\n
"
);
return
MMSYSERR_INVALPARAM
;
}
/* FIXME: MSDN wording suggests that deferred notification should be
implemented as a system-wide lock held by a calling task, and that
re-enabling notifications should broadcast them across all processes.
This implementation uses a simple DWORD counter. One consequence of the
current implementation is that applications will never see
MMSYSERR_ALLOCATED as a return error.
*/
if
(
fdwPriority
&
ACM_DRIVERPRIORITYF_BEGIN
)
{
MSACM_DisableNotifications
();
}
else
if
(
fdwPriority
&
ACM_DRIVERPRIORITYF_END
)
{
MSACM_EnableNotifications
();
}
return
MMSYSERR_NOERROR
;
}
else
{
PWINE_ACMDRIVERID
padid
;
BOOL
bPerformBroadcast
=
FALSE
;
/* Fetch driver ID */
padid
=
MSACM_GetDriverID
(
hadid
);
if
(
!
padid
)
{
WARN
(
"invalid handle
\n
"
);
return
MMSYSERR_INVALHANDLE
;
}
/* Check whether driver ID is appropriate for requested op */
if
(
dwPriority
)
{
if
(
padid
->
fdwSupport
&
ACMDRIVERDETAILS_SUPPORTF_LOCAL
)
{
return
MMSYSERR_NOTSUPPORTED
;
}
if
(
dwPriority
!=
1
&&
dwPriority
!=
-
1
)
{
FIXME
(
"unexpected priority %ld, using sign only
\n
"
,
dwPriority
);
if
(
dwPriority
<
0
)
dwPriority
=
-
1
;
if
(
dwPriority
>
0
)
dwPriority
=
1
;
}
if
(
dwPriority
==
1
&&
(
padid
->
pPrevACMDriverID
==
NULL
||
(
padid
->
pPrevACMDriverID
->
fdwSupport
&
ACMDRIVERDETAILS_SUPPORTF_LOCAL
)))
{
/* do nothing - driver is first of list, or first after last
local driver */
}
else
if
(
dwPriority
==
-
1
&&
padid
->
pNextACMDriverID
==
NULL
)
{
/* do nothing - driver is last of list */
}
else
{
MSACM_RePositionDriver
(
padid
,
dwPriority
);
bPerformBroadcast
=
TRUE
;
}
}
lError
=
RegOpenKeyA
(
HKEY_CURRENT_USER
,
"Software
\\
Microsoft
\\
Multimedia
\\
"
"Audio Compression Manager
\\
Priority v4.00"
,
&
hPriorityKey
);
/* FIXME: Create key */
if
(
lError
!=
ERROR_SUCCESS
)
{
WARN
(
"RegOpenKeyA failed
\n
"
);
return
MMSYSERR_ERROR
;
}
for
(
dwPriorityCounter
=
1
;
;
dwPriorityCounter
++
)
{
snprintf
(
szSubKey
,
17
,
"Priority%ld"
,
dwPriorityCounter
);
lError
=
RegQueryValueA
(
hPriorityKey
,
szSubKey
,
szBuffer
,
&
lBufferLength
);
if
(
lError
!=
ERROR_SUCCESS
)
break
;
FIXME
(
"(%p, %ld, %ld): stub (partial)
\n
"
,
hadid
,
dwPriority
,
fdwPriority
);
break
;
/* Check whether driver ID should be enabled or disabled */
if
(
fdwPriority
&
ACM_DRIVERPRIORITYF_DISABLE
)
{
if
(
!
(
padid
->
fdwSupport
&
ACMDRIVERDETAILS_SUPPORTF_DISABLED
))
{
padid
->
fdwSupport
|=
ACMDRIVERDETAILS_SUPPORTF_DISABLED
;
bPerformBroadcast
=
TRUE
;
}
}
else
if
(
fdwPriority
&
ACM_DRIVERPRIORITYF_ENABLE
)
{
if
(
padid
->
fdwSupport
&
ACMDRIVERDETAILS_SUPPORTF_DISABLED
)
{
padid
->
fdwSupport
&=
~
ACMDRIVERDETAILS_SUPPORTF_DISABLED
;
bPerformBroadcast
=
TRUE
;
}
}
/* Perform broadcast of changes */
if
(
bPerformBroadcast
)
{
MSACM_WriteCurrentPriorities
();
MSACM_BroadcastNotification
();
}
return
MMSYSERR_NOERROR
;
}
RegCloseKey
(
hPriorityKey
);
WARN
(
"RegQueryValueA failed
\n
"
);
return
MMSYSERR_ERROR
;
}
/***********************************************************************
...
...
@@ -491,6 +536,7 @@ MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove)
}
MSACM_UnregisterDriver
(
padid
);
MSACM_BroadcastNotification
();
return
MMSYSERR_NOERROR
;
}
dlls/msacm/internal.c
View file @
cb37c43d
...
...
@@ -46,6 +46,9 @@ HANDLE MSACM_hHeap = NULL;
PWINE_ACMDRIVERID
MSACM_pFirstACMDriverID
=
NULL
;
PWINE_ACMDRIVERID
MSACM_pLastACMDriverID
=
NULL
;
static
DWORD
MSACM_suspendBroadcastCount
=
0
;
static
BOOL
MSACM_pendingBroadcast
=
FALSE
;
static
void
MSACM_ReorderDriversByPriority
(
void
);
#if 0
...
...
@@ -334,6 +337,90 @@ void MSACM_RegisterAllDrivers(void)
}
/***********************************************************************
* MSACM_BroadcastNotification()
*/
void
MSACM_BroadcastNotification
(
void
)
{
if
(
MSACM_suspendBroadcastCount
<=
0
)
{
FIXME
(
"notification broadcast not (yet) implemented
\n
"
);
}
else
{
MSACM_pendingBroadcast
=
TRUE
;
}
}
/***********************************************************************
* MSACM_DisableNotifications()
*/
void
MSACM_DisableNotifications
(
void
)
{
MSACM_suspendBroadcastCount
++
;
}
/***********************************************************************
* MSACM_EnableNotifications()
*/
void
MSACM_EnableNotifications
(
void
)
{
if
(
MSACM_suspendBroadcastCount
>
0
)
{
MSACM_suspendBroadcastCount
--
;
if
(
MSACM_suspendBroadcastCount
==
0
&&
MSACM_pendingBroadcast
)
{
MSACM_pendingBroadcast
=
FALSE
;
MSACM_BroadcastNotification
();
}
}
}
/***********************************************************************
* MSACM_RePositionDriver()
*/
void
MSACM_RePositionDriver
(
PWINE_ACMDRIVERID
padid
,
DWORD
dwPriority
)
{
PWINE_ACMDRIVERID
pTargetPosition
=
NULL
;
/* Remove selected driver from linked list */
if
(
MSACM_pFirstACMDriverID
==
padid
)
{
MSACM_pFirstACMDriverID
=
padid
->
pNextACMDriverID
;
}
if
(
MSACM_pLastACMDriverID
==
padid
)
{
MSACM_pLastACMDriverID
=
padid
->
pPrevACMDriverID
;
}
if
(
padid
->
pPrevACMDriverID
!=
NULL
)
{
padid
->
pPrevACMDriverID
->
pNextACMDriverID
=
padid
->
pNextACMDriverID
;
}
if
(
padid
->
pNextACMDriverID
!=
NULL
)
{
padid
->
pNextACMDriverID
->
pPrevACMDriverID
=
padid
->
pPrevACMDriverID
;
}
/* Look up position where selected driver should be */
if
(
dwPriority
==
1
)
{
pTargetPosition
=
padid
->
pPrevACMDriverID
;
while
(
pTargetPosition
->
pPrevACMDriverID
!=
NULL
&&
!
(
pTargetPosition
->
pPrevACMDriverID
->
fdwSupport
&
ACMDRIVERDETAILS_SUPPORTF_LOCAL
))
{
pTargetPosition
=
pTargetPosition
->
pPrevACMDriverID
;
}
}
else
if
(
dwPriority
==
-
1
)
{
pTargetPosition
=
padid
->
pNextACMDriverID
;
while
(
pTargetPosition
->
pNextACMDriverID
!=
NULL
)
{
pTargetPosition
=
pTargetPosition
->
pNextACMDriverID
;
}
}
/* Place selected driver in selected position */
padid
->
pPrevACMDriverID
=
pTargetPosition
->
pPrevACMDriverID
;
padid
->
pNextACMDriverID
=
pTargetPosition
;
if
(
padid
->
pPrevACMDriverID
!=
NULL
)
{
padid
->
pPrevACMDriverID
->
pNextACMDriverID
=
padid
;
}
else
{
MSACM_pFirstACMDriverID
=
padid
;
}
if
(
padid
->
pNextACMDriverID
!=
NULL
)
{
padid
->
pNextACMDriverID
->
pPrevACMDriverID
=
padid
;
}
else
{
MSACM_pLastACMDriverID
=
padid
;
}
}
/***********************************************************************
* MSACM_ReorderDriversByPriority()
* Reorders all drivers based on the priority list indicated by the registry key:
* HKCU\\Software\\Microsoft\\Multimedia\\Audio Compression Manager\\Priority v4.00
...
...
@@ -446,6 +533,79 @@ errCleanUp:
}
/***********************************************************************
* MSACM_WriteCurrentPriorities()
* Writes out current order of driver priorities to registry key:
* HKCU\\Software\\Microsoft\\Multimedia\\Audio Compression Manager\\Priority v4.00
*/
void
MSACM_WriteCurrentPriorities
(
void
)
{
LONG
lError
;
HKEY
hPriorityKey
;
static
const
WCHAR
basePriorityKey
[]
=
{
'S'
,
'o'
,
'f'
,
't'
,
'w'
,
'a'
,
'r'
,
'e'
,
'\\'
,
'M'
,
'i'
,
'c'
,
'r'
,
'o'
,
's'
,
'o'
,
'f'
,
't'
,
'\\'
,
'M'
,
'u'
,
'l'
,
't'
,
'i'
,
'm'
,
'e'
,
'd'
,
'i'
,
'a'
,
'\\'
,
'A'
,
'u'
,
'd'
,
'i'
,
'o'
,
' '
,
'C'
,
'o'
,
'm'
,
'p'
,
'r'
,
'e'
,
's'
,
's'
,
'i'
,
'o'
,
'n'
,
' '
,
'M'
,
'a'
,
'n'
,
'a'
,
'g'
,
'e'
,
'r'
,
'\\'
,
'P'
,
'r'
,
'i'
,
'o'
,
'r'
,
'i'
,
't'
,
'y'
,
' '
,
'v'
,
'4'
,
'.'
,
'0'
,
'0'
,
'\0'
};
PWINE_ACMDRIVERID
padid
;
DWORD
dwPriorityCounter
;
static
const
WCHAR
priorityTmpl
[]
=
{
'P'
,
'r'
,
'i'
,
'o'
,
'r'
,
'i'
,
't'
,
'y'
,
'%'
,
'l'
,
'd'
,
'\0'
};
static
const
WCHAR
valueTmpl
[]
=
{
'%'
,
'c'
,
','
,
' '
,
'%'
,
's'
,
'\0'
};
static
const
WCHAR
converterAlias
[]
=
{
'I'
,
'n'
,
't'
,
'e'
,
'r'
,
'n'
,
'a'
,
'l'
,
' '
,
'P'
,
'C'
,
'M'
,
' '
,
'C'
,
'o'
,
'n'
,
'v'
,
'e'
,
'r'
,
't'
,
'e'
,
'r'
,
'\0'
};
WCHAR
szSubKey
[
17
];
WCHAR
szBuffer
[
256
];
/* Delete ACM priority key and create it anew */
lError
=
RegDeleteKeyW
(
HKEY_CURRENT_USER
,
basePriorityKey
);
if
(
lError
!=
ERROR_SUCCESS
&&
lError
!=
ERROR_FILE_NOT_FOUND
)
{
ERR
(
"unable to remove current key %s (0x%08lx) - priority changes won't persist past application end.
\n
"
,
debugstr_w
(
basePriorityKey
),
lError
);
return
;
}
lError
=
RegCreateKeyW
(
HKEY_CURRENT_USER
,
basePriorityKey
,
&
hPriorityKey
);
if
(
lError
!=
ERROR_SUCCESS
)
{
ERR
(
"unable to create key %s (0x%08lx) - priority changes won't persist past application end.
\n
"
,
debugstr_w
(
basePriorityKey
),
lError
);
return
;
}
/* Write current list of priorities */
for
(
dwPriorityCounter
=
0
,
padid
=
MSACM_pFirstACMDriverID
;
padid
;
padid
=
padid
->
pNextACMDriverID
)
{
if
(
padid
->
fdwSupport
&
ACMDRIVERDETAILS_SUPPORTF_LOCAL
)
continue
;
if
(
padid
->
pszDriverAlias
==
NULL
)
continue
;
/* internal PCM converter is last */
/* Build required value name */
dwPriorityCounter
++
;
snprintfW
(
szSubKey
,
17
,
priorityTmpl
,
dwPriorityCounter
);
/* Value has a 1 in front for enabled drivers and 0 for disabled drivers */
snprintfW
(
szBuffer
,
256
,
valueTmpl
,
(
padid
->
fdwSupport
&
ACMDRIVERDETAILS_SUPPORTF_DISABLED
)
?
'0'
:
'1'
,
padid
->
pszDriverAlias
);
strlwrW
(
szBuffer
);
lError
=
RegSetValueExW
(
hPriorityKey
,
szSubKey
,
0
,
REG_SZ
,
(
BYTE
*
)
szBuffer
,
(
strlenW
(
szBuffer
)
+
1
)
*
sizeof
(
WCHAR
));
if
(
lError
!=
ERROR_SUCCESS
)
{
ERR
(
"unable to write value for %s under key %s (0x%08lx)
\n
"
,
debugstr_w
(
padid
->
pszDriverAlias
),
debugstr_w
(
basePriorityKey
),
lError
);
}
}
/* Build required value name */
dwPriorityCounter
++
;
snprintfW
(
szSubKey
,
17
,
priorityTmpl
,
dwPriorityCounter
);
/* Value has a 1 in front for enabled drivers and 0 for disabled drivers */
snprintfW
(
szBuffer
,
256
,
valueTmpl
,
'1'
,
converterAlias
);
lError
=
RegSetValueExW
(
hPriorityKey
,
szSubKey
,
0
,
REG_SZ
,
(
BYTE
*
)
szBuffer
,
(
strlenW
(
szBuffer
)
+
1
)
*
sizeof
(
WCHAR
));
if
(
lError
!=
ERROR_SUCCESS
)
{
ERR
(
"unable to write value for %s under key %s (0x%08lx)
\n
"
,
debugstr_w
(
converterAlias
),
debugstr_w
(
basePriorityKey
),
lError
);
}
RegCloseKey
(
hPriorityKey
);
}
/***********************************************************************
* MSACM_UnregisterDriver()
*/
PWINE_ACMDRIVERID
MSACM_UnregisterDriver
(
PWINE_ACMDRIVERID
p
)
...
...
dlls/msacm/wineacm.h
View file @
cb37c43d
...
...
@@ -348,6 +348,12 @@ extern PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj, DWORD type);
extern
MMRESULT
MSACM_Message
(
HACMDRIVER
,
UINT
,
LPARAM
,
LPARAM
);
extern
BOOL
MSACM_FindFormatTagInCache
(
WINE_ACMDRIVERID
*
,
DWORD
,
LPDWORD
);
extern
void
MSACM_RePositionDriver
(
PWINE_ACMDRIVERID
,
DWORD
);
extern
void
MSACM_WriteCurrentPriorities
(
void
);
extern
void
MSACM_BroadcastNotification
(
void
);
extern
void
MSACM_DisableNotifications
(
void
);
extern
void
MSACM_EnableNotifications
(
void
);
/* From msacm32.c */
extern
HINSTANCE
MSACM_hInstance32
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment