最近我已经要求类似这个问题的解决方案:
有没有办法使用“等待”选项暂停/停止使用 mcisendstring 播放的 mp3 文件?
我想在我的音频播放器中实现一个功能,它允许人们连续播放声音,同时滑块根据轨道运行的当前秒移动,并且还具有在当前轨道之后转到下一个轨道的功能是超过
之后(您可以在链接中阅读)尝试使用
mciSendString("play mp3 wait", NULL, 0, NULL);
由于轨道在完成之前无法暂停或停止的问题而失败,我现在正在尝试以另一种方式实现它。目前,当我开始播放曲目时,我还启动了另一个线程,即启动计数器。计数器以秒为单位获取轨道的长度,并且正在倒计时,还提供了一个用于暂停/恢复计数器的互斥锁。为了阻止我的 MusicCycle 简单地循环不受控制,我加入了线程,因此等待它的终止。
void Music::MusicCycle(std::wstring trackPath)
{
while (true)
{
OpenMP3(trackPath);
mciSendString("play mp3", NULL, 0, NULL);
m_counterThread = boost::thread(boost::bind(&Counter::StartCount, m_counter, <length of track in seconds>));
m_counterThread.join();
//... Get new track here
}
}
请注意,整个方法也是在线程中创建的:
m_cycleThread = boost::thread(boost::bind(&Music::MusicCycle, this, trackPath));
MusicCycle 函数启动的线程如下所示:
void Counter::StartCount(int seconds)
{
boost::mutex::scoped_lock lock(m_mutex);
for (int i = 0; i < seconds; i++)
{
while (m_counterLock)
{
m_condVar.wait(lock);
}
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
}
此外,我还使用我的 Pause/Resume 方法添加了另一个功能来锁定/解锁互斥锁,这些方法也调用相应的 mciSendString 函数
mciSendString("resume mp3", NULL, 0, NULL);
mciSendString("pause mp3", NULL, 0, NULL);
当我现在调用 pause 时,mciSendString 会暂停轨道,并锁定计数器,使其不会继续倒计时。
但是,问题是它仍然不起作用。尽管我在不使用 mciSendString 中的等待选项的情况下努力想出一个解决方案,但暂停根本不会影响音乐的播放
有什么建议吗?
编辑:原来这实际上是由于线程而发生的。我已经做了一些 C# 很长时间了,您可以使用 Invokes 来解决线程问题。也许这在这里也是可能的?
EDIT2:我读了一下,似乎有一个选项可以通过 PostMessage WinAPI 调用在另一个线程的消息队列中发布一个方法。这里有可能吗?如果是,任何人都可以提供一个很好的例子吗?我读了一点,但到目前为止我还不太明白
C++ 中也有类似的东西吗?