AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem mit Sync bei BASS.DLL
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Sync bei BASS.DLL

Ein Thema von Marco Steinebach · begonnen am 29. Jul 2009 · letzter Beitrag vom 16. Aug 2009
Antwort Antwort
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#1

Problem mit Sync bei BASS.DLL

  Alt 29. Jul 2009, 11:25
Hallo zusammen,
kann mich vielleicht jemand davor bewahren, mich aus dem Fenster, und ich meine kein virtuelles, zu stürzen?
Ich habe eine Funktion, teil eines Players, die eine Datei, mittels der BASS.DLL, öffnet, und zwei Syncs setzt. Funktioniert alles prima, aber manchmal wird der Sync für das Trackende ausgelöst, manchmal nicht. Es ist leider einer dieser so sehr beliebten nicht-reproduzierbaren Fehler.
Könnte sich mal jemand die Funktion ansehen, ob ich da einen Fehler drin habe, oder hatte vielleicht jemand schon mal ein solches Problem?
Delphi-Quellcode:
function TPlayer.fNeu(s: HStream; name: string; Fehlerausgabe: boolean): HStream;
// aufruf: s ist der als letztes erzeugte Stream
// name der zu öffnenede Dateiname
// fehlerausgabe (nur zu debutzwecken).
// und dekodieren steht, in diesem Fall auf true.
var
  flags: DWord;
begin
  result := 0;
  if s <> 0 then
// wenn noch was gespielt hat...
  begin
    BASS_ChannelStop (s);
    BASS_StreamFree (s)
  end;
  if Dekodieren then
    flags := BASS_Stream_Decode
  else
    flags := 0;
  if pos ('://', UpperCase (name)) > 0 then
    s := BASS_StreamCreateURL (PChar(dateiname), 0, flags, NIL, NIL)
  else
    s := BASS_StreamCreateFile (False, PChar(dateiname), 0, 0, flags);
// In dem Fall kommt StreamCreateFile zum einsatz.
  if s = 0 then
  begin
    if Fehlerausgabe then
      Fehler(format(_('Cannot play %s. (Errorcode: %d)'), [dateiname, BASS_ErrorGetCode]));
    exit
  end;
  if Dekodieren then
  begin
    s := BASS_FX_TempoCreate (s, BASS_FX_FREESOURCE);
// Um später Tempo, Frequenz etc. ändern zu können.
    if s = 0 then
    begin
      if Fehlerausgabe then
        Fehler(format(_('Cannot play %s. (Errorcode: %d)'), [dateiname, BASS_ErrorGetCode]));
      exit
    end
  end;
  hs_ende := BASS_ChannelSetSync (s, BASS_SYNC_END, 0, Sync_AmTrackEnde, nil);
Sync_AmTrackEnde ist in der Klasse bekannt und als SYNCPROC mit aufruf stdcall deklariert.
// und hier liegt das Problem, meist wird sie ausgeführt, manchmal nicht.
  hs_CF := BASS_ChannelSetSync(s, BASS_Sync_OneTime + BASS_SYNC_POS,
    BASS_ChannelSeconds2Bytes (s,
    Round (BASS_ChannelBytes2Seconds (s, BASS_ChannelGetLength(s, BASS_Pos_Byte))) - CrossfadeSekunden),
    Sync_Crossfade, nil);
// setzt, ein paar Sekunden vor dem Trackende einen zweiten Sync.
  BASS_ChannelSetAttribute (s, BASS_Attrib_Vol, lautstaerke);
  BASS_ChannelGetAttribute (s, BASS_Attrib_Tempo_Freq, Dateifrequenz);
  if Dekodieren then
  begin
    BASS_ChannelSetAttribute (s, BASS_Attrib_Tempo, geschwindigkeit);
    BASS_ChannelSetAttribute (s, BASS_Attrib_Tempo_Freq, Dateifrequenz + frequenz);
    BASS_ChannelSetAttribute (s, BASS_Attrib_Tempo_Pitch, Tonhoehe);
  end;
  result := s;
end;
Fällt vielleicht jemand was dazu ein? Ich hänge schon sooo lange an diesem Problem…
Viele Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem mit Sync bei BASS.DLL

  Alt 29. Jul 2009, 11:48
Wie sieht denn Sync_Crossfade aus? Ich könnte mir vorstellen, dass du da die Lautstärke runterfährst, und danach automatisch den laufenden Stream stoppst (und freigibst). Das geht iirc, wenn man da einen der Parameter auf -1 setzt.
Wenn es dabei durch Rundungsfehler oder andere Ungenauigkeiten dazu kommt, dass das Ausfaden kurz vor dem Streamende fertig ist, wird der Stream gestoppt, bevor er am Ende angekommen ist, und Sync_AmTrackEnde wird nicht ausgelöst.
The angels have the phone box.
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: Problem mit Sync bei BASS.DLL

  Alt 13. Aug 2009, 13:57
Hallo Gausi,
wenn auch spät, so doch vielen herzlichen Dank für die Antwort.
Ich hab das Problem gelöst, falls nochmal jemand darüber fällt:
Ich setze neben der BASS.DLL auch die BASS_FX.dll ein. Wenn man hier als Flag beim Aufruf von BASS_FX_TempoCreate BASS_Sample_Loop mit angibt, ist alles in Ordnung, und alle Syncs werden ordnungsgemäß erkannt. Läßt man es weg, kommt es zu meinem oben beschriebenen Problem. Warum das so ist, tja, nicht mal den Ansatz einer Ahnung, mir ist nichtmal wirklich klar, was BASS_Sample_Loop macht. Kann mir da jemand, zum Verständnis, mal weiterhelfen?

Einen herzlichen Gruß
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#4

Re: Problem mit Sync bei BASS.DLL

  Alt 14. Aug 2009, 06:36
Hi

in deinem Code sind einige Fehler!


es muss
BASS_SYNC_END or BASS_SYNC_ONETIME @Sync_Crossfade);

nicht
BASS_Sync_OneTime + BASS_SYNC_POS, Sync_Crossfade);


hs_CF brauchst du nur in Verbindung mit dem Flag BASS_SYNC_MIXTIME


aus meinem Code
Delphi-Quellcode:

(* Frees all resources *)
     if BASS_ChannelRemoveSync(fPlayChan, fSyncStall) then fSyncStall:= 0;
     if BASS_ChannelRemoveSync(fPlayChan, fSyncFree) then fSyncFree:= 0;


   (* Create Channel *)
      fPlayChan:= BASS_StreamCreateFile(false, PWideChar(fFilename), 0, 0, sFlag or BASS_UNICODE);


  (* Set Sync's *)
     BASS_ChannelSetSync(fPlayChan, BASS_SYNC_END or BASS_SYNC_ONETIME, 0, @SongEndProc, nil);
     fSyncStall:= BASS_ChannelSetSync(fPlayChan, BASS_SYNC_STALL or BASS_SYNC_MIXTIME, 0, @SongStalledProc, nil);
     fSyncFree:= BASS_ChannelSetSync(fPlayChan, BASS_SYNC_FREE or BASS_SYNC_MIXTIME, 0, @SongFreeProc, nil);


versuche mal den Flag BASS_STREAM_AUTOFREE in Verbindung mit
s := BASS_StreamCreateFile (False, PChar(dateiname), 0, 0, flags);
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: Problem mit Sync bei BASS.DLL

  Alt 16. Aug 2009, 10:22
Hi Wishmaster,
Mein HS_CF wird gebraucht, wenn ich zwei Titel überblende, also muß ich hier auf BASS_Sync_Pos abfragen. Das Problem hängt wirklich an der BASS_FX.DLL, wenn ich diese nämlich nicht mit einbinde, also einfach den Aufruf, der den FX-Kanal erzeugt, bei dem man Tempo und so ändern kann, auskommentiere, ist alles in Ordnung. Weiß der Himmel, was das für ein Nebeneffekt ist, aber fakt ist, daß mein BASS_SYNC_End meist erreicht wird, aber eben nur meist.
Viele Grüße
Marco
Marco Steinebach
  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 12:46 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