Odtwarzacz delphi - Lista odtwarzania

0

Proszę o pomoc w dopracowaniu odtwarzacza

1.)Jak podczas uruchamiania formy otworzyć folder, zaznaczyć wszystkie elementy i załadować do TListBox,
najlepiej gdyby odbywało się to bez widoku okna Open dialogu.
Chodzi o ładowanie otworów MP3 do odtwarzacza (przy starcie formy).
2.) Jak najlepiej tworzyć listy odtwarzania (bez odwołania do tagów). Czyli ładuje do Tlistbox Utwory, wyboru Listy dokonuje poprzez mainmenu. Wiem ze bez ini sie nie obejdzie ale proszę o wskazanie kierunku jak najprościej to zrobić. (jeśli ktoś z Was stosował podobne rozwiązanie będę wdzięczny za jakiś przykładowy kod).

To jedna z moich pierwszych Form wiec proszę o wyrozumiałość.

0
  1. Użyj google "wybór katalogu delphi" ;p
  2. Użyj google "listowanie plików w katalogu"
  3. obejdzie się bez INI - wystarczy Ci TStringList
0

Ja ładuje za pomoca opendialog, gdzie ustawiam ofAllowMultiSelect na True
a reszta odbywa się tak:

var
i : integer;
begin
if OpenDialog1.Execute then
    for I := 0 to OpenDialog1.Files.Count - 1 do 
    ListBox1.Items.Add(ExtractFileName(OpenDialog1.Files.Strings[i]));
end;
0

Niestety Bruno powyższa procedura niewiele mi daje, nie rozwiązuje problemu który opisałem
w chwili obecnej za ręczne ładowanie u mnie odpowiada poniższy kod.

var
   i: Integer;
begin
       if OpenD.Execute then
           if(music_List.Items.Count > 0)then
              music_List.Items.Clear;
               for i:= 0 to OpenD.Files.Count-1 do
              begin
                 music_List.Items.Add(OpenD.Files[i]);
              end;
           if(OdtworzOdRazu)then
          begin
        music_List.ItemIndex:= 0;
       Play;
    end;
end;

jak go zmienić by ładował wszystkie pliki z określonego folderu.

0
{********Szukanie plików mp3*****}
procedure listfiles(dir, mask: string);
var 
  rec:   TSearchRec;
  found: Integer;
begin
  if dir[Length(dir)] <> '\' then dir := dir + '\';
  found := findfirst(dir + mask, faAnyFile, rec);
  try
   Form1.ListBox1.ScrollWidth := 0;
   Screen.Cursor := crAppStart;
  
    while found = 0 do 
    begin
      Application.ProcessMessages;
      if (rec.Attr and faDirectory <= 0) then
        Form1.ListBox1.Items.Add(dir + rec.Name);
      found := findnext(rec);
    end;
  finally
    findclose(rec);
  end;
  found := findfirst(dir + '*.*', faAnyFile, rec);
  try
    while found = 0 do 
    begin
      if (rec.Attr and faDirectory > 0) and (rec.Name[1] <> '.') then
        ListFiles(dir + rec.Name, mask);
      found := findnext(rec);
    end;
  finally
   
    Screen.Cursor := crDefault;

    Form1.Caption  :=  inttostr('Znalezionych plików mp3 '+Form1.ListBox1.Items.Count);


    findclose(rec);
  end;
end; //----koniec szukania


// wykonanie w oncreate formy:

ListFiles('c:\Test' ,'*.mp3');

A jeśli chcesz mieć w listbox same nazwy zmien w powyzszej procedurze na

Form1.ListBox1.Items.Add(ExtractFileName(dir + rec.Name));

a do otwarcia zastosuj

var
i : integer;
begin
i := ListBox1.itemindex;
Play('C:\Test\'+ListBox1.items[i]+'.mp3');

Pozdrawiam

0

Najprościej

var sciezka:string;
//...
  sciezka:='C:\utwory\';
//..
  ListBox1.Perform(LB_DIR,DDL_READWRITE,LongInt(@(sciezka+'*.mp3'#0)[1]));
0

Ja tylko dodam, uprzedzając być może kolejne pytania, że pod koniec kodu Bruno(M) powinno być:

Form1.Caption := 'Znalezionych plików mp3 ' + inttostr(Form1.ListBox1.Items.Count);
0

Form1.ListBox1.Items.Add(dir + rec.Name);

Do playlisty to raczej dodaje się nazwy piosenek, nie plików...

0

Ok Dzięki Bruno(M) lista się wczytuje. A odnośnie 2go pytania z listami odtwarzania- jakieś sugestie.
Myślę ze rada

"3. obejdzie się bez INI - wystarczy Ci TStringList'

Raczej się nie przyda, dana playlista z muzyką ma pozostawać w pamięci nawet gdy nie pracuje. Ale mogę się mylić i faktycznie wystarczy TStringList.

0

TStringList posiada metody do zapisywania i odczytywania plików. Jest to zwyczajna lista linii tekstu (a la listbox, memo, itp.). Myślę, że do zapisania jakichś prostych informacji (typu: pliki znajdujące się na playliście) Ci wystarczy i nie trzeba do tego zaprzęgać INI.

0

Dodam jeszcze, że jeżeli będziesz miał na liście załadowane pliki z różnych katalogów - polecam zrobienie dodatkowej listy (np. tablicy rekordowej) w której to zamieścisz dane takie jak:

  • wyświetlana nazwa na liście utworów
  • ścieżka katalogu, w którym znajduje się plik utworu
  • tagi mp3
  • inne
    Utwórz tablicę dynamiczną i przerób komponent TListBox; Napisz nową procedurę Add i Delete, w których to wywołasz bazowe metody + uzupełnisz tablicę rekordową nowymi danymi; Napisz sobie także metodę DrawItem, by odczytaną długość utworu wyświetlić po prawej stronie (a la WinAMP);

Ja już wielokrotnie wykorzystywałem właśnie taką tablicę podczas pracy z komponentem TListBox, TCheckListBox i naprawdę polecam; Możesz mieć kłopot z przerzucaniem danych w tej tablicy przy dodawaniu / usuwaniu utworów ale dojdziesz do tego; Jeżeli będziesz chciał zapisać listę przy zamykaniu aplikacji możesz ją zapisać do pliku typowanego; Łatwo będzie ją z powrotem odczytać;

tayamoto napisał(a)

proszę o wskazanie kierunku jak najprościej to zrobić.

Nie zastanawiaj się nad tym, by to zrobić jak najprościej tylko jak najlepiej - trochę dłużej przy tym posiedzisz ale w zamian dostaniesz lepszy efekt;

0

Odtwarzacz jest tylko jedna z form większego projektu, wiec nie musi być tak rozbudowany, dlatego robię go na Mplayerze a nie Bass itp.
Docelowo zależało mi na tym by wczytywał przy starcie utwory (kilkaset) a potem z nich można było wyselekcjonować kilka list odtwarzania, wywołanych z MMenu.

W tej chwili cały kod wygląda tak następująco (wyjadacze pewnie się pośmieją (jestem zielony :)) proszę o uwagi, sugestie)


procedure TOdtwarzacz.Play;
begin
    mediaPlayer.FileName:= music_List.Items.Strings[music_List.ItemIndex];
      mediaPlayer.Open;
      ScrollBar2.Max := MediaPlayer.Length;
      mediaPlayer.Play;
 end;

procedure TOdtwarzacz.OtworzPliki(OdtworzOdRazu : Boolean);
var
   i: Integer;
begin
     if (OpenD.Execute) and(music_List.Items.Count > 0)then
       music_List.Items.Clear;
         for i:= 0 to OpenD.Files.Count-1 do
             begin
                music_List.Items.Add(OpenD.Files[i]);
              end;
           if(OdtworzOdRazu)then
          begin
        music_List.ItemIndex:= 0;
       Play;
   end;
end;

procedure TOdtwarzacz.Otwrzplik1Click(Sender: TObject);
 begin
  OtworzPliki(True);
 end;

procedure TOdtwarzacz.Dodajpliki1Click(Sender: TObject);
 begin
  OtworzPliki(False);
 end;

procedure TOdtwarzacz.mediaPlayerNotify(Sender: TObject);
begin
  if mediaPlayer.NotifyValue = nvSuccessful then
    begin
      if(Cshuffle.checked)then
      begin
        LosujUtwory;
      end
      else
      begin
        if(music_List.ItemIndex = music_List.Items.Count-1)then
          music_List.ItemIndex:= 0
        else
          music_List.ItemIndex:= music_List.ItemIndex+1;
        Play;
      end;
    end;
end;

procedure TOdtwarzacz.Button1Click(Sender: TObject);
begin
    Play;
 end;

procedure TOdtwarzacz.Button2Click(Sender: TObject);
begin
    mediaPlayer.pauseonly;
end;

procedure TOdtwarzacz.Button8Click(Sender: TObject);
 begin
    mediaplayer.Play;
 end;

procedure TOdtwarzacz.Button3Click(Sender: TObject);
 begin
   mediaplayer.Stop;
 end;

procedure TOdtwarzacz.Button5Click(Sender: TObject);
 begin
    music_List.ItemIndex:= music_List.ItemIndex+1;
  play;
 end;

procedure TOdtwarzacz.Button4Click(Sender: TObject);
begin
     music_List.ItemIndex:= music_List.ItemIndex-1;
     play;
end;

procedure TOdtwarzacz.Button9Click(Sender: TObject);
begin
   if(music_List.Items.Count > 0)then
    music_List.Items.Clear
end;

procedure TOdtwarzacz.Button6Click(Sender: TObject);
 begin
     if(music_List.Items.Count > 0)then
     music_list.DeleteSelected;
 end;

Procedure TOdtwarzacz.LosujUtwory;
begin
    Randomize;
    music_list.ItemIndex:= Random(music_list.Items.Count + 1);
    play;
end;

procedure SetWavVolume(Lewy,Prawy:Byte);
begin
 waveOutSetVolume(WAVE_MAPPER, Integer((Lewy shl 24) or (Prawy shl 8 )));
end;

procedure SetCDVolume(Lewy,Prawy:Byte);
  begin
    auxSetVolume(0, Integer((Lewy shl 24) or (Prawy shl 8 )));
  end;
procedure TOdtwarzacz.ScrollBar1Change(Sender: TObject);
  begin
  form1.ProgressBar1.Position := ScrollBar1.Position;
  if ScrollBar1.Position = 60 then WaveOutSetVolume(0, $ffffffff)
  else WaveOutSetVolume(0,$ff*ScrollBar1.Position*1024*$ff);
end;

procedure TOdtwarzacz.Timer1Timer(Sender: TObject);
begin
  If MediaPlayer.FileName = '' Then Exit;
    ScrollBar2.Position := MediaPlayer.Position;
end;

procedure TOdtwarzacz.ScrollBar2Scroll(Sender: TObject;
  ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
   MediaPlayer.Position := ScrollBar2.Position;
   mediaplayer.Play;
 end;
procedure TOdtwarzacz.Button7Click(Sender: TObject);
 begin
  ScrollBar1.Position:= 0
 end;

procedure Todtwarzacz.listfiles(dir, mask: string);
var 
  rec:   TSearchRec;
  found: Integer;
begin
   if dir[Length(dir)] <> '\' then dir := dir + '\';
    found := findfirst(dir + mask, faAnyFile, rec);
  try
    Music_list.ScrollWidth := 0;
    Screen.Cursor := crAppStart;
    while found = 0 do
    begin
      Application.ProcessMessages;
      if (rec.Attr and faDirectory <= 0) then
      music_list.Items.Add(dir + rec.Name);
        //Music_list.Items.Add(ExtractFileName(dir + rec.Name));
      found := findnext(rec);
    end;
  finally
    findclose(rec);
  end;
  found := findfirst(dir + '*.*', faAnyFile, rec);
  try
    while found = 0 do 
    begin
      if (rec.Attr and faDirectory > 0) and (rec.Name[1] <> '.') then
      ListFiles(dir + rec.Name, mask);
      found := findnext(rec);
    end;
  finally
    Screen.Cursor := crDefault;
   Label3.Caption := 'Znalezionych plików mp3  - ' + inttostr(Music_list.Items.Count);
  findclose(rec);
  end;
end;

procedure TOdtwarzacz.FormCreate(Sender: TObject);
 begin
   ListFiles('d:\muzyka' ,'*.mp3');
   ScrollBar1.Position:= 30;
 end;
end.

 
0

Jeśli chodzi o ten kawałek kodu:

procedure TOdtwarzacz.Play;
begin
  mediaPlayer.FileName:= music_List.Items.Strings[music_List.ItemIndex];
  mediaPlayer.Open;
  ScrollBar2.Max := MediaPlayer.Length;
  mediaPlayer.Play;
end;

trzeba dodać warunek, bo jak klikniesz na puste pole w TListBox to wtedy ItemIndex zostaje ustawiony na -1:

procedure TOdtwarzacz.Play();
begin
  if music_List.ItemIndex <> -1 then
    begin
      mediaPlayer.FileName := music_List.Items.Strings[music_List.ItemIndex];
      mediaPlayer.Open();
      ScrollBar2.Max := MediaPlayer.Length;
      mediaPlayer.Play();
    end;
end;

Następnie:

if (rec.Attr and faDirectory > 0) and (rec.Name[1] <> '.') then

katalog, który na pewno chciałbyś ominąć ma nazwę .. więc dodaj go do warunku;

1 użytkowników online, w tym zalogowanych: 0, gości: 1