Uçbirim uygulaması 7 : Basit ses çalıcısı 3

Bu derste basit ses çalıcısını bir sesin belirli bir bölümünü çaldıktan sonra duracak şekilde ayarlıyoruz

Giriş

Bu derste ses çalıcısını ileri sarıp belirli bir süre çaldıktan sonra durmasını istiyoruz.

Örneğin 71. saniyeden başlasın. 16 saniye çalsın. Daha sonra uygulama sona ersin.

C ses çalıcısı sesin bir parçasını çalma

Aşağıdaki kütüğü dorduncu.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;
}

static void iletiyiIsle(GstMessage *ileti);

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "tr_TR.utf8");
    GstElement *oynatici;
    GstBus *veriYolu;
    GstMessage *ileti;

    gboolean sonlandir = FALSE;
    static gint sayac = 0;

    gst_init(&argc, &argv);

    char* dosyaAc = "playbin uri=file://";
    char* kutuk = "ses.mp3";
    char* sonuc = birlestir(dosyaAc, kutuk);
    printf("Birleştikten sonra %s\n", 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);

    do
    {
        ileti = gst_bus_timed_pop_filtered (veriYolu,
                                            1000 * GST_MSECOND,
                                            GST_MESSAGE_ERROR |
                                            GST_MESSAGE_EOS);

        if (ileti != NULL)
        {
            iletiyiIsle(ileti);
        }
        else
        {
            sayac = sayac + 1;
            g_print("Sayaç %d\n", sayac);
            if (sayac == 16)
            {
                g_print("Uygulamadan çıkıyorum\n");

                /* Kaynakları geri ver */
                gst_object_unref(veriYolu);
                gst_element_set_state(oynatici, GST_STATE_NULL);
                gst_object_unref(oynatici);
                return 0;
            }
            g_print("1 saniye geçti\n");
        }
    } while (!sonlandir);

    /* Kaynakları geri ver */
    gst_object_unref(veriYolu);
    gst_element_set_state(oynatici, GST_STATE_NULL);
    gst_object_unref(oynatici);

    return 0;
}

static void iletiyiIsle (GstMessage *ileti)
{
    switch (GST_MESSAGE_TYPE (ileti))
    {
    case GST_MESSAGE_ERROR:
        g_error("Bir hata oluştu\n");
        break;
    default:
        break;
    }
}

C kodunu derlemek

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

gcc dorduncu.c -o dorduncu `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 dorduncu yazarak derleyebilirsiniz.

Yorumlar

yorum yaz

Yorum yaz

Henüz yorum yok.