Also zu deiner Vermutung, ich weiß zwar nicht warum du so denkst über mich aber du hast zu einem kleinen Teil recht:
Code: Alles auswählen
#MAXPNAMELEN = 32
Structure hMIXERLINE
cbStruct.l
dwDestination.l
dwSource.l
dwLineID.l;
fdwLine.l;
dwUser.l;
dwComponentType.l;
cChannels.l;
cConnections.l;
cControls.l;
szShortName.b[#MIXER_SHORT_NAME_CHARS]
szName.b[#MIXER_LONG_NAME_CHARS]
EndStructure
Structure helpMixerline Extends hMixerline
dwType.l
dwDeviceID.l
wMid.w
wPid.w
vDriverVersion.l
szPname.b[#MAXPNAMELEN]
EndStructure
Structure MIXERCONTROL
cbStruct.l
dwControlID.l
dwControlType.l
fdwControl.l
cMultipleItems.l
szShortName.b[#MIXER_SHORT_NAME_CHARS]
szName.b[#MIXER_LONG_NAME_CHARS];
lMinimum.l
lMaximum.l
dwMinimum.l
dwMaximum.l
Reserved.l[6];
cSteps.l
cbCustomData.l;
dwReserved.l[6];
EndStructure
Structure MIXERCONTROLDETAILSUNSIGNED
dwValue.l
EndStructure
Structure MIXERCONTROLDETAILS_LISTTEXT
dwParam1.l
dwParam2.l
szName.b[#MIXER_LONG_NAME_CHARS];
EndStructure
;******************************************************************************
Procedure ZeroMemory(adr,len)
For i=0 To len-1
PokeB(adr+i,0)
Next
EndProcedure
;******************************************************************************
Procedure ASL_ERR(err.l,source.s)
Select err
Case #MMSYSERR_NOERROR
ProcedureReturn 1
Case #MIXERR_INVALLINE
msg.s = "The audio line reference is invalid."
Case #MMSYSERR_BADDEVICEID
msg.s = "The hmxobj parameter specifies an invalid device identifier."
Case #MMSYSERR_INVALFLAG
msg.s = "One Or more flags are invalid."
Case #MMSYSERR_INVALHANDLE
msg.s = "The hmxobj parameter specifies an invalid handle."
Case #MMSYSERR_INVALPARAM
msg.s = "One Or more parameters are invalid."
Case #MMSYSERR_NODRIVER
msg.s = "No mixer device is available For the object specified by hmxobj."
Default
msg = "Unknown"
EndSelect
MessageRequester(source, msg, #PB_MessageRequester_Ok | #MB_ICONHAND)
ProcedureReturn 0
EndProcedure
;******************************************************************************
Procedure DebugMixerLine(*mxl.helpMIXERLINE)
Debug "--------MIXERLINE----------"
Debug "dwDestination: "+Str(*mxl\dwDestination )+ " Out Audiostreams 0 = 1"
Debug "dwSource: "+Str(*mxl\dwSource ) + " In Audiostreams 0 = 1"
Debug "dwLine: " + Str(*mxl\dwLineID ) + " use this ID for later Infos and Settings"
Debug "fdwLine: "+Str(*mxl\fdwLine )
Debug "dwUSer: "+ Str(*mxl\dwUser )
Debug "dwComponentType: "+Str(*mxl\dwComponentType )
Debug "cChannels: " + Str(*mxl\cChannels.l )
Debug "cConnections: "+ Str(*mxl\cConnections )
Debug "cControls: "+Str(*mxl\cControls )+ " = Faders, Pan, Mute And so on"
Debug "dwType: "+Str(*mxl\dwType)
Debug "dwDeviceID: "+Str(*mxl\dwDeviceID)
Debug "wMid: "+Str(*mxl\wMid)
Debug "wPid: "+Str(*mxl\wPid)
Debug "vDriverVersion: "+ Str(*mxl\vDriverVersion)
For i = 0 To #MIXER_SHORT_NAME_CHARS-1
s$ = s$+Chr(PeekB(@*mxl\szShortName[i]))
Next
Debug "szShortName: "+ s$
s$ = "";
For i = 0 To #MIXER_LONG_NAME_CHARS-1
s$ = s$+Chr(PeekB(@*mxl\szName[i]))
Next
Debug "szLongName: "+s$
Debug "-------End MIXERLINE---------"
Debug""
EndProcedure
;******************************************************************************
Procedure DebugMixerControl(*mxctrl.MIXERCONTROL)
Debug "--------MIXERCONTROL-----------"
Debug "dwControlID: " + Str(*mxctrl\dwControlID)
Debug "dwControlType: " + Str(*mxctrl\dwControlType)
Debug "cMultipleItems: " + Str(*mxctrl\cMultipleItems)
For i = 0 To #MIXER_SHORT_NAME_CHARS-1
s$ = s$+Chr(PeekB(@*mxctrl\szShortName[i]))
Next
Debug "szShortName: "+ s$
s$ = "";
For i = 0 To #MIXER_LONG_NAME_CHARS-1
s$ = s$+Chr(PeekB(@*mxctrl\szName[i]))
Next
Debug "szLongName: "+s$
Debug "lMinimum: " + Str(*mxctrl\lMinimum)
Debug "lMaximum: " + Str(*mxctrl\lMaximum)
Debug "dwMinimum: " + Str(*mxctrl\dwMinimum)
Debug "dwMaximum: " + Str(*mxctrl\dwMaximum)
Debug "cSteps: " + Str(*mxctrl\cSteps)
Debug "-------End MIXERCONTROL--------"
Debug ""
EndProcedure
;******************************************************************************
Procedure ASL_MixerGetRecordChannel(mixerID,*ChannelNumber.l)
ZeroMemory(mxl.MIXERLINE, SizeOf(MIXERLINE))
mxl\cbStruct = SizeOf(MIXERLINE)
mxl\dwComponentType = #MIXERLINE_COMPONENTTYPE_DST_WAVEIN
Result = mixerGetLineInfo_(mixerID,mxl,#MIXER_GETLINEINFOF_COMPONENTTYPE)
If Not ASL_ERR(Result,"API: MixerGetLineInfo")
ProcedureReturn = 0
EndIf
DebugMixerLine(mxl)
ZeroMemory(mxlctrls.MIXERLINECONTROLS, SizeOf(MIXERLINECONTROLS));
mxlctrls\cbStruct = SizeOf(MIXERLINECONTROLS);
mxlctrls\dwLineID = mxl\dwLineID;
mxlctrls\cControls = mxl\cControls;
mxlctrls\dwControlType = #MIXERCONTROL_CONTROLTYPE_MUX; #MIXERCONTROL_CONTROLTYPE_VOLUME,#MIXERCONTROL_CONTROLTYPE_PAN,#MIXERCONTROL_CONTROLTYPE_MUTE
mxlctrls\cbmxctrl = SizeOf(MIXERCONTROL);
Bytes = (SizeOf(MIXERCONTROL)* mxlctrls\cControls) ; Bytes(SizeOF Structur[X])
*control = AllocateMemory(Bytes) ; Allocate Memory for Structur Array
mxlctrls\pamxctrl = *control ; Pointer
;---- second... Call MixerGetLineControls -> mxlctrl.MixerLineControls
Result = mixerGetLineControls_(mixerID,mxlctrls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
If Not ASL_ERR(Result,"API: MixerGetLineControls")
ProcedureReturn = 0
EndIf
CopyMemory(*Control,ctrl.Mixercontrol,SizeOf(Mixercontrol))
For i = o To mxl\cControls -1
CopyMemory(*Control+(i*SizeOf(Mixercontrol)),ctrl.Mixercontrol,SizeOf(Mixercontrol))
DebugMixerControl(@ctrl)
Next
If ctrl\dwControlType = #MIXERCONTROL_CONTROLTYPE_MUX
ZeroMemory(mcd.MIXERCONTROLDETAILS, SizeOf(MIXERCONTROLDETAILS));
mcd\cbStruct = SizeOf(MIXERCONTROLDETAILS);
mcd\dwControlID = ctrl\dwControlID
mcd\cChannels = 1;
PokeL(mcd+12,ctrl\cMultipleItems)
mcd\cbDetails = SizeOf(MIXERCONTROLDETAILS_BOOLEAN)
*lv = AllocateMemory(mcd\cChannels * ctrl\cMultipleItems * mcd\cbDetails )
mcd\paDetails = *lv
ZeroMemory(*lv, MemorySize(*lv));
Result = mixerGetControlDetails_(mixer,mcd,#MIXER_GETCONTROLDETAILSF_VALUE)
If Not ASL_ERR(Result,"API: MixerGetControlDetails")
ProcedureReturn = 0
EndIf
For i = 0 To ctrl\cMultipleItems-1
If PeekL(*lv+i*4) = 1
NumberSelect = i
EndIf
Next
ZeroMemory(mcd.MIXERCONTROLDETAILS, SizeOf(MIXERCONTROLDETAILS));
mcd\cbStruct = SizeOf(MIXERCONTROLDETAILS);
mcd\dwControlID = ctrl\dwControlID
mcd\cChannels = 1;
PokeL(mcd+12,ctrl\cMultipleItems)
mcd\cbDetails = SizeOf(MIXERCONTROLDETAILS_LISTTEXT)
*fl = AllocateMemory(SizeOf(MIXERCONTROLDETAILS_LISTTEXT)*mcd\cChannels * ctrl\cMultipleItems * mcd\cbDetails)
mcd\paDetails = *fl
Result = mixerGetControlDetails_(mixer,mcd,#MIXER_GETCONTROLDETAILSF_LISTTEXT)
If Not ASL_ERR(Result,"API: MixerGetControlDetails")
ProcedureReturn = 0
EndIf
*Text = AllocateMemory(#MIXER_LONG_NAME_CHARS)
For i = 0 To ctrl\cMultipleItems -1
CopyMemory(*fl+(i*SizeOf(MIXERCONTROLDETAILS_LISTTEXT)+8),*Text,64)
s$ = "";
For y = 0 To #MIXER_LONG_NAME_CHARS-1
s$ = s$+Chr(PeekB(*Text+y))
Next
Debug "Channels = "+s$
If NumberSelect = i
NameSelect.s = s$
EndIf
Next
PokeL(*ChannelNumber,NumberSelect)
Debug "*****************************"
Debug "Number: "+Str(NumberSelect)+" "+NameSelect +" selected"
Debug "*****************************"
ProcedureReturn 1
EndIf ; If ctrl\dwControlType = #MIXERCONTROL_CONTROLTYPE_MUX
ProcedureReturn 0
EndProcedure
;******************************************************************************
mixerID = 0
ASL_MixerGetRecordChannel(mixerID,@ChannelNumber.l)
Debug ChannelNumber
Das ist ein Code von prs. Link:
http://www.purebasic.fr/german/viewtopi ... t=sndvol32
Zuerst hab ich den Code so weit gekürtzt wie es geht das nur noch der Stand angegeben wird und dann hab ich den ersten Code geproggt, aber wie man sieht ist der ziehmlich umständig und man kann leicht als Benutzter nen Fehler machen, also hab ich jetzt ein bischen herumgespielt und hab mich gedacht "zu fast jedem Get gibts ein Set"

(reimt sich sogar

). Und so ist das rausgekommen.
//Edit:
Get: mixerGetControlDetails_(mixer,mcd,#MIXER_GETCONTROLDETAILSF_VALUE)
Set: mixerSetControlDetails_(mixerID,mcd,#MIXER_SETCONTROLDETAILSF_VALUE)