Registriert seit: 4. Aug 2006
502 Beiträge
Delphi 5 Enterprise
|
Problem mit Sync bei BASS.DLL
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
|