gpt4 book ai didi

c++ - 如何使用 FMOD 和 C++ 显示当前音乐位置?

转载 作者:行者123 更新时间:2023-11-30 03:17:01 25 4
gpt4 key购买 nike

我想实时显示音乐播放耗时。FMOD 的Core API 提供了Channel::getPosition() 函数来获取当前位置,以毫秒为单位。我想每秒更新一次位置。

我是初学者,对多线程编程一无所知。

我在循环中调用 Channel::getPosition() 并使用 std::this_thread::sleep_for() 在下一次迭代之前将循环延迟一秒钟.

代码如下:

unsigned int position = 0;
std::chrono::milliseconds timespan(1000);
while(true) {
channel -> getPosition(&position, FMOD_TIMEUNIT_MS);
std::cout << postion / 1000 << "\n"; //Display seconds
std::this_thread::sleep_for(timespan);
}

但是,我得到了一些错误的输出:

0
1
...
13
13
14
16
...

13出现了两次,15甚至没有出现。在另一种情况下,5 出现了两次。

我正在考虑将我从 Channel::getPosition() 获得的数字四舍五入或四舍五入以更正输出。

我该如何解决这个问题?

注意:为简单起见省略了错误检查

最佳答案

  1. 使用 <chrono>即使是微不足道的计时功能。

  2. 使用 C++17 round在此示例中将毫秒截断为秒的函数。如果你没有 C++17,请窃取 round来自 here .

  3. 使用 sleep_until而不是 sleep_for以便为循环的每次迭代保持更准确的“时间跨度”。

综合起来:

#include <chrono>
#include <iostream>
#include <memory>
#include <thread>

enum unit{FMOD_TIMEUNIT_MS};

struct Channel
{
void getPosition(unsigned int* position, unit)
{
using namespace std::chrono;
static auto start = steady_clock::now();
*position = duration_cast<milliseconds>(steady_clock::now()-start).count();
}
};

int
main()
{
using namespace std::chrono;
auto channel = std::make_unique<Channel>();
auto constexpr timespan = 1s;
auto next_start = system_clock::now() + timespan;
while (true)
{
unsigned int position_as_integral;
channel->getPosition(&position_as_integral, FMOD_TIMEUNIT_MS);
milliseconds position{position_as_integral};
std::cout << round<seconds>(position).count() << '\n';
std::this_thread::sleep_until(next_start);
next_start += timespan;
}
}

关于c++ - 如何使用 FMOD 和 C++ 显示当前音乐位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55795908/

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