JMC70
Messages postés77Date d'inscriptionsamedi 9 novembre 2002StatutMembreDernière intervention 6 juillet 2014
-
1 sept. 2008 à 22:29
JMC70
Messages postés77Date d'inscriptionsamedi 9 novembre 2002StatutMembreDernière intervention 6 juillet 2014
-
4 sept. 2008 à 07:59
Par défaut, Windows XP ajuste l'accélération matérielle de la carte son au maximum. Or avec certains PC équipés de cartes de début de gamme, des problèmes peuvent se poser lors de la lecture de sons (notamment compressés car le son est lu avant d'être prêt - enfin, je suppose que le problème vient de là). C'est le cas d'un de mes programmes dont les débuts des sons mp3 sont parfois tronqués sur environ 1/2 sec (comme ils durent 2 ou 3 sec, c'est pour le moins gênant). J'indique aux utilisateurs qui me soumettent le problème qu'il leur suffit d'aller diminuer d'un ou deux crans l'accélération matérielle depuis le panneau de configuration, ce qui suffit généralement mais n'est pas très pratique.
J'aimerais donc récupérer la valeur de l'accélération courante au lancement du programme, la mettre ensuite sur "aucune" et enfin la remettre à sa valeur d'origine en quittant le programme. Je suppose qu'une API le gère puisque cela fonctionne très bien depuis le panneau de configuration.
Je n'ai rien trouvé après plusieurs recherches sur ce sujet traité dans différents forums (ou on conseille simplement de passer par le panneau de configuration). Si vous avez une idée...
orellabac
Messages postés4Date d'inscriptionmardi 2 septembre 2008StatutMembreDernière intervention 4 septembre 2008 4 sept. 2008 à 00:45
Je teste avec le suivante code:
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, cbName As Long, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias _
"RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, _
ByVal cbData As Long) As Long
Public Enum DirectSoundAccel
Emulation
Basic
Standard
Full
End Enum
Function ObtenirDirectSound(ByVal hKey As Long)
Dim handle As Long
Dim length As Long
Dim index As Long
Dim subKeyNameBuffer As String
Dim res As Long
' result collection
Dim iPCISubEntries As Integer
ObtenirDirectSound = 0
iPCISubEntries = 0
Do
' this is the max length for a key name
length = 260
subKeyNameBuffer = Space$(length)
res = RegEnumKey(hKey, iPCISubEntries, subKeyNameBuffer, length)
If res = 0 Then
'PCI \ SubEntrie
res = RegOpenKeyEx(hKey, subKeyNameBuffer, iPCISubEntries, KEY_READ_WRITE, hPCISubEntrie)
If res <> 0 Then
' Errour c'est le fin
Exit Function
Else
'PCI \ SubEntrie \ SubSubEntrie \ DirectSound
subKeyNameBuffer = Space$(length)
res = RegEnumKey(hPCISubEntrie, 0, subKeyNameBuffer, length)
If res = 0 Then
Dim hPCISubSubEntrie
res = RegOpenKeyEx(hPCISubEntrie, subKeyNameBuffer, 0, KEY_READ_WRITE, hPCISubSubEntrie)
If res = 0 Then
Dim hDirectSound
res = RegOpenKeyEx(hPCISubSubEntrie, "DirectSound", 0, KEY_READ_WRITE, hDirectSound)
If res = 0 Then
RegCloseKey (hPCISubSubEntrie)
RegCloseKey (hPCISubEntrie)
ObtenirDirectSound = hDirectSound
Exit Function
End If
End If
RegCloseKey (hPCISubSubEntrie)
End If
RegCloseKey (hPCISubEntrie)
End If
Else
Exit Function
End If
' preparer le suivant
iPCISubEntries = iPCISubEntries + 1
Loop
' Close the key, if it was actually opened
If handle Then RegCloseKey handle
End Function
Sub ChangerLeAccelerationMaterielle(neuAcceleration As Integer)
Dim hPCIKey As Long
Dim res As Long
Dim value As Long
res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\ControlSet001\Hardware Profiles\Current\System\CurrentControlSet\Enum\PCI", 0, KEY_READ_WRITE, hPCIKey)
If res <> 0 Then
GoTo Error
End If
'Reviser tout les entrees
Dim hDirectSound
hDirectSound = ObtenirDirectSound(hPCIKey)
If hDirectSound Then
Dim hDevicePresence
Dim hMixerDefaults
orellabac
Messages postés4Date d'inscriptionmardi 2 septembre 2008StatutMembreDernière intervention 4 septembre 2008 2 sept. 2008 à 01:19
tu pourrais essayer
Private Declare Function EnumDisplaySettings Lib "user32" _
Alias "EnumDisplaySettingsA" _
(ByVal lpszDeviceName As Long, _
ByVal iModeNum As Long, _
lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" _
Alias "ChangeDisplaySettingsA" _
(lpDevMode As Any, _
ByVal dwflags As Long) As Long
Private Type DEVMODE
dmDeviceName As String * CCDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Public Sub ChangeRes(iWidth As Single, iHeight As Single)
Dim blnWorked As Boolean
Dim i As Long
Dim DevM As DEVMODE
i = 0
Do
blnWorked = EnumDisplaySettings(0&, i, DevM)
i = i + 1
Loop Until (blnWorked = False)
With DevM
.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
.dmPelsWidth = iWidth
.dmPelsHeight = iHeight
End With
Call ChangeDisplaySettings(DevM, 0)
End Sub
tu peux changer "refresh rate" avec cettes functions
je regarderai avec les API (sans promesse)
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Vous n’avez pas trouvé la réponse que vous recherchez ?
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 2 sept. 2008 à 10:39
Salut,
En même temps, si ces sons sont correctement lus pas un lecteur audio (Winamp, WMP...) même sur des PC équipés de cartes son d'entrée de gamme, cela veut dire que ce problème est lié à autre chose. Je doute que Winamp ou WMP réduisent l'accélération matériel de la carte son lors de leur lancement...
Enum DirectSoundAccelerationLevels
ProgramError
EmulationOnly
Basic
Standard
Full
End Enum
Function ObtenirAccelerationMaterielle() As DirectSoundAccelerationLevels
'Cette Example est sur pour PCI
Using registrySYSTEM As RegistryKey = My.Computer.Registry.LocalMachine.OpenSubKey("SYSTEM")
Using registryControlSet001 As RegistryKey = registrySYSTEM.OpenSubKey("ControlSet001")
Using registryHardwareProfiles As RegistryKey = registryControlSet001.OpenSubKey("Hardware Profiles")
Using registry0001 As RegistryKey = registryHardwareProfiles.OpenSubKey("Current")
Using registrySystem2 As RegistryKey = registry0001.OpenSubKey("System")
Using registryCurrentControlSet As RegistryKey = registrySystem2.OpenSubKey("CurrentControlSet")
Using registryEnum As RegistryKey = registryCurrentControlSet.OpenSubKey("Enum")
Using registryPCI As RegistryKey = registryEnum.OpenSubKey("PCI")
Using directSound As RegistryKey = RegistryEntryAvecDirectSound(registryPCI)
Dim devicePresence As RegistryKey = directSound.OpenSubKey("Device Presence", True)
Dim mixerDefault As RegistryKey = directSound.OpenSubKey("Mixer Defaults", True)
If devicePresence.GetValue("VxD") = 0 Then
Return DirectSoundAccelerationLevels.EmulationOnly
Else If devicePresence.GetValue("VxD") 1 AndAlso devicePresence.GetValue("VxD") 1 AndAlso mixerDefault.GetValue("Acceleration") = &HF Then
Return DirectSoundAccelerationLevels.Basic
End If
Select Case mixerDefault.GetValue("Acceleration")
Case &H0
Return DirectSoundAccelerationLevels.Full
Case &H8
Return DirectSoundAccelerationLevels.Standard
Case &HF
Return DirectSoundAccelerationLevels.EmulationOnly
End Select
Return DirectSoundAccelerationLevels.ProgramError
End If
End Using
End Using
End Using
End Using
End Using
End Using
End Using
End Using
End Using
End Function
Sub ChangezAccelerationMaterielle(ByVal newState As DirectSoundAccelerationLevels)
'Cette Example est sur pour PCI
Using registrySYSTEM As RegistryKey = My.Computer.Registry.LocalMachine.OpenSubKey("SYSTEM")
Using registryControlSet001 As RegistryKey = registrySYSTEM.OpenSubKey("ControlSet001")
Using registryHardwareProfiles As RegistryKey = registryControlSet001.OpenSubKey("Hardware Profiles")
Using registry0001 As RegistryKey = registryHardwareProfiles.OpenSubKey("Current")
Using registrySystem2 As RegistryKey = registry0001.OpenSubKey("System")
Using registryCurrentControlSet As RegistryKey = registrySystem2.OpenSubKey("CurrentControlSet")
Using registryEnum As RegistryKey = registryCurrentControlSet.OpenSubKey("Enum")
Using registryPCI As RegistryKey = registryEnum.OpenSubKey("PCI")
Using directSound As RegistryKey = RegistryEntryAvecDirectSound(registryPCI)
Dim devicePresence As RegistryKey = directSound.OpenSubKey("Device Presence", True)
Dim mixerDefault As RegistryKey = directSound.OpenSubKey("Mixer Defaults", True)
Select Case newState
Case DirectSoundAccelerationLevels.EmulationOnly
mixerDefault.SetValue("Acceleration", &HF)
devicePresence.SetValue("VxD", 0)
devicePresence.SetValue("WDM", 0)
Case DirectSoundAccelerationLevels.Basic
mixerDefault.SetValue("Acceleration", &HF)
devicePresence.SetValue("VxD", 1)
devicePresence.SetValue("WDM", 1)
Case DirectSoundAccelerationLevels.Standard
mixerDefault.SetValue("Acceleration", &H8)
devicePresence.SetValue("VxD", 1)
devicePresence.SetValue("WDM", 1)
Case DirectSoundAccelerationLevels.Full
mixerDefault.SetValue("Acceleration", 0)
devicePresence.SetValue("VxD", 1)
devicePresence.SetValue("WDM", 1)
End Select
End Using
End Using
End Using
End Using
End Using
End Using
End Using
End Using
End Using
End Sub
Sub main()
ChangezAccelerationMaterielle(DirectSoundAccelerationLevels.EmulationOnly)
MsgBox("Check")
ChangezAccelerationMaterielle(DirectSoundAccelerationLevels.Basic)
MsgBox("Check")
ChangezAccelerationMaterielle(DirectSoundAccelerationLevels.Standard)
MsgBox("Check")
ChangezAccelerationMaterielle(DirectSoundAccelerationLevels.Full)
End Sub
Function RegistryEntryAvecDirectSound(ByVal root As RegistryKey) As RegistryKey
'Les PCI Keys sont comme
' + - VEN_14E4&DEV_1677&SUBSYS_01AD1028&REV_01
' + ---- 3&172e68dd&0&F2
For Each keyName As String In root.GetSubKeyNames()
Using SubKey As RegistryKey = root.OpenSubKey(keyName)
If SubKey.SubKeyCount > 0 Then
Using subSubKey As RegistryKey = SubKey.OpenSubKey(SubKey.GetSubKeyNames()(0))
If Array.IndexOf(subSubKey.GetSubKeyNames(), "DirectSound") <> -1 Then
'trouve
Return subSubKey.OpenSubKey("DirectSound")
JMC70
Messages postés77Date d'inscriptionsamedi 9 novembre 2002StatutMembreDernière intervention 6 juillet 2014 3 sept. 2008 à 18:50
Merci à Orellabac (et à tous les intervenants). Je vais essayer de traduire cela en VB6 (si j'y arrive, je mettrai le code à disposition). Je sais maintenant où intervenir dans la base de registres et j'exclus donc le recours aux API.
Je regarde cela dès que j'ai un peu de temps (je ne valide pas la réponse pour l'instant).
seulement je n'ai réussi à trouver PCI\VEN_1039&DEV_7018&SUBSYS_70181039&REV_02\3&61AAA01&0&0C QUE par WMI, (WIN32_SoundDevice), ce qui est alors trop long d'accès
si quelqu'un a une piste j'adapterai....
(à noter que çà correspond dans ton code orellabac à RegistryEntryAvecDirectSound(registryPCI))
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
JMC70
Messages postés77Date d'inscriptionsamedi 9 novembre 2002StatutMembreDernière intervention 6 juillet 2014 4 sept. 2008 à 07:59
Nickel ! Je n'ai même pas eu besoin de faire la conversion en VB6. Il manquait simplement :
dim hPCISubEntrie
dans ObtenirDirectSound()
Je vais tester avec plusieurs versions de windows.
Merci !