播放速率设置面板新增是否音调补偿设置
parent
0adb4f5ae5
commit
677c3f16e4
|
@ -1,6 +1,7 @@
|
||||||
### 新增
|
### 新增
|
||||||
|
|
||||||
- 新增音效设置(实验性功能),支持10段均衡器设置、内置的一些环境混响音效、3D立体环绕音效
|
- 新增音效设置(实验性功能),支持10段均衡器设置、内置的一些环境混响音效、3D立体环绕音效
|
||||||
|
- 播放速率设置面板新增是否音调补偿设置,在调整播放速率后,可以选择是否启用音调补偿,默认启用
|
||||||
|
|
||||||
### 修复
|
### 修复
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ const defaultSetting: LX.AppSetting = {
|
||||||
'player.volume': 1,
|
'player.volume': 1,
|
||||||
'player.isMute': false,
|
'player.isMute': false,
|
||||||
'player.playbackRate': 1,
|
'player.playbackRate': 1,
|
||||||
|
'player.preservesPitch': true,
|
||||||
'player.mediaDeviceId': 'default',
|
'player.mediaDeviceId': 'default',
|
||||||
'player.isMediaDeviceRemovedStopPlay': false,
|
'player.isMediaDeviceRemovedStopPlay': false,
|
||||||
'player.isShowLyricTranslation': false,
|
'player.isShowLyricTranslation': false,
|
||||||
|
|
|
@ -113,6 +113,11 @@ declare global {
|
||||||
*/
|
*/
|
||||||
'player.playbackRate': number
|
'player.playbackRate': number
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否自动调整音频的音高以补偿对播放速率设置所做的更改
|
||||||
|
*/
|
||||||
|
'player.preservesPitch': boolean
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 音频输出设备id
|
* 音频输出设备id
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -223,6 +223,7 @@
|
||||||
"player__play_toggle_mode_off": "Disable",
|
"player__play_toggle_mode_off": "Disable",
|
||||||
"player__play_toggle_mode_random": "List Random",
|
"player__play_toggle_mode_random": "List Random",
|
||||||
"player__play_toggle_mode_single_loop": "Single Loop",
|
"player__play_toggle_mode_single_loop": "Single Loop",
|
||||||
|
"player__playback_preserves_pitch": "Pitch compensation",
|
||||||
"player__playback_rate": "Current playback rate:",
|
"player__playback_rate": "Current playback rate:",
|
||||||
"player__playback_rate_reset_btn": "Reset",
|
"player__playback_rate_reset_btn": "Reset",
|
||||||
"player__playing": "Now playing...",
|
"player__playing": "Now playing...",
|
||||||
|
|
|
@ -223,6 +223,7 @@
|
||||||
"player__play_toggle_mode_off": "禁用",
|
"player__play_toggle_mode_off": "禁用",
|
||||||
"player__play_toggle_mode_random": "列表随机",
|
"player__play_toggle_mode_random": "列表随机",
|
||||||
"player__play_toggle_mode_single_loop": "单曲循环",
|
"player__play_toggle_mode_single_loop": "单曲循环",
|
||||||
|
"player__playback_preserves_pitch": "音调补偿",
|
||||||
"player__playback_rate": "当前播放速率:",
|
"player__playback_rate": "当前播放速率:",
|
||||||
"player__playback_rate_reset_btn": "重置",
|
"player__playback_rate_reset_btn": "重置",
|
||||||
"player__playing": "播放中...",
|
"player__playing": "播放中...",
|
||||||
|
|
|
@ -223,6 +223,7 @@
|
||||||
"player__play_toggle_mode_off": "禁用",
|
"player__play_toggle_mode_off": "禁用",
|
||||||
"player__play_toggle_mode_random": "列表隨機",
|
"player__play_toggle_mode_random": "列表隨機",
|
||||||
"player__play_toggle_mode_single_loop": "單曲循環",
|
"player__play_toggle_mode_single_loop": "單曲循環",
|
||||||
|
"player__playback_preserves_pitch": "音調補償",
|
||||||
"player__playback_rate": "當前播放速率:",
|
"player__playback_rate": "當前播放速率:",
|
||||||
"player__playback_rate_reset_btn": "重置",
|
"player__playback_rate_reset_btn": "重置",
|
||||||
"player__playing": "播放中...",
|
"player__playing": "播放中...",
|
||||||
|
|
|
@ -9,9 +9,17 @@
|
||||||
<div :class="$style.setting">
|
<div :class="$style.setting">
|
||||||
<div :class="$style.info">
|
<div :class="$style.info">
|
||||||
<span>{{ playbackRate.toFixed(2) }}x</span>
|
<span>{{ playbackRate.toFixed(2) }}x</span>
|
||||||
<base-btn min @click="handleUpdatePlaybackRate(100)">{{ $t('player__playback_rate_reset_btn') }}</base-btn>
|
<div :class="$style.control">
|
||||||
|
<base-checkbox
|
||||||
|
id="player__playback_preserves_pitch"
|
||||||
|
:model-value="appSetting['player.preservesPitch']"
|
||||||
|
:label="$t('player__playback_preserves_pitch')"
|
||||||
|
@update:model-value="updatePreservesPitch"
|
||||||
|
/>
|
||||||
|
<base-btn min @click="handleUpdatePlaybackRate(100)">{{ $t('player__playback_rate_reset_btn') }}</base-btn>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<base-slider-bar :class="$style.slider" :value="playbackRate * 100" :min="60" :max="200" @change="handleUpdatePlaybackRate" />
|
<base-slider-bar :class="$style.slider" :value="playbackRate * 100" :min="50" :max="200" @change="handleUpdatePlaybackRate" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</material-popup-btn>
|
</material-popup-btn>
|
||||||
|
@ -20,11 +28,17 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
// import { computed } from '@common/utils/vueTools'
|
// import { computed } from '@common/utils/vueTools'
|
||||||
import { playbackRate } from '@renderer/store/player/playbackRate'
|
import { playbackRate } from '@renderer/store/player/playbackRate'
|
||||||
|
import { appSetting, updateSetting } from '@renderer/store/setting'
|
||||||
|
|
||||||
const handleUpdatePlaybackRate = (val) => {
|
const handleUpdatePlaybackRate = (val) => {
|
||||||
window.app_event.setPlaybackRate(Math.round(val) / 100)
|
window.app_event.setPlaybackRate(Math.round(val) / 100)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const updatePreservesPitch = (enabled) => {
|
||||||
|
updateSetting({ 'player.preservesPitch': enabled })
|
||||||
|
}
|
||||||
|
|
||||||
// const icon = computed(() => {
|
// const icon = computed(() => {
|
||||||
// return playbackRate.value == 0
|
// return playbackRate.value == 0
|
||||||
// ? '#icon-volume-off-outline'
|
// ? '#icon-volume-off-outline'
|
||||||
|
@ -100,6 +114,11 @@ const handleUpdatePlaybackRate = (val) => {
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.control {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.slider {
|
.slider {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { onBeforeUnmount, watch } from '@common/utils/vueTools'
|
import { onBeforeUnmount, watch } from '@common/utils/vueTools'
|
||||||
import { setPlaybackRate as setPlayerPlaybackRate } from '@renderer/plugins/player'
|
import { setPlaybackRate as setPlayerPlaybackRate, setPreservesPitch } from '@renderer/plugins/player'
|
||||||
|
|
||||||
import { debounce } from '@common/utils'
|
import { debounce } from '@common/utils'
|
||||||
// import { HOTKEY_PLAYER } from '@common/hotKey'
|
// import { HOTKEY_PLAYER } from '@common/hotKey'
|
||||||
|
@ -11,6 +11,7 @@ export default () => {
|
||||||
|
|
||||||
setPlaybackRate(appSetting['player.playbackRate'])
|
setPlaybackRate(appSetting['player.playbackRate'])
|
||||||
setPlayerPlaybackRate(appSetting['player.playbackRate'])
|
setPlayerPlaybackRate(appSetting['player.playbackRate'])
|
||||||
|
setPreservesPitch(appSetting['player.preservesPitch'])
|
||||||
|
|
||||||
|
|
||||||
const handleSetPlaybackRate = (num: number) => {
|
const handleSetPlaybackRate = (num: number) => {
|
||||||
|
@ -41,6 +42,11 @@ export default () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
watch(() => appSetting['player.preservesPitch'], preservesPitch => {
|
||||||
|
setPreservesPitch(preservesPitch)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
// window.key_event.on(HOTKEY_PLAYER.volume_up.action, hotkeyVolumeUp)
|
// window.key_event.on(HOTKEY_PLAYER.volume_up.action, hotkeyVolumeUp)
|
||||||
// window.key_event.on(HOTKEY_PLAYER.volume_down.action, hotkeyVolumeDown)
|
// window.key_event.on(HOTKEY_PLAYER.volume_down.action, hotkeyVolumeDown)
|
||||||
window.app_event.on('setPlaybackRate', handleSetPlaybackRate)
|
window.app_event.on('setPlaybackRate', handleSetPlaybackRate)
|
||||||
|
|
|
@ -254,6 +254,11 @@ export const setPlaybackRate = (rate: number) => {
|
||||||
audio.playbackRate = rate
|
audio.playbackRate = rate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const setPreservesPitch = (preservesPitch: boolean) => {
|
||||||
|
if (!audio) return
|
||||||
|
audio.preservesPitch = preservesPitch
|
||||||
|
}
|
||||||
|
|
||||||
export const getMute = (): boolean => {
|
export const getMute = (): boolean => {
|
||||||
return audio?.muted ?? false
|
return audio?.muted ?? false
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue