Problème d'accès à Winmm.dll

PhB91 Messages postés 11 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 9 décembre 2023 - Modifié le 11 déc. 2023 à 21:03
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 13 janv. 2024 à 09:09

Bonjour,


Je reviens sur un sujet qui est largement traité (parfois maltraité) dans les forums car je n'arrive pas à  échanger avec cette DLL un peu compliquée.

J'ai des exemples en VB6 qui semblent tourner mais je travaille en VB.NET.

Il y a quelques exemples, plus rares, en VB.NET dont je m'inspire mais cela ne fonctionne pas non plus.

J'explique :

Sur les fonctions de base (qui n'échangent pas de données avec la DLL) cela fonctionne, par exemple, mixerGetNumDevs, waveOutGetNumDevs, waveInGetNumDevs, etc.

qui  me retournent les valeurs qui correspondent à  ma config y compris si j'ajoute un WaveOut en raccordant un écran en HDMI.

Cela se gâte lorsque j'ai des données à échanger, on peut difficilement faire plus simple :

    Public Declare Function waveOutGetVolume Lib "winmm.dll" (ByVal hWaveOut As Integer, ByVal pdwVolume As Integer) As Integer

    Public Handler As Integer 'pointeur du handler
    Public Volume As Integer
    Public DEVICEID As Integer = 0 'provisoire, je sais que ce sont mes HP

'ceci fonctionne et retourne rc=0
'rc = mixerOpen(Handler, DEVICEID, 0, 0, 0) 'permet de récupérer l'adresse du handler

'ceci ne fonctionne pas et retourne rc = 11 erreur paramètre
    rc = waveOutGetVolume(DEVICEID, volume)

J'avais commencé par d'autre fonctions plus compliquées comme  mixerGetLineInfo mais j'ai toujours une erreur 11, aussi je pense que j'ai un problème de partage des données avec la DLL ???

J'ai initialement loger le code dans un module puis transféré dans une class sans que cela n'apporte de différence.

De même VB2008 ou VB2022, même résultat.

Qu'en pensez vous ?

Merci de votre aide, ça fait maintenant une bonne semaine que je piétine !

4 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
18 déc. 2023 à 07:21

Bonjour

VB.Net c'est du C# déguisé en VB.

Du coup, parfois, il faut chercher sa réponse en C#.

Je suis tombé notamment sur ce tuto

https://www.geekpedia.com/get-and-set-the-wave-sound-volume/

Il stipule qu'il faut importer System.Runtime.InteropService mais aussi que les paramètres des fonction sont de types Intptr et uint soit IntPtr et UInteger en VB.

Mais enfin que le second paramètre est un paramètre "out", en principe VB.net gère ça tout seul quand il s'agit de code .net, mais il semble conseillé de "forcer" ce out quand on importe du code natif.

En copiant collant le code exemple dans un traducteur en ligne, cela donne

Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports System.Runtime.InteropServices

Namespace VolumeControl
    Public Partial Class Form1
        Inherits Form

        <DllImport("winmm.dll")>
        Public Shared Function waveOutGetVolume(ByVal hwo As IntPtr, <Out> ByRef dwVolume As UInteger) As Integer
        <DllImport("winmm.dll")>
        Public Shared Function waveOutSetVolume(ByVal hwo As IntPtr, ByVal dwVolume As UInteger) As Integer

        Public Sub New()
            InitializeComponent()
            Dim CurrVol As UInteger = 0
            waveOutGetVolume(IntPtr.Zero, CurrVol)
            Dim CalcVol As UShort = CUShort((CurrVol And &H0000fffF))
            trackWave.Value = CalcVol / (UShort.MaxValue / 10)
        End Sub

 '.....la traduction du reste n'a pas bien marché 
    End Class
End Namespace

J'ai pas testé 


0

Merci Whismeril.

Je n'avais pas précisé que effectivement j'importais 

System.Runtime.InteropServices

En fait la doc Microsoft précise que l'on peut directement appeler la fonction avec de deviceID qui est 0 dans le cas du WaveOut des HPs, (j'ai vérifié cet ID grâce à waveOutGetNumDevs). Ce que je faisais.

Jai essayé avec inrprt qui n'est autre qu'un pointeur au début du handler du WaveOut, même erreur !

Je patine ...

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
Modifié le 18 déc. 2023 à 19:14

Et le out Byref?

0

Désolé, pareil ...

0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
13 janv. 2024 à 09:09

Bonjour

Le reste du code dont Whismeril dit que cela n'a pas bien marché devrait ressembler à ceci si cela peut aider .

Private Sub TrackWave_Scroll(sender As Object, e As EventArgs) Handles TrackWave.Scroll

    ' Calculate the volume that's being set
    Dim NewVolume As Integer = (UShort.MaxValue \ 10) * TrackWave.Value
    ' Set the same volume for both the left And the right channels
    Dim NewVolumeAllChannels As UInteger = CUInt((Convert.ToUInt32(NewVolume) And &HFFFF) Or (Convert.ToUInt32(NewVolume) << 16))
    ' Set the volume
    WaveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels)

End Sub

0
Rejoignez-nous