![]() |
Bass.dll - Player spinnt
also ich arbeite mit der bass.dll und will einen Musikplayer erstellen. Derzeit arbeite ich an einem Autocrossfading. Dazu will ich meine Play Procedur erweitern von:
Delphi-Quellcode:
Um jetzt das autocrossfading zu realisieren will ich diese Procedur so erweitern:
procedure TForm1.Play (weiter: Boolean);
var f: PChar; len: Integer; time: Tdatetime; begin try if weiter then begin bass_channelstop(p); f := PChar(list[pos].datei); p := BASS_StreamCreateFile(False, f, 0, 0, 0); if pos >= 0 then if not BASS_ChannelPlay(p, False) then Error('Error playing stream!'); position.Max := bass_channelGetLength(p); end else begin bass_channelstop(p); f := PChar(list[pos].datei); p := BASS_StreamCreateFile(False, f, 0, 0, 0); if pos >= 0 then if not BASS_ChannelPlay(p, False) then Error('Error playing stream!'); position.Max := bass_channelGetLength(p); end; except end; end;
Delphi-Quellcode:
so wenn ich das jetzt mit
procedure TForm1.Play (weiter: Boolean; ch: HSTREAM);
var f: PChar; len: Integer; time: Tdatetime; begin try if weiter then begin bass_channelstop(ch); // Play the stream (continuing from current position) f := PChar(list[pos].datei); ch := BASS_StreamCreateFile(False, f, 0, 0, 0); if pos >= 0 then if not BASS_ChannelPlay(ch, False) then Error('Error playing stream!'); position.Max := bass_channelGetLength(ch); end else begin bass_channelstop(ch); f := PChar(list[pos].datei); ch := BASS_StreamCreateFile(False, f, 0, 0, 0); if pos >= 0 then if not BASS_ChannelPlay(ch, False) then Error('Error playing stream!'); position.Max := bass_channelGetLength(ch); end; except end; end;
Delphi-Quellcode:
aufrufe wird der Track der gerade abgespielt wird nicht angehalten!
form1.play(true, p);
Wieso? //EDIT: CODE GEKÜRZT |
Re: Bass.dll - Player spinnt
Hat keiner ne Idee wieso das nicht funktioniert?
|
Re: Bass.dll - Player spinnt
Vielleicht liegt es daran, dass dein Code recht lang und noch dazu unübersichtlich formatiert ist. Versuche mal, ihn auf das Wesentliche zu reduzieren, und die einzelnen Zeilen richtig einzurücken. Dann kann man eher was erkennen / helfen.
|
Re: Bass.dll - Player spinnt
Sodele Bitte sehr!
|
Re: Bass.dll - Player spinnt
Formatiert sieht das so aus.
Für autocrossfading braichst du callback der bass.dll oder einen Timer und 2 Channels. Ich sehe nichts davon.
Delphi-Quellcode:
procedure TForm1.Play(weiter: Boolean; ch: HSTREAM);
var f: PChar; len: Integer; time: Tdatetime; begin try if weiter then begin bass_channelstop(ch); //Play the stream (continuing from current position) f := PChar(list[pos].datei); ch := BASS_StreamCreateFile(False, f, 0, 0, 0); if pos >= 0 then if not BASS_ChannelPlay(ch, False) then Error('Error playing stream!'); position.Max := bass_channelGetLength(ch); end else begin bass_channelstop(ch); f := PChar(list[pos].datei); ch := BASS_StreamCreateFile(False, f, 0, 0, 0); if pos >= 0 then if not BASS_ChannelPlay(ch, False) then Error('Error playing stream!'); position.Max := bass_channelGetLength(ch); end; except end; end; |
Re: Bass.dll - Player spinnt
das stimmt ich wollte das mit einem Timer und zwei channels regeln. Dafür möchte ich der Play procedur eine Variable ch hinzufügen die für den channel steht und HSTREAM ist aber daran bin ich gescheitert, denn die ganze procedure funktioniert nicht mehr!
|
Re: Bass.dll - Player spinnt
Machs doch einfach so:
Delphi-Quellcode:
Damit ein sanftes Einblenden des neuen Tracks kommt, kann man natürlich die Lautstärke des neuen zu Beginn auf 0 setzen und mit SlideAttributes im gewünschten Intervall die Lautstärke hochfahren.
// Flag setzen, damit das Handle beim Beenden automatisch freigegeben wird
BASS_ChannelSetFlags(ch, BASS_STREAM_AUTOFREE); //Aktuellen Stream ausblenden. // -2 steht dabei für Lautstärke auf 0 und stoppen // -1 und -101 lassen Balance und Samplerate (glaube ich) unverändert BASS_ChannelSlideAttributes(ch,-1,-2,-101,FadingInterval) // Jetzt kannst du ch getrost mit nem neuen Stream belegen f := PChar(list[pos].datei); ch := BASS_StreamCreateFile(False, f, 0, 0, 0); //usw. |
Re: Bass.dll - Player spinnt
Liste der Anhänge anzeigen (Anzahl: 1)
Also meine Idee war, dass ich dann zwei Streams laufen hab und der eine dann aufhöhrt und der andere weiterläuft aber soweit bin ich noch gar nicht. Ich will, wenn ein Track abgespielt wird und ein bestimmter Zeitpunkt erreicht ist, dass schon der nächste Trackgestartet wird Crossfade halt. Aber um den nächsten zustarten will ich meine Play procedur mit einem anderen Stream ausführen und daher diese erweitern. Ich habe das auch getan aber wie gesagt wird beim einfachen Abspielen der Tracks, wenn man zum Beispiel einfach nur auf Playklickt und einen anderen Track abspielen möchte der vorhergehende nicht angehalten, was aber normalerweise mit dem erneuten aufruf der play geschehen müsste. Dazu hier mal mein Timer ereignis!
Delphi-Quellcode:
Bei diesem Timer ereignis und der Erweiterten Play Procedur ensteht allerdings ein neues Problem. Aus irgendeinem Grund wird jetzt Bei jedem Ontimer also in diesem Falle jede Sekunde der nächste Track in der Playlist geöffnet und abgespielt nach 10 sek laufen also 10 Tracks übernander. Mit der alten Procedur trat das Problem nicht auf und alles Funktionierte wie es sollte.
procedure TForm1.Timer2Timer(Sender: TObject);
var i: Integer; f: PChar; begin try tpassd := tpassd + 1; position.Position := bass_channelgetposition(p); if bass_channelgetposition(p) = bass_channelgetlength(p) then play(true); remain.Caption := inttostr (currentl div 1000 - tpassd); //-----------Crossfader------------------------// if settings.CheckBox1.Checked then begin if ((currentl div 1000) - tpassd) <= strtoint(settings.LabeledEdit1.Text) then begin i := 100 div strtoint(settings.LabeledEdit1.text); fade1 := fade1+i; bass_channelsetattributes(p2, 0, fade1, -101); end; if ((currentl div 1000) - tpassd) = strtoint(settings.LabeledEdit1.Text) then begin play (true, p2); end; end; //--------------------------------------------// } except end; end; Hier mal das komplette Program: |
Re: Bass.dll - Player spinnt
Also ich blicke bei deinen ganzen Vars nicht durch...Ständig im Timer etwas wie StrToInt(Edit1.Text) zu machen halte ich auch für etwas ungünstig. Hier mal der betreffende Auszug aus der Timer-Prozedur meines Players. Die Funktionsnamen sollten einigermaßen selbsterklärend sein oder als Pseudo-Code angesehen werden.
In StopAndFree wird der laufende Stream gestoppt/ausgefadet, GetNExtAudioFile liefert das nächste abzuspielende Stück und FadingInterval ist das vom User gewünschte Fading-Intervall.
Delphi-Quellcode:
Warum du in deiner Prozedur mehrere "Play" drinhast, ist mir nicht klar. Außerdem musst du ja nach dem Faden die Variablen p und p2 wieder so umhängen, dass das p2 zum p wird. Da halte ich es für einfacher, wenn man das Faden ganz der bass.dll überlässt, und beim Titelwechsel direkt den alten Stream "vergisst", während er sanft ausgeblendet wird.
if (Bass_ChannelBytes2Seconds(MainStream,Bass_ChannelGetLength(MainStream))
- Bass_ChannelBytes2Seconds(MainStream,Bass_ChannelGetPosition(MainStream)) <= (FadingInterval DIV 1000)) //also: if "fast am Ende" then begin // alten Stream stoppen und freigeben, vgl. Code oben StopAndFree; //Nächste Datei abspielen Play(GetNextAudioFile, FadingInterval) end; Denselben Code musst du dann auch beim manuellen Titelwechsel ausführen. |
Re: Bass.dll - Player spinnt
Also das mit den zwei Playproceduren sieht immo sinnlos aus aber wenn man den ganzen Code anguckt ist die Var weiter dafür verantwortlch ob einfach nur der nächste Track oder ein bestimmter Track abgespielt werden soll. Je nachdem wird pos geändert.
Könntest du bitte mal den Crossfade code von deinem Player posten. Ich verstehe nicht ganz was du meinst! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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