In the linglong container, ldconfig -C "$LINGLONG_LD_SO_CACHE" failed
to make VLC runtime libraries discoverable, causing deepin-music to
fall back to QtPlayer whose supported format list is incomplete
(missing ac3/amr etc.), resulting in import failure for these formats.
Replace ldconfig with explicit symlink creation for required runtime
libraries (libvlccore, libvlc, libSDL2-2.0, libavcodec, libavformat,
libavutil, libswresample) so that VLC libraries are properly loaded
and VlcPlayer is used as the playback engine.
pms: BUG-379183
Log: create runtime library symlinks for linglong package
1. Root cause: onBufferDetector() set m_stopFlag on a running thread
but never called wait(); start() on a running QThread is a no-op so
the new track's waveform detection never launched; the old thread's
exit path also cleared m_curPath/m_curHash, overwriting the new
track metadata just set by onBufferDetector()
2. Fix: introduce QMutex-protected request generation counter and
pending-request queue; new requests arriving while the worker is
running are queued and started via QThread::finished signal; stale
thread results are discarded by generation check in resample and
forwardAudioBuffer; QML side also filters stale buffers by hash
3. Impact: public audioBuffer signal and slot signatures unchanged;
AudioAnalysis and all existing callers unaffected; new concurrency
test covers the race scenario
Log: fix waveform progress bar anomaly on track switch
Influence:
1. Test waveform display when rapidly switching tracks
2. Test waveform display when playing from album page
3. Verify no stale waveform data after track switch
fix: 修复切歌时波形进度条状态异常
1. 根因:onBufferDetector() 在检测线程运行时仅设置 m_stopFlag 但未
调用 wait() 等待线程退出,对运行中的线程调用 start() 是空操作导致
新歌曲波形检测无法启动;旧线程退出时 clear m_curPath/m_curHash
覆盖刚设置的新歌曲信息
2. 方案:引入 QMutex 保护的请求代际计数器和待处理请求队列;新请求在
工作线程运行时排队,通过 QThread::finished 信号启动;resample 和
forwardAudioBuffer 中通过代际检查丢弃过期结果;QML 侧通过 hash
比较过滤过期波形数据
3. 影响:公开 audioBuffer 信号和槽签名未变,AudioAnalysis 及所有现有
调用方不受影响;新增竞态测试覆盖切歌场景
Log: 修复切歌时波形进度条状态异常
Influence:
1. 测试快速切歌时的波形显示
2. 测试从专辑页面播放时的波形显示
3. 验证切歌后无过期波形数据残留
PMS: BUG-378709
1. Root cause: SettingsDialog.qml set Qt.WindowStaysOnTopHint
causing the dialog to always stay on top of other windows
2. Fix: replace flags with Qt.Dialog | Qt.WindowCloseButtonHint
and add modality Qt.WindowModal for proper modal dialog behavior
3. Impact: settings dialog no longer covers other app windows,
works as a standard modal dialog without affecting other components
Log: Settings dialog no longer stays on top of other windows
Influence:
1. Test opening settings dialog and switching to other app windows
2. Verify settings dialog blocks parent window interaction (modal)
3. Verify close button and config saving still work correctly
fix: 移除设置对话框的始终置顶标志
1. 根因:SettingsDialog.qml 设置了 Qt.WindowStaysOnTopHint,导致
设置对话框始终显示在其他窗口之上
2. 方案:将 flags 改为 Qt.Dialog | Qt.WindowCloseButtonHint,新增
modality: Qt.WindowModal,使设置对话框作为常规模态对话框展示
3. 影响:设置对话框不再遮挡其他应用窗口,不影响其他组件行为
Log: 设置对话框不再始终置顶展示
Influence:
1. 测试打开设置对话框后切换到其他应用窗口
2. 验证设置对话框模态阻塞父窗口交互
3. 验证关闭按钮和配置保存功能正常
PMS: BUG-378317
1. Root cause: SearchResultDialog.qml had no keyboard navigation;
SearchEdit only handled Return key, arrow keys were consumed by
TextField default cursor movement
2. Fix: add selectedIndex tracking, moveSelection/activateSelection
methods and highlight in SearchResultDialog; add Keys.onDownPressed
/onUpPressed and extend onReturnPressed in WindowTitlebar SearchEdit
3. Impact: users can now navigate search results with arrow keys and
confirm with Enter; mouse interaction unchanged
Log: Search results now support keyboard navigation with arrow keys
Influence:
1. Test arrow key navigation in search result dropdown
2. Test Enter key to activate selected search result
3. Verify mouse hover and click still work as before
fix: 搜索结果下拉列表添加键盘导航
1. 根因:SearchResultDialog.qml 无键盘导航机制,SearchEdit 仅处理
回车键,方向键被 TextField 默认光标移动行为消费
2. 方案:在 SearchResultDialog 添加 selectedIndex 追踪、
moveSelection/activateSelection 方法和高亮显示;在 WindowTitlebar
的 SearchEdit 添加方向键处理并扩展回车键逻辑
3. 影响:用户可通过方向键导航搜索结果并回车确认,鼠标交互不受影响
Log: 搜索结果支持方向键导航和回车选择
Influence:
1. 测试搜索结果下拉列表中方向键导航
2. 测试回车键激活选中的搜索结果
3. 验证鼠标悬停和点击功能无回归
PMS: BUG-375953
1. Root cause: SearchResultDialog (Popup) used searchEdit.x which is
a local coordinate relative to titleRowLayout, but Popup renders
in Overlay layer with a different coordinate system
2. Fix: set parent to titleBar and use mapToItem() to convert
searchEdit coordinates into titleBar coordinate system
3. Impact: only affects search result dropdown position, no change to
search logic or event handling
Log: fix search result dropdown misalignment with search box
Influence:
1. Test searching by album name with songs in library
2. Verify dropdown appears below and centered on search box
3. Resize window and verify dropdown stays aligned
fix: 修复搜索关联栏位置错位
1. 根因:SearchResultDialog(Popup)使用 searchEdit.x 定位,但该值
是相对于 titleRowLayout 的局部坐标,而 Popup 显示在 Overlay 层
使用不同坐标系,导致下拉框偏移
2. 方案:将 Popup 的 parent 设为 titleBar,使用 mapToItem() 将
searchEdit 坐标转换到 titleBar 坐标系后定位
3. 影响:仅影响搜索结果下拉框显示位置,不影响搜索逻辑和事件处理
Log: 修复搜索关联栏位置错位
Influence:
1. 测试搜索已导入歌曲的专辑名
2. 验证下拉框出现在搜索框正下方居中对齐
3. 调整窗口大小后验证下拉框保持对齐
PMS: BUG-375805
Remove ensureStartMenuShortcut() which created a "深度音乐.lnk" shortcut in the
Windows Start Menu Programs folder on launch, along with its declaration in
winsmtc.h, the call site in main.cpp, the WINSMTC_AUMID macro, and the
now-unused includes (QDir, shlobj, shobjidl, propkey, propvarutil).
refactor: 移除 Windows 开始菜单快捷方式创建逻辑
移除 ensureStartMenuShortcut() 函数,该函数原在应用启动时于 Windows 开始菜单
Programs 目录下创建"深度音乐.lnk"快捷方式;同时移除 winsmtc.h 中的声明、
main.cpp 中的调用、WINSMTC_AUMID 宏,以及随之不再使用的头文件包含
(QDir、shlobj、shobjidl、propkey、propvarutil)。
Lines like [00:01.00][00:02.00]same line were misparsed as word-timed
lyrics. Now only treat a line as word-timed when each intermediate
timestamp is followed by lyric text.
形如 [00:01.00][00:02.00]同一句歌词 的多时间标签行,此前被误判为逐字歌词。
现在只有当每个中间时间标签后都跟有歌词文本时,才按逐字歌词解析。
多个时间标签会生成多条同文本的独立歌词行。
Log: 修复重复时间标签 LRC 行被误判为逐字歌词的问题
Influence: 修复后带多个时间标签的歌词行按多行独立显示,逐字歌词解析不再被误触发,歌词同步更准确。
shutdown() early-returned when m_initialized was false, skipping cleanup of
partial state. Now cleanup runs if any of SMTC/updater/props/RO init exist.
shutdown() 在 m_initialized 为 false 时直接返回,跳过了部分初始化状态的清理。
现在只要 SMTC/更新器/属性/RO 初始化任一存在,清理逻辑均会执行。
Log: 修复 WinSMTC 部分初始化时资源未清理的问题
Influence: 修复 Windows 下初始化中途失败时 SMTC 资源泄漏,避免系统媒体控件残留。
Replace the deprecated `function onSignal(...)` form with the proper
`onSignal: function(...)` syntax for the searchItemTriggered handler
in SearchResultDialog. The old form is not supported by newer QML
engines and prevented the handler from being invoked.
fix: 修正 WindowTitlebar 中的 QML 信号处理器语法
将 SearchResultDialog 中 searchItemTriggered 信号处理器由已弃用的
`function onSignal(...)` 形式改为正确的 `onSignal: function(...)` 语法。
旧写法在新版 QML 引擎中不受支持,会导致处理器无法被正常调用。
The `add_definitions(-include poll.h)` was a workaround because VLC
headers call poll() without including poll.h. Drop the workaround from
src/libdmusic/CMakeLists.txt along with its explanatory comment.
fix: 移除 VLC 头文件强制包含 poll.h 的 workaround
此前由于 VLC 头文件调用 poll() 但未包含 poll.h,通过
`add_definitions(-include poll.h)` 强制包含以绕过该问题。
现从 src/libdmusic/CMakeLists.txt 中移除该 workaround 及对应注释。
- Store the ButtonPressed registration token as a member and remove it
in shutdown() before releasing SMTC, fixing use-after-free crash when
a media key is dispatched after the app exits
- Guard setWinSMTC() against double initialization to avoid leaking the
old WinSMTC object and duplicate signal connections
- Move engine.rootObjects() emptiness check before first access in
main.cpp to avoid undefined behavior when QML loading fails
- Make the SMTC play fallback actually start playback (play() falls
back to forcePlay() when the current meta has no localPath)
- Pair RoInitialize/RoUninitialize and CoInitializeEx/CoUninitialize,
and validate DataWriter StoreAsync results
fix: 加固 WinSMTC 释放流程并修复 SMTC 播放回退
- ButtonPressed 注册 token 保存为成员,shutdown() 中先解绑再释放 SMTC,
修复应用退出后系统派发媒体键导致的 use-after-free 崩溃
- setWinSMTC() 增加双重初始化保护,避免泄漏旧对象并重复 connect
- main.cpp 将 engine.rootObjects() 判空上移到首次访问之前,
避免 QML 加载失败时的未定义行为
- SMTC 播放回退改为真正触发播放(当前曲目无 localPath 时 play()
内部走 forcePlay()),按“播放”必定有声音
- 配对 RoInitialize/RoUninitialize 与 CoInitializeEx/CoUninitialize,
并校验 DataWriter StoreAsync 返回值
- Add Windows System Media Transport Controls (SMTC) support
- Wrap MprisPlayer include and usage in Q_OS_LINUX ifdef
- Use void* placeholder for non-Linux platforms to maintain ABI
- Add platform guards for setMprisPlayer in presenter and main
- Update tests to conditionally compile MPRIS-dependent code
feat: 添加 Windows SMTC 支持并为 MPRIS 添加 Linux 条件编译
- 新增 Windows System Media Transport Controls (SMTC) 支持
- 使用 Q_OS_LINUX ifdef 将 MprisPlayer 包裹为仅 Linux 可用
- 非 Linux 平台使用 void* 占位符保持 ABI 兼容
- 为 presenter 和 main 中的 setMprisPlayer 添加平台保护
- 更新测试代码的条件编译
Pass the original playback position to LyricRect.currentPosition in
LyricPage.positionChange(); the +500ms offset is now only used for the
line-scroll look-ahead binary search, so word-by-word (karaoke)
highlighting no longer runs 500ms ahead.
Relax the timestamp regex from \d{2,3} to \d{1,3} and handle one-digit
fractions (*100) in parseTimeStamp, so legacy timestamps like [01:23.4]
are no longer silently dropped.
fix: 修复逐字歌词高亮提前500ms及一位小数时间戳被丢弃
- LyricPage.qml 中 currentPosition 改为使用原始播放位置,+500ms 偏移
仅用于提前滚动当前行的二分查找,避免逐字卡拉OK式高亮提前 500ms。
- 时间戳正则放宽为支持 1~3 位小数,parseTimeStamp 对 1 位小数做 *100
处理,形如 [01:23.4] 的旧格式时间戳不再被静默丢弃。
- Overhaul SearchResultWindow navigation with StackView for push/pop transitions
- Adjust grid cell sizes for better artist and album display
- Add requestClose signal and padding/radius improvements to SearchResultDialog
- Remove sidebar auto-uncheck behavior when entering search page
- Fix connection handlers for artist and album detail navigation
fix: 优化搜索结果UI和导航
- 使用StackView重构SearchResultWindow导航,支持推入/弹出过渡动画
- 调整网格单元格大小以改善歌手和专辑显示
- 为SearchResultDialog添加requestClose信号和内边距/圆角改进
- 移除进入搜索页面时侧边栏自动取消勾选的行为
- 修复歌手和专辑详情页导航的连接处理
- Fix vertical centering of title column and time text in Toolbar
- Add vertical alignment to title label in AllMusicListDelegate
- Fix playlist delegate horizontal centering and dynamic width in CurrentPlayList
- Adjust header column width and title offset in ArtistSublistView
- Fix text vertical centering in WaveformRect
- Add row number column and play button centering in ArtistSublistDelegate
fix: 解决UI居中和对齐问题
- 修复工具栏标题列和时间文本的垂直居中
- 在AllMusicListDelegate中为标题标签添加垂直对齐
- 修复播放列表委托的水平居中和动态宽度
- 调整ArtistSublistView中的标题列宽度和偏移
- 修复WaveformRect中的文本垂直居中
- 在ArtistSublistDelegate中添加行号列和播放按钮居中
- Pre-create config/cache/database directories using QDir::mkpath()
to fix build on MSYS2 where directories may not exist yet
- Simplify directory creation logic in MusicSettings
- Emit metaChanged signal when cover is ready for current playing media
- Fetch latest cover/lyric metadata from database in getActivateMeta()
fix: 确保目录在使用前已创建,并修复封面元数据更新
- 使用 QDir::mkpath() 预创建配置/缓存/数据库目录,
修复 MSYS2 构建时目录不存在的问题
- 简化 MusicSettings 中的目录创建逻辑
- 当前播放歌曲的封面就绪时发送 metaChanged 信号
- 在 getActivateMeta() 中从数据库获取最新的封面和歌词路径
Remove the conditional check that only calculated the position when
defaultY was negative. Now the position is recalculated every time
on hover, preventing layout issues when the window size changes.
fix: 每次都重新计算,防止窗口大小变化时有问题
移除仅在 defaultY 为负值时才计算位置的条件判断。
现在悬停时每次都重新计算位置,防止窗口大小变化时出现布局问题。
- Add null pointer safety guards for m_qvplayer in all VLC player methods
- Replace inline VLC library detection with DynamicLibraries singleton
- Set playback engine type to VLC when dynamic libraries load successfully
fix: 优化VLC引擎检测和空值安全
- 在所有VLC播放器方法中为m_qvplayer添加空指针安全保护
- 使用DynamicLibraries单例替换内联VLC库检测
- 当动态库加载成功时设置播放引擎类型为VLC
Remove hardcoded version suffixes (e.g. avcodec-63) from FFmpeg library
names so that libPath's wildcard matching can automatically resolve the
latest available version at runtime.
fix: Windows 下使用无版本号的 FFmpeg 库名以实现动态适配
移除 FFmpeg 库名中硬编码的版本号后缀(如 avcodec-63),使 libPath 的通配
符匹配机制能够自动解析运行时可用的最新版本,避免因 FFmpeg 版本更替导致
库加载失败。