首页 > 解决方案 > 用 C++ 播放音乐

问题描述

我在用 c++ 播放 mp3 文件时遇到了一些问题(我为我的英语道歉,这不是我的第一语言)。我在程序中使用 winapi 播放音乐(我正在使用函数 mciSendStringW)。我的程序将使用 3 个线程。主线程,一个用于输入/输出操作的线程和一个用于播放音乐的线程。我有两个问题:

  1. 我不知道,音乐什么时候结束(我不知道歌曲的大小和长度)。我可以用:

mciSendStringW(LR"(play SongPath1.mp3 wait)", NULL, 0, NULL)

但我有第二个问题

  1. 我无法停止音乐,如果我使用:

mciSendStringW(LR"(play SongPath1.mp3 wait)", NULL, 0, NULL);

因为,程序会停在这一行,直到歌曲结束。例如,用户关闭音乐,但是,我不能说停止音乐,也不能杀死另一个线程中的音乐线程。但是如果我使用

mciSendStringW(LR"(play SongPath1.mp3)", NULL, 0, NULL);

没有标志“等待”我可以写这样的东西:

mciSendStringW(LR"(play SongPath1.mp3 )", NULL, 0, NULL);
while(true){
    g_song_mutex.lock();     /*global mutex for g_switch_off_music*/
    if(g_switch_off_music) { /*global bool for switch off music*/
        mciSendStringW(LR"(stop SongPath1.mp3)", NULL, 0, NULL);
        return;
    this_thread::sleep_for(chrono::milliseconds(300));
    }
    g_song_mutex.unlock();
}

但是我有不止一首歌曲,当第一首歌曲结束时,将开始 secong。但我不知道,歌曲何时结束。如果我使用编程:

 mciSendStringW(LR"(play SongPath1.mp3)", NULL, 0, NULL);

无法播放第二首歌曲(或第一首重复),或者如果我使用:

mciSendStringW(LR"(play SongPath1.mp3 wait)", NULL, 0, NULL);

程序无法关闭歌曲。

标签: c++multithreadingwinapiaudio

解决方案


推荐阅读