Axtivex bileşenli Media Player nesnesinde sıralı çalma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Axtivex bileşenli Media Player nesnesinde sıralı çalma

Mesaj gönderen baloglurecep »

Dostlar selamlar saygılar.... Öğretmenim. Delphi7 ile yıllar önce yazdığım ve sonrasında bir iki güncelleme yaptığım okul zil programını ve donanımını Teknofest'e proje olarak katılmak istiyorum. Sorunsuz olmasına çabalıyorum. Tenefüs aralarında isteğe bağlı şarkı çaldırma kısmı eklmiştim. Activex bileşen kullanmadığım zamanda (eski versiyonda normal mediaplayer nesnesi kullandım) sorunsuz çalışan precedurüm activex bileşeninde işe yaramıyor. Activex nesnesine geçmemin sebebi de stop durumunu statechage olayında anlayabilmem. Normal Media Player nesnesinde bunu anlayamıyorum. Aynı procedur normal plsyer nesnesinde sorunsuz çalışırken activex nesnesinde çalışmıyor. Sebebini de bir türlü çözemedim. Listboxta yüklü olan şarkı listesini sıra ile ya da karışık olarak tenefüs boyunca çalacak. Yalnız ilk şarkıyı çalıp diğerine geçince ilgili şarkıya konumlanıyor(listboxta ilgili satır renkleniyor) ancak play koduna yanıt vermiyor. Eski mediaplayer nesnesinde aynı procedurum gayet sorunsuz çalışıyordu. Ancak onda da player nesnesinin stop durumunu alamadığım için activex nesnesine geçtim. (Stop durumunda portu kontrol ederek amfiyi açıp kapatıyorum, telefonumdan internete bağlı olan cihaz üzerinden programa komut göndererek de istediğim zili çaldırabiliyorum bu yüzden önemli)

tenefüs adında bir procedur oluşturdum.
Procedurum bu şu şekilde


procedure Tform1.TENEFUS;
VAR I:INTEGER;
begin

IF DirectoryExists(Edit1.Text) THEN
BEGIN

IF bsSkinFileListBox1.Items.Count>0 THEN
BEGIN
IF bsSkinCheckRadioBox4.Checked THEN //SIRALI ÇAL
BEGIN
IF StrToInt(SON_MELODI.Caption)>=bsSkinFileListBox1.Items.Count-1 THEN
SON_MELODI.Caption:='0'
ELSE
SON_MELODI.Caption:=INTTOSTR(STRTOINT(SON_MELODI.Caption)+1);
Player1.controls.stop;
bsSkinFileListBox1.ItemIndex:=STRTOINT(SON_MELODI.Caption);
Player1.URL:=bsSkinDirectoryListBox1.Directory+'\'+bsSkinFileListBox1.Items[STRTOINT(SON_MELODI.Caption)];
Player1.controls.play;
END; //SIRALI ÇAL SON

IF bsSkinCheckRadioBox5.Checked THEN //KARIŞIK ÇAL
BEGIN
IF bsSkinFileListBox1.Items.Count>1 THEN
BEGIN
Randomize;
REPEAT
I:=RANDOM(bsSkinFileListBox1.Items.Count);
UNTIL I<>STRTOINT(SON_MELODI.Caption);
END
ELSE I:=0;
Player1.controls.stop;
SON_MELODI.Caption:=INTTOSTR(I);
bsSkinFileListBox1.ItemIndex:=STRTOINT(SON_MELODI.Caption);
Player1.URL:=bsSkinDirectoryListBox1.Directory+'\'+bsSkinFileListBox1.Items;
Player1.controls.play;
END;//KARIŞIK ÇAL SON
END;
END;
end;

playerin playstatechange olayında da stop durumunu okuyarak

if (NewState = wmppsStopped ) then begin
TENEFUS;
end;

İlginçtir ki play yapmıyor. ilk şarkı çalıyor ikinci ve sonrası şarkılara ilerlemiyor. newstate ait tüm seçenekleri denedim yine olmadı. Sizce ikinci defa ve sonrasında diğer şarkılar neden çalışmaz dostlar? Yorumlarınızı bekler kolaylıklar dilerim.
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: Axtivex bileşenli Media Player nesnesinde sıralı çalma

Mesaj gönderen ertank »

Merhaba,

MediaPlayer bileşeni ile şarkının çalması bittiğini OnNotify olayını kullanarak anlamak mümkün.

Maalesef artık Delphi 7 kullanmıyorum. Ancak Delphi 10.4.2 ile test edilmiş proje örneği ektedir. Şarkı çalmaya başladığında ve bittiği zaman Memo bileşeni içine aşağıdaki gibi kayıtlar yazıyor.

Kod: Tümünü seç

2022-11-30 22:20:03.378  Çal: Successful
2022-11-30 22:23:24.980  Bitti: Successful
2022-11-30 22:31:08.861  Çal: Successful
2022-11-30 22:35:12.478  Bitti: Successful
Sıralı ve Karışık özelliği için gerekli kodlamayı yapmadım. Sizin için şarkı bittiğini anlamak zaten yeterli oluyor.

Uygulama FormCreate metodunda ilgili dizin ve dosya eki ile şarkı listesini dolduruyor. İlgili dizin veya dizin içinde filtreye uygun dosya yoksa liste boş olur ve şarkı çalma yapılamaz.
Dosya ekleri
mp3_play.rar
(2.76 KiB) 46 kere indirildi
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Axtivex bileşenli Media Player nesnesinde sıralı çalma

Mesaj gönderen baloglurecep »

Ertank hocam öncelikle mesajınız için çok teşekkür ederim. Yalnız delphi 7 kullandığım için yeni delphi içinde olan dahili metodlar ve unitler olmadığından projeyi derleme yapamadım. Dolayısı ile de test edemedim. İmkan varsa exeli olarak da gönderme imkanınız olabilir mi? Şunu sormak isterim birde... Kullanıcı zil seçenekleri kısmında zil olarak belirlediği parçanın tamamını ya da kullanıcının spinedit içine girdiği saniye değerinde çaldırabilir. Dolayısı ile de kısa süreli çalmada stop ettirerek durduruyorum. o anda da algılanır mı bilmiyorum. Daha önce okuduğum yabancı bir forumda mediaplayerin onNotify olayında sadece media player nesnesi üzerindeki butonlara dokunularak işlem yapılırsa notify özelliği aktif olacağı ifade ediliyordu. Yani herhangi bir sebeple mediaplayer durduğunda bunu anlamak onnotify ile anlamak mümkün değil diye bir yazı okudum. Doğruluğunu teyit edemedim.

Kod: Tümünü seç

if (ANFI_CHECK_ONN.Checked=true) and (ComPort1.Connected)and(KNTRL_EDIT.Checked=false) then
  begin

   if  (Player1.Mode = mpStopped) then Begin

       if TENEFUS_DURUMU.Caption<>'4' Then
        Begin
        zaman_al:=Now;
        zaman_al:=IncSecond(zaman_al,Trunc(ANFI_SPIN2.Value));
        LABEL_ANFIKAPAT.caption:=FormatDateTime('hh:nn:ss',zaman_al);
       End;
      End
    else if (Player1.Mode = mpPlaying) then
      Begin
      LABEL_ANFIKAPAT.caption:='0';
      End;
   end;
Yukarıda normal mediaplayer onnotify olayı içindeki kod var. Burada tenefüs dışında zamanda media player stop ederse(zil çalıp süresi gelince stop ettirilirse) ettiği zaman saati alıyorum ve kullanıcının belirdiği süre sonrasında amfiyi kapatan kodu gönderiyorum. Stop ettiğini anlamadığı için amfi de kapatan komut gitmiyor.

Tekrar çok teşekkür ediyorum.
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: Axtivex bileşenli Media Player nesnesinde sıralı çalma

Mesaj gönderen ertank »

Merhaba,

ActiveX kullanmanıza gerek yok. TMediaPlayer.OnNotify Delphi 7 zamanından beri mevcut ve kullanımı da birebir aynı. Örnek kodları paylaştığım proje içinden alıp Delphi 7 projesine uygulamanız yeterli olacaktır.
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Axtivex bileşenli Media Player nesnesinde sıralı çalma

Mesaj gönderen baloglurecep »

Ertank bey hocam projeyi delphi 7 ile derleyemediğimden dolayı ben de dediğinizi yapmıştım. Çalışma şeklinde melodi dışardan elle durdulduğunda aborted ile yakalanıyor. ancak parça bittiğinde ya da bir sorunla durduğunda anlamıyor. Örneğin çalan şarkı bitti yine succesful mesajı veriyor. Her şekilde stop durumunu algılamam ihtiyacımı görecek. Activexte bu durum sorun olmadı. Statechange olayında her kısmı yakaladım. Yalnız onda da sorunsuz çalışan tenefus precedurum çalışmadı. Yani tenefüslerde kullanıcı iznine bağlı belirlenen klasördeki parçalı sralı ya da karışık çaldırma. Ya activexteki bir sonraki parçaya geçme sorununu halletmem ya da normal media playerdeki notify olayında stop durumunu çözmem gerekiyor. İnşallah çözeceğim. Çalışmalara devam ediyorum. desteğiniz için tekrar teşekkkür eder kolaylıklar dilerim. :bravo: :bravo:
Dosya ekleri
media player 2.rar
(200.41 KiB) 42 kere indirildi
Cevapla