Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Mixer Windows 64bit vb.net
Forum - C# / VB.NET - Mixer Windows 64bit vb.net

Avatar
orma674 (Normal User)
Rookie


Messaggi: 55
Iscritto: 02/06/2008

Segnala al moderatore
Postato alle 15:42
Lunedì, 06/08/2012
Buonasera a tutti,
volevo chiedervi aiuto inerente la compilazione di un programma con vs2010 su piattaforma win7 a 64bit che possa gestire il mixer di windows.

Premetto che dopo aver fatto alcune prove senza alcun risultato utile ho scaricato in rete un esempio che mio malgrado non funziona, l'unico modo che ho trovato e quello con l'utilizzo della libreria user.

Qualcuno mi sa dire se c'è qualche limitazione su 64bit per le librerie winmm.
Grazie per la collaborazione
Orma674


Orma674 by Marcello
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:56
Lunedì, 06/08/2012
Spiega più approfonditamente la questione ...

Che intendi con "l'unico modo che ho trovato e quello con l'utilizzo della libreria user" ?

E perché vuoi utilizzare per forza la "winmm" ?

Cosa vuoi fare e cosa non funziona in particolare ?

Quale codice hai scritto e quali errori hai (eventualmente) avuto ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
orma674 (Normal User)
Rookie


Messaggi: 55
Iscritto: 02/06/2008

Segnala al moderatore
Postato alle 16:09
Lunedì, 06/08/2012
Ciao,
ti spiego il mio obiettivo:

-) devo gestire una scheda audio con 8 input in modo che posso assegnargli il mute al canale.

ho aperto il mixer con mixeropen
dopo ho letto i canali e le connessioni
e poi ho cercato tra i canali di identificare dst_speaker

queste funzioni ritornano codice di errore 0, ma non regolano il cursore da me specificato.

In giro per la rete ci sono tante applicazione di setVolume e SetMute, anche sul sito MSDN; queste, le ho provate e non mi funzionano.

Mi chiedevo se qualcuno le ha provate?
con x86 o x64?

Grazie


Orma674 by Marcello
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:12
Lunedì, 06/08/2012
Posta il codice che hai usato per dare un'occhiata e provarlo ...

Inoltre, stai proprio creando una applicazione x64 ? E perché mai ?
Il programma funziona se crei una applicazione x86 ?

I driver della scheda che hai installato sono a 32 o 64 bit ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
orma674 (Normal User)
Rookie


Messaggi: 55
Iscritto: 02/06/2008

Segnala al moderatore
Postato alle 16:32
Lunedì, 06/08/2012
Ciao,
i driver della scheda audio sono a 64bit.

L'applicazione può funzionare a 32bit non è necessario per me a 64bit, non so per la scheda.

Ti posto l'ultimo codice provato trovato in rete:

"Form Principale"

Dim snd As New Sound

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
snd.SetVolume(100) ' applica il livello di volume
snd.SetSound(False) ' Disabilita il Muto
    End Sub

"Classe Sound"

Imports System.Runtime.InteropServices

Public Class Sound

#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 = (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 + 2)
    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)
#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)> _
    Private 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
#End Region
    Public Sub SetVolume(ByVal Level As Integer)
        Dim hmixer As Integer
        Dim volCtrl As New MIXERCONTROL
        Dim lngReturn As Integer
        Dim lngVolSetting As Integer
        lngReturn = mixerOpen(hmixer, 0, 0, 0, 0)
        If lngReturn <> 0 Then Exit Sub
        Call GetVolumeControl(hmixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, _
            MIXERCONTROL_CONTROLTYPE_VOLUME, volCtrl)
        lngVolSetting = CType(volCtrl.lMaximum * (Level / 100), Integer)
        SetVolumeControl(hmixer, volCtrl, lngVolSetting)
    End Sub
    Public Sub SetSound(ByVal boolMute As Boolean)
        Dim hmixer As Integer
        Dim volCtrl As New MIXERCONTROL
        Dim lngReturn As Integer
        Dim lngVolSetting As Integer
        lngReturn = mixerOpen(hmixer, 0, 0, 0, 0)
        If lngReturn <> 0 Then Exit Sub
        Call GetVolumeControl(hmixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, _
            MIXERCONTROL_CONTROLTYPE_MUTE, volCtrl)
        If boolMute Then
            lngVolSetting = 1
        Else
            lngVolSetting = 0
        End If
        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
        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
        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)
            pmem = Marshal.AllocHGlobal(Marshal.SizeOf(mxc))
            mxlc.pamxctrl = pmem
            mxc.cbStruct = Marshal.SizeOf(mxc)
            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
        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))
        mxcd.paDetails = hptr
        mxcd.cChannels = 1
        vol.dwValue = volume
        Marshal.StructureToPtr(vol, hptr, False)
        rc = mixerSetControlDetails(hmixer, _
                                   mxcd, _
                                   0)
        Marshal.FreeHGlobal(hptr)
        If (MMSYSERR_NOERROR = rc) Then
            Return True
        Else
            Return False
        End If
    End Function
End Class

Grazie per la collaborazione


Orma674 by Marcello
PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 10:59
Mercoledì, 08/08/2012
si ma la scelta tra x64 e x86 la devi fare in base al processore...:pat:


Blog:
<coming soon>
Appalo:
http://www.appalo.it/
PM Quote
Avatar
orma674 (Normal User)
Rookie


Messaggi: 55
Iscritto: 02/06/2008

Segnala al moderatore
Postato alle 10:39
Venerdì, 10/08/2012
Ciao, il processore è x64


Orma674 by Marcello
PM Quote