Einzelnen Beitrag anzeigen

Marco Steinebach

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

Problem mit Sync bei BASS.DLL

  Alt 29. Jul 2009, 10: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