AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Bass.dll erneutes starten von Lied unterbinden
Thema durchsuchen
Ansicht
Themen-Optionen

Bass.dll erneutes starten von Lied unterbinden

Ein Thema von Luki206 · begonnen am 31. Jul 2014 · letzter Beitrag vom 31. Jul 2014
Antwort Antwort
Luki206
(Gast)

n/a Beiträge
 
#1

Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 09:13
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: 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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 09:17
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).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 11:49
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;
Miniaturansicht angehängter Grafiken
slider.jpg  
  Mit Zitat antworten Zitat
Luki206
(Gast)

n/a Beiträge
 
#4

AW: Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 12:13
@Perlsau: ich habe das Max der Trackbar mit der länge die die Bass.dll zurückgibt wenn ich ihr sage: 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 Aber danke für die Antworten.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 12:18
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 15:08
ich habe das Max der Trackbar mit der länge die die Bass.dll zurückgibt wenn ich ihr sage: 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.

Nur habe ich jetzt einen Equalizer eingebaut und schwupp, es geht 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 ...

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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 15:12
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 15:30
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:

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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 15:43
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Luki206
(Gast)

n/a Beiträge
 
#10

AW: Bass.dll erneutes starten von Lied unterbinden

  Alt 31. Jul 2014, 20:17
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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