Uçbirim uygulaması 6 : Basit ses çalıcısı 2

Bu derste uç birimde çalışan basit ses çalıcısına devam ediyoruz

Giriş

Bu ders uç birimde çalışan basit ses çalıcısının devamıdır.

Bu derste çalıcıyı nasıl ileri sarabileceğimize bakacağız.

Bu sefer C kodunu da ekleyeceğiz.

C ile ses çalıcısı ileri sarma

Aşağıdaki kütüğü ilk.c olarak kaydediniz.

#include <gst/gst.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

char* birlestir(const char *ilk, const char *ikinci)
{
    char *sonuc = malloc(strlen(ilk) + strlen(ikinci) + 1);
    strcpy(sonuc, ilk);
    strcat(sonuc, ikinci);
    return sonuc;
}

int oynat(int argc, char *argv[])
{
    GstElement *oynatici;
    GstBus *veriYolu;
    GstMessage *ileti;
    gst_init(&argc, &argv);

    char* dosyaAc = "playbin uri=file://";
    char* kutuk = "ses.mp3";
    char* sonuc = birlestir(dosyaAc, kutuk);
    printf("Birleştikten sonra %s", sonuc);

    oynatici = gst_parse_launch(sonuc, NULL);

    /* durakla  */
    gst_element_set_state(oynatici, GST_STATE_PAUSED);

    /* gerekiyor */
    gst_element_get_state(oynatici, NULL, NULL, GST_CLOCK_TIME_NONE);

    long birSaniye = 1000000000;

    long sarmaZamani = 71 * birSaniye;

    /* ileri sar */

    if (!gst_element_seek (oynatici,
                           1.0,
                           GST_FORMAT_TIME,
                           GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT |
                           GST_SEEK_FLAG_ACCURATE,
                           GST_SEEK_TYPE_SET,
                           sarmaZamani,
                           GST_SEEK_TYPE_NONE,
                           -1))
   {
       g_print ("Sarma başarısız!\n");
   }


    gst_element_set_state(oynatici, GST_STATE_PLAYING);

    veriYolu = gst_element_get_bus(oynatici);
    ileti = gst_bus_timed_pop_filtered (veriYolu, GST_CLOCK_TIME_NONE,
                                        GST_MESSAGE_ERROR |
                                        GST_MESSAGE_EOS);

    if (GST_MESSAGE_TYPE (ileti) == GST_MESSAGE_ERROR)
    {
        g_error("Bir hata oluştu");
    }

    /* Kaynakları geri ver */
    gst_message_unref(ileti);
    gst_object_unref(veriYolu);
    gst_element_set_state(oynatici, GST_STATE_NULL);
    gst_object_unref(oynatici);
    free(sonuc);
    return 0;
}

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "tr_TR.utf8");
    return oynat(argc, argv);
}

C kodunu derlemek

Eğer bash kabuğu kullanıyorsanız C kodunu aşağıdaki gibi derleyebilirsiniz.

gcc ilk.c -o ilk `pkg-config --cflags --libs gstreamer-1.0`

Eğer 'fish' kabuğu kullanıyorsanız ~/.config/fish/functions/ dizininde derle.fish isminde bir işlev oluşturunuz.

İçine aşağıdakileri giriniz.

function derle
   set kutuk (string join '' $argv[1] .c)
   gcc $kutuk -o $argv[1] (pkg-config --cflags --libs gstreamer-1.0 | string split -n " ")
end

Artık kaynak kodunu derle ilk yazarak derleyebilirsiniz.

Vala ile ses çalıcısı ileri sarma

Aşağıdaki kütüğü ilk.vala olarak kaydediniz.

using Gst;

void ileriSar(Gst.Element oynatici, int baslangic, int bitis)
{
    /* durakla */
    oynatici.set_state(Gst.State.PAUSED);

    /* gerekiyor */
    oynatici.get_state(null, null, Gst.CLOCK_TIME_NONE);

    long birSaniye = 1000000000;

    long sarmaZamani = baslangic * birSaniye;
    long sarmaBitis = bitis * birSaniye;

    if (!oynatici.seek(1.0,
                       Gst.Format.TIME,
                       Gst.SeekFlags.FLUSH | Gst.SeekFlags.SEGMENT |
                       Gst.SeekFlags.ACCURATE,
                       Gst.SeekType.SET,
                       sarmaZamani,
                       Gst.SeekType.SET,
                       sarmaBitis))
    {
        stdout.printf("Bir hata oluştu\n");
    }

}

int main (string [] secenekler)
{
    Gst.Element oynatici;
    Gst.Bus veriYolu;
    Gst.Message ileti;
    Gst.init (ref secenekler);
    var dosyaAc = "playbin uri=file://";
    var kutukIsmi = "ses.mp3";
    stdout.printf("Birleştikten sonra %s%s\n", dosyaAc, kutukIsmi);
    oynatici = Gst.parse_launch(dosyaAc + kutukIsmi, null);


    ileriSar(oynatici, 71, 87);
    oynatici.set_state(Gst.State.PLAYING);


    veriYolu = oynatici.get_bus();
    ileti = veriYolu.timed_pop_filtered (Gst.CLOCK_TIME_NONE,
                                         Gst.MessageType.ERROR |
                                         Gst.MessageType.EOS);
    if (ileti.type == Gst.MessageType.ERROR)
    {
        stdout.printf("Bir hata oluştu\n");
    }
    oynatici.set_state(Gst.State.NULL);

    return 0;
}

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

valac --pkg gstreamer-1.0 ilk.vala

D ile ses çalıcısı ileri sarma

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

import glib.MainLoop : Döngü = MainLoop;
import gstreamer.GStreamer : SesKütüphanesi = GStreamer;
import gstreamer.Parse : İşle = Parse;
import gstreamer.Message : Durum = GstState;
import gstreamer.Element : Eleman = Element;
import gstreamer.c.types : GstClockTime;
import gstreamer.c.types : SÜRESİZ = GST_CLOCK_TIME_NONE;
import gstreamer.c.types : Bayraklar = GstSeekFlags;
import gstreamer.c.types : Biçim = GstFormat;
import gstreamer.c.types : SarmaŞekli = GstSeekType;
import gstreamer.c.types : İleti = MessageType;
import gtk.Main : Ana = Main;

import std.stdio: yaz = writeln;

alias çalıştır = İşle.launch;
alias ÇALIYOR = Durum.PLAYING;
alias DURAKLADI = Durum.PAUSED;
alias BOŞTA = Durum.NULL;
alias NANOSANİYE = Biçim.TIME;
alias TAMKONUM = SarmaŞekli.SET;
alias HATAİLETİSİ = İleti.ERROR;
alias DOSYASONU = İleti.EOS;


void ileriSar(Eleman oynatıcı, int başlangıç, int bitiş)
{
    /* durakla */
    oynatıcı.setState(DURAKLADI);

    Durum boşta = BOŞTA;

    /* gerekiyor */
    oynatıcı.getState(boşta, boşta, SÜRESİZ);

    long birSaniye = 1000000000;
    long sarmaZamanı = başlangıç * birSaniye;
    long sarmaBitiş = bitiş * birSaniye;
    Bayraklar tümBayraklar =  Bayraklar.FLUSH | Bayraklar.SEGMENT | Bayraklar.ACCURATE;

    if (!oynatıcı.seek(1.0,
                  NANOSANİYE,
                  tümBayraklar,
                  TAMKONUM,
                  sarmaZamanı,
                  TAMKONUM,
                  sarmaBitiş))
    {
        yaz("Bir hata oluştu\n");
    }
}

int main (string[] seçenekler)
{
    SesKütüphanesi.init(seçenekler);
    auto kütükİsmi = "ses.mp3";
    auto oynatıcı = çalıştır("playbin uri=file://" ~ kütükİsmi);
    ileriSar(oynatıcı, 71, 87);
    oynatıcı.setState(ÇALIYOR);

    auto veriYolu = oynatıcı.getBus();

    auto ileti = veriYolu.timedPopFiltered(SÜRESİZ,
                                           HATAİLETİSİ | DOSYASONU);

    if (ileti.type == HATAİLETİSİ)
     {
         yaz("Bir hata oluştu\n");
     }

    oynatıcı.setState(BOŞTA);
    return 0;
}

Derlemek için aşağıdaki komutu veriniz.

gdc ilk.d -I/usr/include/d/gtkd-3 -L /usr/lib -lgtkd-3 -lgstreamerd-3 -o ilk

Uygulamanın açıklaması

Uygulama sesi çalmadan önce 71. saniyeye sarıyor.

71 ve 87 saniyeler arasını çalıyor.

Burada ileri sarma ("seek") işlevine nano saniye cinsinden değer gönderiyoruz.

Yorumlar

yorum yaz

Yorum yaz

Henüz yorum yok.