Seite 1 von 2

Mixer Proceduren und Waveaufnahme

Verfasst: 29.05.2007 11:36
von Andreas_S
Hi,

Ich hier ein paar Proceduren geschrieben mit den die Mixer-Einstellungen geändert werden können:

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


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
Sie können so verwendet werden:

Code: Alles auswählen

EnableExplicit


Define ChannelNumber
ASL_MixerGetRecordChannel(0,@ChannelNumber)
Debug ChannelNumber
NewList List.s()
ASL_MixerGetRecordChannels(0,List())
 ForEach List()
  Debug List()
 Next
Define Channels
ASL_MixerGetRecordChannelNumber(0,@Channels)
Debug Channels
Debug ASL_MixerGetRecordState(0,#MIXER_LONG_NAME_CHARS)
Define ChannelName.s=""
ASL_MixerGetRecordChannelName(0,1,@ChannelName)
Debug ChannelName

Funktionen:

ASL_MixerGetRecordChannel(mixerID,@ChannelNumber) gibt das aktuelle Gerät an (gepeichert in ChannelNumber).

ASL_MixerGetRecordChannels(mixerID,ChannelList.s()) speichert alle Geräte auf die ChannelList.s().

ASL_MixerSetRecordChannel(mixerID,State) setzt ein aktuelles Gerät.

ASL_MixerGetRecordChannelNumber(mixerID,@Channels) gibt die Zahl an Geräten an (gepeichert in Channels).

ASL_MixerGetRecordState(mixerID,Form,@State) gibt die form des Mixers an (gepeichert in State). Form kann #MIXER_SHORT_NAME_CHARS oder #MIXER_LONG_NAME_CHARS sein. State muss vorher so angegeben werden: >State.s=""< !

ASL_MixerGetRecordChannelName(mixerID,Channel,@ChannelName) gibt den Namen zum angegebenen Channel an (gepeichert in ChannelName). ChannelName muss vorher so angegeben werden: >ChannelName.s=""< !

ASL_MixerSetRecordChannelName(mixerID,Channel$) setzt dan Mixer auf den angegebenen Channel$.


Die mixerID sollte immer 0 sein.


//Edit: Hier noch eine dazupassende Waveaufnahme: (Proceduren)

Code: Alles auswählen

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
 File.l
 RawFile$
EndStructure


Procedure StartRecord_(hWnd,nBuf,lBuf,nDev,nChannels,wBitsPerSample,nSamplesPerSec,cbSize,wFormatTag,File,RawFile$)
 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
 Record\RawFile$=RawFile$

  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
 Record\File=File
 CreateFile(Record\File,RawFile$)
 ProcedureReturn Record\wave
EndProcedure
Procedure Record_(wParam,lParam)
 waveInAddBuffer_(wParam,lParam,SizeOf(WAVEHDR))
 *hWave_Record.WAVEHDR=lParam
 Record\buffer=*hWave_Record\lpData
 Record\size=*hWave_Record\dwBytesRecorded
 Record\recorded+Record\size
 WriteData(Record\File,Record\buffer,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)
 CloseFile(Record\File)
EndProcedure
Procedure raw2wav(WaveFile$)
 FileIn=ReadFile(#PB_Any,Record\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
Kann so verwendet werden:

Code: Alles auswählen

EnableExplicit


Procedure WindowCallback(hWnd,Msg,wParam,lParam)
  Select Msg
   Case #MM_WIM_DATA
    Record_(wParam,lParam)
  EndSelect
 ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


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

Define Event
Define Quit
Repeat
 Event=WindowEvent()
  If Event=#WM_CLOSE
   Quit=1
  EndIf
Until Quit=1 Or GetAsyncKeyState_(#VK_RETURN)

StopRecord_()
raw2wav("C:\Wave.wav")
DeleteFile("C:\RawWave.raw")
Mit diesem Code kann man Aufnehmen was man will, auch das was gerage am PC abgepielt wird (ASL_MixerSetRecordChannelName(0,"Stereo Mixer") oder ASL_MixerSetRecordChannelName(0,"Mono Mixer"))

Verfasst: 29.05.2007 11:48
von tranquil
Hey klasse! Muss ich Zuhause unbedingt ausprobieren, genau solch einen Code habe ich mir kürzlich für mein Webradio durch den Kopf gehen lassen.

Vielen Dank fürs Sharen!!!

Verfasst: 29.05.2007 11:52
von Andreas_S
So schnell ne Antwort :o :allright: .

Danke :allright: !

Verfasst: 29.05.2007 12:39
von PMTheQuick
Das Ding erzeugt bei mir nen Invalid Memory Error. Bzw:

[12:39:55] Warte auf den Start des Executable...
[12:39:55] Executable gestartet.
[12:39:55] [ERROR] Line: 60
[12:39:55] [ERROR] Can't allocate a memory block of size 0 !

Gruss
PMTheQuick :wink:

Verfasst: 29.05.2007 13:02
von Andreas_S
Gehts bei anderen?

Verfasst: 29.05.2007 13:27
von ts-soft
PBprogger hat geschrieben:Gehts bei anderen?
Debugger-Ausgabe hat geschrieben:4
Wave
Line-In
Aux/Phone
CD-Player
Mikrofon
Stereo Mix
6
Aufnahme
Line-In
Aber der Strolch hat keine Variablen deklariert
:mrgreen:

Verfasst: 29.05.2007 13:34
von Andreas_S
JUHUUUUUUUUU :mrgreen: !

Danke :allright: !


>>Aber der Strolch hat keine Variablen deklariert

Was meinst du damit?

Verfasst: 29.05.2007 14:09
von Andreas_S
So jetzt ist die Aufnahme auch dabei :allright: .

Verfasst: 29.05.2007 15:25
von coder
>Was meinst du damit?

Damit meint er bestimmt das du die Variablen mit Define (Global o. Protect) deklarieren sollst damit das ganze auch mit EnableExplecit läuft.

An sonsten: nice :allright:

//Edit: Beim ersten Beispiel meckert er wegen ASL_MixerGetRecordState() Incorrect Numbers of Parameter

Und beim zweiten Beispiel: Can't create a memory block of size 0!

//Edit2: Der zweite Beispiel Code hat doch geklappt man muss ihn nur ein zweites mal ausführen! Ist das so gedacht?? <)

Verfasst: 29.05.2007 15:58
von Andreas_S
Nein, aber danke für die Antworten ich schau mal ob ich den Fehler finde...

Danke :allright: !


//Edit: Also bei mir gehts auch wenn ich einen neuen Channel wähle...