Pencereli uygulamalar 5 : Oynatıcıyı ileri sarmak

Bu derste ses oynatıcısının zamanının nasıl ileri geri sarılacağı gösterilmiştir

İleri geri sarabilen ses çalıcısı

Daha önceki uygulamalarda geliştirdiğimiz uygulamalarda ileri geri sarma özelliği yoktu.

Allah'ın izni ile ekledik.

Eğer uygulamayı derlerseniz üzerinde oynat, durdur düğmeleri ve kaydırma çubuğu olan bir oynatıcı görebilirsiniz.

Ses çalıcısı

Çubuk ile ileri geri sarabilirsiniz.

D ile ileri geri sarabilen ses çalıcısı

Aşağıdaki kütüğü oynatıcı.d ismi ile kaydediniz.

import std.stdio : yaz = writeln;

import gtk.Main : Ana = Main;
import gtk.Window : TemelPencere = Window;
import gtk.Widget : Pencerecik = Widget;
import gtk.Box : Kutu = Box;
import gtk.Image : Resim = Image;
import gtk.Scale : Çubuk = Scale;
import gtk.Range : Aralık = Range;
import gtk.ToolButton : KüçükDüğme = ToolButton;
import gtk.c.types;

import glib.Timeout : Zamanlayıcı = Timeout;
import gobject.Signals : İşaret = Signals;

import gstreamer.GStreamer : SesKütüphanesi = GStreamer;
import gstreamer.Element : Eleman = Element;
import gstreamer.ElementFactory : ElemanÜretici = ElementFactory;
import gstreamer.Message : Durum = GstState;
import gstreamer.c.types : Süre = GstClockTime;
import gstreamer.c.types: Biçim = GstFormat;
import gstreamer.c.types: Bayraklar = GstSeekFlags;
import gstreamer.c.types: SaniyeyeÇevir = GST_SECOND;


alias yatay = Orientation.HORIZONTAL;
alias küçükSimge = IconSize.SMALL_TOOLBAR;
alias zamanBiçimi = Biçim.TIME;
alias Çalıyor = Durum.PLAYING;
alias Duraklatıldı = Durum.PAUSED;
alias Kilitle = İşaret.handlerBlock;
alias Çöz = İşaret.handlerUnblock;

class Pencere : TemelPencere
{
    string başlık = "Basit çalıcı";
    bool çalıyorMu;
    bool toplamSüreAyarlandı;
    Eleman oynatıcı;
    Kutu kutu;
    Çubuk kaydırmaÇubuğu;
    long toplamSüre, anlıkSüre, çubukNumarası;
    Resim oynatSimgesi, duraklatSimgesi;
    KüçükDüğme oynatDüğmesi, duraklatDüğmesi;
    Zamanlayıcı zamanlayıcı;

    this()
    {
        super(başlık);
        setSizeRequest(600, 50);
        oynatıcı = ElemanÜretici.make("playbin", "oynatıcı");
        auto kütükİsmi = "/home/erdem/Belgeler/ses.mp3";
        oynatıcı.setProperty("uri", "file://" ~ kütükİsmi);

        kutu = new Kutu(yatay, 0);
        add(kutu);

        oynatSimgesi = new Resim("media-playback-start",
                                 küçükSimge);
        oynatDüğmesi = new KüçükDüğme(oynatSimgesi, null);
        oynatDüğmesi.addOnClicked(&oynat);
        duraklatSimgesi = new Resim("media-playback-pause",
                                 küçükSimge);
        duraklatDüğmesi = new KüçükDüğme(duraklatSimgesi, null);
        duraklatDüğmesi.addOnClicked(&duraklat);

        kaydırmaÇubuğu = new Çubuk(yatay, 0, 100, 0.5);
        çubukNumarası = kaydırmaÇubuğu.addOnValueChanged(&çubukKaydı);
        yaz("Çubuk numarası ", çubukNumarası);
        kutu.packStart(oynatDüğmesi, false, false, 2);
        kutu.packStart(duraklatDüğmesi, false, false, 2);
        kutu.packStart(kaydırmaÇubuğu, true, true, 1);
        showAll();
    }

    void oynat (KüçükDüğme gönderen)
    {
        çalıyorMu = true;
        oynatıcı.setState(Çalıyor);
        zamanlayıcı = new Zamanlayıcı(1000, &çubuğuİlerlet );
    }

    void duraklat (KüçükDüğme gönderen)
    {
        çalıyorMu = false;
        oynatıcı.setState(Duraklatıldı);
    }

    void çubukKaydı(Aralık aralık)
    {
        auto ondalıkSüre = kaydırmaÇubuğu.getValue();
        Biçim biçim = zamanBiçimi;
        Bayraklar bayraklar = Bayraklar.FLUSH | Bayraklar.KEY_UNIT;
        yaz("Kaydırma süresi ", ondalıkSüre);
        long kaydırmaSüresi = (cast(long) ondalıkSüre * SaniyeyeÇevir);
        oynatıcı.seekSimple(biçim,
                            bayraklar,
                            kaydırmaSüresi);
    }

    bool çubuğuİlerlet()
    {
        if (!çalıyorMu)
            return false;
        else
        {
            Biçim biçim = zamanBiçimi;
            if (!toplamSüreAyarlandı)
            {
                if (oynatıcı.queryDuration(biçim, toplamSüre))
                {
                    auto toplam = (toplamSüre / SaniyeyeÇevir);
                    yaz ("Toplam süre ", toplam);
                    kaydırmaÇubuğu.setRange(0, toplam);
                }
                toplamSüreAyarlandı = true;
            }

            if (oynatıcı.queryPosition(biçim, anlıkSüre))
            {
                auto anlık = (anlıkSüre / SaniyeyeÇevir);
                yaz("Anlık süre ", anlık);
            }
            Kilitle(kaydırmaÇubuğu, çubukNumarası);
            kaydırmaÇubuğu.setValue(anlıkSüre / SaniyeyeÇevir);
            Çöz(kaydırmaÇubuğu, çubukNumarası);
            return true;
        }
    }

    void çıkış (Pencerecik pencere)
    {
        Ana.quit();
    }
}

int main (string[] seçenekler)
{
    Ana.init (seçenekler);
    SesKütüphanesi.init(seçenekler);
    auto pencere = new Pencere();
    pencere.addOnDestroy(&pencere.çıkış);
    Ana.run();
    return 0;
}

Uygulamayı derlemek için aşağıdaki komutu veriniz.

gdc oynatıcı.d -I/usr/include/d/gtkd-3 -L /usr/lib -lgtkd-3 -lgstreamerd-3 -o oynatıcı

Uygulamayı ./oynatıcı yazarak çalıştırabilirsiniz.

Vala ileri geri saran ses çalıcısı

Aşağıdaki kütüğü oynatici.vala ismi ile kaydediniz.

using Gtk;
using Gst;
using GLib;

class Pencere : Gtk.Window
{
    Gtk.Box kutu;
    Gtk.ToolButton oynatDugmesi;
    Gtk.ToolButton duraklatDugmesi;
    Gtk.Scale kaydirmaCubugu;
    Gtk.Image oynatSimgesi;
    Gtk.Image duraklatSimgesi;
    Gst.Element oynatici;
    Gst.ClockTime toplamSure;
    Gst.ClockTime anlikSure;
    bool caliyorMu;
    bool toplamSureAyarlandi;
    ulong cubukNumarasi;

    public Pencere ()
    {
        set_size_request(600, 50);
        set_title("Basit çalıcı");

        oynatici = Gst.ElementFactory.make("playbin", "oynatici");
        var kutukIsmi = "/home/erdem/Belgeler/ses.mp3";
        oynatici.set_property("uri", "file://" + kutukIsmi);

        kutu = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
        add(kutu);

        oynatSimgesi = new Image.from_icon_name( "media-playback-start",
                                                 IconSize.SMALL_TOOLBAR);
        oynatDugmesi = new ToolButton(oynatSimgesi, null);
        oynatDugmesi.clicked.connect(oynat);

        duraklatSimgesi =
            new Image.from_icon_name("media-playback-pause",
                                     IconSize.SMALL_TOOLBAR);
        duraklatDugmesi = new ToolButton(duraklatSimgesi, null);
        duraklatDugmesi.clicked.connect(duraklat);

        kaydirmaCubugu = new
            Gtk.Scale.with_range(Gtk.Orientation.HORIZONTAL,
                                 0, 100, 0.5);
        cubukNumarasi = kaydirmaCubugu.value_changed.connect(cubukKaydi);
        stdout.printf("Cubuk numarası %s\n", cubukNumarasi.to_string());

        kutu.pack_start(oynatDugmesi, false, false, 2);
        kutu.pack_start(duraklatDugmesi, false, false, 2);
        kutu.pack_start(kaydirmaCubugu, true, true, 1);
        show_all();
    }
    void oynat (Gtk.Widget gonderen)
    {
        caliyorMu = true;
        oynatici.set_state(Gst.State.PLAYING);
        GLib.Timeout.add(1000, cubuguIlerlet);
    }

    void duraklat (Gtk.Widget gonderen)
    {
        caliyorMu = false;
        oynatici.set_state(Gst.State.PAUSED);
    }

    void cubukKaydi(Gtk.Widget gonderen)
    {
        var ondalikSure = kaydirmaCubugu.get_value();
        Gst.Format bicim = Gst.Format.TIME;
        Gst.SeekFlags bayraklar =
            Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT;
        stdout.printf("Kaydırma süresi %s\n", ondalikSure.to_string());
        var kaydirmaSuresi = ((int) ondalikSure * Gst.SECOND);
        oynatici.seek_simple(bicim,
                             bayraklar,
                             kaydirmaSuresi);
    }

    bool cubuguIlerlet()
    {
        if (!caliyorMu)
            return false;
        else
        {
            Gst.Format bicim = Gst.Format.TIME;
            if (!toplamSureAyarlandi)
            {
                if (oynatici.query_duration(bicim, out toplamSure))
                {
                    var toplam = (toplamSure / Gst.SECOND).to_string();
                    stdout.printf("Toplam süre %s\n", toplam);
                    kaydirmaCubugu.set_range(0, toplamSure / Gst.SECOND);
                }
                toplamSureAyarlandi = true;
            }

            if (oynatici.query_position(bicim, out anlikSure ))
            {
                var anlik = (anlikSure / Gst.SECOND).to_string();
                stdout.printf("Anlık süre %s\n", anlik);
            }
            GLib.SignalHandler.block(kaydirmaCubugu, cubukNumarasi);
            kaydirmaCubugu.set_value((float)(anlikSure) / Gst.SECOND);
            GLib.SignalHandler.unblock(kaydirmaCubugu, cubukNumarasi);
            return true;
        }
    }
}

int main (string[] secenekler)
{
    Gtk.init (ref secenekler);
    Gst.init (ref secenekler);
    var pencere = new Pencere();
    pencere.destroy.connect(Gtk.main_quit);
    Gtk.main();
    return 0;
}

Uygulamayı derlemek için aşağıdaki komutu kullanabilirsiniz.

valac --pkg gtk+-3.0 --pkg gstreamer-1.0 oynatici.vala -o oynatici

Uygulamayı çalıştırmak için ./oynatici yazmanız yeterlidir.

Yorumlar

yorum yaz

Yorum yaz

Henüz yorum yok.