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
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
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")