hallo community
ich arbeite derzeit an einem moeglichst schlanken programm, was musik mit hilfe der bass.dll abspielen soll.
im hauptfenster befindet sich eine playlist, in die man mittels einer prozedur lieder hinzufuegen kann. die prozedur:
Delphi-Quellcode:
procedure AddTrack(s:
String);
var
//TStrList ist ein nachbau der TStrlinglist klasse. in wesentlichen ist es das selbe
m3ulist: TStrList;
i: LongInt;
//HSTREAM ist in der bass.pas definiert. ist vom typ LongWord
tmpstream: HSTREAM;
begin
//unsere datei wird gerendert
tmpstream := BASS_StreamCreateFile(False, @s[1], 0, 0, 0);
//wenn das handle nicht 0 ist, die datei also eine gueltige audio datei ist..
if tmpstream <> 0
then
begin
//playlist ist mein TStrList objekt, indem ich meine dateinamen der playlist sichere
Playlist.Add(s);
SendMessage(hList, LB_ADDSTRING, 0, LongInt(PChar(ExtractFileName(s))));
//den stream wieder freigeben, da er nur erstellt wurde um die gueltigkeit der audio datei zu pruefen
BASS_StreamFree(tmpstream);
//wenn das neu hinzugefuegte lied das erste ist, soll es auch gleich abgespielt werden
if SendMessage(hList, LB_GETCOUNT, 0, 0) = 1
then play(track);
end else
begin
//wenn die datei keine gueltige audio datei ist, wird die extension der datei geprueft
//ist diese nicht m3u, wird die procedure verlassen
if FileExt(s) <> '
m3u'
then exit;
//die stringlist wird erstellt und die playlist geladen
m3ulist := TStrList.Create;
m3ulist.loadfromfile(s);
//der pfad der playlist wird ermittelt. im grunde das selbe wie ExtractFilePath()
while s[length(s)] <> '
\'
do
Delete(s, length(s), 1);
//schleife die jedes element durchgehen soll
for i := 0
to m3ulist.Count - 1
do
//ist das erste zeichen ein #, handelt es sich um eine extended m3u playlist. die zeile ist ein kommentar oder eine zusatz information. ich ignoriere diese informationen vorerst
if m3ulist.strings[i][1] <> '
#'
then
//IsDrive() prueft den pfad. gibt true zurueck, wenn der pfad mit einem laufwerksbuchstaben beginnt
if IsDrive(m3ulist.strings[i])
then
AddTrack(m3ulist.strings[i])
else
AddTrack(s + m3ulist.strings[i]);
m3ulist.Free;
end;
end;
diese prozedur funktioniert tadellos. auch m3u playlist werden erfolgreich ausgelesen. allerdings beobachte ich ein seltsames phaenomen. will ich eine playlist per drag&drop hinzufuegen, sind die dateien nur bedingt abspielbar. man kann beispielsweise das lied nicht per doppelklick abspielen. der aufruf ist genau der selbe, nur findet er an einer anderen position statt
mein drag&drop teil:
Delphi-Quellcode:
var
tmpstr: String;
iDrop,
fSize: LongInt;
..
WM_DROPFILES:
begin
for iDrop := 0 to DragQueryFile(wParam, $FFFFFFFF, @tmpstr[1], 255) - 1 do
begin
fSize := DragQueryFile(wParam, iDrop, nil, 0) + 1;
SetLength(tmpstr, fSize);
DragQueryFile(wParam, iDrop, @tmpstr[1], fSize);
AddTrack(tmpstr);
end;
DragFinish(wParam);
end;
ich bin langsam ratlos. ich verstehe nicht, warum der selbe aufruf an einer anderen position nichtmehr funktioniert. ich hoffe, ich habe mich verstaendlich gemacht :)
falls es helfen soll, gebe ich auch gerne den gesamten quelltext raus. das programm soll ohnehin open source werden