cpp
复制代码
//music_manager.cpp
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <vector>
#include <string>
// 存储所有打开的设备别名
static std::vector<std::string> g_deviceAliases;
static std::string g_currentDevice = "";
void playBackgroundMusic(const char* music, bool repeat, int volume)
{
static int i = 0;
char alias[20];
sprintf(alias, "bgm%d", i++);
char cmd[256] = { 0 };
// 打开设备
sprintf(cmd, "open \"%s\" alias %s", music, alias);
MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
if (ret != 0)
{
char err[100] = { 0 };
mciGetErrorString(ret, err, sizeof(err));
printf("[open error]: %s\n", err);
return;
}
// 设置音量
if (volume != -1)
{
sprintf(cmd, "setaudio %s volume to %d", alias, volume);
ret = mciSendString(cmd, NULL, 0, NULL);
if (ret != 0)
{
char err[100] = { 0 };
mciGetErrorString(ret, err, sizeof(err));
printf("[volume error]: %s\n", err);
}
}
// 播放
sprintf(cmd, "play %s %s", alias, repeat ? "repeat" : "");
ret = mciSendString(cmd, NULL, 0, NULL);
if (ret != 0)
{
char err[100] = { 0 };
mciGetErrorString(ret, err, sizeof(err));
printf("[play error]: %s\n", err);
// 播放失败时关闭设备
sprintf(cmd, "close %s", alias);
mciSendString(cmd, NULL, 0, NULL);
return;
}
// 保存设备信息
g_deviceAliases.push_back(alias);
g_currentDevice = alias;
printf("Playing music: %s on device: %s\n", music, alias);
}
void pauseBackgroundMusic()
{
if (g_currentDevice.empty()) {
printf("No music is currently playing.\n");
return;
}
char cmd[100] = { 0 };
sprintf(cmd, "pause %s", g_currentDevice.c_str());
MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
if (ret != 0)
{
char err[100] = { 0 };
mciGetErrorString(ret, err, sizeof(err));
printf("[pause error]: %s\n", err);
}
else
{
printf("Music paused: %s\n", g_currentDevice.c_str());
}
}
void resumeBackgroundMusic()
{
if (g_currentDevice.empty()) {
printf("No music is currently paused.\n");
return;
}
char cmd[100] = { 0 };
sprintf(cmd, "resume %s", g_currentDevice.c_str());
MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
if (ret != 0)
{
char err[100] = { 0 };
mciGetErrorString(ret, err, sizeof(err));
printf("[resume error]: %s\n", err);
}
else
{
printf("Music resumed: %s\n", g_currentDevice.c_str());
}
}
void stopBackgroundMusic()
{
if (g_currentDevice.empty()) {
printf("No music is currently playing.\n");
return;
}
char cmd[100] = { 0 };
// 停止播放
sprintf(cmd, "stop %s", g_currentDevice.c_str());
mciSendString(cmd, NULL, 0, NULL);
// 关闭设备
sprintf(cmd, "close %s", g_currentDevice.c_str());
MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
if (ret != 0)
{
char err[100] = { 0 };
mciGetErrorString(ret, err, sizeof(err));
printf("[close error]: %s\n", err);
}
else
{
printf("Music stopped and closed: %s\n", g_currentDevice.c_str());
// 从列表中移除
for (auto it = g_deviceAliases.begin(); it != g_deviceAliases.end(); ++it) {
if (*it == g_currentDevice) {
g_deviceAliases.erase(it);
break;
}
}
g_currentDevice = "";
}
}
void closeAllMusic()
{
char cmd[100] = { 0 };
// 关闭所有设备
for (const auto& alias : g_deviceAliases) {
sprintf(cmd, "close %s", alias.c_str());
mciSendString(cmd, NULL, 0, NULL);
printf("Closed device: %s\n", alias.c_str());
}
g_deviceAliases.clear();
g_currentDevice = "";
printf("All music devices closed.\n");
}