AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bass.dll - Player spinnt
Thema durchsuchen
Ansicht
Themen-Optionen

Bass.dll - Player spinnt

Ein Thema von smepal · begonnen am 3. Aug 2006 · letzter Beitrag vom 18. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von smepal
smepal

Registriert seit: 25. Okt 2005
Ort: Bechen
58 Beiträge
 
Delphi 2005 Personal
 
#1

Bass.dll - Player spinnt

  Alt 3. Aug 2006, 17:49
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
form1.play(true, p); aufrufe wird der Track der gerade abgespielt wird nicht angehalten!
Wieso?

//EDIT: CODE GEKÜRZT
Martin Krämer
Be water my friend!!!
  Mit Zitat antworten Zitat
Benutzerbild von smepal
smepal

Registriert seit: 25. Okt 2005
Ort: Bechen
58 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Bass.dll - Player spinnt

  Alt 4. Aug 2006, 11:42
Hat keiner ne Idee wieso das nicht funktioniert?
Martin Krämer
Be water my friend!!!
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Bass.dll - Player spinnt

  Alt 4. Aug 2006, 11:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von smepal
smepal

Registriert seit: 25. Okt 2005
Ort: Bechen
58 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Bass.dll - Player spinnt

  Alt 4. Aug 2006, 12:18
Sodele Bitte sehr!
Martin Krämer
Be water my friend!!!
  Mit Zitat antworten Zitat
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Bass.dll - Player spinnt

  Alt 4. Aug 2006, 12:56
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;
Besucht doch mal meine Homepage
  Mit Zitat antworten Zitat
Benutzerbild von smepal
smepal

Registriert seit: 25. Okt 2005
Ort: Bechen
58 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Bass.dll - Player spinnt

  Alt 4. Aug 2006, 13:44
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!
Martin Krämer
Be water my friend!!!
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Bass.dll - Player spinnt

  Alt 4. Aug 2006, 14:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von smepal
smepal

Registriert seit: 25. Okt 2005
Ort: Bechen
58 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Bass.dll - Player spinnt

  Alt 4. Aug 2006, 14:40
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:
Angehängte Dateien
Dateityp: rar audioplayer_1_2_1_0_150.rar (359,0 KB, 60x aufgerufen)
Martin Krämer
Be water my friend!!!
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Bass.dll - Player spinnt

  Alt 4. Aug 2006, 15:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von smepal
smepal

Registriert seit: 25. Okt 2005
Ort: Bechen
58 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Bass.dll - Player spinnt

  Alt 6. Aug 2006, 12:56
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!
Martin Krämer
Be water my friend!!!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz