none
Projet MSDN - Vu metre audio en VS 2010 RRS feed

  • Discussion générale

  • Bonjour,

    Je souhaite creer un petit vu metre audio d'enregitrement dans une aplication.

    J'ai trouvé ceci sur Msdn:  (de Alex Petrescu)

    Le .NET Framework ne comprend pas un tel contrôle. Une approche très simple est de créer un tableau de contrôles de type Image. Ces contrôles, affichés comme des petites carrés en ligne, on chacun une couleur principale (à partir de vert jusqu’à rouge, disons) pour symboliser l’intensité. Un contrôle peut avoir deux états (active et inactif). Pour actif, son background prends la couleur principale que vous lui avez assigne. Pour inactif, il prend le couleur gris. Vous définissez une variable pour l’intensité. Vous définissez des intervalles pour cette variable pour lesquelles des différents carrés deviennent actives. Par exemple, pour v>0 et v<10, le premier carré est actif et les autres inactifs. Pour v>10 et v<20, le deuxième carré devient actif aussi, etc.

     Ok pour la procedure; je devrais pouvoir le faire; mais je ne trouve pas la methode pour aller récuperer le niveau sonore sur l'entré son (ligne ou micro). Autrement dit pour pouvoir appliquer la méthode cité ci-dessus, il faut récupérer une valeur "v" (qui représente le niveau sonore d'entrée) et ensuite la passer à la moulinette pour en faire une représentation graphique ou visuel.

    J'ai cherché un peu partout, Il en existe en VB 6 en . net, mais je ne trouve pas en VS 2010 (ni en VS 2008).

    Si vous avez une solution, merci d'avance

    Bonne journée à tous

    Jakez

    jeudi 16 décembre 2010 12:31

Toutes les réponses

  • Bonjour,

    Moi aussi je cherche à créer un vu-metre

    Peut-etre on peut créer un projet sur http://www.codeplex.com/ si cela t'intéresse?

     


    fred
    vendredi 17 décembre 2010 11:10
  • Bonjour à tous et a Fred75 en particulier

    Oui je veux bien essayer et je suis partant pour un petit projet commun sur le site que tu reference ci-dessus.

    Mais par contre, je ne le connais pas (le site) et donc je vais devoir me familiariser avec ses fonctions; peut-être que j'aurrais besoin d'être un peu guider.

    Par contre j'ai trouvé ça pour un début de boulot que j'ai essayé d'adapter en VS 2010 mais j'ai encore plein d'erreurs à traiter

    http://allapi.mentalis.org/apilist/F5ECE5DE6EAF09AD7B4DF966CA519A4D.html

    Si quelqun à des conseils je suis preneur

    A+

    Jakez

    vendredi 17 décembre 2010 12:17
  • Bonjour,

    J'ai essayé de déboguer de code d'Allapi mais j'ai des erreurs à l'execution (pinvoke)

    voici le project en vb10

    http://ot13.free.fr/code/vb/vu_metre/ vb_vumetre2.zip

    sinon j'ai aussi trouvé cet exemple en C++

    http://www.codeproject.com/KB/cpp/LED_vu_Meter_User_Control.aspx

    Dis moi si tu arrives à le faire fonctionner.

     


    fred
    vendredi 17 décembre 2010 17:34
  • Bonsoir à tous et a fred75

    Merci pour tes deux sugestion que je garde precieusement.

    Le premier chez moi fonctionne et sera interessant pour la partie graphique, mais il ne recupere pas les donnéees input du son

    Pour ce qui est du code en C++ il me semble l'avoir déjà vu et je crois qu'il ne gere que la partie graphique mais pas la partie récupération des valeur d'entrée. Mais a étudier pour plus tard.

    J'ai bossé un peu sur le code d'Allapi.

     Apres avoir modifier les labels en labelbox etc... j'ai réussi à supprimer la premiere erreur Pinvoke en modifiant la definition de mixeropen:

    L'ancien:

    'Declare Function mixerOpen Lib "winmm.dll" (ByVal phmx As Long, ByVal uMxId As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal fdwOpen As Long) As Long

    Le nouveau:

     

     

    Declare Function mixerOpen Lib "winmm.dll" (ByRef phmx As IntPtr, ByVal pMxId As UInteger, ByVal dwCallback As IntPtr, ByVal dwInstance As IntPtr, ByVal fdwOpen As UInteger) As Integer

     

     

     

    J'ai pas avancer beaucoup mais bon c'est déjà ça

    A+

    Jakez

     

     pourquoi c'est écrit tout petit ??

     

    vendredi 17 décembre 2010 21:56
  • Bonjour,

    bravo pour la fonction.

    C'est écrit en petit car tu as du faire un copier/coller

    Utilise plutot l'icone </> pour insérer du code.

     


    fred
    samedi 18 décembre 2010 17:12
  • Bonsoir,

    J'ai réussi à ne plus stopper sur la deuxieme erreur Pinvoke dans l'appel de la mixergetlineinfo:

    L' ancien code:
     Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Long, ByVal pmxl As MIXERLINE, ByVal fdwInfo As Long) As Long
    
    Le nouveau:
    Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Integer, ByRef pmxl As MIXERLINE, ByVal fdwInfo As Integer) As Integer
    
      

    Mais j'obtiens le message d'erreur suivant quelques cycles suivant:

    Couldn't get wavein meter

    J'ai avancé un peu mais est-ce dans la bonne direction ????? !!!!! ?????

    Bonne soirée

    Jakez

     

    samedi 18 décembre 2010 17:50
  • Bonjour Fred,

    J'ai fait un vu-mètre, mais bon, je nage "un peu beaucoup" dans les méthode graphiques du vbNet, alors faut sans doute l'améliorer (moi je ne sais pas), il est tout en code et il fonctionne, voici :

    Option Explicit On
    Public Class Form
     Dim debut As Boolean
    
     Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      Me.Width = 600
      Me.Height = 500
      Me.Left = 25
      Me.Top = 25
      debut = True
     End Sub
    
     Sub Form_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
      Dim r As Long
      Dim ox As Long
      Dim oy As Long
      Dim angleRadian As Double
      Dim i As Long
      Dim sinus As Double
      Dim cosinus As Double
      Dim x As Long
      Dim y As Long
      Dim demiCercle As System.Drawing.Graphics
      Dim xy As PointF() = New PointF(180) {}
      Dim noir As New Pen(Color.FromArgb(0, 0, 0), 2)
      Dim rouge As New Pen(Color.FromArgb(255, 0, 0), 5)
      Dim couleurForm As New Pen(Color.FromArgb(255, 255, 255), 5)
      Dim x2 As Integer
      Dim y2 As Integer
      'demi cercle
      demiCercle = Me.CreateGraphics()
      ox = 250
      oy = 250
      Dim pc As New Point(ox, oy)
      r = 200
      For i = 0 To 180
       angleRadian = i * 3.14 / 180
       cosinus = Math.Cos(angleRadian)
       x = r * cosinus + ox
       xy(i).X = x
       sinus = Math.Sin(angleRadian)
       y = oy - r * sinus
       xy(i).Y = y
      Next i
      demiCercle.DrawLines(noir, xy)
      demiCercle.Dispose()
      ' ligne
      Dim p0 As New Point(ox - r, oy)
      Dim p180 As New Point(ox + r, oy)
      e.Graphics.DrawLine(noir, p180, p0)
    bis: ' aiguille
      If debut = False Then e.Graphics.DrawLine(couleurForm, ox, oy, x2, y2)
      debut = False
      Dim hasard As Long
      Randomize()
      hasard = Int((170 - 10 + 1) * Rnd() + 10)
      angleRadian = hasard * 3.14 / 180
      cosinus = Math.Cos(angleRadian)
      x = (r - 10) * cosinus + ox
      sinus = Math.Sin(angleRadian)
      y = oy - (r - 10) * sinus
      Dim ph As New Point(x, y)
      x2 = x
      y2 = y
      On Error Resume Next ' ?
      e.Graphics.DrawLine(rouge, pc, ph)
      System.Threading.Thread.Sleep(500)
      My.Application.DoEvents()
      GoTo bis
     End Sub
    
     Sub Form_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      End
     End Sub
    End Class
    

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    dimanche 19 décembre 2010 18:01
  • Bonsoir à tous et merci Hejoe pour ta contribution.

    J'ai continué à travailler sur le code Allapi (voir lien au-dessus).

    J' en ai déduit le cycle suivant: (sans tenir compte du code du timer qui repasse tous les 50/1000 de secondes:

    1. On ouvre le mixer
    2. On va chercher les infos sur l' Input volume meter Wave IN
    3. On va chercher les infos sur l' Input volume meter Micro
    4. On va chercher les infos sur l'output volume meter Line

    J'arrive à ouvrir le Mixer (pas d'erreur) mais pour les étapes 2, j'ai l'erreur 

    Couldn't get wavein meter

    et à l'étape 3 l'erreur:

    Couldn't get waveout meter

     j'ai rajouté une ligne de code pour connaitre l'erreur détectée: erreur n°11 (variable rc dans le code) traduit comme:

     "Un paramètre non valide a été passé à une fonction système. " 

    sinon je n'ai plus d'arret ' PINVOKE' avec les modif que j'ai fait dans le modules dont je copie le code ci-après.

    Imports System.Runtime.InteropServices
    
    Module Module1
      'Paste this code into the module
      Public Const CALLBACK_FUNCTION = &H30000
      Public Const MM_WIM_DATA = &H3C0
      Public Const WHDR_DONE = &H1     ' done bit
      Public Const GMEM_FIXED = &H0     ' Global Memory Flag used by GlobalAlloc functin
    
      Public code As String         ' returne l'erreur dans la form1 pour l'afficher avec les msgbox 
      Structure WAVEHDR
        Dim lpData As Long
        Dim dwBufferLength As Long
        Dim dwBytesRecorded As Long
        Dim dwUser As Long
        Dim dwFlags As Long
        Dim dwLoops As Long
        Dim lpNext As Long
        Dim Reserved As Long
      End Structure
      Structure WAVEINCAPS
        Dim wMid As Integer
        Dim wPid As Integer
        Dim vDriverVersion As Long
    
        ' old Dim szPname As String '   * 32
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> Dim szPname As String
        Dim dwFormats As Long
        Dim wChannels As Integer
      End Structure
      Structure WAVEFORMAT
        Dim wFormatTag As Integer
        Dim nChannels As Integer
        Dim nSamplesPerSec As Long
        Dim nAvgBytesPerSec As Long
        Dim nBlockAlign As Integer
        Dim wBitsPerSample As Integer
        Dim cbSize As Integer
      End Structure
    
      ' oldDeclare Function waveInOpen Lib "winmm.dll" (ByVal lphWaveIn As Long, ByVal uDeviceID As Long, ByVal lpFormat As WAVEFORMAT, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
      ' 1er essai Declare Function WaveInOpen Lib "winmm.dll" (ByRef waveInHandle As IntPtr, ByVal deviceId As Integer, ByVal waveFormat As WAVEFORMAT, ByVal callback As NativeMethods, ByVal WaveInCallback, ByVal instance As Integer, ByVal flags As Integer) As MmResult
      Declare Function waveInOpen Lib "winmm.dll" (ByVal lphWaveIn As Int32, ByVal uDeviceID As Int32, ByRef lpFormat As WAVEFORMAT, ByVal dwCallback As Int32, ByVal dwInstance As Int32, ByVal dwFlags As Int32) As Int32
    
      Declare Function waveInPrepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, ByVal lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
    
      ' old Declare Function waveInReset Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
      ' 1 er essai Declare Function waveInReset Lib "winmm.dll" Alias "waveInReset" (ByVal hWaveIn As Long) As Long
      Declare Function waveInReset Lib "winmm.dll" Alias "waveInReset" (ByVal hWaveIn As Int32) As Int32
    
      Declare Function waveInStart Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
    
      ' oldDeclare Function waveInStop Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
      Declare Function waveInStop Lib "winmm.dll" (ByVal hWaveIn As Int32) As Int32
    
      ' old Declare Function waveInUnprepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, ByVal lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
      '1er essai Declare Function waveInUnprepareHeader Lib "winmm.dll" (ByVal hWaveIn As Int32, ByVal lpWaveInHdr As WAVEHDR, ByVal uSize As Int32) As Int32
      ' 2 em essai Public Declare Function waveInUnprepareHeader Lib "winmm" (ByVal InputDeviceHandle As Long, ByVal WaveHdrPointer As Long, ByVal WaveHdrStructSize As Long) As Long
      Declare Function waveInUnprepareHeader Lib "winmm.dll" Alias "waveInUnprepareHeader" (ByVal hWaveIn As IntPtr, ByRef lpWaveInHdr As WAVEHDR, ByVal uSize As Int32) As Int32
    
      ' old Declare Function waveInClose Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
      Declare Function waveInClose Lib "winmm.dll" (ByVal hWaveIn As IntPtr) As IntPtr
    
      Declare Function waveInGetDevCaps Lib "winmm.dll" Alias "waveInGetDevCapsA" (ByVal uDeviceID As Long, ByVal lpCaps As WAVEINCAPS, ByVal uSize As Long) As Long
      Declare Function waveInGetNumDevs Lib "winmm.dll" () As Long
    
      ' old Declare Function waveInGetErrorText Lib "winmm.dll" Alias "waveInGetErrorTextA" (ByVal err As Long, ByVal lpText As String, ByVal uSize As Long) As Long
      ' 1 er essai Declare Function WaveInGetErrorText Lib "winmm.dll" (ByVal status As MmResult, ByVal text As StringBuilder, ByVal size As UInteger) As MmResult
      Declare Function waveInGetErrorText Lib "winmm.dll" Alias "waveInGetErrorTextA" (ByVal err As Int32, ByVal lpText As String, ByVal uSize As Int32) As Int32
    
    
    
      Declare Function waveInAddBuffer Lib "winmm.dll" (ByVal hWaveIn As Long, ByVal lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
    
      Public Const MMSYSERR_NOERROR = 0
      Public Const MAXPNAMELEN = 32
    
      Public Const MIXER_LONG_NAME_CHARS = 64
      Public Const MIXER_SHORT_NAME_CHARS = 16
      Public Const MIXER_GETLINEINFOF_COMPONENTTYPE = &H3&
      Public Const MIXER_GETCONTROLDETAILSF_VALUE = &H0&
      Public Const MIXER_GETLINECONTROLSF_ONEBYTYPE = &H2&
    
      Public Const MIXERLINE_COMPONENTTYPE_DST_FIRST = &H0&
      Public Const MIXERLINE_COMPONENTTYPE_SRC_FIRST = &H1000&
      Public Const MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4)
      Public Const MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3)
      Public Const MIXERLINE_COMPONENTTYPE_SRC_LINE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2)
    
      Public Const MIXERCONTROL_CT_CLASS_FADER = &H50000000
      Public Const MIXERCONTROL_CT_UNITS_UNSIGNED = &H30000
      Public Const MIXERCONTROL_CT_UNITS_SIGNED = &H20000
      Public Const MIXERCONTROL_CT_CLASS_METER = &H10000000
      Public Const MIXERCONTROL_CT_SC_METER_POLLED = &H0&
      Public Const MIXERCONTROL_CONTROLTYPE_FADER = (MIXERCONTROL_CT_CLASS_FADER Or MIXERCONTROL_CT_UNITS_UNSIGNED)
      Public Const MIXERCONTROL_CONTROLTYPE_VOLUME = (MIXERCONTROL_CONTROLTYPE_FADER + 1)
      Public Const MIXERLINE_COMPONENTTYPE_DST_WAVEIN = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 7)
      Public Const MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8)
      Public Const MIXERCONTROL_CONTROLTYPE_SIGNEDMETER = (MIXERCONTROL_CT_CLASS_METER Or MIXERCONTROL_CT_SC_METER_POLLED Or MIXERCONTROL_CT_UNITS_SIGNED)
      Public Const MIXERCONTROL_CONTROLTYPE_PEAKMETER = (MIXERCONTROL_CONTROLTYPE_SIGNEDMETER + 1)
    
      Declare Function mixerClose Lib "winmm.dll" (ByVal hmx As Long) As Long
    
      ' old Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsA" (ByVal hmxobj As Long, ByVal pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long
      Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsA" (ByVal hmxobj As IntPtr, ByRef pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As IntPtr) As IntPtr
    
      Declare Function mixerGetDevCaps Lib "winmm.dll" Alias "mixerGetDevCapsA" (ByVal uMxId As Long, ByVal pmxcaps As MIXERCAPS, ByVal cbmxcaps As Long) As Long
      Declare Function mixerGetID Lib "winmm.dll" (ByVal hmxobj As Long, ByVal pumxID As Long, ByVal fdwId As Long) As Long
    
      ' old Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Long, ByVal pmxl As MIXERLINE, ByVal fdwInfo As Long) As Long
      Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Integer, ByRef pmxl As MIXERLINE, ByVal fdwInfo As Integer) As Integer
    
      Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsA" (ByVal hmxobj As Long, ByVal pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Long) As Long
      '1 er essai Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsA" (ByVal hmxobj As Int32, ByVal pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Int32) As Int32
    
      Declare Function mixerGetNumDevs Lib "winmm.dll" () As Long
      Declare Function mixerMessage Lib "winmm.dll" (ByVal hmx As Long, ByVal uMsg As Long, ByVal dwParam1 As Long, ByVal dwParam2 As Long) As Long
    
      ' old Declare Function mixerOpen Lib "winmm.dll" (ByVal phmx As Long, ByVal uMxId As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal fdwOpen As Long) As Long
      Declare Function mixerOpen Lib "winmm.dll" (ByRef phmx As IntPtr, ByVal uMxId As UInteger, ByVal dwCallback As IntPtr, ByVal dwInstance As IntPtr, ByVal fdwOpen As UInteger) As Integer
    
      Declare Function mixerSetControlDetails Lib "winmm.dll" (ByVal hmxobj As Long, ByVal pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long
    
      ' old Declare Sub CopyStructFromPtr Lib "kernel32" Alias "RtlMoveMemory" (ByVal struct As Object, ByVal ptr As Long, ByVal cb As Long)
      ' 1 er essaiDeclare Sub CopyStructFromPtr Lib "kernel32" Alias "RtlMoveMemory" (ByVal struct As Object, ByVal ptr As IntPtr, ByVal cb As IntPtr)
      Declare Sub CopyStructFromPtr Lib "kernel32" Alias "RtlMoveMemory" (ByVal struct As Object, ByVal ptr As Object, ByVal cb As Long)
      Declare Sub CopyPtrFromStruct Lib "kernel32" Alias "RtlMoveMemory" (ByVal ptr As Long, ByVal struct As Object, ByVal cb As Long)
    
      ' oldDeclare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
      Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Integer, ByVal dwBytes As Integer) As IntPtr
    
      ' old Declare Function GlobalLock Lib "kernel32" (ByVal hmem As Long) As Long
      Declare Function GlobalLock Lib "kernel32" (ByVal handle As IntPtr) As IntPtr
    
      ' old Declare Function GlobalFree Lib "kernel32" (ByVal hmem As Long) As Long
      Declare Function GlobalFree Lib "kernel32" (ByVal handle As IntPtr) As IntPtr
    
    
    
      Structure MIXERCAPS
        Dim wMid As Integer
        Dim wPid As Integer
        Dim vDriverVersion As Long
    
        ' old Dim szPname As String '  * MAXPNAMELEN
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)> Dim szPname As String
        Dim fdwSupport As Long
        Dim cDestinations As Long
      End Structure
      Structure MIXERCONTROL
        Dim cbStruct As Long
        Dim dwControlID As Long
        Dim dwControlType As Long
        Dim fdwControl As Long
        Dim cMultipleItems As Long
    
        ' old Dim szShortName As String '   MIXER_SHORT_NAME_CHARS
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_SHORT_NAME_CHARS)> Dim szShortName As String
    
        ' old Dim szName As String '   * MIXER_LONG_NAME_CHARS
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_LONG_NAME_CHARS)> Dim sxName As String
        Dim lMinimum As Long
        Dim lMaximum As Long
        Dim Reserved() As Long
      End Structure
      Structure MIXERCONTROLDETAILS
        Dim cbStruct As Long
        Dim dwControlID As Long
        Dim cChannels As Long
        Dim item As Long
        Dim cbDetails As Long
        Dim paDetails As Long
      End Structure
      Structure MIXERCONTROLDETAILS_SIGNED
        Dim lValue As Long
      End Structure
      Structure MIXERLINE
        Dim cbStruct As Long
        Dim dwDestination As Long
        Dim dwSource As Long
        Dim dwLineID As Long
        Dim fdwLine As Long
        Dim dwUser As Long
        Dim dwComponentType As Long
        Dim cChannels As Long
        Dim cConnections As Long
        Dim cControls As Long
    
        ' old Dim szShortName As String ' * MIXER_SHORT_NAME_CHARS
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_SHORT_NAME_CHARS)> Dim szShortName As String
    
        ' old Dim szName As String ' * MIXER_LONG_NAME_CHARS
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_LONG_NAME_CHARS)> Dim sxName As String
        Dim dwType As Long
        Dim dwDeviceID As Long
        Dim wMid As Integer
        Dim wPid As Integer
        Dim vDriverVersion As Long
    
        ' old Dim szPname As String ' * MAXPNAMELEN
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)> Dim szPname As String
      End Structure
      Structure MIXERLINECONTROLS
        Dim cbStruct As Long
        Dim dwLineID As Long
        Dim dwControl As Long
        Dim cControls As Long
        Dim cbmxctrl As Long
        Dim pamxctrl As Long
      End Structure
    
      Public i As Integer, j As Integer, rc As Long, msg As String = Space(200), hWaveIn As Long
      Public Const NUM_BUFFERS = 2
      Public format As WAVEFORMAT, hmem(NUM_BUFFERS) As Long, inHdr(NUM_BUFFERS) As WAVEHDR
      Public Const BUFFER_SIZE = 8192
      Public Const DEVICEID = 0
      Public fRecording As Boolean
      Function GetControl(ByVal hmixer As Long, ByVal componentType As Long, ByVal ctrlType As Long, ByRef mxc As MIXERCONTROL) As Boolean
        ' This function attempts to obtain a mixer control. Returns True if successful.
    
        Dim mxlc As MIXERLINECONTROLS
        Dim mxl As MIXERLINE
        Dim hmem As Long
        Dim rc As Long
    
        mxl.cbStruct = Len(mxl)
        mxl.dwComponentType = componentType
    
        ' Obtain a line corresponding to the component type
        rc = mixerGetLineInfo(hmixer, mxl, MIXER_GETLINEINFOF_COMPONENTTYPE)
        'rc = 0
        If (MMSYSERR_NOERROR = rc) Then
          mxlc.cbStruct = Len(mxlc)
          mxlc.dwLineID = mxl.dwLineID
          mxlc.dwControl = ctrlType
          mxlc.cControls = 1
          mxlc.cbmxctrl = Len(mxc)
    
          ' Allocate a buffer for the control
          'hmem = GlobalAlloc(&H40, Len(mxc))
          hmem = GlobalAlloc(GMEM_FIXED, Len(mxc))
          mxlc.pamxctrl = GlobalLock(hmem)
          mxc.cbStruct = Len(mxc)
    
          ' Get the control
          rc = mixerGetLineControls(hmixer, mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE)
    
          If (MMSYSERR_NOERROR = rc) Then
            GetControl = True
    
            ' Copy the control into the destination structure
            CopyStructFromPtr(mxc, mxlc.pamxctrl, Len(mxc))
          Else
            GetControl = False
          End If
          GlobalFree(hmem)
          Exit Function
        End If
    
        waveInGetErrorText(rc, msg, Len(msg)) : code = msg 'rajouter par jakez04 recupéré dans la form1
        GetControl = False
      End Function
      ' Function to process the wave recording notifications.
      Sub waveInProc(ByVal hwi As Long, ByVal uMsg As Long, ByVal dwInstance As Long, ByRef hdr As WAVEHDR, ByVal dwParam2 As Long)
        If (uMsg = MM_WIM_DATA) Then
          If fRecording Then
            rc = waveInAddBuffer(hwi, hdr, Len(hdr))
          End If
        End If
      End Sub
      ' This function starts recording from the soundcard. The soundcard must be recording in order to
      ' monitor the input level. Without starting the recording from this application, input level
      ' can still be monitored if another application is recording audio
      Function StartInput() As Boolean
    
        If fRecording Then
          StartInput = True
          Exit Function
        End If
    
        format.wFormatTag = 1
        format.nChannels = 1
        format.wBitsPerSample = 8
        format.nSamplesPerSec = 8000
        format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8
        format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign
        format.cbSize = 0
    
        For i = 0 To NUM_BUFFERS - 1
          hmem(i) = GlobalAlloc(&H40, BUFFER_SIZE)
          inHdr(i).lpData = GlobalLock(hmem(i))
          inHdr(i).dwBufferLength = BUFFER_SIZE
          inHdr(i).dwFlags = 0
          inHdr(i).dwLoops = 0
        Next
    
        rc = waveInOpen(hWaveIn, DEVICEID, format, 0, 0, 0)
        If rc <> 0 Then
          waveInGetErrorText(rc, msg, Len(msg))
          MsgBox(msg)
          StartInput = False
          Exit Function
        End If
    
        For i = 0 To NUM_BUFFERS - 1
          rc = waveInPrepareHeader(hWaveIn, inHdr(i), Len(inHdr(i)))
          If (rc <> 0) Then
            waveInGetErrorText(rc, msg, Len(msg))
            MsgBox(msg)
          End If
        Next
    
        For i = 0 To NUM_BUFFERS - 1
          rc = waveInAddBuffer(hWaveIn, inHdr(i), Len(inHdr(i)))
          If (rc <> 0) Then
            waveInGetErrorText(rc, msg, Len(msg))
            MsgBox(msg)
          End If
        Next
    
        fRecording = True
        rc = waveInStart(hWaveIn)
        StartInput = True
      End Function
      ' Stop receiving audio input on the soundcard
      Sub StopInput()
    
        fRecording = False
        waveInReset(hWaveIn)
        waveInStop(hWaveIn)
        For i = 0 To NUM_BUFFERS - 1
          waveInUnprepareHeader(hWaveIn, inHdr(i), Len(inHdr(i)))
          GlobalFree(hmem(i))
        Next
        waveInClose(hWaveIn)
      End Sub
    
    End Module
    
    
    
    Attention il ne s'agit que du code Module1
    Lorsque je met le timer en route, j'ai un arret PINVOKE sur l'instruction suivante:

    CopyStructFromPtr(volume, mxcd.paDetails, Len(volume))

    A l'ocasion si fre75 tu peux essayer le code Allapi avec ce code module et me dire ce que tu en penses
    Excusez-moi pour cette présentation abominable, je comprend pas pourquoi j'ai des encadrements et une police toute petite.
    Je vais aller voir dans la FAQ s'ils disent quelquechoses la dessus.
    Bonne soirée
    Jakez
    dimanche 19 décembre 2010 20:19
  • Bonjour à tous !

     

    Je trouve ce projet très intéressant et j’aimerai vous aider pour augmenter son niveau de visibilité. Si vous êtes d’accord avec la continuation de votre discussion et le partage des résultats dans ce thread, je pourrai le rendre permanent dans ce forum pour le faire plus visible.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    mercredi 22 décembre 2010 12:58
  • Bonjour,

    bonne idée Alex.

    Jakez, je vais essayé

    Merci Joe pour ce code :O)

     


    fred
    mercredi 22 décembre 2010 17:33
  • Bonsoir à tous,

    Oui bonne idée Alex,

    Je n'ai pas avancé beaucoup ces deux derniers jours si ce n'est c'est deux point que j'ai pu remarquer (peut-être Fred cela te sera utile).

    Le Timer est mis à la propriété True en début de programme mais si le booleen fRecording est à zéro (ou false), le Timer n'est pas executé, on quitte aussitto. Mais qu'est qui met le Frecording à 1 (true) ??? Et bien c'est le Checkbox1, du moins la réussitte de la fonction qu'il apelle.

    Il  en est de même des deux progressebars qui doivent être à false des les propriétés de la form1; cela évitera l'erreur PINVOKE sur la fonction

    CopyStructFromPtr

     Les deux progresbars seront misent à automatiquement à enabled si le Timer fonctionne lui-même conditioné par la valeur de fRecording.

    A part ça j'ai toujours l'erreur 11, mais je continue à chercher.

    A si !!  j'ai trouvé un prog en C# ( il y a des similitudes) assez bien commenté qui peut aider à comprendre l' utilité des fonctions apellées et pour savoir à quoi sert tous ces paramettres dans les déclarations.

    http://www.csharpfr.com/codesource.aspx?ID=26228

    Bonne soirée

    Jakez

     

     

    mercredi 22 décembre 2010 21:36
  • Bonjour,

    moi aussi je n'ai pas beaucoup de temps ces temps-ci

    Merci pour l'info

    Je vais regarder la source en C Sharp

     


    fred
    jeudi 23 décembre 2010 13:32
  • Bonsoir à tous

    Après des heures de recherche sur la façon de récupérer la valeur du niveau sonore (en entrée ou en sortie), je n'ai pas avancé beaucoup.

    Mais je commence à mieux comprendre les procedure pour ouvrir le ou les mixers de son et sur la façon de récupérer certaines données. Pour info, j'ai trouvé un bout de code que j'ai simplifié sur la gestion des volumes sonores en entrée et en sortie.

    Fred ( ou d'autres bien-sur) S'il te plait peut tu l'essayer; cela me permettra de savoir si les valeurs coponenttype sont standard ou s'ils changent sur chaque machine.

    Sinon je ne desespere pas et continue mes recherches pour ce fameux vumetttre. A propos je butte toujours sur la fonction CopyStructFromPtr si quelqun connait je suis preneur de conseils ou d'infos.

    Le code concernant un mixer audio sous visual studio 2010:

    Imports System.Runtime.InteropServices
    
    Public Class Form1
    #Region "Comments"
      ' This class is responisble for all interactions for muting and controlling the master volume level
      '
      ' There is no warranty associated with this code - if you use this and it blows up you machine.
      ' Well, that will teach you to write you own code in future, won't it ;-)
      '
      ' Mark Dryden (aka Drydo@vbcity.com)à 95%
      '
      'Jakez04 pour le reste
      ' Créer une form du nom de Form1; y mettre un Trackbar du nom de Trackbar1
      ' puis un label du nom de label1 et un combobox du nom de combobox1
      ' Copier le code dans le code de la form1
    
    #End Region
    
    #Region "Constants"
      Private Const MMSYSERR_NOERROR As Integer = 0
      Private Const MAXPNAMELEN As Integer = 32
      Private Const MIXER_LONG_NAME_CHARS As Integer = 64
      Private Const MIXER_SHORT_NAME_CHARS As Integer = 16
      Private Const MIXERCONTROL_CT_CLASS_FADER As Integer = &H50000000
      Private Const MIXERCONTROL_CT_UNITS_UNSIGNED As Integer = &H30000
      Private Const MIXERCONTROL_CT_UNITS_BOOLEAN As Integer = &H10000
      Private Const MIXERCONTROL_CT_CLASS_SWITCH As Integer = &H20000000
      Private Const MIXERLINE_COMPONENTTYPE_DST_FIRST As Integer = &H0&
      Private Const MIXERLINE_COMPONENTTYPE_DST_SPEAKERS As Integer = 4104   ' old (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4)
      Private Const MIXERCONTROL_CONTROLTYPE_FADER As Integer = (MIXERCONTROL_CT_CLASS_FADER Or MIXERCONTROL_CT_UNITS_UNSIGNED)
      Private Const MIXERCONTROL_CONTROLTYPE_VOLUME As Integer = (MIXERCONTROL_CONTROLTYPE_FADER + 1)
      Private Const MIXER_GETLINEINFOF_COMPONENTTYPE As Integer = &H3&
      Private Const MIXER_GETLINECONTROLSF_ONEBYTYPE As Integer = &H2
      Private Const MIXERCONTROL_CONTROLTYPE_BASS As Integer = (MIXERCONTROL_CONTROLTYPE_FADER + 3)
      Private Const MIXERCONTROL_CONTROLTYPE_TREBLE As Integer = (MIXERCONTROL_CONTROLTYPE_FADER + 3)
      Private Const MIXERCONTROL_CONTROLTYPE_EQUALIZER As Integer = (MIXERCONTROL_CONTROLTYPE_FADER + 4)
      Private Const MIXERCONTROL_CONTROLTYPE_BOOLEAN As Integer = (MIXERCONTROL_CT_CLASS_SWITCH Or MIXERCONTROL_CT_UNITS_BOOLEAN)
      Private Const MIXERCONTROL_CONTROLTYPE_MUTE As Integer = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2)
      Public Const MIXER_GETCONTROLDETAILSF_VALUE = &H0&
    #End Region
    
    #Region "Structs"
    
      <StructLayout(LayoutKind.Sequential)> _
      Private Structure MIXERCONTROL
        <FieldOffset(0)> Public cbStruct As Integer      ' size in Byte of MIXERCONTROL
        <FieldOffset(4)> Public dwControlID As Integer    ' unique control id for mixer device
        <FieldOffset(8)> Public dwControlType As Integer   ' MIXERCONTROL_CONTROLTYPE_xxx
        <FieldOffset(12)> Public fdwControl As Integer     ' MIXERCONTROL_CONTROLF_xxx
        <FieldOffset(16)> Public cMultipleItems As Integer   ' if MIXERCONTROL_CONTROLF_MULTIPLE set
        <FieldOffset(20), MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=MIXER_SHORT_NAME_CHARS)> Public szShortName As String ' * MIXER_SHORT_NAME_CHARS ' short name of control
        <FieldOffset(36), MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=MIXER_LONG_NAME_CHARS)> Public szName As String ' * MIXER_LONG_NAME_CHARS ' Integer name of control
        <FieldOffset(100)> Public lMinimum As Integer      ' Minimum value
        <FieldOffset(104)> Public lMaximum As Integer      ' Maximum value
        <FieldOffset(108), MarshalAs(UnmanagedType.ByValArray, SizeConst:=11, ArraySubType:=UnmanagedType.AsAny)> Public reserved() As Integer   ' reserved structure space
      End Structure
    
      <StructLayout(LayoutKind.Sequential)> _
      Public Structure MIXERCONTROLDETAILS
        <FieldOffset(0)> Public cbStruct As Integer    ' size in Byte of MIXERCONTROLDETAILS
        <FieldOffset(4)> Public dwControlID As Integer  ' control id to get/set details on
        <FieldOffset(8)> Public cChannels As Integer   ' number of channels in paDetails array
        <FieldOffset(12)> Public item As Integer      ' hwndOwner or cMultipleItems
        <FieldOffset(16)> Public cbDetails As Integer   ' size of _one_ details_XX struct
        <FieldOffset(20)> Public paDetails As IntPtr    ' pointer to array of details_XX structs
      End Structure
    
      <StructLayout(LayoutKind.Sequential)> _
      Private Structure MIXERCONTROLDETAILS_UNSIGNED
        <FieldOffset(0)> Public dwValue As Integer    ' value of the control
      End Structure
    
      <StructLayout(LayoutKind.Sequential)> _
      Private Structure MIXERLINECONTROLS
        <FieldOffset(0)> Public cbStruct As Integer    ' size in Byte of MIXERLINECONTROLS
        <FieldOffset(4)> Public dwLineID As Integer    ' line id (from MIXERLINE.dwLineID)
        <FieldOffset(8)> Public dwControl As Integer   ' MIXER_GETLINECONTROLSF_ONEBYTYPE
        <FieldOffset(12)> Public cControls As Integer   ' count of controls pmxctrl points to
        <FieldOffset(16)> Public cbmxctrl As Integer    ' size in Byte of _one_ MIXERCONTROL
        <FieldOffset(20)> Public pamxctrl As IntPtr    ' pointer to first MIXERCONTROL array
      End Structure
    
      <StructLayout(LayoutKind.Sequential)> _
      Private Structure MIXERLINE
        <FieldOffset(0)> Public cbStruct As Integer        ' size of MIXERLINE structure
        <FieldOffset(4)> Public dwDestination As Integer     ' zero based destination index
        <FieldOffset(8)> Public dwSource As Integer        ' zero based source index (if source)
        <FieldOffset(12)> Public dwLineID As Integer        ' unique line id for mixer device
        <FieldOffset(16)> Public fdwLine As Integer        ' state/information about line
        <FieldOffset(20)> Public dwUser As Integer         ' driver specific information
        <FieldOffset(24)> Public dwComponentType As Integer    ' component type line connects to
        <FieldOffset(28)> Public cChannels As Integer       ' number of channels line supports
        <FieldOffset(32)> Public cConnections As Integer      ' number of connections (possible)
        <FieldOffset(36)> Public cControls As Integer       ' number of controls at this line
        <FieldOffset(40), MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=MIXER_SHORT_NAME_CHARS)> Public szShortName As String ' * MIXER_SHORT_NAME_CHARS
        <FieldOffset(56), MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=MIXER_LONG_NAME_CHARS)> Public szName As String ' * MIXER_LONG_NAME_CHARS
        <FieldOffset(120)> Public dwType As Integer
        <FieldOffset(124)> Public dwDeviceID As Integer
        <FieldOffset(128)> Public wMid As Integer
        <FieldOffset(132)> Public wPid As Integer
        <FieldOffset(136)> Public vDriverVersion As Integer
        <FieldOffset(168), MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)> Public szPname As String ' * MAXPNAMELEN
      End Structure
    
    #End Region
    
    #Region "API Declarations"
    
      Private Declare Function mixerOpen Lib "winmm.dll" _
      (ByRef phmx As Integer, <MarshalAs(UnmanagedType.U4)> ByVal uMxId As Integer, ByVal dwCallback As Integer, ByVal dwInstance As Integer, ByVal fdwOpen As Integer) As Integer
    
      Private Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" _
        (<MarshalAs(UnmanagedType.I4)> ByVal hmxobj As Integer, ByRef pmxl As MIXERLINE, ByVal fdwInfo As Integer) As Integer
    
      Private Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsA" _
        (<MarshalAs(UnmanagedType.I4)> ByVal hmxobj As Integer, ByRef pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Integer) As Integer
    
      Private Declare Function mixerSetControlDetails Lib "winmm.dll" (<MarshalAs(UnmanagedType.I4)> ByVal hmxobj As Integer, _
        ByRef pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Integer) As Integer
    
      Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsA" (ByVal hmxobj As IntPtr, ByRef pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As IntPtr) As IntPtr
      Declare Sub CopyStructFromPtr Lib "kernel32" Alias "RtlMoveMemory" (ByVal struct As IntPtr, ByVal ptr As Object, ByVal cb As Integer)
    
      Public coponenttype As Integer = 4 'valeur par défaut: volume principal
    
      Public hmixerOut As Integer
      Public hmixerIn As Integer
      Public hmixer As Integer
      Public lngReturn As Integer
      Public boolmute As Boolean
    
    
    #End Region
    
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load
    
        Label1.Text = " 50 %"
        TrackBar1.Value = 5
    
        ComboBox1.Items.Add("Volume Général - out")
        ComboBox1.Items.Add("Volume Midi - out")
        ComboBox1.Items.Add("Volume CD - out")
        ComboBox1.Items.Add("Volume Wave - out")
        ComboBox1.Items.Add("Volume Micro - Out")
        ComboBox1.Items.Add("Volume Ligne - Out")
        ComboBox1.Items.Add("Volume Micro - in")
        ComboBox1.Items.Add("Volume Ligne - in")
        ComboBox1.SelectedIndex = 0
    
        ' Obtenir une ligne de mixer OUT
        lngReturn = mixerOpen(hmixerOut, 0, 0, 0, 0)
    
        ' Error check
        If lngReturn <> 0 Then
          MsgBox("Ouverture du Mixer de sortie impossible")
          Exit Sub
        End If
    
        ' Obtenir une ligne de mixer IN
        lngReturn = mixerOpen(hmixerIn, 1, 0, 0, 0)
    
        ' Error check
        If lngReturn <> 0 Then
          MsgBox("Ouverture du Mixer d'entrée impossible")
          Exit Sub
        End If
    
    
        hmixer = hmixerOut 'par defaut sur sortie
    
      End Sub
    
      Private Sub ComboBox1_SelectedIndexChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        Dim volCtrl As New MIXERCONTROL
        Dim choix As Byte
    
        choix = ComboBox1.SelectedIndex
    
        ' SelectedItem(choix)
        Select Case (choix)
    
          Case 0 : hmixer = hmixerOut : coponenttype = 4 ' volume général -out
          Case 1 : hmixer = hmixerOut : coponenttype = 4100 ' volume MIDI - out
          Case 2 : hmixer = hmixerOut : coponenttype = 4101 ' volume CD - out
          Case 3 : hmixer = hmixerOut : coponenttype = 4104 ' volume wave - out
          Case 4 : hmixer = hmixerOut : coponenttype = 4099 ' volume micro - Out
          Case 5 : hmixer = hmixerOut : coponenttype = 4098 ' volume ligne - Out
          Case 6 : hmixer = hmixerIn : coponenttype = 4099 ' volume micro - in
          Case 7 : hmixer = hmixerIn : coponenttype = 4098 ' volume ligne - in
    
        End Select
    
      End Sub
    
      Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles TrackBar1.Scroll
    
        Dim level As Integer
    
        level = (TrackBar1.Value) * 10
        Label1.Text = CStr(level) & " %"
    
        ' Affecter le volume à la valeur du Trackbar
    
        Dim volCtrl As New MIXERCONTROL
        Dim lngVolSetting As Integer
    
        ' Obtain the volumne control object
        Call GetVolumeControl(hmixer, coponenttype, _
          MIXERCONTROL_CONTROLTYPE_VOLUME, volCtrl)
    
        ' Then determine the value of the volume
        lngVolSetting = CType(volCtrl.lMaximum * (level / 100), Integer) 'la valeur level est un pourcentage; le réel varie entre 0 et 65535
    
        ' Then set the volume
        SetVolumeControl(hmixer, volCtrl, lngVolSetting)
    
      End Sub
    
      Private Function GetVolumeControl(ByVal hmixer As Integer, ByVal componentType As Integer, _
                       ByVal ctrlType As Integer, ByRef mxc As MIXERCONTROL) As Boolean
        ' Obtains an appropriate pointer and info for the volume control
    
        ' [Note: original source taken from MSDN http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q178456&]
    
        ' This function attempts to obtain a mixer control. Returns True if successful.
        Dim mxlc As New MIXERLINECONTROLS
        Dim mxl As New MIXERLINE
        Dim rc As Integer, pmem As IntPtr
    
        mxl.cbStruct = Marshal.SizeOf(mxl)
        mxl.dwComponentType = componentType
    
        ' Obtain a line corresponding to the component type
        rc = mixerGetLineInfo(hmixer, mxl, MIXER_GETLINEINFOF_COMPONENTTYPE)
    
        If (MMSYSERR_NOERROR = rc) Then
          mxlc.cbStruct = Marshal.SizeOf(mxlc)
          mxlc.dwLineID = mxl.dwLineID
          mxlc.dwControl = ctrlType
          mxlc.cControls = 1
          mxlc.cbmxctrl = Marshal.SizeOf(mxc)
    
          ' Allocate a buffer for the control
          pmem = Marshal.AllocHGlobal(Marshal.SizeOf(mxc))
          mxlc.pamxctrl = pmem
    
          mxc.cbStruct = Marshal.SizeOf(mxc)
    
          ' Get the control
          rc = mixerGetLineControls(hmixer, mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE)
    
          If (MMSYSERR_NOERROR = rc) Then
    
            mxc = CType(Marshal.PtrToStructure(mxlc.pamxctrl, GetType(MIXERCONTROL)), MIXERCONTROL)
    
            Marshal.FreeHGlobal(pmem)
            Return True
          End If
          Marshal.FreeHGlobal(pmem)
          Exit Function
        End If
    
        Return False
      End Function
    
    
      Private Function SetVolumeControl(ByVal hmixer As Integer, ByVal mxc As MIXERCONTROL, _
                  ByVal volume As Integer) As Boolean
        ' Sets the volumne from the pointer of the object passed through
    
        ' [Note: original source taken from MSDN http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q178456&]
    
        'This function sets the value for a volume control. Returns True if successful
    
        Dim mxcd As MIXERCONTROLDETAILS
        Dim vol As MIXERCONTROLDETAILS_UNSIGNED
        Dim rc As Integer
    
        Dim hptr As IntPtr
    
        mxcd.item = 0
        mxcd.dwControlID = mxc.dwControlID
        mxcd.cbStruct = Marshal.SizeOf(mxcd)
        mxcd.cbDetails = Marshal.SizeOf(vol)
    
        hptr = Marshal.AllocHGlobal(Marshal.SizeOf(vol))
    
        ' Allocate a buffer for the control value buffer
        mxcd.paDetails = hptr
        mxcd.cChannels = 1
        vol.dwValue = volume
    
        Marshal.StructureToPtr(vol, hptr, False)
    
        ' Set the control value
        rc = mixerSetControlDetails(hmixer, mxcd, 0)
    
    
        Marshal.FreeHGlobal(hptr)
    
        If (MMSYSERR_NOERROR = rc) Then
    
          Return True
        Else
          Return False
        End If
      End Function
    
      
      
    
      Public Sub SetSound(ByVal boolMute As Boolean)
    
        ' partie pas utilisée pour l'instant mais laissée pour info
    
        ' This routine sets the volume setting of the current unit depending on the value passed through
        Dim volCtrl As New MIXERCONTROL
    
        Dim lngVolSetting As Integer
    
        ' Obtain the hmixer struct
        'lngReturn = mixerOpen(hmixer, 0, 0, 0, 0)
    
        ' Error check
        'If lngReturn <> 0 Then Exit Sub
    
        ' Obtain the volumne control object
        Call GetVolumeControl(hmixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, _
          MIXERCONTROL_CONTROLTYPE_MUTE, volCtrl)
    
        ' Then determine the value of the volume
        If boolMute Then
          ' Mute
          lngVolSetting = 1
        Else
          ' Turn the sound on
          lngVolSetting = 0
        End If
    
        ' Then set the volume
        SetVolumeControl(hmixer, volCtrl, lngVolSetting)
      End Sub
    
      
    
    End Class
    
    

     

    Bonne soirée

    Jakez

    lundi 27 décembre 2010 22:29
  • Bonjour,

     

    J’ai transformé cette discussion en thread permanent. J’espère que ça améliora le visibilité et que votre projet aura plusieurs contributeurs.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    mardi 28 décembre 2010 11:00
  • Bonsoir à tous Bon j'ai avancé un peu; J'ai ammélioré mon mixer audio en VS 2010: A présent, il peut lire la position du curseur de volume dans le systeme Windows (sndvol32.exe) afin de s'initialiser à la bonne position et mon mixer audio lit également si la ligne sélectionnée (Principal, Wave, Midi ou autres) à été coché en 'Mute' et permet de le décocher si necessaire. Donc j'arrive à lire quelques données du mixer audio. Mais je butte toujours sur le niveau sonore. Mais il y a eu un petit progrès. Si ça interesse quelqun, je peut lui fournir le code (un peu spagetti, à remettre au propre). Concernant le vu-metre je continu à chercher. A+ Jakez
    dimanche 2 janvier 2011 20:19
  • Bonsoir à tous

    Bon j'avance assez peu

    et je butte sur cette ligne de code:

    mixerGetLineInfo(hmixer, mxl,

     

    GetLineInfoFlag.COMPONENTTYPE)

    en y mettant la valeur Peakmeter.

    Mais j'ai trouvé ceci sur le site: http://groups.google.com/group/borland.public.cppbuilder.vcl.components.using/browse_thread/thread/b292bf7ee5aa58ec/96ff22a0f7b9f163?lnk=st&q=cppbuilder+audio&rnum=34

    Not all Soundcards have PEAKMETERS (SoundBlasters and AC97's do NOT have them, and hence, cannot display a
    level meter on the standard Windows mixer control), so this rules out the methods discussed before. Is there a
    way to periodically read 4 bytes from each channel on the soundcard's output? It seems an absurdly simple
    thing to do, but the grief it has caused me so far is incredible!!! Surely, all I would need is the address of
    the primary sound buffer in order to read from it. I have the DirectSound header file and library, but I can't
    get the dang thing working for lack of documentation and examples. Has anyone got anything on DirectSound out
    there that isn't MSDN and has proper examples that work, and don't use the DirectSound8 interface, but use the
    one supplied with BCB5? 

    Il semble donc que je cherche pas dans la bonne direction. Mais quelqun peut-il confirmer ce qui est dit ci-dessus au sujet de la fonction Peakmeter de certaine carte son?

    Merci d'avance

    Jakez
     

    mercredi 5 janvier 2011 22:11
  • Bonjour,

    En effet il dit que la fonction PeakMeter n'est pas implémentée dans toutes les cartes sons.

    Donc je pense qu'il faudrait chercher dans une autre direction mais je ne sais pas ou.

     

     


    fred
    jeudi 6 janvier 2011 15:06
  • Bonsoir à tous

    J' ai trouvé quelque chose sur ce lien:

    http://www.vbfrance.com/code.aspx?ID=51542

    Ce prog fait vu metre et analyseur de spectre en sortie grace à FMOD.

    Le prog fonctionne très bien sous Visual studio 2010. C' est peut-être une piste pour faire un vu metre en entrée. En tous cas il faut supprimer du code tous ce qui est superflu par rapport à notre objectif et titre de ce tread.

    J 'y travaille et je vous tiens au courant. Si Fred  tu peux regarder, ce serais interessant de savoir ce que tu en penses.

    Bonne soirée

    Jakez 

    lundi 10 janvier 2011 21:15
  • Bonjour Jake,

    Super cette source :O)

    J'ai converti le projet en vb10 et il fonctionne nickel

    C'est exactement ce que je cherchais à faire

     


    fred
    mercredi 26 janvier 2011 15:57