首页 > 编程语言 >C++小案例之音乐播放器

C++小案例之音乐播放器

时间:2023-06-20 17:45:08浏览次数:56  
标签:播放器 res void cmd C++ 案例 curIndex include pres

Common.h:
点击查看代码
#pragma once
#include<iostream>
#include<string>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<list>
#include<time.h>
#include<map>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
using namespace std;


MusicPlay.h:

点击查看代码

#pragma once
#include "Common.h"
class Res;
class MusicPlayer
{
public:
	//枚举命令
	enum CMD
	{
		Open,Play,Pause,Resume,Close
	};
	MusicPlayer();
	void menu();//菜单
	void keydown();//按键处理
	void showMusic();
	void playMusic();
	void pauseMusic();
	void resumeMusic();//继续音乐
	void nextMusic();
	void preMusic();
	void randPlayMusic();
	void selectMusic();

protected:
	//播放音乐的序号
	int m_curIndex;
	//存储命令
	vector<string> m_cmd;
	
	Res* m_pres;


};

Res.h

点击查看代码
#pragma once
#include "Common.h"
class Res
{
public:
	Res();
	map<int, string>& res();
	void show(int curPlayIndex);
protected:
	map<int, string> m_res;
};

MusicPlay.cpp

点击查看代码
#include "MusicPlay.h"
#include "Res.h"
MusicPlayer::MusicPlayer() {
	m_pres = new Res;
	m_curIndex = 1;//音乐从第一首开始
	//命令存储到数组中,便于播放音乐
	m_cmd.push_back("open ");
	m_cmd.push_back("play ");
	m_cmd.push_back("pause ");
	m_cmd.push_back("resume ");
	m_cmd.push_back("close ");
}
void MusicPlayer::menu()
{
	cout << "----------[音乐播放器]------------\n"
		"\t0.退出播放器\n"
		"\t1.播放音乐\n"
		"\t2.暂停\n"
		"\t3.继续\n"
		"\t4.上一首\n"
		"\t5.下一首\n"
		"\t6.随机播放\n"
		"\t7.选择播放\n"
		"-----------------------------------\n";
}

void MusicPlayer::keydown()
{
	int userKey = 0; cout << "请输入你的选择:" << endl;
	cin >> userKey;
	switch (userKey)
	{
	case 0:
		exit(0);
		break;
	case 1:
		playMusic();
		break;
	case 2:
		pauseMusic();
		break;
	case 3:
		resumeMusic();
		break;
	case 4:
		preMusic();

		break;
	case 5:
		nextMusic();
		break;
	case 6:
		randPlayMusic();
		break;
	case 7:
		selectMusic();
		break;

	}
}

void MusicPlayer::showMusic()
{
	m_pres->show(m_curIndex);
}

void MusicPlayer::playMusic()
{
	//auto r = m_pres->res();
	//r[m_curIndex]
	string opencmd = m_cmd[CMD::Open] + m_pres->res()[m_curIndex];
	mciSendString(opencmd.c_str(), 0, 0, 0);
	string playcmd = m_cmd[CMD::Play] + m_pres->res()[m_curIndex];
	mciSendString(playcmd.c_str(), 0, 0, 0);


}

void MusicPlayer::pauseMusic()
{
	string pausecmd = m_cmd[CMD::Pause] + m_pres->res()[m_curIndex];
	mciSendString(pausecmd.c_str(), 0, 0, 0);
	
}

void MusicPlayer::resumeMusic()
{
	string resumecmd = m_cmd[CMD::Resume] + m_pres->res()[m_curIndex];
	mciSendString(resumecmd.c_str(), 0, 0, 0);
}

void MusicPlayer::nextMusic()
{
	string closecmd = m_cmd[CMD::Close] + m_pres->res()[m_curIndex];
	mciSendString(closecmd.c_str(), 0, 0, 0);
	//得到上一首的音乐信号
	m_curIndex == m_pres->res().size() ? m_curIndex = 1 : m_curIndex++;
	playMusic();
}

void MusicPlayer::preMusic()
{//关闭正在播放音乐
	string closecmd = m_cmd[CMD::Close] + m_pres->res()[m_curIndex];
	mciSendString(closecmd.c_str(), 0, 0, 0);
	//得到上一首的音乐信号
	m_curIndex == 1 ? m_curIndex = m_pres->res().size(): m_curIndex--;
	playMusic();
}

void MusicPlayer::randPlayMusic()
{
	string closecmd = m_cmd[CMD::Close] + m_pres->res()[m_curIndex];
	mciSendString(closecmd.c_str(), 0, 0, 0);
	//得到上一首的音乐信号
	m_curIndex = rand() % m_pres->res().size() + 1;
	playMusic();
}

void MusicPlayer::selectMusic()
{
	string closecmd = m_cmd[CMD::Close] + m_pres->res()[m_curIndex];
	mciSendString(closecmd.c_str(), 0, 0, 0);
	cout << "请输入播放音乐的序号";
	cin >> m_curIndex;
	
	if (m_curIndex<1 || m_curIndex>m_pres->res().size())
	{
		cout << "序号无效,无法播放" << endl;

	}
	else {
		playMusic();
	}
}

Res.cpp

点击查看代码
#include "Res.h"
Res::Res()
{
	m_res[1] = "./res/music1.mp3";
	m_res[2] = "./res/music2.mp3";
	m_res[3] = "./res/music3.mp3";
	m_res[4] = "./res/music4.mp3";
	m_res[5] = "./res/music5.mp3";
	m_res[6] = "./res/music6.mp3";
	m_res[7] = "./res/music7.mp3";
	m_res[8] = "./res/music8.mp3";


}
map<int, string>& Res::res()
{
	// TODO: 在此处插入 return 语句
	return m_res;
}

void Res::show(int curPlayIndex)
{
	cout << "歌单:" << endl;
	for (auto v : m_res) {
		if (v.first == curPlayIndex) {
			cout << v.first << "\t" << v.second << "\t" << "<------" << endl;
		}
		else {
			cout << v.first << "\t" << v.second << endl;
		}
	}
}

源.cpp

点击查看代码
#include "MusicPlay.h"
int main() {
	srand((unsigned int)time(nullptr));
	//自动推断出指针类型
	auto p=new MusicPlayer;
	while (true) {
		p->menu();
		p->showMusic();
		p->keydown();
		system("cls");
	}

	/*mciSendString("open ./res/music1.mp3",0,0,0);
	mciSendString("play ./res/music1.mp3 wait", 0, 0, 0);
	mciSendString("close ./res/music1.mp3 wait", 0, 0, 0);*/
	return 0;

}

标签:播放器,res,void,cmd,C++,案例,curIndex,include,pres
From: https://www.cnblogs.com/moxiaozhi/p/17494289.html

相关文章

  • C++指针
     #include<iostream>usingnamespacestd;//指针 if(1) { inta=10; intb=20; constint*pi=&a; pi=&b; //const指针可以修改指针,不能修改指向的数据 //*pi=25; //错误表达式必须是可修改的左值 cout<<*pi<<endl; }......
  • C++字符串处理
         #include<iostream>#include<sstream>usingnamespacestd;if(1){inti;stringstreamss_stream;//注意:如果做多次数据转换;必须调用clear()来设置转换模式ss_stream<<"456";ss_stream>>i;//首先将字符串转换为intcout<<i<&......
  • 【UEC++】UE引擎程序设计浅析
    一虚幻引擎C++编程                                        未完待续.........
  • UE5 C++ UPROPERTY宏
    属性声明UPROPERTY([specifier,specifier,...],[meta(key=value,key=value,...)])TypeVariableName;属性说明符声明属性时,属性说明符可被添加到声明,以控制属性与引擎和编辑器诸多方面的相处方式常用说明符VisibleDefaultsOnly//仅在ClassDefaults可见UP......
  • 树状数组详解!(C++_单点/区间查询_单点/区间修改)
    先把这张著名的树状数组结构图摆在最前面,接下来我们就以这张图讲起!       首先图中的A数组就是所谓的原数组,也就是普通的数组形态,C则是我们今天要说的树状数组(可以看出一个树的形状,但其实和树没多大关系)从图中可以明显看到以下几个式子:有点像前缀和不是?但这样还看不出什......
  • 【数据库数据恢复】SQL Server数据库底层File Record被截断为0,无法读取的数据恢复案例
    数据库故障&分析:SQLserver数据库数据无法读取。经过初检,发现SQLserver数据库文件无法被读取的原因是因为底层FileRecord被截断为0,无法找到文件开头,数据表结构损坏。镜像文件的前面几十M空间和中间一部分空间被覆盖掉,系统表损坏,无法读取。考虑用自动备份文件来提取表结构。日......
  • 学习抽象概念案例,虚数和复数
    从哲学角度思考虚拟的东西有必要吗?人类可能是唯一一个能够构想出不存在的事物的物种,这个能力对我们来讲非常重要。说实话,虚数其实不好理解,因为这个数是之前的数学家虚构、想象出来的。那么这种虚构的数一定是抽象的,就像我们说的负数,你就很难说它存在或者不存在,当你说“我有-1个......
  • C++用纯虚函数实现协议委托的例子
      C++不像其他很多编程语言有接口、委托或者协议的概念,但是利用纯虚函数和C++多重继承的特性,我们也能实现接口、委托或协议要做的事情,下面的通过一个人设置闹钟然后被闹钟唤醒的例子来说明如何在C++中实现委托回调。#include<iostream>#include<unistd.h>usingstd::cout;u......
  • 三菱FX3U与4台三菱变频器专用指令通讯案例 功能:采用三菱FX3U PLC与4台三菱变频器E740
    三菱FX3U与4台三菱变频器专用指令通讯案例功能:采用三菱FX3UPLC与4台三菱变频器E740进行通讯。配件:三菱FX3U的PLC,加FX3U485BD板。三菱E740变频器。昆仑通态触摸屏方式:采用三菱变频器专用通讯指令。效果:控制4台变频器启停,加减速时间设定,频率,电流,电压读取三菱FX3U与四台三菱变频器......
  • C++ 计时方法 std::chrono
    计时的作用:测试某一段代码的运行时间,时间越短,则性能相对越高。C++11标准的”最佳计时方法“的代码:1#include<chrono>2usingnamespacestd;3usingnamespacechrono;45autostart=system_clock::now();6//dosomething...7autoend=system_clock::no......