日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

C语言实现音乐播放器(Linux madplay)

發布時間:2025/3/8 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现音乐播放器(Linux madplay) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(一)需求分析

1.掃描指定路徑下的音樂,并顯示出來
2.實現音樂的播放、暫停、上一首和下一首的功能
3.程序退出釋放內存資源

(二)思路

1.掃描出指定路徑下的音樂文件(便利指定文件夾,找出音頻文件放在數組里面)
2.創建鏈表存放音樂的信息(音樂名、歌曲路徑、歌曲總數等信息)
3.創建新的進程,用來播放音樂
4.調用kill函數實現音樂的切換和暫停播放功能
注意: 如果出現設備繁忙,可以使用ps -aux命令查看是否正在使用madplay,如果有madplay進程kill掉再運行程序就可以了

(三)接口函數

函數原型功能介紹頭文件備注
DIR *opendir(const char *name);打開一個目錄#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dirp);讀取目錄的信息放在返回值中#include <dirent.h>
char *getcwd(char *buf, size_t size)獲取當前所在路徑#include <unistd.h>
pid_t fork(void)創建一個新的進程#include <unistd.h>父進程和子進程
返回值不同
int kill(pid_t pid, int sig);發送一個信號到進程#include <signal.h>
int execlp(const char *file, const char *arg, …0)調用系統程序#include <unistd.h>注意和system區別

(四)功能演示

在使用前先安裝madplay音頻解碼器,在Ubuntu下安裝如下:apt install madplay
安裝完成后,編譯工程(make) 之后運行程序傳遞參數就可以播放音樂了

輸入1測試:

剩下的我就不一一測試了,感興趣的可以自己下載工程測試下

(五)代碼實現

這里貼出主要代碼,因為我把功能開寫的代碼有些多:
music.c

/********************************************************************* * * File : music.c * Purpose : play music * author : @Mrming * Time : 2020/2 * ***************************END-OF-HEADER****************************** */#include "link.h" #include "file.h" #include <unistd.h> #include <string.h> #include <signal.h> char CtrFlag=0;//0從頭播放 1播放 2暫停 pid_t pid;//播放音樂進程句柄 extern struct song song_info;//歌曲信息結構體 link_t song_list = { NULL,0,"song_list" };//創建鏈表,存放歌曲的信息(鏈表頭部,節點個數,鏈表名字) node *cur_song= NULL;//當前歌曲節點/*** @brief 實現音樂的控制播放、暫停** @param None**/ void play() {char *str=NULL;switch(CtrFlag){case 0:{pid = fork();if(pid==0){str = strcat(cur_song->path,cur_song->name);//printf("\n%s\n",str);close(0);//execlp("madplay","madplay",str,"-r","-q",NULL);//execlp會開辟一個新的線程覆蓋掉子線程}CtrFlag = 2; }break;case 1:kill(pid,18);//對于主進程控制繼續播放CtrFlag = 2; break;case 2:{CtrFlag = 1;if(pid>0) {kill(pid,19);//主進程中暫停子進程}}break;default:printf("play:");}}/*** @brief 獲取下一首歌曲并播放** @param None**/ void next() {cur_song = next_node(cur_song);if(cur_song == NULL){cur_song = song_list.phead;}kill(pid,9);//殺死當前音樂的進程CtrFlag = 0;//恢復默認值play();//播放當前選中的音樂 }/*** @brief 獲取上一首歌曲并播放** @param None**/ void prev() {cur_song = prev_node(cur_song);if(cur_song->prev == NULL){cur_song = song_list.phead->next;printf("this song is the first! \n");}kill(pid,9);//殺死當前音樂的進程CtrFlag = 0;//恢復默認值play();//播放當前選中的音樂 }/*** @brief 顯示音樂列表** @param None**/ void show_music_list(void) {printf("歌曲總數:%d首\n",song_info.song_num);//打印歌曲總數out_list(&song_list); }/*** @brief 關閉音樂釋放鏈表資源** @param None**/ void source_recovery(void) {system("killall madplay");//關閉madplay進程destory_link(&song_list);//退出程序前釋放資源 } //打印當前歌曲的上一首和下一首 void near_curMusic(node *cur_song) {printf("\n當前歌曲 : %s\n",cur_song->name);if(CtrFlag == 2)printf("播放狀態 :播放\n");if(CtrFlag == 1)printf("播放狀態 :暫停\n");}/*** @brief 查找音樂文件放在song_list中** @param argv:路徑**/ void search_all_music(char *argv) {int i = 0;link_init(&song_list);//初始化鏈表1search_file(argv,".mp3");//指定路徑下查找指定文件名,結果放在song_info結構體中for(i=0;i<song_info.song_num;i++)//歌曲信息插入鏈表{link_insert_tail(&song_list,song_info.song_name[i],song_info.song_path[i]);//尾插數據//printf("%s\t%s\n",song_info.song_name[i],song_info.song_path[i]);}cur_song = song_list.phead->next; }/*** @brief 功能列表** @param None**/ int menu() {int i;printf("+-------------------------------------------------------------+\n");printf("| | \n");printf("| Welcome to MP3 PLAYER | \n");printf("| | \n");printf("| 1.Play\\stop | \n");printf("| 2.prev song | \n");printf("| 3.next song | \n");printf("| 4.music list | \n");printf("| 5.quit | \n");printf("|_____________________________________________________________| \n");printf("choose->");scanf("%d",&i);return i; }/*** @brief 功能選擇** @param None**/ void start_music() {show_music_list();while(1){near_curMusic(cur_song);switch(menu()){case 1:play();break;case 2:prev();break;case 3:next();break;case 4 :show_music_list();break;case 5 :return;default:printf("重新輸入!\n");break;}} }int main(int argc, char *argv[]) {system("clear");search_all_music(argv[1]);//查找目錄下的mp3文件,結果放在song_liststart_music();//播放音樂source_recovery();return 0; }

file.c

#include "file.h" /*************************************函數功能: 掃描目錄下指定后綴名的文件*輸入 : 路徑*輸出 : 掃描成功輸出0,掃描失敗輸出-1*注釋 : 掃描到的文件名放在song_info結構體里面*************************************/ struct song song_info={0,0};int search_file(char* name,char * type) {DIR *p=NULL;struct dirent *pdir;p=opendir(name);if(p==NULL){perror("open dir error");return -1;}chdir(name);while(pdir=readdir(p)){if(!(strcmp(pdir->d_name,".")==0) && !(strcmp(pdir->d_name,"..")==0)){struct stat st;stat(pdir->d_name,&st);if((st.st_mode &S_IFMT)== S_IFDIR){// printf("this is a content:%s\n",pdir->d_name);//system("pwd");search_file(pdir->d_name,"mp3");}else {char * file_type;file_type = strstr(pdir->d_name,type);if(file_type){getcwd(song_info.song_path[song_info.song_num],sizeof(song_info.song_path[0]));sprintf(song_info.song_name[song_info.song_num++],"/%s",pdir->d_name);}}}}chdir("..");closedir(p); return 0; }

link.h

#pragma once #ifndef _LINK_H_ #define _LINK_H_ #include <stdio.h> #include <stdlib.h> #include <string.h> #define name_max 255 typedef struct _node {char name[name_max];char path[name_max];struct _node * prev;struct _node * next; }node;typedef struct _link {node *phead;//鏈表頭部int count;//節點個數char name[name_max];//鏈表名字 }link_t;int link_init(link_t *link);//鏈表初始化,成功返回0,失敗返回-1 int link_insert_tail(link_t *link, char *dat1,char *dat2);//尾插鏈表,使用前先執行link_init初始化鏈表 int destory_link(link_t *link);//刪除鏈表,成功返回0 失敗返回-1 node * pos_list(link_t link, int n);//定位到鏈表任意位置 node * next_node(node * node);//獲取當前節點的上一個節點 node * prev_node(node * node);//獲取當前節點的下一個節點 void out_list(link_t *head);//遍歷鏈表#endif /* ifndef _MUSIC_H_ */

總結

以上是生活随笔為你收集整理的C语言实现音乐播放器(Linux madplay)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。