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
per gestire un suono basta fare del tipo
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
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
mire.forumfree.it/ - Mire Engine
C# UI Designer
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... ^__^
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 17:43
Furion
Ho usato queste due righe di codice
all'interno della GetVolumeControl, subito prima di entrambi i return. E' giusto?
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?
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)...
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