Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit Sync bei BASS.DLL (https://www.delphipraxis.net/137828-problem-mit-sync-bei-bass-dll.html)

Marco Steinebach 29. Jul 2009 10:25


Problem mit Sync bei BASS.DLL
 
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

Gausi 29. Jul 2009 10:48

Re: Problem mit Sync bei BASS.DLL
 
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.

Marco Steinebach 13. Aug 2009 12:57

Re: Problem mit Sync bei BASS.DLL
 
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

Wishmaster 14. Aug 2009 05:36

Re: Problem mit Sync bei BASS.DLL
 
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);

Marco Steinebach 16. Aug 2009 09:22

Re: Problem mit Sync bei BASS.DLL
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 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