deadbeef播放器歌词插件
deadbeef播放器歌词插件
起风了
一直在找一款在linux下能替代foobar2k的播放器,直到发现deadbeef,是一个小而美替代品, 但是没有好的歌词插件,看看自己能不能开发一个歌词插件。
第一版deadbeef歌词插件 是基于开源代码改的,使用gtkmm3.0, 随着deadbeef版本的升级,linux版本也无法正常使用,移植windows也有bug不能用,gtkmm依赖太多,所以萌生了直接用gtk3重写插件的想法,很多代码时AI写的。
Windows 效果

Linux(Debian) 效果


一、源码结构
- 代码目录结构
- src 代码目录
- Makefile make编译文件
- make lyricdemo 编译目标文件:lyric_demo
- make lyricbar 编译deadbeef插件 目标文件 ddb_lyricbar_gtk3
- CmakeLists.txt cmake编译文件
- 程序代码主要入口
- main.cpp 用于编译lyric_demo使用
- plugin.cpp 用于编译deadbeef插件 ddb_lyricbar_gtk3
二、歌词面板调用流程
DeaDBeeF插件模式 (plugin.cpp)
- 面板创建:
w_lyricbar_create()创建歌词面板,保存到全局变量current_lyric_widget - 歌曲开始:
message_handler()监听DB_EV_SONGSTARTED事件 - 歌词更新:
update_lyrics_wrapper()线程函数:- 获取歌曲信息 (artist, title, location)
- 检查是否需要加载新歌词
- 调用
set_lyrics()设置歌词内容 - 调用
update_lyrics()更新歌词显示
- 歌词加载:
set_lyrics()→clear_widget()停止当前滚动歌词定时器、清空当前歌词数据 - 歌词加载:
set_lyrics()→loading_lyrics()线程加载歌词 - UI初始化:
g_idle_add_once()→init_lyric_handle()初始化歌词面板 - 定时器启动:
start_time()启动定时器 - 歌词滚动:
lyric_timer_callback()定时调用update_lyrics()滚动歌词
Demo模式 (main.cpp)
- 面板创建:
lyric_widget_new()创建歌词面板 - 歌曲进度:
get_position()模拟当前歌曲播放位置,自动累加时间 - 歌曲切换: 用户点击上一首、下一首按钮分别触发on_pre_clicked事件、on_next_clicked事件,调用
set_lyrics()切换歌曲 - 后续流程: 与插件模式相同
关键函数说明
set_lyrics(): 设置当前播放歌曲,开启线程加载歌词loading_lyrics(): 后台线程加载歌词文件或从网络下载init_lyric_handle(): UI线程初始化歌词面板显示start_time(): 启动定时器进行歌词同步lyric_timer_callback(): 定时器回调,调用get_position()获取播放位置并更新歌词update_lyrics(): 根据播放时间更新歌词高亮和滚动位置
三、编译
- 环境
- Linux
sudo apt install libgtk-3.0+-dev
sudo apt install libcurl4-openssl-dev
sudo apt install libtag1-dev
sudo apt-get install autoconf automake libtool autopoint
- Windows
-
gtk3lyrics.sln只能编译demo,无法编译插件
-
使用MSYS2 MINGW64
pacman -S mingw-w64-x86_64-taglib
pacman -S mingw-w64-x86_64-curl
pacman -S mingw-w64-x86_64-gtk3pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-autoconf
pacman -S mingw-w64-x86_64-automake
pacman -S mingw-w64-x86_64-pkg-config
** 如有缺失参考下我的 **
base 2022.06-1
filesystem 2025.02.23-1
git 2.49.0-1
libtool 2.5.4-1
make 4.4.1-2
mingw-w64-x86_64-clang 20.1.3-1
mingw-w64-x86_64-curl 8.13.0-2
mingw-w64-x86_64-dlfcn 1.4.2-1
mingw-w64-x86_64-faad2 2.11.2-1
mingw-w64-x86_64-ffmpeg 7.1.1-2
mingw-w64-x86_64-flac 1.5.0-1
mingw-w64-x86_64-glade 3.40.0-5
mingw-w64-x86_64-gtk2 2.24.33-6
mingw-w64-x86_64-gtk3 3.24.49-1
mingw-w64-x86_64-gtkmm3 3.24.10-2
mingw-w64-x86_64-jansson 2.14.1-2
mingw-w64-x86_64-libblocksruntime-swift 6.1-2
mingw-w64-x86_64-libdispatch 6.1-2
mingw-w64-x86_64-libmad 0.15.1b-5
mingw-w64-x86_64-libogg 1.3.5-1
mingw-w64-x86_64-libsamplerate 0.2.2-1
mingw-w64-x86_64-libsndfile 1.2.2-1
mingw-w64-x86_64-libvorbis 1.3.7-2
mingw-w64-x86_64-libzip 1.11.3-1
mingw-w64-x86_64-mpg123 1.32.10-1
mingw-w64-x86_64-opus 1.5.2-1
mingw-w64-x86_64-opusfile 0.12-3
mingw-w64-x86_64-pkg-config 0.29.2-6
mingw-w64-x86_64-portaudio 1~19.7.0-4
mingw-w64-x86_64-pulseaudio 17.0-2
mingw-w64-x86_64-taglib 2.0.2-1
mingw-w64-x86_64-wavpack 5.8.1-1
msys2-runtime 3.6.1-4
vim 9.1.1236-1
- 下载deadbeef
git clone https://github.com/DeaDBeeF-Player/deadbeef.git
- deadbeef依赖检查(可选)
./autogen.sh
./Configre
- 拷贝deadbeef头文件
# 拷贝头文件
cd deadbeef/include
sudo cp -r deadbeef /usr/local/include
# 拷贝GTKui头文件
cd deadbeef/plugins/gtkui
sudo cp *.h /usr/local/include/deadbeef
编译gtk3lyrics
源码地址
- 编译demo
** 无需下载deadbeef源码 **
make lyricdemo
- 编译插件
make lyricbar
