gpt4 book ai didi

c++ - mciSendString 不会暂停从线程播放的声音

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:37 24 4
gpt4 key购买 nike

最近我已经问了一个类似这个问题的解决方案:

Is there a way to pause/stop a mp3 file playing with mcisendstring with the "wait" option?

我想在我的音频播放器中实现一个功能,它允许人们连续播放声音,同时 slider 根据轨道运行的当前秒数移动,并且还具有在播放后转到下一首轨道的功能当前轨道结束

在(你可以在链接中读到)尝试用

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));
}
}

另外,我在这里添加了另一个功能来使用我的暂停/恢复方法来锁定/解锁互斥体,它也调用相应的 mciSendString 函数

mciSendString("resume mp3", NULL, 0, NULL);

mciSendString("pause mp3", NULL, 0, NULL);

当我现在调用 pause 时,mciSendString 会暂停轨道,并锁定计数器,这样它就不会继续倒计时。

但是,问题是还是不行。暂停根本不会影响音乐的播放,尽管我努力想出一个解决方案而不使用 mciSendString 中的等待选项

有什么建议吗?

编辑:原来这实际上是由于线程而发生的。我已经做了很长时间的 C#,您可以使用 Invokes 来解决线程问题。也许这在这里也是可能的?

EDIT2:我读了一点,似乎有一个选项可以通过 PostMessage WinAPI 调用在另一个线程的消息队列中发布一个方法。这有可能吗?如果是,谁能提供一个很好的例子?我读了一点书,但到目前为止我还不太明白

C++中是否也有类似的东西?

最佳答案

EDIT: Turns out this is actually happening due to threading. I've been doing some C# for a good amount of time and you could use Invokes to work around thread problems.

是的。如果您需要一个用于异步事件的用户级线程,然后排队的消息就是您的操作过程(如 C#(或 Java 等)在 UI 线程上调用)。这是一项艰苦的工作。

EDIT2: I read up a bit and it seems like there is an option to Post a method in the message queue of another thread via PostMessage WinAPI call. Is this a possiblity here? If yes, could anyone provide a good example? I read up a bit but I don't really understand alot so far

Is there something like this in C++ as well?

您所指的只是一般的消息泵/事件循环,它几乎是所有 UI 框架的基础。 C++ 本身不“具有”GUI,但肯定存在具有类似功能的库。

Boost Asio 值得一提。如果您已经有一个 GUI 框架,它就会有自己的事件循环(Qt、MFC 等都有)。

无论使用什么,所有 Win32 GUI 应用程序最终都使用您提到的消息泵,它确实允许发布消息。这几乎总是错误的抽象级别,除非您正在积极开发 GUI 框架²

您始终可以构建自己的。只需有某种(优先级)队列来接收消息并有一个主循环来处理这些消息。称它们为事件并迅速:事件驱动的设计。


¹ 目前正掀起一波返璞归真的浪潮,比如https://github.com/ocornut/imgui

² 这个问题存在的事实告诉我你没有这样做

关于c++ - mciSendString 不会暂停从线程播放的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34774867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com