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
0 komentar:
Posting Komentar