Bu derste D ve Vala dilleri ile ses çalıcısı yapmaya çalışacağız
Daha önce D dili ile ses çalıcısı yapmıştık.
Bu sefer hem Vala hem D dilleri ile pencereli bir ses çalıcısı yapmaya çalışacağız.
Aşağıdaki kütüğü çalıcı.d olarak kaydediniz.
import std.string : kırp = strip;
import std.file : varMı = exists;
import std.stdio : yaz = writeln;
import gio.Application : Uygulamamız = Application;
import glib.ErrorG : Hata = ErrorG;
import gtk.Application;
import gtk.ApplicationWindow : UygulamaPenceresi = ApplicationWindow;
import gtk.Label : Etiket = Label;
import gtk.Entry : GirişKutusu = Entry;
import gtk.Button : Düğme = Button;
import gtk.Box : Kutu = Box;
import gtk.Main : Ana = Main;
import gtk.Widget : Pencere = Widget;
import gdk.Event : Olay = Event;
import gstreamer.Element : Eleman = Element;
import gstreamer.ElementFactory : ElemanÜretici = ElementFactory;
import gstreamer.Bus : VeriYolu = Bus;
import gstreamer.Message : İleti = Message;
import gstreamer.Message : İletiTürü = GstMessageType;
import gstreamer.Message : Durum = GstState;
import gstreamer.GStreamer : SesKütüphanesi = GStreamer;
alias dikey = Orientation.VERTICAL;
class Çalıcı : UygulamaPenceresi
{
GirişKutusu girişKutusu;
Düğme düğme;
Kutu kutu;
Eleman oynatıcı;
VeriYolu veriYolu;
this (Uygulama uygulama)
{
super(uygulama);
setTitle("Ses oynatıcısı");
setDefaultSize(300, -1);
kutu = new Kutu(dikey, 0);
add(kutu);
girişKutusu = new GirişKutusu();
kutu.packStart(girişKutusu, false, true, 0);
düğme = new Düğme();
düğme.setLabel("Çal");
düğme.addOnClicked(&oynat);
kutu.add(düğme);
showAll();
oynatıcı = ElemanÜretici.make("playbin", "oynatıcı");
veriYolu = oynatıcı.getBus();
veriYolu.addSignalWatch();
veriYolu.addOnMessage(&iletileriOku);
}
void oynat (Düğme düğme)
{
if (düğme.getLabel() == "Çal")
{
string kütükİsmi = kırp(girişKutusu.getText());
if (varMı (kütükİsmi))
{
düğme.setLabel("Dur");
oynatıcı.setProperty("uri", "file://" ~ kütükİsmi);
oynatıcı.setState(Durum.PLAYING);
}
else
{
oynatıcı.setState(Durum.NULL);
düğme.setLabel("Çal");
}
}
else if (düğme.getLabel() == "Dur")
{
oynatıcı.setState(Durum.PAUSED);
düğme.setLabel("Çal");
}
}
void iletileriOku(İleti ileti, VeriYolu veriYolu)
{
auto tür = ileti.type();
if (tür == İletiTürü.EOS)
{
oynatıcı.setState(Durum.NULL);
düğme.setLabel("Çal");
}
else if (tür == İletiTürü.ERROR)
{
Hata hata;
string hataYakalama;
oynatıcı.setState(Durum.NULL);
ileti.parseError(hata, hataYakalama);
}
}
}
class Uygulama : Application
{
this()
{
super("sesi.ac.bakalim", GApplicationFlags.FLAGS_NONE);
pencereOluştur();
}
void pencereOluştur()
{
this.addOnActivate(delegate void(Uygulamamız uygulamamız)
{
auto pencere = new Çalıcı(this);
pencere.showAll();
});
}
}
int main (string[] seçenekler)
{
Ana.init (seçenekler);
SesKütüphanesi.init (seçenekler);
auto uygulama = new Uygulama();
return uygulama.run(seçenekler);
}
Uygulamayı derlemek için şu komutu veriniz :
gdc çalıcı.d -I/usr/include/d/gtkd-3 -L /usr/lib -lgtkd-3 -lgstreamerd-3 -o çalıcı
Aşağıdaki kütüğü calici.vala
ismi ile kaydediniz.
using Gtk;
using Gst;
class Calici : Gtk.ApplicationWindow
{
Gtk.Entry girisKutusu;
Gtk.Button dugme;
Gtk.Box kutu;
Gst.Element oynatici;
Gst.Bus veriYolu;
public Calici(Uygulama uygulama)
{
GLib.Object(application:uygulama, title:"Ses oynatıcısı");
set_default_size(300, -1);
kutu = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
add(kutu);
girisKutusu = new Gtk.Entry();
kutu.pack_start(girisKutusu, false, true, 0);
dugme = new Gtk.Button();
dugme.set_label("Çal");
dugme.clicked.connect(oynat);
kutu.add(dugme);
show_all();
oynatici = Gst.ElementFactory.make("playbin", "oynatici");
veriYolu = oynatici.get_bus();
veriYolu.add_signal_watch();
veriYolu.message.connect(this.iletileriOku);
}
void oynat(Gtk.Widget gonderen)
{
if (dugme.get_label() == "Çal")
{
string kutukIsmi = girisKutusu.get_text().strip();
var kutuk = File.new_for_path(kutukIsmi);
if (kutuk.query_exists())
{
dugme.set_label("Dur");
oynatici.set_property("uri", "file://" + kutukIsmi);
oynatici.set_state(Gst.State.PLAYING);
}
else
{
oynatici.set_state(State.NULL);
dugme.set_label("Çal");
}
}
else if (dugme.get_label() == "Dur")
{
oynatici.set_state(Gst.State.PAUSED);
dugme.set_label("Çal");
}
}
void iletileriOku(Gst.Bus veriYolu, Gst.Message ileti)
{
var tur = ileti.type;
if (tur == Gst.MessageType.EOS)
{
oynatici.set_state(State.NULL);
dugme.set_label("Çal");
}
else if (tur == Gst.MessageType.ERROR)
{
oynatici.set_state(State.NULL);
Error hata;
string hataYakalama;
ileti.parse_error(out hata, out hataYakalama);
stdout.printf("Hata : %s %s", hata.message, hataYakalama);
}
}
}
class Uygulama : Gtk.Application
{
public Uygulama()
{
GLib.Object (application_id: "sesi.ac.bakalim");
}
protected override void activate()
{
var pencere = new Calici(this);
pencere.show_all();
}
}
int main (string[] secenekler)
{
Gtk.init(ref secenekler);
Gst.init(ref secenekler);
var uygulama = new Uygulama();
return uygulama.run(secenekler);
}
Uygulamayı derlemek için aşağıdaki komutu veriniz.
valac --pkg gtk+-3.0 --pkg gstreamer-1.0 calici.vala -o calici
Eğer gerekli ise ses eklentisini kurunuz.
sudo pacman -S --needed gst-plugins-good
Uygulamayı çalıştırdığınızda basit bir giriş kutusu ve çal düğmesini görebilirsiniz.
Giriş dizinine çalınacak kütüğün tam ismini giriniz.
Düğmeye tekrar basarak duraklatabilirsiniz.
Her iki örnek de daha önce öğrendiğimiz temel üzerine kurulmuştur.
Kullanılan ses kütüphanesini öğrenmek isterseniz buraya bakabilirsiniz. Bu sayfada ise biraz eski de olsa Python örnekleri var.
D dilinde örneğin writeln
işlevi için yaz
takma ismini kullanabiliyoruz.
import std.stdio : yaz = writeln;
Yorumlar