Sabtu, 07 November 2015

[THREAD] Membuat Music Player versi Sendiri

Sebelum kita membuat music player, kita harus mengerti dahulu apa itu thread.
Thread adalah bagian kecil dari suatu proses yang bisa di jadwalkan oleh sistem operasi. Thread juga disebut sebagai proses ringan (lightweight). Macamnya ada 2, yaitu :
  • Single Threading : sebuah proses yang hanya memiliki satu thread yang berjalan. Biasanya fungsi thread ini digunakan sebagai pengendali jalannya proses.
  • Multi Threading : proses yang memiliki lebih dari satu thread yang berjalan didalamnya, sehingga dalam hal ini proses dapat menjalankan lebih dari satu tugas dalam satu waktu.
Nah music player yang kita buat di sini adalah multi threading. Nantinya music player yang kita buat dijalankan berbasis konsol. Fiturnya ada menu help, list, play lagu, pause lagu, continue lagu dan stop lagu.
Pertama-tama, kita buat fungsi threadnya dahulu :

void* playAndCount(void *arg){ //fungsi yg akan dijalankan sbg thread
    unsigned long i=0;
    pthread_t id=pthread_self();
    int iter;
    if(pthread_equal(id,tid[0])){ //thread pertama menjalankan menu
        system("clear");
        printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
    }
    else if(pthread_equal(id,tid[1])){ //thread kedua melihat list
    //system("clear");   
    system("cd playlist");       
    system("ls | grep .mp3");
    }
    else if(pthread_equal(id,tid[2])){ //thread ketiga menjalankan lagu
    char tmp[1000];
    if(init==1) system("kill -9 $(pgrep vlc)");
    init=1;
    //printf("%s playing\n", path[nolagu-1]);
    sprintf(tmp, "cvlc %s", path[nolagu-1]);
    system(tmp);
   
    }
    else if(pthread_equal(id,tid[3])){ //thread keempat pause lagu
        sleep(detik);
    system("kill -20 $(pgrep vlc)");
    }
    else if(pthread_equal(id,tid[4])){ //thread kelima melanjutkan lagu    
    sleep(detik);
    system("kill -18 $(pgrep vlc)");   
    }
    else if(pthread_equal(id,tid[5])){ //thread keenam stop lagu
    init=0;       
    system("kill -9 $(pgrep vlc)");
    }
    return NULL;
}

Untuk di main function kita tulis :

int main()
{
    system("clear");
    printf("C06 Music Player\n");
    printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
    int i=0,pilihan;
    int err;
    init=0;
    while(1){
    //system("clear");
    scanf("%d", &pilihan);
    if(pilihan==3){
        system("clear");
        system("cd playlist");
        FILE *fp = popen("ls | grep .mp3", "r");      
        while (fgets(path[j], sizeof(path[j]), fp) != NULL){
            printf("%s", path[j]);
            j++;
        }          
        printf("Masukkan pilihan lagu yang ingin dimainkan(nomer baris 1-...): ");
        scanf("%d", &nolagu);
        //printf("%d %s", nolagu, path[nolagu-1]);
        pclose(fp);
    }
    else if(pilihan==4){
        printf("Musik pause setelah :");
        scanf("%d", &detik);
    }
    else if(pilihan==5){
        printf("Musik continue setelah :");
        scanf("%d", &detik); 
    }  
        err=pthread_create(&(tid[pilihan-1]), NULL, &playAndCount, NULL); //membuat thread
        if(err!=0){ //cek error pembuatan thread
            printf("\ncan't create thread: [%s]", strerror(err));
        }
        else{
            //printf("\nThread created successfully\n");
        }
    system("clear");
    printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
       
    }
    pthread_join(tid[0],NULL);
    pthread_join(tid[1],NULL);
    pthread_join(tid[2],NULL);
    pthread_join(tid[3],NULL);
    pthread_join(tid[4],NULL);
    pthread_join(tid[5],NULL);

    return 0;
}

Bila digabungkan maka kodingannya akan seperti ini :

#include <stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

pthread_t tid[6]; //inisialisasi array u/ menampung thread. dalam kasus ini ada 6
int detik, init;
int nolagu, j=0;
char path[100][1024];


void* playAndCount(void *arg){ //fungsi yg akan dijalankan sbg thread
    unsigned long i=0;
    pthread_t id=pthread_self();
    int iter;
    if(pthread_equal(id,tid[0])){ //thread pertama menjalankan menu
        system("clear");
        printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
    }
    else if(pthread_equal(id,tid[1])){ //thread kedua melihat list
    //system("clear");  
    system("cd playlist");      
    system("ls | grep .mp3");
    }
    else if(pthread_equal(id,tid[2])){ //thread ketiga menjalankan lagu
    char tmp[1000];
    if(init==1) system("kill -9 $(pgrep vlc)");
    init=1;
    //printf("%s playing\n", path[nolagu-1]);
    sprintf(tmp, "cvlc %s", path[nolagu-1]);
    system(tmp);
   
    }
    else if(pthread_equal(id,tid[3])){ //thread keempat pause lagu
        sleep(detik);
    system("kill -20 $(pgrep vlc)");
    }
    else if(pthread_equal(id,tid[4])){ //thread kelima melanjutkan lagu    
    sleep(detik);
    system("kill -18 $(pgrep vlc)");  
    }
    else if(pthread_equal(id,tid[5])){ //thread keenam stop lagu
    init=0;      
    system("kill -9 $(pgrep vlc)");
    }
    return NULL;
}

int main()
{
    system("clear");
    printf("C06 Music Player\n");
    printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
    int i=0,pilihan;
    int err;
    init=0;
    while(1){
    //system("clear");
    scanf("%d", &pilihan);
    if(pilihan==3){
        system("clear");
        system("cd playlist");
        FILE *fp = popen("ls | grep .mp3", "r");      
        while (fgets(path[j], sizeof(path[j]), fp) != NULL){
            printf("%s", path[j]);
            j++;
        }          
        printf("Masukkan pilihan lagu yang ingin dimainkan(nomer baris 1-...): ");
        scanf("%d", &nolagu);
        //printf("%d %s", nolagu, path[nolagu-1]);
        pclose(fp);
    }
    else if(pilihan==4){
        printf("Musik pause setelah :");
        scanf("%d", &detik);
    }
    else if(pilihan==5){
        printf("Musik continue setelah :");
        scanf("%d", &detik); 
    }  
        err=pthread_create(&(tid[pilihan-1]), NULL, &playAndCount, NULL); //membuat thread
        if(err!=0){ //cek error pembuatan thread
            printf("\ncan't create thread: [%s]", strerror(err));
        }
        else{
            //printf("\nThread created successfully\n");
        }
    system("clear");
    printf("Menu HELP:\n1. Help\n2. List\n3. Play\n4. Pause\n5. Continue\n6. Stop\n");
       
    }
    pthread_join(tid[0],NULL);
    pthread_join(tid[1],NULL);
    pthread_join(tid[2],NULL);
    pthread_join(tid[3],NULL);
    pthread_join(tid[4],NULL);
    pthread_join(tid[5],NULL);

    return 0;
}

Simpan kodingan tersebut, dan compile dengan :  gcc -pthread -o [output] input.c
Share:

0 komentar:

Posting Komentar