我有一个遗留系统,可以在以前的系统上运行,但无法使其运行。
系统: 我有一张华硕 Xonar 7,1 声卡。我之前在 Linux 上运行过 Spotify。我之前运行的是 7.1 卡,所有通道都连接到 8 通道放大器。 我将 .asoundrc 与代表每组扬声器的多个 pcm 设备一起使用,即
pcm.study {
type route
slave {
pcm "hw:0,0"
channels 8
}
ttable {
0.2= 1
1.3= 1
}
}
每个房间都重复此操作。 Linux 的原始 Spotify 不允许我选择音频设备,因此我编写了一个共享库,该库拦截 snd_pcm_open 并根据文件中的值修改设备名称,然后使用
dlsym(RTLD_NEXT, "snd_pcm_open")
打开所需的设备。我有一个单独的守护进程来设置此文件中的值。
不再支持 Linux 的原始 Spotify,因此我在安装 debian 12 后尝试了 snap 包,并设法使用 aplay -D 研究让单独的 pcm 设备通过所需的输出播放。
我编写了一个应用程序,可以在默认的 alsa 设备上播放波形文件,并使用 LD_PRELOAD 来预加载我的库,它工作正常。
对于所有其他应用程序,我遇到了各种不同的问题。 对于 Spotify(快速安装)和其他一些使用 librespot 的应用程序,我得到了
ld.so: object 'alsaselect.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
我已经尝试了库的完整路径和库名称。 我在负载上使用了 LD_DEBUG 和 strace,但看不出它失败的原因。
使用 vlc 我可以加载库,但是当我拦截 snd_pcm_open 时,函数 dlsym(RTLD_NEXT, "snd_pcm_open") 返回 NULL
vlc 可以从它的设备选择菜单中播放 pcm 设备。
我不确定是否继续走这条路。 还有其他方法可以实现这一目标吗?我最初实现这一点时遇到了很少的麻烦,但不确定操作系统中的某些内容是否已更改(我认为原始版本将小于 debian 8)
好的,通过不同的路径解决了这个问题。
LD_PRELOAD 失败的原因似乎是新的 Spotify 应用程序是一个 snap 应用程序,并且容器系统似乎正在停止预加载。同样,我尝试过的另一个应用程序https://github.com/xou816/spot作为 flatpak 分发也有同样的问题。
不太了解导致加载失败的原因,因为我假设它可能加载但无法工作,但我可以忽略这一点。
通过克隆现货存储库并编译它来解决这个问题,这样我就可以将它作为本地应用程序运行。我原来的 LD_PRELOAD 现在加载并像以前一样工作。