Oppure

Loading
29/04/09 17:46
Furion
Con DirectAudio intendi le DirectX Audio? E come dovrei fare? Scusate ma in questo campo purtroppo sono un n0bb0ne. Potresti postarmi un esempio anche piccolino? Grazie in anticipo.
aaa
29/04/09 20:42
Thejuster
Si, fa parte delle DirectX.

puoi scaricare le DirectX SDK a quest'indirizzo

microsoft.com/downloads/…

dopo aggiungi i riferimenti necessari del tipo

Imports Microsoft.DirectX.DirectSound


per gestire un suono basta fare del tipo

Public sound As SecondaryBuffer



Function caricaSuono(ByVal fileSrc As String) As SecondaryBuffer

        caricaSuono = New SecondaryBuffer(fileSrc, DirectSound)
End Function



Sub Main()

sound = caricaSuono("ok.wav")


end sub



una volta assegnato il suono alla variabile
puoi gestire tantissime cose
appunto come effetti audio, il bilanciamento, ascoltare il suono in una determinata posizione, gestire il volume ecc. ecc.

ti consiglio

notjustcode.it/public/…
per gli effetti

il quale illustra molti esempi
per questo credo che non ti conviene gestire l'audio generale di tutto il computer
ma di gestire l'audio di ogni singolo suono e appunto puoi creare equalizzatori
molto piu facilmente appunto perchè esiste proprio una funzione in directX che ti restituisce o imposta il volume.

oppure quest'esempio
notjustcode.it/public/…

che esegue anche un detect della tua scheda audio e ti permette di catturare audio che il tuo computer riproduce creando un file wav

:k:
mire.forumfree.it/ - Mire Engine
C# UI Designer
30/04/09 9:21
Furion
Oddio ti ringrazio, ma non è quello che dovevo fare io ^____^ Forse mi sono spiegato male all'inizio, faccio un mea culpa e lo rispiego: un mio amico ha un portatile su cui aveva Windows sVista. Ha fatto il downgrade ed è tornato a XP. Su sVista, però, aveva un programma della Acer che quando lui usava la rotella integrata per controllare il volume di sistema, su schermo gli compariva un disegno con scritto il volume attuale e lo stato di muto. Quel prog, sul sito della Acer, esiste solo per sVista ed io mi sono offerto per rimpiazzarglielo con uno fatto da me. Ed eccomi nei casini...

cmq ho provato, nella funzione GetVolumeControl, a usare la Marshal.FreeCoTaskMem ed il problema si è quasi risolto: in pratica, adesso, la dimensione dell'applicazione rimane fissa per qualche secondo, poi aumenta di un po' e rimane fissa di nuovo per un altro tot di tempo e così via. UFF... ^__^
aaa
30/04/09 13:12
theprogrammer
Ma come l'hai usata la Free?
aaa
30/04/09 17:43
Furion
Ho usato queste due righe di codice

Marshal.FreeCoTaskMem(mxlc.pamxctrl)
Marshal.FreeCoTaskMem(pmxcd.paDetails)


all'interno della GetVolumeControl, subito prima di entrambi i return. E' giusto?
aaa
30/04/09 18:15
theprogrammer
Tutti e due prima di tutti e due i return???

Perche' non posti solamente la funzione con le modifiche?
aaa
01/05/09 8:24
Furion
Certo, eccola qui:

Private Shared Function GetVolumeControl(ByVal hmixer As Integer, ByVal componentType As Integer, ByVal ctrlType As Integer, ByRef mxc As MIXERCONTROL, ByRef vCurrentVol As Integer) As Boolean
        Dim mxlc As New MIXERLINECONTROLS
        Dim mxl As New MIXERLINE
        Dim pmxcd As New MIXERCONTROLDETAILS
        Dim du As New MIXERCONTROLDETAILS_UNSIGNED
        mxc = New MIXERCONTROL
        Dim rc As Integer
        Dim retValue As Boolean
        vCurrentVol = -1

        mxl.cbStruct = Marshal.SizeOf(mxl)
        mxl.dwComponentType = componentType

        rc = mixerGetLineInfoA(hmixer, mxl, MIXER_GETLINEINFOF_COMPONENTTYPE)

        If MMSYSERR_NOERROR = rc Then
            Dim sizeofMIXERCONTROL As Integer = 152
            Dim ctrl As Integer = Marshal.SizeOf(GetType(MIXERCONTROL))
            mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL)
            mxlc.cbStruct = Marshal.SizeOf(mxlc)
            mxlc.dwLineID = mxl.dwLineID
            mxlc.dwControl = ctrlType
            mxlc.cControls = 1
            mxlc.cbmxctrl = sizeofMIXERCONTROL

            ' Allocate a buffer for the control 
            mxc.cbStruct = sizeofMIXERCONTROL

            ' Get the control 
            rc = mixerGetLineControlsA(hmixer, mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE)

            If MMSYSERR_NOERROR = rc Then
                retValue = True
                ' Copy the control into the destination structure 
                mxc = CType(Marshal.PtrToStructure(mxlc.pamxctrl, GetType(MIXERCONTROL)), MIXERCONTROL)
            Else
                retValue = False
            End If
            Dim sizeofMIXERCONTROLDETAILS As Integer = Marshal.SizeOf(GetType(MIXERCONTROLDETAILS))
            Dim sizeofMIXERCONTROLDETAILS_UNSIGNED As Integer = Marshal.SizeOf(GetType(MIXERCONTROLDETAILS_UNSIGNED))
            pmxcd.cbStruct = sizeofMIXERCONTROLDETAILS
            pmxcd.dwControlID = mxc.dwControlID
            pmxcd.paDetails = Marshal.AllocCoTaskMem(sizeofMIXERCONTROLDETAILS_UNSIGNED)
            pmxcd.cChannels = 1
            pmxcd.item = 0
            pmxcd.cbDetails = sizeofMIXERCONTROLDETAILS_UNSIGNED

            rc = mixerGetControlDetailsA(hmixer, pmxcd, MIXER_GETCONTROLDETAILSF_VALUE)

            du = Marshal.PtrToStructure(pmxcd.paDetails, GetType(MIXERCONTROLDETAILS_UNSIGNED))

            vCurrentVol = du.dwValue

            Marshal.FreeCoTaskMem(mxlc.pamxctrl)
            Marshal.FreeCoTaskMem(pmxcd.paDetails)

            Return retValue
        End If

        Marshal.FreeCoTaskMem(mxlc.pamxctrl)
        Marshal.FreeCoTaskMem(pmxcd.paDetails)
        
        retValue = False
        Return retValue
    End Function 'GetVolumeControl
aaa
01/05/09 8:34
theprogrammer
Le ultime due Free non devono esserci perche' in quel punto non sono state fatte le due Alloc ...

Non vedo altri punti in cui ci potrebbe essere un memory leak.

Non dovresti avere piu' problemi di allocazione di memoria ... anche se la memoria impegnata sembra crescere, prova a vedere se e' solo l'effetto della modifica del working set ... (prova riducendo ad icona il programma e controlla se la memoria impegnata sembra ridursi)...
aaa