[C++]一个拥有音乐播放器所有基本功能的音乐库

前言

       这几天,想做一个图形化的音乐播放器来着,但是写着写着,各种思路交杂在一起反而让我难以实现功能。
       于是就决定先不图形化,直接上控制台,把音乐播放器该有的基本功能全部实现出来先,于是便产生了这个即将要被我介绍音乐库。

注意:代码以文件上传,在文章末尾。
      

音乐播放器该有什么功能

1.开始播放,上一首,下一首,暂停,停止
2.进度调节,音量调节
3.以列表的形式存储一个或多个音乐
4.能够实现获取单个或多个音乐文件,甚至是一次获取某个音乐文件夹下的所有音乐
5.能自定义添加音乐列表和音乐,并且列表名字可更改
6.基本的查找音乐的功能
7.实现单曲循环,列表循环,顺序播放
8.能够让用户选择播放指定列表的指定音乐

      

恩,看起来很多,事实上单单是实现功能就花了我几天时间,然后成功的写出了一个拥有上述所有功能的音乐库。(只有一个需要让程序员操作=v=)

一般来讲,要做到自动连播需要程序员在程序代码中自己判断什么时候要自动连播,但这个音乐类不需要,它能够自己判断是否要进行自动连播!这是基于线程实现的。

好了,废话不多说,直接上该音乐库的核心类的声明:

class C_MUSIC_DO {
	C_MUSIC_LIST *headp;
	C_MUSIC_LIST *nowp;
	int lists;//列表数目
	int sound;//音量大小
	bool sound_on;//是否静音 1静音 0没有静音
	bool have_begined;//是否已经打开音乐可播放了?
	bool have_started;//是否已经在播放中
	enum MODE_NAME mode;//播放模式
	bool close();//关闭音乐
	C_MUSIC_LIST* get_head_list_p();//获得列表的头指针
	C_MUSIC_LIST* get_now_list_p();//获得当前列表的指针
	int get_files(//获得文件夹内音乐文件数量及名称
		const LPCWSTR str,//输入搜索范围和条件
		TCHAR *p[1000],//一个字符数组,用来获取多个文件名
		int save_set//从数组的哪个元素开始存起
	);
	void get_line_from_mci(); //从MCI的返回中获取当前进度,并设置
	int min_now;//当前播放的分钟
	int sec_now;//当前播放的秒数
	thread thread_var;//线程变量
	friend void run(C_MUSIC_DO *p);//线程函数,专门管理当前的播放进度,实时反馈播放进度和实现自动连播
	bool live=true;//音乐播放器活着吗?
	bool have_creat_over=false;//初始化完成了吗?
	bool should_run;//应该执行命令吗?
	bool result;//命令执行结果
	bool intime;//是否到时了
	TCHAR shouLd_do[255];//要执行的命令
public:
	C_MUSIC_DO();
	C_MUSIC_DO(wstring name);
	C_MUSIC_DO(TCHAR *name);
	wstring get_music_name(int=0);//获得音乐名1~n,默认当前音乐
	wstring get_list_name(int=0);//获得列表名1~n,默认当前列表
	wstring get_list_music_name(int=0,int=0);//获得列表名1~n的第1~n个音乐名,默认当前列表的第一个音乐名
	wstring get_list_music_name(wstring, int=0);//获得指定列表名的第1~n个音乐名,默认指定列表的第一个音乐名
	wstring get_music_now_name();//获得当前播放音乐名
	wstring get_music_last_name();//获得上一个播放的音乐名
	wstring get_music_next_name();//获得下一个播放的音乐名
	wstring get_path();//获得当前播放的音乐路径
	int get_min_now();//获得当前音乐播放分钟
	int get_sec_now();//获得当前音乐播放秒数
	int get_min();//获得当前音乐播放总分钟
	int get_sec();//获得当前音乐播放总秒数
	bool set_min_sec_now(int min,int sec);//设置当前分钟
	int get_line();//百分比获得播放条进度
	int get_sound();//百分比获得音量大小
	int get_lists();//获得列表总数
	wstring get_list_now_name();//获得当前列表名
	wstring get_list_last_name();//获得上一个列表名
	wstring get_list_next_name();//获得下一个列表名
	int get_list_musics();//获得当前列表下的音乐总数
	int get_list_musics(wstring list);//获得指定列表下的音乐总数
	int get_lists_musics();//获得所有列表下的音乐总数
	wstring find_music_from_lists(wstring name);//获得所有列表中指定音乐的列表名字
	bool find_list_music(wstring name);//查询当前列表存在该音乐吗?
	bool find_lists_music(wstring name);//查询所有列表存在该音乐吗?
	bool start();//播放音乐
	bool start(wstring name);//播放当前列表指定音乐
	bool start(wstring name,wstring list);//播放指定列表指定音乐
	bool next();//播放下一首
	bool last();//播放上一首
	bool pause();//暂停播放
	bool stop();//中止播放
	bool restart();//重新播放
	bool add_music(wstring name); //当前列表增添指定音乐
	bool add_music(wstring name,wstring list);//指定列表增添指定音乐
	bool del_music();//当前列表排除当前音乐
	bool del_music(wstring name);//当前列表排除指定音乐
	bool del_music(wstring name, wstring list);//指定列表排除指定音乐
	bool del_list_musics();//排除当前列表所有音乐
	bool del_list_musics(wstring list);//排除指定列表所有音乐
	bool del_lists_musics();//排除所有列表所有音乐
	bool change_list_name(wstring newname, wstring oldname);//指定列表改名
	bool new_list(wstring &name);//新增指定列表
	bool del_list(wstring name);//排除指定列表
	bool del_lists();//排除所有列表
	bool set_mode(MODE_NAME=ONCE_LIST);//设置循环模式
	bool change_sound(int num);//百分比调整音量大小 -1表示取消静音
	MODE_NAME get_mode();//获得循环模式
	~C_MUSIC_DO();//析构函数
};

可以看见,功能相当齐全,是个好音乐类,基本上拥有了一个音乐播放器的所有功能。只要作为程序员的你会造界面,那么只需要尽情调用这个类的public的成员函数,而不需要理会上面的私有成员和其他的列表类(C_MUSIC_LIST),音乐文件类(C_MUSIC),你就能够写出自己的音乐播放器

这个音乐库是基于Unicode编码的,主要调用mci音乐函数,它所需要的头文件有:
#include < string>
#include <graphics.h>//这是一个easyx库的头文件,放心,我没用他画画
#include < thread>

控制台使用效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
那么下面写一下该库一般的用法:

如何使用该库开始播放音乐?
例子:
首先,要创建一个音乐播放器实例,一般而言,一个就够了,除非你想多曲同时播放,就创建多个
使用函数:
C_MUSIC_DO var;//这样可以默认创建一个空白的音乐播放器,内含一个名为“默认列表”的列表
C_MUSIC_DO var(_T("名字"));//这样可以创建一个空白的音乐播放器的同时,将里面的第一个列表命名为名字
创建完这么一个音乐播放器对象后,我们就可以开始使用这个音乐播放器对象来播放音乐了

使用方式为:var.函数名(参数);
如
var.add_music(_T("天堂.mp3")); //当前列表增添指定音乐,文件跟程序同一文件夹时候可以这么用
var.add_music(_T("存有音乐的文件夹")); //当前列表增添指定音乐,文件夹跟程序同一文件夹的时候可以这么用
var.add_music(_T("C:\\www\\sound.mp3")); //当前列表增添指定音乐,文件或文件夹跟程序不同路径时候,请使用绝对路径
var.get_music_name();//获得当前音乐名字
var.start();//播放音乐
var.start(_T("a.mp3"));//播放当前列表指定音乐
var.start(_T("a.mp3"),_T("默认列表"));//播放指定列表指定音乐
var.next();//播放下一首
var.last();//播放上一首
var.pause();//暂停播放
var.stop();//中止播放
var.restart();//重新播放

下载链接:https://download.csdn.net/download/qq_43655831/12380423
附带控制台界面代码。

注意:由于上传的资源无法更改,在这里写下一些代码错误。
1.下图箭头指向处原本为i,现修正为min
在这里插入图片描述

最新优化版:https://download.csdn.net/download/qq_43655831/12443172
主要优化细节:
1.修复了上图的错误
2.去除了get_files函数,并解除了单次文件获得量最大1000的限制。
3.存储最大路径的数组大小255换成了常数MAX_PATH

附上一份依照该音乐库写好了的图形版音乐播放器的程序
链接:https://pan.baidu.com/s/12liFZu2-NcL5U77S1CzPag
提取码:q8q7

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值