![]() |
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:
Fällt vielleicht jemand was dazu ein? Ich hänge schon sooo lange an diesem Problem…
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; Viele Grüße Marco |
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. |
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 |
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); |
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 06:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz