Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bass.dll erneutes starten von Lied unterbinden (https://www.delphipraxis.net/181262-bass-dll-erneutes-starten-von-lied-unterbinden.html)

Luki206 31. Jul 2014 09:13

Bass.dll erneutes starten von Lied unterbinden
 
Hi, ich habe eine Frage bezüglich der Bass.dll und der Wiedergabe von Audio. Die Bass.dll soll, wenn das Lied fertig ist, die Wiedergabe stoppen. Normalerweise sollte das ja mit:
Delphi-Quellcode:
Bass_ChannelPlay(.., false);
funktionieren nur tut es nicht, die Bass.dll gibt die Audio-Datei wieder von vorne wieder.
Wie unterbinde ich das, da mit der Audio auch ein Timer läuft, der ein Label und eine Trackbar anspricht. Wenn das Lied zu ende ist, ist aber die Trackbar noch nicht bei Maximal angekommen und somit wird das Lied für kurze Zeit am Anfang wiederholt.

Danke

Luki :spin:

DeddyH 31. Jul 2014 09:17

AW: Bass.dll erneutes starten von Lied unterbinden
 
Bist Du sicher, dass Du die Loop nicht versehentlich selbst gebaut hat? Von selbst tut BASS das nämlich nicht, sofern nicht explizit angegeben (und überhaupt möglich, siehe Bemerkungen in der Doku).

Perlsau 31. Jul 2014 11:49

AW: Bass.dll erneutes starten von Lied unterbinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Luki206 (Beitrag 1267101)
Wenn das Lied zu ende ist, ist aber die Trackbar noch nicht bei Maximal angekommen und somit wird das Lied für kurze Zeit am Anfang wiederholt

Wenn deine Trackbar (bei mir Slid_Play : TjvxSlider, wobei Max=100 und Min=0) bei Songende nicht ebenfalls am Ende angekommen ist, liegt das an fehlerhafter Programmierung:
Delphi-Quellcode:

...
  PRIVATE { Private-Deklarationen }
    Var
      ...
      Kanal    : HSTREAM;
      ...


Procedure TFormPlay.Timer_Mp3Timer(Sender: TObject);
Var
  Wert,
  Level : DWord;
  Sek  : Integer;

begin
  If BASS_ChannelIsActive(Kanal) = BASS_ACTIVE_PLAYING Then
  Begin
     Level           := BASS_ChannelGetLevel(Kanal);
     Wert            := LoWord(Level);
     PeakMeter.Value := Round(PeakMeter.MeterMaxValue * Wert / 32768);
     Posi            := BASS_ChannelGetPosition(Kanal,BASS_POS_BYTE);
     Slid_Play.Value := Round((100 * Posi) / Lang);
     Sek             := Round(BASS_ChannelBytes2Seconds(Kanal,Posi));
     Lbl_Posi.Caption := GL.Spc + GL.SekundenToStundenString(Sek,1);
  End;

  If BASS_ChannelIsActive(Kanal) = BASS_ACTIVE_STOPPED Then
  Begin
    Timer_Mp3.Enabled := False;
    PeakMeter.Value  := 0;
    Slid_Play.Value  := 0;
    Lbl_Posi.Caption := GL.Spc + GL.SekundenToStundenString(0,1);
    Bit_Stop.Enabled := False;
    Bit_Play.Glyph.LoadFromResourceName(HInstance, 'Bit_PlayMp3');
  End;
end;

Luki206 31. Jul 2014 12:13

AW: Bass.dll erneutes starten von Lied unterbinden
 
@Perlsau: ich habe das Max der Trackbar mit der länge die die Bass.dll zurückgibt wenn ich ihr sage:
Delphi-Quellcode:
BASS_ChannelGetLength
(ich weiß das dieser Aufruf Bytes zurückgibt) gespeist und somit ist die Trackbar ja bei Max wenn das Lied zu ende ist.

Nur habe ich jetzt einen Equalizer eingebaut und schwupp, es geht :D Aber danke für die Antworten.

DeddyH 31. Jul 2014 12:18

AW: Bass.dll erneutes starten von Lied unterbinden
 
Und wieder ein Blick in die Bemerkungen:
Zitat:

Remarks
The exact length of a stream will be returned once the whole file has been streamed, but until then it is not always possible to 100% accurately estimate the length. The length is always exact for MP3/MP2/MP1 files when the BASS_STREAM_PRESCAN flag is used in the BASS_StreamCreateFile call, otherwise it is an (usually accurate) estimation based on the file size. The length returned for OGG files will usually be exact (assuming the file is not corrupt), but when streaming from the internet (or "buffered" user file), it can be a very rough estimation until the whole file has been downloaded. It will also be an estimate for chained OGG files that are not pre-scanned.
Wobei es mir schon komisch vorkommt, wieso das Neustarten eines Songs von der Position einer Trackbar abhängt. Sind da Logik und Darstellung evtl. nicht sauber getrennt?

Perlsau 31. Jul 2014 15:08

AW: Bass.dll erneutes starten von Lied unterbinden
 
Zitat:

Zitat von Luki206 (Beitrag 1267144)
ich habe das Max der Trackbar mit der länge die die Bass.dll zurückgibt wenn ich ihr sage:
Delphi-Quellcode:
BASS_ChannelGetLength
(ich weiß das dieser Aufruf Bytes zurückgibt) gespeist und somit ist die Trackbar ja bei Max wenn das Lied zu ende ist.

Was treibst du da eigentlich? Du mußt doch nicht jedesmal den Maxwert deiner Trackbar ändern, nur weil das aktuelle Lied kürzer oder länger ist. Bei mir steht die Trackbar auf Max = 100, das sind hundert Prozent, und den Prozentwert berechne ich wie oben bereits dargestellt. Zeig doch mal ein wenig Code, wo du die aktuelle Position der Sounds ausliest und in Relation dazu die Trackbar positionierst.

Zitat:

Zitat von Luki206 (Beitrag 1267144)
Nur habe ich jetzt einen Equalizer eingebaut und schwupp, es geht :D Aber danke für die Antworten.

Was hat denn ein Equalizer mit dem eingangs geschilderten Problem zu tun, daß der Song wiederholt wird? Kommt mir alles ziemlich wirr vor ... :?:

Zitat:

Zitat von DeddyH (Beitrag 1267145)
Wobei es mir schon komisch vorkommt, wieso das Neustarten eines Songs von der Position einer Trackbar abhängt. Sind da Logik und Darstellung evtl. nicht sauber getrennt?

Mit Sicherheit :!:

DeddyH 31. Jul 2014 15:12

AW: Bass.dll erneutes starten von Lied unterbinden
 
Zitat:

Zitat von Perlsau (Beitrag 1267185)
Du mußt doch nicht jedesmal den Maxwert deiner Trackbar ändern, nur weil das aktuelle Lied kürzer oder länger ist. Bei mir steht die Trackbar auf Max = 100, das sind hundert Prozent, und den Prozentwert berechne ich wie oben bereits dargestellt.

Wenn man den Max-Wert für jeden Track wieder neu setzt, kann man sich die eigene Prozentrechnung sparen, was soll daran falsch sein? Blöde wird es nur dann, wenn der Integer-Bereich überschritten wird.

Perlsau 31. Jul 2014 15:30

AW: Bass.dll erneutes starten von Lied unterbinden
 
Zitat:

Zitat von DeddyH (Beitrag 1267186)
Wenn man den Max-Wert für jeden Track wieder neu setzt, kann man sich die eigene Prozentrechnung sparen, was soll daran falsch sein?

Wo habe ich denn angeblich behauptet, daß das falsch sei?

Und was "spart" man denn da? Rechenzeit? Nicht wirklich. Problematisch ist es u.a. genau deshalb:

Zitat:

Zitat von DeddyH (Beitrag 1267186)
Blöde wird es nur dann, wenn der Integer-Bereich überschritten wird.

Das heißt, man muß bei Songlängen, die größer als der Integerbereich sind, sowieso umrechnen.

Davon abgesehen ändert sich jedesmal die Darstellung der Progress- oder Trackbar bzw. ihre Einteilung. Außerdem erscheint es mir wenig sinnvoll, einer Progressbar einen Spielraum von sagen wir mal 1.000.000 zu gewähren, wenn auf meinem Bildschirm sowieso nur 1900 Pixel horizontal dargestellt werden können. Da werden dann tatsächlich ständig Positionsänderungen, die man gar nicht sehen kann, unnötigerweise berechnet. Du gehst doch hoffentlich nicht davon aus, daß dein Vorschlag, den Maxwert für jeden Track immer wieder neu zu setzen, allgemeinen Standard darstellt?

Wenn du eine Trackbar zur Positionierung benötigst (mach ich z.B. mit dem oben beschriebenen Slider), genügt der Wert 100 in der Regel ebenfalls. Muß es genauer sein, dann nimmt man eben einen Maxwert von 1000 oder 2000, muß dann daber die Progressbar entsprechend größer darstellen, um diese genaueren Werte überhaupt einstellen zu können.

DeddyH 31. Jul 2014 15:43

AW: Bass.dll erneutes starten von Lied unterbinden
 
Dafür kannst Du bei einer derart großen Datei (das dürfte dann wahrscheinlich eine ganze Oper im WAV-Format sein) lediglich im Megabyte-Bereich positionieren. Auch nicht das Gelbe vom Ei.

Luki206 31. Jul 2014 20:17

AW: Bass.dll erneutes starten von Lied unterbinden
 
So, ich habe jetzt einmal den Code von Perlsau soweit bearbeitet wie ich denke das es richtig ist. Nur gibt es jetzt ein kleines Problem, die Trackbar spring gleich zum ende bzw. hüpft sofort ans Maximum aber ich erkenne jetzt keinen Fehler. Hier der Code:
Delphi-Quellcode:
procedure TFrmHaupt.TmrPosTimer(Sender: TObject);
Var
  Wert,
  Level,
  Posi : DWord;

begin
  if BASS_ChannelIsActive(strs) = BASS_ACTIVE_PLAYING then
  begin
     Level := BASS_ChannelGetLevel(strs);
     Wert := LoWord(Level);
     posi := BASS_ChannelGetPosition(strs,BASS_POS_BYTE);
     TrbPos.Position := Round(Posi/LLength);
     second := Round(BASS_ChannelBytes2Seconds(strs,Posi));
     LblLaufzeit.Caption := Format('%d:%d', [second div 60, second mod 60]);
  end;

  if BASS_ChannelIsActive(strs) = BASS_ACTIVE_STOPPED then
  begin
   if LRelis then
     begin
       BASS_ChannelPLay(strs, true);
       TrbPos.Position := 0;
       second := 0;
       LblLaufzeit.Caption := '0:0';
     end
    else
     begin
      TmrPos.Enabled := False;
      ImgVorClick(nil);
   end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz