
#pragma once
void playBackgroundMusic(const char* music, bool repeat = false, int volume = -1);
void pauseBackgroundMusic();
void resumeBackgroundMusic();
void stopBackgroundMusic();
void closeAllMusic();
#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");
}
#include "music_manager.h"
#include <windows.h>
#include<graphics.h>
#include <conio.h>
#define WIDTH 800
#define HEIGHT 600
IMAGE background;
int swap;
void init() {initgraph(WIDTH, HEIGHT,1); loadimage(&background, _T("syk.png"));putimage(0, 0, &background);
}int main()
{init();playBackgroundMusic("background.mp3", true, 500); while (1) {if (MouseHit()) {MOUSEMSG msg = GetMouseMsg();if (msg.uMsg == WM_LBUTTONDOWN) {swap = ~swap;if (swap) {pauseBackgroundMusic();}else {resumeBackgroundMusic();}}if (msg.uMsg == WM_RBUTTONDOWN) {playBackgroundMusic("b1.mp3", true, 500); }if (msg.uMsg == WM_MBUTTONDOWN) {closeAllMusic();}if (msg.uMsg == WM_RBUTTONDBLCLK) {}}}Sleep(3000); pauseBackgroundMusic();Sleep(2000); resumeBackgroundMusic();Sleep(3000); playBackgroundMusic("b1.mp3", false, 800); Sleep(10000);closeAllMusic();_getch();closegraph(); return 0;
}