feat: Add equalizer plugin with presets (e.g. bass booster) (#2575)

This commit is contained in:
th-ch
2024-12-20 15:17:11 +01:00
committed by GitHub
parent be04d66aa8
commit 26b8b38b89
4 changed files with 112 additions and 0 deletions

View File

@ -0,0 +1,80 @@
import { createPlugin } from '@/utils';
import { t } from '@/i18n';
import { MenuContext } from '@/types/contexts';
import { MenuTemplate } from '@/menu';
import { defaultPresets, presetConfigs, Preset, FilterConfig } from './presets';
export type EqualizerPluginConfig = {
enabled: boolean;
filters: FilterConfig[];
presets: { [preset in Preset]: boolean };
};
let appliedFilters: BiquadFilterNode[] = [];
export default createPlugin({
name: () => t('plugins.equalizer.name'),
description: () => t('plugins.equalizer.description'),
restartNeeded: false,
config: {
enabled: false,
filters: [],
presets: { 'bass-booster': false },
} as EqualizerPluginConfig,
menu: async ({
getConfig,
setConfig,
}: MenuContext<EqualizerPluginConfig>): Promise<MenuTemplate> => {
const config = await getConfig();
return [
{
label: t('plugins.equalizer.menu.presets.label'),
type: 'submenu',
submenu: defaultPresets.map((preset) => ({
label: t(`plugins.equalizer.menu.presets.list.${preset}`),
type: 'radio',
checked: config.presets[preset],
click() {
setConfig({
presets: { ...config.presets, [preset]: !config.presets[preset] },
});
},
})),
},
];
},
renderer: {
async start({ getConfig }) {
const config = await getConfig();
document.addEventListener(
'ytmd:audio-can-play',
({ detail: { audioSource, audioContext } }) => {
const filtersToApply = config.filters.concat(
defaultPresets
.filter((preset) => config.presets[preset])
.map((preset) => presetConfigs[preset]),
);
filtersToApply.forEach((filter) => {
const biquadFilter = audioContext.createBiquadFilter();
biquadFilter.type = filter.type;
biquadFilter.frequency.value = filter.frequency; // filter frequency in Hz
biquadFilter.Q.value = filter.Q;
biquadFilter.gain.value = filter.gain; // filter gain in dB
audioSource.connect(biquadFilter);
biquadFilter.connect(audioContext.destination);
appliedFilters.push(biquadFilter);
});
},
{ once: true, passive: true },
);
},
stop() {
appliedFilters.forEach((filter) => filter.disconnect());
appliedFilters = [];
},
},
});

View File

@ -0,0 +1,18 @@
export const defaultPresets = ['bass-booster'] as const;
export type Preset = (typeof defaultPresets)[number];
export type FilterConfig = {
type: BiquadFilterType;
frequency: number;
Q: number;
gain: number;
};
export const presetConfigs: Record<Preset, FilterConfig> = {
'bass-booster': {
type: 'lowshelf',
frequency: 80,
Q: 100,
gain: 12.0,
},
};