Pencereli uygulamalar 3 : Ses çalıcısı

Bu derste D ve Vala dilleri ile ses çalıcısı yapmaya çalışacağız

Giriş

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.

D ile ses çalıcısı

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ı

Vala ile ses çalıcısı

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

Ses çalıcısı

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

yorum yaz

Yorum yaz

Henüz yorum yok.