Autor Beitrag
Bääääär
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Mo 24.07.06 20:40 
Hallo!

Ich möchte mit Delphi ein VU Meter realisieren, dass den Ausgangspegel (also die Lautstärke) anzeigt, der/die gerade von der Soundkarte abgespielt wird. Ich habe auf der Suche im Internet schon sehr oft von der bass.dll gelesen, und auch, dass man damit Visualisierungen realisieren kann, die ja im Prinzip nur den Pegelwert verarbeiten.


Meine Frage: Wie kann ich diesen Pegelwert aus der Bass.dll rausquetschen, bzw. kann ich ihn auch ohne bass.dll herausfinden?

Danke schon mal,

The Bääääär
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Di 25.07.06 08:44 
Mensch user profile iconBäääääär, die Antwort steht doch knappe 4 posts unter deinem :(
Suche in: Delphi-Forum EINGANGSPEGEL DER SOUNDKARTE MESSEN
Bääääär Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Di 25.07.06 11:58 
Ja, das hatte ich schon gesehen. Allerdings ging es da um den Eingangspegel.
Du hast aber trotzdem Recht, weil es ja auf das Selbe hinauskommt, wenn ich am Mixwer unter Aufnahme den Steroemixer auswähle!

Thnx trotzdem,

The Bääääär

PS: du hast mich mit 6 mal "ä" geschreiben! =(
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Di 25.07.06 12:21 
Lossy eX hatte schon einmal so ein Programm gemacht, da kannst du ja ein bissl dich daran orientieren ;).
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Di 25.07.06 14:36 
Sry user profile iconBääääär ich scheine heute zu Übertriebungen zu neigen ;)
Bääääär Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Di 25.07.06 16:37 
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:
ausblenden Delphi-Quelltext
1:
2:
    Channel := BASS_StreamCreateFile(FALSE, PChar(OpenDialog1.FileName), 000);
    BASS_ChannelPlay(Channel, False);

Wie kann ich denn den Channel auf "Aufnahme" legen? Es gab da die möglichkeit mit der Callback-Routine:
ausblenden volle Höhe Delphi-Quelltext
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
    //              ---LoWord---   ---HiWord---
    Flag := MakeLong(c16BitAudio,cRecordingTime);

    RecChannel := BASS_RecordStart (cSampleRate,
                                    cNumChannels,
                                    Flag,
                                    @RecordingCallback,// die Callback-Routine
                                    cDefaultUser);

  end;

function RecordingCallback (Handle : HRecord;
                            Buffer : Pointer;
                            BufLength : DWord;
                            User   : DWord) : boolean; stdcall;
  // Diese Funktion ist das Herzstück der Aufnahme. Die Callback-Routine
  // wird ereignisgesteuert immer dann aufgerufen, wenn ein gefüllter Buffer
  // zur Verfügung steht. Allerdings bleibt dabei die tatsächlich Länge des
  // Buffers nicht völlig konstant. Die Bufferlänge kann mit dem HiWord des
  // Flag eingestellt werden. 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. Sie wird in der Prozedur
  // RecordButtonClick auf 200 ms entsprechend 35280 Bytes eingestellt.
  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);

    // Mit dem CopyMemory-Befehl kopieren wir den von der Soundkarte
    // übergebenen Buffer in unseren eigenen LocalBuffer, der als
    // zweidimensionales Array aufgebaut ist. So können wir die Samples
    // des linken und rechten Kanals nach belieben auslesen.
    CopyMemory(@LocalBuffer,Buffer,BufLength);

    // Beispiel: Ermittlung des RMS-Pegels aus dem LocalBuffer, also den Pegelwert
    Sum := 0;
    for i := 0 to Pred(BufLength div 4do 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;

    // Peak-Level des aufgenommenen Signals mit BASS-Routine bestimmen:
    Level := BASS_ChannelGetLevel(RecChannel);
    LeftLevel := LoWord(Level);
    RightLevel := HiWord(Level);
    // Form1.ProgressBar1.Position := Trunc(100*RightLevel/cMaxAudio);

    // Die Aufnahme wird fortgesetzt, solange die Callback-Routine
    // das Ergebnis true zurück gibt:
    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


Zuletzt bearbeitet von Bääääär am Di 25.07.06 16:47, insgesamt 2-mal bearbeitet
Bääääär Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Di 25.07.06 16:45 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  // Diese Funktion ist das Herzstück der Aufnahme. Die Callback-Routine
  // wird ereignisgesteuert immer dann aufgerufen, wenn ein gefüllter Buffer
  // zur Verfügung steht. Allerdings bleibt dabei die tatsächlich Länge des
  // Buffers nicht völlig konstant. Die Bufferlänge kann mit dem HiWord des
  // Flag eingestellt werden. 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. Sie wird in der Prozedur
  // RecordButtonClick auf 200 ms entsprechend 35280 Bytes eingestellt. <- <- <- <-


Oh gott, bin ich doof... Alles durchgelesen, aber genau diese Stelle nicht im Hirn abgespeichert...

Ok, nennt mich ein Microhirn...
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mi 26.07.06 11:33 
Nönö, das ist bloß die Hitze :nut:
Bääääär Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: So 10.12.06 17:25 
Sorry, dass ich das Thema noch mal ausgrabe. Aber ich kriegs nicht gebacken, den Pegel einer Frewuenz im Localbuffer auszulesen.
kann mir da jemand helfen?