Seite 2 von 2

Verfasst: 29.05.2007 17:38
von Leonhard
Bei mir kommt beim Beispiel bei der Zeile

Code: Alles auswählen

ASL_MixerGetRecordState(mixerID,#MIXER_LONG_NAME_CHARS,@State)
ein fehler: falsche Parameter-Anzahl.

Ich hab dann den Pointer einfach weg gelassen und mein Debug beschrängt sich auf das:
[17:36:01] [Debug] 0
[17:36:01] [Debug] 0
[17:36:01] [Debug]
[17:36:01] [Debug]
Ich hab dann schnell mal die Mixer-ID auf 1 gesetzt und es kommt der Fehler wie oben.

@PMTheQuick
Ich schätz mal, du hast keine "Mixer", daher kommt der Fehler. Sind deine Treiber richtig installiert?

Verfasst: 29.05.2007 19:07
von coder
Ich habe die Konstante weggelassen und dann gings...

Verfasst: 29.05.2007 22:08
von ts-soft
PBprogger hat geschrieben:JUHUUUUUUUUU :mrgreen: !

Danke :allright: !


>>Aber der Strolch hat keine Variablen deklariert

Was meinst du damit?
Da ich EnableExplicit nutze gibts nur Fehlermeldungen. Du solltest alle
Variablen vor Ihrer ersten Nutzung deklarieren. Das lernt man aber im
Programmierbuch auf der ersten Seite nach der Einführung

Verfasst: 30.05.2007 21:19
von tranquil
Bei mir funktioniert alles bestens! Läuft 1a. Danke! Reicht dicke für meine Zwecke, muss ja nur bei mir laufen. :)

Verfasst: 30.05.2007 21:22
von tranquil
ts-soft hat geschrieben:
PBprogger hat geschrieben:JUHUUUUUUUUU :mrgreen: !

Danke :allright: !


>>Aber der Strolch hat keine Variablen deklariert

Was meinst du damit?
Da ich EnableExplicit nutze gibts nur Fehlermeldungen. Du solltest alle
Variablen vor Ihrer ersten Nutzung deklarieren. Das lernt man aber im
Programmierbuch auf der ersten Seite nach der Einführung
OT:
Deshalb benutzen wir Basic - da muss man das nicht. Tolle Sache! :)

Verfasst: 31.05.2007 14:09
von PMTheQuick
Bei mir funzts nun auch. Liegt wohl daran, das ich vorne 1 Sound-Ausgang und Eingang habe und hinten 2 Eingänge und 4 Ausgänge :D Habe für Sound-Ausgabe Params ausgeben ID 3 verwendet und für Sound-Eingabe Params ausgeben ID 4 verwendet. Ich sage einfach mal nur: :allright:

Gruss
PMTheQuick ;)

Verfasst: 31.05.2007 14:31
von Andreas_S
Obwohl ich seit einem Jahr programmiere ist mir EnableExplicit noch nie unter gekommen... ich finde diese Funktion nicht so wichtig wenn man nur so wenige Variable verwendet wie ich... aber ich ändere es mal...

Danke :allright: !

Verfasst: 08.06.2007 21:12
von Andreas_S
Heir ist noch eine Erweiterung:

Code: Alles auswählen

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 MIXERCONTROLDETAILS_LISTTEXT
 dwParam1.l
 dwParam2.l
 szName.b[#MIXER_LONG_NAME_CHARS]
EndStructure


Structure WAVEFORMATEX
 wFormatTag.w
 nChannels.w
 nSamplesPerSec.l
 nAvgBytesPerSec.l
 nBlockAlign.w
 wBitsPerSample.w
 cbSize.w
EndStructure
Structure stats
 nBuf.l
 lBuf.l
 wave.l
 buffer.l
 size.l
 recorded.l
EndStructure


Procedure Verhaeltniss(a1$,b1$,a2$,b2$)
  If a1$="x" Or a1$="X"
   XVal=1
  Else
   a1=Val(a1$)
  EndIf
  If b1$="x" Or b1$="X"
   XVal=2
  Else
   b1=Val(b1$)
  EndIf
  If a2$="x" Or a2$="X"
   XVal=3
  Else
   a2=Val(a2$)
  EndIf
  If b2$="x" Or b2$="X"
   XVal=4
  Else
   b2=Val(b2$)
  EndIf
  Select XVal
   Case 1
    ;x:b1=a2:b2
    ;x*b2=b1*a2
    result=(b1*a2)/b2
   Case 2
    ;a1:x=a2:b2
    ;a1*b2=x*a2
    result=(a1*b2)/a2
   Case 3
    ;a1:b1=x:b2
    ;a1*b2=b1*x
    result=(a1*b2)/b1
   Case 4
    ;a1:b1=a2:x
    ;a1*x=b1*a2
    result=(b1*a2)/a1
  EndSelect
 ProcedureReturn result
EndProcedure


Procedure ASL_MixerGetRecordChannel(mixerID,*ChannelNumber)
 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_(mixerID,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_MixerGetRecordChannels(mixerID,ChannelList.s())
 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\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_(mixerID,mcd,#MIXER_GETCONTROLDETAILSF_LISTTEXT)
   *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
     AddElement(ChannelList())
     ChannelList()=s$
    Next
   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
Procedure ASL_MixerGetRecordChannelNumber(mixerID,*Channels)
 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
   PokeL(*Channels,ctrl\cMultipleItems)
   ProcedureReturn #True
  EndIf
 ProcedureReturn #False
EndProcedure
Procedure$ _State_(*mxl.helpMIXERLINE,Type)
  If Type=#MIXER_SHORT_NAME_CHARS
   For i=0 To #MIXER_SHORT_NAME_CHARS-1
    s$=s$+Chr(PeekB(@*mxl\szShortName[i]))
   Next
  EndIf  
  If Type=#MIXER_LONG_NAME_CHARS
   For i=0 To #MIXER_LONG_NAME_CHARS-1
    s$=s$+Chr(PeekB(@*mxl\szName[i]))
   Next
  EndIf
 ProcedureReturn s$
EndProcedure
Procedure$ ASL_MixerGetRecordState(mixerID,Form)
 mxl.MIXERLINE
 mxl\cbStruct=SizeOf(MIXERLINE)
 mxl\dwComponentType=#MIXERLINE_COMPONENTTYPE_DST_WAVEIN
 mixerGetLineInfo_(mixerID,mxl,#MIXER_GETLINEINFOF_COMPONENTTYPE)
 ProcedureReturn _State_(@mxl,Form)
EndProcedure
Procedure ASL_MixerGetRecordChannelName(mixerID,Channel,*ChannelName)
 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\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_(mixerID,mcd,#MIXER_GETCONTROLDETAILSF_LISTTEXT)
   i=Channel
   *Text=AllocateMemory(#MIXER_LONG_NAME_CHARS)
   CopyMemory(*fl+(i*SizeOf(MIXERCONTROLDETAILS_LISTTEXT)+8),*Text,64)
    For y=0 To #MIXER_LONG_NAME_CHARS-1
     s$=s$+Chr(PeekB(*Text+y))
    Next
   PokeS(*ChannelName,s$)
   ProcedureReturn #True
  EndIf
 ProcedureReturn #False
EndProcedure
Procedure ASL_MixerSetRecordChannelName(mixerID,Channel$)
 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\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_(mixerID,mcd,#MIXER_GETCONTROLDETAILSF_LISTTEXT)
   *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
     If s$=Channel$
      Found=1
      State=i
     EndIf
    Next
    If Found
     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
    Else
     ProcedureReturn #False
    EndIf
  EndIf
 ProcedureReturn #False
EndProcedure


Procedure StartRecord_(hWnd,nBuf,lBuf,nDev,nChannels,wBitsPerSample,nSamplesPerSec,cbSize,wFormatTag)
 Global Record.stats
 Global format.WAVEFORMATEX
 Global Dim inHdr.WAVEHDR(16)

 format\nChannels=nChannels
 format\wBitsPerSample=wBitsPerSample
 format\nSamplesPerSec=nSamplesPerSec
 format\wFormatTag=wFormatTag
 format\cbSize=cbSize
 format\nBlockAlign=(format\nChannels*format\wBitsPerSample)/8
 format\nAvgBytesPerSec=format\nSamplesPerSec*format\nBlockAlign
 Record\nBuf=nBuf
 Record\lBuf=lBuf

  If #MMSYSERR_NOERROR=waveInOpen_(@Record\wave,#WAVE_MAPPER+nDev,@format,hWnd,#Null,#CALLBACK_WINDOW|#WAVE_FORMAT_DIRECT)
    For i=0 To Record\nBuf-1
     inHdr(i)\lpData=AllocateMemory(Record\lBuf)
     inHdr(i)\dwBufferLength=Record\lBuf
     waveInPrepareHeader_(Record\wave,inHdr(i),SizeOf(WAVEHDR))
     waveInAddBuffer_(Record\wave,inHdr(i),SizeOf(WAVEHDR))
    Next
   waveInStart_(Record\wave)
  EndIf
 ProcedureReturn Record\wave
EndProcedure
Procedure Record_(wParam,lParam,*buffer.long,*size.long)
 waveInAddBuffer_(wParam,lParam,SizeOf(WAVEHDR))
 *hWave_Record.WAVEHDR=lParam
 Record\buffer=*hWave_Record\lpData
 Record\size=*hWave_Record\dwBytesRecorded
 Record\recorded+Record\size
 *buffer\l=Record\buffer
 *size\l=Record\size
 ProcedureReturn Record\recorded
EndProcedure
Procedure StopRecord_()
 waveInReset_(Record\wave)
 waveInStop_(Record\wave)
  For i=0 To Record\nBuf-1
   If inHdr(i)
    waveInUnprepareHeader_(Record\wave,inHdr(i),SizeOf(WAVEHDR))
   EndIf
  Next
 waveInClose_(Record\wave)
EndProcedure
Procedure raw2wav(WaveFile$,RawFile$)
 FileIn=ReadFile(#PB_Any,RawFile$)
   If FileIn=#Null
    ProcedureReturn #False
   EndIf
  lBuf=Lof(FileIn)
  pBuf=AllocateMemory(lBuf)
  ReadData(FileIn,pBuf,lBuf)
 CloseFile(FileIn)
 FileOut=CreateFile(#PB_Any,WaveFile$)
   If FileOut=#Null
    ProcedureReturn #False
   EndIf
  b.w=format\wBitsPerSample
  c.w=format\nChannels
  h=format\nSamplesPerSec
  WriteByte(FileOut,Asc("R"))
  WriteByte(FileOut,Asc("I"))
  WriteByte(FileOut,Asc("F"))
  WriteByte(FileOut,Asc("F"))

  WriteLong(FileOut,lBuf+44)

  WriteByte(FileOut,Asc("W"))
  WriteByte(FileOut,Asc("A"))
  WriteByte(FileOut,Asc("V"))
  WriteByte(FileOut,Asc("E"))
 
  WriteByte(FileOut,Asc("f"))
  WriteByte(FileOut,Asc("m"))
  WriteByte(FileOut,Asc("t"))
  WriteByte(FileOut,Asc(" "))

  WriteLong(FileOut,16)

  WriteWord(FileOut,1)
  WriteWord(FileOut,c)
  WriteLong(FileOut,h)
  WriteLong(FileOut,c*b/8*h)
  WriteWord(FileOut,b/8*c)
  WriteWord(FileOut,b)

  WriteByte(FileOut,Asc("d")) 
  WriteByte(FileOut,Asc("a"))
  WriteByte(FileOut,Asc("t"))
  WriteByte(FileOut,Asc("a"))

  WriteLong(FileOut,lBuf)

  WriteData(FileOut,pBuf,lBuf)
 CloseFile(FileOut)
 ProcedureReturn #True
EndProcedure
Procedure raw2img(BMPFile$,RawFile$)
 FileIn=ReadFile(#PB_Any,RawFile$)
   If FileIn=#Null
    ProcedureReturn #False
   EndIf
  lBuf=Lof(FileIn)
  pBuf=AllocateMemory(lBuf)
  ReadData(FileIn,pBuf,lBuf)
 CloseFile(FileIn)
  For k=0 To lBuf Step 2
   Word.w=PeekW(pBuf+k)/-180
    If Word>HWord.w
     HWord=Word
    EndIf
    If Word<LWord.w
     LWord=Word
    EndIf
  Next
 Width=lBuf/2/2/180
 Height=HWord-LWord
 add=-LWord
 ImgOut=CreateImage(#PB_Any,Width,Height)
  StartDrawing(ImageOutput(ImgOut))
   Line(0,Height/2,Width,0,RGB(255,0,0))
    For k=0 To lBuf Step 2
     X=Verhaeltniss("x",Str(lBuf/2/2/180),Str(k),Str(lBuf))-1
     Word.w=PeekW(pBuf+k)
     Y=Word/-180+add
      If X<>XF
        If Draw=1
         LineXY(X,Y,XFF,YF,RGB(0,255,0))
        EndIf
       Draw=1
       XFF=X
       YF=Y
      EndIf
     XF=X
    Next
  StopDrawing()
 SaveImage(ImgOut,BMPFile$)
EndProcedure


Procedure WindowCallback(hWnd,Msg,wParam,lParam)
  Select Msg
   Case #MM_WIM_DATA
    Record_(wParam,lParam,@buffer,@size)
    WriteData(0,buffer,size)
  EndSelect
 ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


Win=OpenWindow(0,0,0,200,200,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible)
hWnd=WindowID(0)
ASL_MixerSetRecordChannel(0,0)
StartRecord_(hWnd,8,512,0,2,16,48000,0,#WAVE_FORMAT_PCM)
CreateFile(0,"C:\RawWave.raw")
SetWindowCallback(@WindowCallback())

StartTime=ElapsedMilliseconds()
Repeat
 Event=WindowEvent()
  If Event=#WM_CLOSE
   Quit=1
  EndIf
 YetTime=ElapsedMilliseconds()
Until Quit=1 Or GetAsyncKeyState_(#VK_RETURN); Or YetTime-StartTime>=1000

StopRecord_()
CloseFile(0)
raw2wav("C:\WaveTest.wav","C:\RawWave.raw")
raw2img("C:\AktionIMG.bmp","C:\RawWave.raw")
DeleteFile("C:\RawWave.raw")

Ihr solltet ein mikro anschließen und abwechselnt etwas machen (zB. reden nicht reden :mrgreen: ). Auf keinen Fall zu lange aufnehmen:

1) kostet speicher
2) kostet zeit (Zeit ist Geld und Geld wirft man nicht aus dem fenster :mrgreen: )

Dann seht unter C:\ (in diesem Fall) das bmp an das erstellt wurde.