Hallo
ich hab mir ein mp3-recording programm gebastelt und dazu die bass.dll & bassenc.dll von http://www.un4seen.com/ verwendet
UDF BASS.AU3:
Spoiler anzeigen
$BASS = DllOpen(@ScriptDir & "\bass.dll")
$BASSENC = DllOpen(@ScriptDir & "\bassenc.dll")
Dim $HRecord,$CHFX
Func Mp3Active()
Local $Ret[1]
$Ret = DllCall($BASSENC, "dword", "BASS_Encode_IsActive", "hwnd", $HRecord[0])
Return $Ret[0]
EndFunc ;==>Mp3Active
Func StopMp3()
DllCall($BASSENC, "dword", "BASS_Encode_Stop", "hwnd", $HRecord[0])
EndFunc ;==>StopMp3
Func CloseBass()
DllCall($BASS, "dword", "BASS_RecordFree")
DllClose($BASS)
DllClose($BASSENC)
EndFunc ;==>CloseBass
Func SetInput($Init, $Chnl, $Volume, $Active)
DllCall($BASS, "dword", "BASS_RecordSetDevice", "dword", $Init - 1)
if $Volume >=0 Then $Ret = DllCall($BASS, "dword", "BASS_RecordSetInput", "dword", $Chnl, "dword", BitOR($Volume, 0x40000))
If $Active = 1 Then $Ret = DllCall($BASS, "dword", "BASS_RecordSetInput", "dword", $Chnl, "dword", BitOR(1, 0x20000))
If $Active = 0 Then $Ret = DllCall($BASS, "dword", "BASS_RecordSetInput", "dword", $Chnl, "dword", BitOR(1, 0x10000))
EndFunc ;==>SetInput
Func MakeMp3($output)
DllCall($BASSENC, "long", "BASS_Encode_Start", "hwnd", $HRecord[0], "str", "lame --alt-preset insane - " & $output, "dword", 0, "dword", 0, "dword", 0)
;DllCall($BASSENC, "long", "BASS_Encode_Start", "hwnd", $CHFX[0], "str", "output.wav", "dword", 0, "dword", 0, "dword", 0)
DllCall($BASS,"long","BASS_ChannelPlay","hwnd",$hrecord[0],"dword",0)
EndFunc ;==>MakeMp3
Func RecStart($Init,$gain,$attack,$release,$threshold,$ratio,$predelay)
DllCall($BASS, "dword", "BASS_RecordSetDevice", "dword", $Init - 1)
$HRecord = DllCall($BASS, "hwnd", "BASS_RecordStart", "dword", 44100, "dword", 2, "dword", 128, "dword", 0, "dword", 0)
$CHFX=DllCall($BASS, "dword", "BASS_ChannelSetFX", "hwnd", $HRecord[0], "dword", 1, "dword", 0)
$Ret=DllCall($BASS, "dword", "BASS_ErrorGetCode")
$str="float gain;float attack;float release;float threshold;float ratio;float predelay"
$struct=DllStructCreate($str)
DllStructSetData($struct,"gain",$gain)
DllStructSetData($struct,"attack",$attack)
DllStructSetData($struct,"release",$release)
DllStructSetData($struct,"threshold",$threshold)
DllStructSetData($struct,"ratio",$ratio)
DllStructSetData($struct,"predelay",$predelay)
$Ret=DllCall($BASS, "dword", "BASS_FXSetParameters", "hwnd", $CHFX[0], "ptr", DllStructGetPtr($struct))
$Ret=DllCall($BASS, "dword", "BASS_ErrorGetCode")
EndFunc ;==>RecStart
Func GetPeak()
Local $Ret[1]
Dim $Return[2]
$Ret = DllCall($BASS, "dword", "BASS_ChannelGetLevel", "hwnd", $HRecord[0])
$Return[0] = LoWord($Ret[0]) * 100 / 32768
If $Return[0] < 0 Then $Return[0] = $Return[0] * (-1)
$Return[1] = HiWord($Ret[0]) * 100 / 32768
If $Return[1] < 0 Then $Return[1] = $Return[1] * (-1)
Return $Return
EndFunc ;==>GetPeak
Func GetInputs($Init)
Local $Ret[1], $Count, $Name
Dim $Return[1][2]
DllCall($BASS, "dword", "BASS_RecordInit", "dword", $Init - 1)
For $Count = 0 To 10
$Ret = DllCall($BASS, "dword", "BASS_RecordGetInput", "dword", $Count)
If $Ret[0] <= 0 Then ExitLoop
$Name = DllCall($BASS, "str", "BASS_RecordGetInputName", "dword", $Count)
ReDim $Return[$Count + 2][2]
$Return[$Count + 1][0] = $Name[0]
$Return[$Count + 1][1] = LoWord($Ret[0])
Next
$Return[0][0] = $Count
Return $Return
EndFunc ;==>GetInputs
Func GetDevices()
Local $Count, $Ret[1], $Loop
Dim $Return[1]
For $Count = 0 To 10
$Ret = DllCall($BASS, "dword", "BASS_RecordGetDeviceDescription", "dword", $Count)
If $Ret[0] <= 0 Then ExitLoop
Next
ReDim $Return[$Count + 1]
For $Loop = 0 To $Count - 1
$Ret = DllCall($BASS, "str", "BASS_RecordGetDeviceDescription", "dword", $Loop)
$Return[$Loop + 1] = $Ret[0]
Next
$Return[0] = $Count
Return $Return
EndFunc ;==>GetDevices
Func LoWord($dword)
If BitAND($dword, 0x8000) = 0 Then
Return BitAND($dword, 0xFFFF)
Else
Return BitOR($dword, 0xFFFF0000)
EndIf
EndFunc ;==>LoWord
Func HiWord($dword)
Return BitAND($dword, 0xFFFF0000) / 0x10000
EndFunc ;==>HiWord
Func MakeLong($LoWord, $HiWord)
Return BitOR(BitAND($HiWord * 0x10000, 0xFFFF0000), BitAND($LoWord, 0xFFFF))
EndFunc ;==>MakeLong
GetDevices liefert ein Array:
[0]=Anzahl der Audiointerfaces
[1]=Name des 1 Audiointerface
[2]=Name des 2 Audiointerface
.
.
GetInputs(1) liefert ein Array des 1 Audiointerface:
[0][0]=Anzahl der AudioInputs
[1][0]=Name des 1 AudioInputs (z.b: Mikrofoneingang)
[1][1]=Eingestellte Lautstärke
.
.
RecStart startet den Input. Noch NICHT die Aufnahme, aber man kann schon die Peaks ablesen
Außerdem lassen sich noch Einstellungen des Compressors vornemen
GetPeak liefert ein Array:
[0]=Ausschlag des linken Kanals
[1]=Ausschlag des rechten Kanals
SetInput setzt einen AudioInput auf Aktiv oder Inaktiv und stellt die Lautstärke ein
MakeMp3 schließlich startet die eigentliche Aufnahme und codiert als MP3
man benötigt die Dateien Bass.dll, BasEnc.dll und Lame.exe
dieses UDF ist natürlich auf mein programm zugeschnitten und z.z. sind keine @Error-Codes eingebaut.
aber vielleicht kann ja jemand etwas damit anfangen...
und vielleicht hat ja mal jemand Lust ein ordentliches UDF für Bass.dll zu coden