Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bass.dll - Player spinnt (https://www.delphipraxis.net/74468-bass-dll-player-spinnt.html)

smepal 3. Aug 2006 16:49


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:
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;
Um jetzt das autocrossfading zu realisieren will ich diese Procedur so erweitern:
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;
so wenn ich das jetzt mit
Delphi-Quellcode:
form1.play(true, p);
aufrufe wird der Track der gerade abgespielt wird nicht angehalten!
Wieso?

//EDIT: CODE GEKÜRZT

smepal 4. Aug 2006 10:42

Re: Bass.dll - Player spinnt
 
Hat keiner ne Idee wieso das nicht funktioniert?

Gausi 4. Aug 2006 10:59

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.

smepal 4. Aug 2006 11:18

Re: Bass.dll - Player spinnt
 
Sodele Bitte sehr!

Gandalfus 4. Aug 2006 11:56

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;

smepal 4. Aug 2006 12:44

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!

Gausi 4. Aug 2006 13:00

Re: Bass.dll - Player spinnt
 
Machs doch einfach so:
Delphi-Quellcode:
// 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.
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.

smepal 4. Aug 2006 13:40

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:
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;
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.
Hier mal das komplette Program:

Gausi 4. Aug 2006 14:06

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:
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;
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.

Denselben Code musst du dann auch beim manuellen Titelwechsel ausführen.

smepal 6. Aug 2006 11:56

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.
Seite 1 von 2  1 2      

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