Mixer Proceduren und Waveaufnahme

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Mixer Proceduren und Waveaufnahme

Beitrag 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"))
Zuletzt geändert von Andreas_S am 31.05.2007 14:45, insgesamt 5-mal geändert.
tranquil
Beiträge: 117
Registriert: 22.09.2004 22:07
Kontaktdaten:

Beitrag 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!!!
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

So schnell ne Antwort :o :allright: .

Danke :allright: !
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag 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:
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Gehts bei anderen?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

JUHUUUUUUUUU :mrgreen: !

Danke :allright: !


>>Aber der Strolch hat keine Variablen deklariert

Was meinst du damit?
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

So jetzt ist die Aufnahme auch dabei :allright: .
Benutzeravatar
coder
Beiträge: 204
Registriert: 25.09.2005 17:53
Computerausstattung: Intel Core2Quad Q8200 @ 2.33GHz
ASUS P5Q3, 2GB DDR3-1066 RAM, ATi Raedeon HD 4850
Wohnort: Deutschland
Kontaktdaten:

Beitrag 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?? <)
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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...
Antworten