Sunday, November 8, 2015

Threading dan membuat music player

Yahoo.. ketemu lagi nih…sekarang kita akan membahas soal pembuatan music player menggunakan dalam terminal menggunakan bantuan vlc.
Pertama-tama, untuk membuat music player kita membutuhkan bantuan multi threading. Apa itu Multi Threading?
Ok mari kita bahas Thread terlebih dahulu.
Thread merupakan bagian dari proses yang ada dalam system operasi. Thread dibagi menjadi dua, Single Threading dan Multi Threading. Single Threading biasanya digunakan untuk mengendailkan jalannya proses. Sedangkan Multi Threading merupankan thread yang lebih dari satu berjalan bersamaan, sehingga kita dapat menjalankan lebih dari satu tugas dalam waktu yang sama.
Kenapa kita butuh Multi Threading?
Dalam music player kita dapat memberikan perintah fungsi seperti pause atau stop pada saat musik berjalan, nah maka dari itu setidaknya ada 2 atau lebih tugas yang dijalankan yaitu musik tersebut dan pemberian perintah.
Mari kita simak kodingan program dibawah ini
#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_t tid[4];
int length=0;
char song[1024];
void* playAndCount(void *arg){  //fungsi yang dijalankan sebagai thread
     unsigned long i=0;
     pthread_t id = pthread_self();
     if(pthread_equal(id,tid[0])){
           sleep(length);
           system("pkill vlc");
          
     }
     else if(pthread_equal(id,tid[1])){
           char cmd[1024];
           sprintf(cmd,"cvlc Playlist/%s",song);
           system(cmd);         

     }
     else if(pthread_equal(id,tid[2])){
           sleep(length);
           system("pkill -STOP vlc");
     }
    
     else if(pthread_equal(id,tid[3])){
           sleep(length);
           system("pkill -CONT vlc");
     }
    
     return NULL;
}

int main(void)
{
    
close(STDERR_FILENO);
     int i=0;
     int err;
     char opt[1024];
     int flag=0;
     while(1)
     {   
           if(i<=3){
           err = pthread_create(&(tid[i]), NULL, &playAndCount, NULL);
           if(err!=0)
                printf("\ncan't create thread : [%s]", strerror(err));      
           }         
           printf("input options: ");
           scanf("%s",opt);
           if(strcmp(opt,"PLAY")==0){
                printf("input lagu: ");
                scanf("%s",song);               
                if(flag==1) system("pkill vlc");
                i=1;
                flag=1;
           }
           else if(strcmp(opt,"PAUSE")==0){
                printf("input waktu: ");
                scanf("%d", &length);
                i=2;
           }
           else if(strcmp(opt,"CONTINUE")==0){
                printf("input waktu: ");
                scanf("%d", &length);     
                i=3;
           }
           else if(strcmp(opt,"STOP")==0){
                printf("input waktu: ");
                scanf("%d", &length);     
                i=0;
                flag=0;
           }   
           else {
                i=4;
                if(strcmp(opt,"LIST")==0){ system("ls Playlist | grep .mp3");}
                else if(strcmp(opt,"HELP")==0)
                {
                     printf("=================KEYS================\n");
                      printf("PLAY          : Play inputed music\n");
                      printf("PAUSE          : Pause music\n");
                      printf("CONTINUE       : Continue paused music\n");
                      printf("STOP           : Stop music\n");
                      printf("LIST          : Show playlist\n");
                      printf("EXIT          : Exit Player\n");
                      printf("HELP          : Show help keys\n");
                }
                else if(strcmp(opt,"EXIT")==0) {
                      system("pkill vlc");
                      break;
                      }         
           }
     }
     pthread_join(tid[0],NULL);
     pthread_join(tid[1],NULL);
     pthread_join(tid[2],NULL);
     pthread_join(tid[3],NULL);
     return 0;
}


 Di kodingan diatas kita menggunakan 4 thread + 1 proses utama (main) ini dapat dilihat dari pendeklarasian :
pthread_t tid[4];

4 thread ini masing masing digunakan untuk pause music, play music, pause music, dan continue.

fungsi void* playAndCount(void *arg)akan dijalankan sebagai thread.
Untuk Play music kita menggunakan perintah yaitu system(“cvlc nama_lagu”); dapat dilihat di thread tid[1].
Untuk Stop music kita menggunakan system("pkill vlc");  dapat dilihat di thread tid[0]. sleep(length); yang digunakan di thread ini dan beberapa thread lainnya digunakan untuk waiting time sebelum kita menstop(tid[0]) atau pause(tid[2]) atau continue(tid[3]) selama length detik, jadi perintah stop akan dijalankan setelah length detik yang kita inputkan.
Untuk Pause music perintah yang digunakan adalah system("pkill -STOP vlc"); dalam thread[2].
Untuk Continue music yang telah di pause perintah yang digunakan adalah system("pkill -CONT vlc"); dalam thread[3].
Untuk Membuat thread, kita gunakan perintah dibawah ini
err = pthread_create(&(tid[i]), NULL, &playAndCount, NULL);
if(err!=0)
                printf("\ncan't create thread : [%s]", strerror(err));
tid[i] adalah thread yang akan dijalankan yang ada dalam fungsi playAndCount seperti play, pause, continue, dan stop dimana i akan diisi oleh angka 0 sampai 3 di baris bawahnya tergantung apa yang kita inputkan.
Lagu-lagu yang bisa dijalankan adalah lagu yang ada dalam folder Playlist di folder yang sama dengan programnya. Untuk melihat lagu apa saja yang bisa kita putar, dapat menggunakan system("ls Playlist | grep .mp3"); dimana perintah tersebut akan melist semua file mp3 yang ada dalam folder Playlist. Perintah ini dapat kita jalankan dengan mengetik “LIST” ketika program berjalan.
Karena dalam main kita menggunakan while(1) dimana program itu akan terus berjalan tanpa henti, maka kita perlu perintah untuk keluar dengan menggunakan perintah break; yang ada dalam pilihan “EXIT”.
Perintah ptherad_join yang ada setelah while seperti dibawah ini,
     pthread_join(tid[0],NULL);
     pthread_join(tid[1],NULL);
     pthread_join(tid[2],NULL);
     pthread_join(tid[3],NULL);
digunakan untuk menunggu thread lain yang sedang berjalan agar selesai terlebih dahulu sebelum keluar dari program sehingga tidak terjadi error.

Demikian post kali ini tentang thread dan pembuatan music player… Semoga bermanfaat.. sampai jumpa di post lain…

No comments:

Post a Comment