由于本机使用的Ubuntu 20.04双系统但是实验环境要求使用22.04,由于不想在Windows下开虚拟机,遂尝试用Docker运行22.04.
Docker镜像选用的是:osrf/ros:humble-desktop-full-jammy ,可能有一些桌面环境显示的库,这个实验是需要桌面环境的,但是这个镜像里面没有完整的桌面环境。
PA0顺利搭建完毕,开始尝试PA1小游戏,正常编译通过,运行时卡死,然后有一个灰屏界面,一直没有视频加载出来
问题1
ALSA lib confmisc.c:855:(parse_card) cannot find card '0'
ALSA lib conf.c:5178:(_snd_config_evaluate) function snd_func_card_inum returned error: No such file or directory
ALSA lib confmisc.c:422:(snd_func_concat) error evaluating strings
ALSA lib conf.c:5178:(_snd_config_evaluate) function snd_func_conca
搜索发现ALSA 是高级Linux声音架构,结合搜索结果和Docker特殊环境,我猜测Docker是Docker配置的问题。
感谢:ubuntu docker 调用宿主机声卡(alsa)_ubuntu docker aplay-l 为什么包含蓝牙耳机-CSDN博客
解决
我通过重新run一个容器,安装驱动(上面老哥的方案我只搞到这3步,导致后面还是有问题),实现Docker直接使用主机的音频设备,然后解决了这些的问题
问题2
上面报错没有了,但是有新的ALSA:
ALSA lib pcm_dmix.c:1032:(snd_pcm_dmix_open) unable to open slave
这个slave是子设备,应该是无法打开音频子设备
解决
感谢:https://github.com/Uberi/speech_recognition/issues/526
其中提到
The problem is related to the alsa.conf.
Go to/usr/share/alsa/alsa.conf
then comment lines with unknown PCM cards e.g. cards.pcm.rear:
我比较了一下Docker容器里的/usr/share/alsa/alsa.conf和本机里的/usr/share/alsa/alsa.conf文件,二者内容不一样,因为上面让Docker直接用主机的声卡,so为了一致,我把主机里的alsa.conf文件覆盖了容器里的。
成功,unable to open slave的问题成功解决。
问题3
没有报错了,但是卡在了 终端输出了: Initializing video... 后,就卡死,然后有一个灰屏界面,一直没有视频加载出来。
解决
经过我在Makefile里加-g编译选项,通过调试,发现程序卡在一个死循环里。
while ((free = GetWriteSound()) == 0) break; // wait until there is free space
/**
* Returns the amount of free space in the audio buffer.
*/
uint32
GetWriteSound(void)
{
#if SOUND_CONFIG != SOUND_NONE
int count = io_read(AM_AUDIO_STATUS).count / sizeof(int16_t);
return s_BufferSize - count;
#else
return 0;
#endif
}
通过VSCode的变量显示,我发现里面变量free一直==0,就是声卡缓冲区一直是满的。我干脆直接用break;跳出了循环,跳出两层循环,然后运行,成功显示出页面了
问题4
成功有游戏界面了,但是游戏程序不受我键盘控制,一直快速执行。
怀疑还是前面的声卡缓冲区的问题,只能改回来源代码。
解决
我又回到了第一个老哥的文章,我发现我没有按照文章搞完,没有在Docker里尝试播放mp3,遂回到老哥文章,继续从第4步搞,直到在配好播放配置后,成功用play播放了《Are you OK》
成功
这时,回到实验代码,重新编译执行。终于成功了,游戏界面,音效都正常播放 \ww/。贴一张