Seite 2 von 2

Verfasst: 28.05.2007 21:56
von Tafkadasom2k5
Wenn, dann im Code-Tipps und Tricks-Unterforum.

Warum deklarierst du einen Typen(eine Struktur) IN einer Prozedur? Das ist aber kein sehr schöner Stil.
Irgendwie bezweifle ich, dass du das alles selber geschrieben hast, von daher vermute ich, dass du es aus Visual-Basic oder so übersetzt hast ;)
Aber wer weiß? :wink:

Gr33tz
Tafkadasom2k5

Verfasst: 28.05.2007 22:05
von Andreas_S
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)

Verfasst: 28.05.2007 22:12
von ts-soft
Hab gerade nicht viel Zeit, aber die Procedure ZeroMemory ist lahm und
unnötig. Dafür kannste die RtlZeroMemory_() API in derselben Syntax
nehmen.

Verfasst: 28.05.2007 22:14
von Andreas_S
Das ist nur der Code vor prs unverändert hier ist meiner nochmal:

Code: Alles auswählen

Procedure ASL_MixerGetRecordChannel(mixerID,*ChannelNumber)
  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
 mxl.MIXERLINE
 mxl\cbStruct=SizeOf(MIXERLINE)
 mxl\dwComponentType=#MIXERLINE_COMPONENTTYPE_DST_WAVEIN
 Result=mixerGetLineInfo_(mixerID,mxl,#MIXER_GETLINEINFOF_COMPONENTTYPE)
 mxlctrls.MIXERLINECONTROLS
 mxlctrls\cbStruct=SizeOf(MIXERLINECONTROLS)
 mxlctrls\dwLineID=mxl\dwLineID
 mxlctrls\cControls=mxl\cControls
 mxlctrls\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
 mxlctrls\cbmxctrl=SizeOf(MIXERCONTROL)
 Bytes=(SizeOf(MIXERCONTROL)* mxlctrls\cControls)
 *control=AllocateMemory(Bytes)
 mxlctrls\pamxctrl=*control
 Result=mixerGetLineControls_(mixerID,mxlctrls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
 CopyMemory(*Control,ctrl.Mixercontrol,SizeOf(Mixercontrol))
  For i=0 To mxl\cControls-1
   CopyMemory(*Control+(i*SizeOf(Mixercontrol)),ctrl.Mixercontrol,SizeOf(Mixercontrol))
  Next
  If ctrl\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
   mcd.MIXERCONTROLDETAILS
   mcd\cbStruct = SizeOf(MIXERCONTROLDETAILS)
   mcd\cChannels=1
   PokeL(mcd+12,ctrl\cMultipleItems)
   mcd\cbDetails = SizeOf(MIXERCONTROLDETAILS_BOOLEAN)
   *lv=AllocateMemory(mcd\cChannels*ctrl\cMultipleItems*mcd\cbDetails)
   mcd\paDetails=*lv
   Result=mixerGetControlDetails_(mixer,mcd,#MIXER_GETCONTROLDETAILSF_VALUE)
    For i=0 To ctrl\cMultipleItems-1
     If PeekL(*lv+i*4)=1
       NumberSelect=i
     EndIf
    Next
   NameSelect.s=s$
   PokeL(*ChannelNumber,NumberSelect)
   ProcedureReturn #True
  EndIf
 ProcedureReturn #False
EndProcedure
Procedure ASL_MixerSetRecordChannel(mixerID,State)
 mxl.MIXERLINE
 mxl\cbStruct=SizeOf(MIXERLINE)
 mxl\dwComponentType=#MIXERLINE_COMPONENTTYPE_DST_WAVEIN
 Result=mixerGetLineInfo_(mixerID,mxl,#MIXER_GETLINEINFOF_COMPONENTTYPE)
 mxlctrls.MIXERLINECONTROLS
 mxlctrls\cbStruct=SizeOf(MIXERLINECONTROLS)
 mxlctrls\dwLineID=mxl\dwLineID
 mxlctrls\cControls=mxl\cControls
 mxlctrls\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
 mxlctrls\cbmxctrl=SizeOf(MIXERCONTROL)
 Bytes=(SizeOf(MIXERCONTROL)* mxlctrls\cControls)
 *control=AllocateMemory(Bytes)
 mxlctrls\pamxctrl=*control
 Result=mixerGetLineControls_(mixerID,mxlctrls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
 CopyMemory(*Control,ctrl.Mixercontrol,SizeOf(Mixercontrol))
  For i=0 To mxl\cControls-1
   CopyMemory(*Control+(i*SizeOf(Mixercontrol)),ctrl.Mixercontrol,SizeOf(Mixercontrol))
  Next
  If ctrl\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
   mcd.MIXERCONTROLDETAILS
   mcd\cbStruct=SizeOf(MIXERCONTROLDETAILS)
   mcd\cChannels=1
   PokeL(mcd+12,ctrl\cMultipleItems)
   mcd\cbDetails=SizeOf(MIXERCONTROLDETAILS_BOOLEAN)
   *lv=AllocateMemory(mcd\cChannels*ctrl\cMultipleItems*mcd\cbDetails)
   PokeL(*lv+State*4,1)
   mcd\paDetails=*lv
   Result=mixerSetControlDetails_(mixerID,mcd,#MIXER_SETCONTROLDETAILSF_VALUE)
   ProcedureReturn #True
  EndIf
 ProcedureReturn #False
EndProcedure


ASL_MixerSetRecordChannel(0,4)
RunProgram("sndvol32","/record","",#PB_Program_Wait)
ASL_MixerGetRecordChannel(0,@ChannelNumber)
Debug ChannelNumber
Sorry das ich das zweimal poste :oops: .

//Edit:

Ich schreib meine Proceduren immer so das der Benutzer nichts machen muss als die Parameter einsetzten.