remConst AL_UNDETERMINED = $1030Const AL_FORMAT_MONO8=$1100Const AL_FORMAT_MONO16=$1101Const AL_FORMAT_STEREO8=$1102Const AL_FORMAT_STEREO16=$1103end remStrictFramework brl.blitzImport vertex.openalImport brl.Math 'not neccecaryImport brl.max2d 'not nceccecaryImport brl.glmax2dImport "float_ring_buffer.bmx"Graphics(800, 600)TOpenAL.Open()TOpenAL.InitAL()TOpenAL.InitALC() Global Device:Byte Ptr, Context:Byte Ptr Device = alcOpenDevice(Null) If Device = Null Then WriteStdout "Device is null when using alcOpenDevice~n" Context = alcCreateContext(Device, Null) alcMakeContextCurrent(Context)'List of Capture Devices WriteStdout("List of capture devices:~n") For Local CaptureDevice:String = EachIn EnumCaptureDevices() WriteStdout(CaptureDevice + "~n") Next WriteStdout("#Default: " + String.FromCString(alcGetString(Null, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER))) Const SAMPLE_RATE:Int = 44100, .. 'In Hertz [Hz] BUFFER_SIZE:Int = SAMPLE_RATE 'In Samples Global CaptureDevice:Byte Ptr CaptureDevice = alcCaptureOpenDevice(Null, SAMPLE_RATE, AL_FORMAT_MONO16, BUFFER_SIZE) 'Null means using default capture device If CaptureDevice = Null Then Notify ("CaptureDevice is null") ; EndGlobal Data:Byte[] = New Byte[BUFFER_SIZE * 2] '16 Bit per sampleGlobal RingBuffer : TFloatRingBuffer = TFloatRingBuffer.Create(BUFFER_SIZE)Global Samples : Float[] = New Float[GraphicsWidth()]alcCaptureStart(CaptureDevice)While Not KeyDown(KEY_ESCAPE) Local NumAvailableSamples:Int 'Read Samples alcGetIntegerv(CaptureDevice, ALC_CAPTURE_SAMPLES, 4, Varptr(NumAvailableSamples)) If NumAvailableSamples > 0 Then alcCaptureSamples(CaptureDevice, Data, NumAvailableSamples) For Local I:Int = 0 Until NumAvailableSamples Local Offset:Int = I*2 ' 16 Bit per sample Local Sample:Float = DecodeSigned16BitLittleEndian(Data, Offset) RingBuffer.Put(Sample) Next EndIf If RingBuffer.GetSize() >= GraphicsWidth() Then RingBuffer.PeakLast(Samples, 0, GraphicsWidth()) EndIf 'Root Mean Square Local RMS:Float = 0 Local Size:Int = GraphicsWidth() For Local I:Int = 0 Until Size RMS = RMS + (Samples[I] * Samples[I]) Next RMS = Sqr(RMS / Size) Assert 0 <= RMS And RMS <= 1 Cls() 'Draw Intensity DrawRect 0, 0, RMS * GraphicsWidth(), 20 'Draw wave form Local OldX:Int = 0 ; Local OldY:Float = GraphicsHeight() / 2 For Local X:Int = 0 Until GraphicsWidth() Local Y:Float = Samples[X] * 100 + GraphicsHeight()/2 DrawLine OldX, OldY, X, Y OldX = X ; OldY = Y Next Flip() WendalcCaptureStop(CaptureDevice)alcMakeContextCurrent(Null)alcDestroyContext(Context)alcCloseDevice(Device)TOpenAL.Close()EndGraphics()EndFunction EnumCaptureDevices:String[]() Local List : Byte Ptr, .. Specifiers:String[] ' Null-terminated specifier list List = alcGetString(Null, ALC_CAPTURE_DEVICE_SPECIFIER) ' Separate specifier by null character While List[0] Specifiers = Specifiers[..Specifiers.Length + 1] Specifiers[Specifiers.Length - 1] = String.FromCString(List) List :+ Specifiers[Specifiers.Length - 1].Length + 1 Wend Return SpecifiersEnd FunctionFunction DecodeSigned16BitLittleEndian:Float(Buffer:Byte Ptr, Offset:Int) Local LowerB:Byte, HigherB:Byte HigherB = Buffer[offset + 1] LowerB = Buffer[offset] Local SampleInt:Int = (HigherB Shl 8) | (LowerB & $ff) If SampleInt & $8000 Then SampleInt = $FFFF8000 | (SampleInt & $7FFF) Local Sample:Float = Float(SampleInt) / Float($7fff) Return SampleEnd Function
ok thanks
Function MakeSinus(Duration:Int, PulseA:Int, PulseB:Int) Local SampleLen:Int= SAMPLERATE*Duration/1000 Local FaktorA:Float = 360.0/PulseA Local FaktorB:Float = 360.0/PulseB Local Sample:TAudioSample = CreateAudioSample( SampleLen, SAMPLERATE, SF_MONO8 ) For Local n:Int=0 Until SampleLen Local ValueA:Int, ValueB:Int If PulseA=0 ValueA=0 Else ValueA=60* Sin(FaktorA*(n Mod PulseA)) EndIf If PulseB=0 ValueB=0 Else ValueB=60* Sin(FaktorB*(n Mod PulseB)) EndIf Sample.samples[n] = 127+ValueA+ValueB Next Local Audio:TSound = LoadSound( Sample ) PlaySound Audio End Function