目录
问题答疑1:为什么通过Mix_GetMusicPosition时刻获取播放音频的进度时,需要在while循环中使用SDL_PollEvent(&e)函数才能保证程序正常运行?
上一篇博文利用基于SDL2,SDL2_ttf,SDL2_image,SDL2_mixer实现音频播放器,可以看到上次我们实现不仅仅是加载WAV格式的音频文件,还可以加载MP3等格式的音频文件呢,因此本文主要是QT 6.6.0 + SDL2 + SDL2_mixer继续改进音频播放器,建议读者先去看前面几篇篇博文的内容,然后来看本文也需要会更好理解。
从最初使用QT中mediamulti的模块实现了一个简单的额音频播放器,到现在使用相关的SDL库实现了音频播放器,然后再反过来将QT 6.6.0和SDL2_mixer + SDL2进一步结合得到更加晚上的音频播放器,整个过程都是清晰和比较完整的,我相信坚持到这里的小伙伴一定有了不少的收获,也感谢大家的观看。
现在来绘制一下已经实现了的音频播放器案例的学习路线(后期的学习计算未给出):
实现思路
- 初始化SDL2以及SDL2_mixer子系统,加载CSS文件渲染界面控件;
- 选择音频文件并加载音频文件;
- 点击播放,暂停播放,快进和后退,重置播放,静音播放(播放时间进度显示);音量调整;(仅仅只是列举出了核心部分)
- 显示播放列表;任意选择播放列表中的音频文件进行播放;
- 关闭程序并释放申请的资源和关闭音频设备。
问题答疑1:为什么通过Mix_GetMusicPosition时刻获取播放音频的进度时,需要在while循环中使用SDL_PollEvent(&e)函数才能保证程序正常运行?
-
事件处理:SDL 是基于事件驱动的框架。
SDL_PollEvent(&e)
用于处理事件,比如窗口关闭、鼠标点击等。如果不调用该函数来处理事件,SDL 的事件队列可能会阻塞或者导致程序没有机会处理用户输入或其他系统事件。因此这可能导致程序在某些情况下不响应。 -
避免主线程阻塞:如果程序在一个循环中只进行音频播放,而不处理任何事件,可能会导致主线程被阻塞。通过调用
SDL_PollEvent()
,能够确保主线程仍然能够处理中断、刷新UI等操作,在大多数情况下保持程序的响应性。 -
时间同步:在
while
循环中,通常会有一个延时(如使用SDL_Delay()
,但是我们整个程序中并没有使用
),以控制检查音频进度的频率。这期间调用SDL_PollEvent()
可以确保程序在空闲时间仍然能处理中断并执行其他任务,而不会消耗过多的 CPU 资源。
注:其实关于这个SDL_PollEvent(&e) 的使用之前的程序实现中也有,只不过是没有做出解释,看到这里大家应该能够大致明白为什么要这么做了。
QT 6.6.0 + SDL2_mixer实现音频播放器