Ja, das hatte ich mir schon runtergeladen. Aber die zum compillieren benötigten Sachen lassen sich nicht installieren. ich habe eine Stunde lang rumprobiert, und es dann gelassen. das war's dann.
Irgendwer hatte in dem selben Thread noch ein Tutorial gezeigt. Da stand das auch drin. Einziges Problem: Die Callback-Routine wird nur alle 100ms aufgerufen, also beginnt das VU-Meter zu ruckeln, und das siekt *mist*e aus! Ich habe dann das Beispielprogramm samplevis genommen, was in der Bass-Zip mit drin ist, die man runterladen muss. Das klappt jetzt wunderbar. Nur spielt das Programm die Musik selber ab. Und zwar so:
Delphi-Quelltext
1: 2:
| Channel := BASS_StreamCreateFile(FALSE, PChar(OpenDialog1.FileName), 0, 0, 0); BASS_ChannelPlay(Channel, False); |
Wie kann ich denn den Channel auf "Aufnahme" legen? Es gab da die möglichkeit mit der Callback-Routine:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| procedure TForm1.RecordButtonClick(Sender: TObject); var Flag: DWord; begin Flag := MakeLong(c16BitAudio,cRecordingTime);
RecChannel := BASS_RecordStart (cSampleRate, cNumChannels, Flag, @RecordingCallback, cDefaultUser);
end;
function RecordingCallback (Handle : HRecord; Buffer : Pointer; BufLength : DWord; User : DWord) : boolean; stdcall; var LocalBuffer: TStereoBuffer; Sum, Mean, Root : extended; RMSLevel : integer; Level : integer; LeftLevel : word; RightLevel : word; i : cardinal; begin Form1.Label2.Caption := 'Buffer-Länge: ' + IntToStr(BufLength);
CopyMemory(@LocalBuffer,Buffer,BufLength);
Sum := 0; for i := 0 to Pred(BufLength div 4) do begin Sum := Sum + LocalBuffer[i,Le] * LocalBuffer[i,Le]; end; Mean := Sum/(BufLength div 4); Root := Sqrt(Mean); RMSLevel := Round(100*Root/cMaxAudio); Form1.ProgressBar1.Position := RMSLevel;
Level := BASS_ChannelGetLevel(RecChannel); LeftLevel := LoWord(Level); RightLevel := HiWord(Level); Result := true;
end; |
Zitat Tut:
Die Callback-Routine wird ereignisgesteuert immer dann aufgerufen, wenn ein gefüllter Buffer zur Verfügung steht. Die Default-Länge des Recording-Buffers liegt bei 100 ms entsprechend einer Länge von 100 ms * 44100 Samples/s = 4410 Samples * 2 Kanäle * 2 Bytes = 17640 Bytes. Allerdings bleibt die tatsächliche Länge des Buffers nicht völlig konstant, weil Windows die Callback-Routine über die Zeit steuert und abhängig von der momentanen Auslastung des Rechners Ereignisse nicht punktgenau eintreffen.
Zitat ende.
So. Das stand in dem Tutorial.
Wie kann ich sie z.B. alle 33 ms ausführen lassen?
The Bääääär