mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 18:41:47 +00:00
fix: add back butterchurn
This commit is contained in:
53
plugins/visualizer/butterchurn.d.ts
vendored
Normal file
53
plugins/visualizer/butterchurn.d.ts
vendored
Normal file
@ -0,0 +1,53 @@
|
||||
declare module 'butterchurn' {
|
||||
interface VisualizerOptions {
|
||||
width?: number;
|
||||
height?: number;
|
||||
meshWidth?: number;
|
||||
meshHeight?: number;
|
||||
pixelRatio?: number;
|
||||
textureRatio?: number;
|
||||
outputFXAA?: boolean;
|
||||
}
|
||||
|
||||
class Visualizer {
|
||||
constructor(audioContext: AudioContext, canvas: HTMLCanvasElement, opts: ButterchurnOptions);
|
||||
loseGLContext(): void;
|
||||
connectAudio(audioNode: AudioNode): void;
|
||||
disconnectAudio(audioNode: AudioNode): void;
|
||||
static overrideDefaultVars(baseValsDefaults: unknown, baseVals: unknown): unknown;
|
||||
createQVars(): Record<string, WebAssembly.Global>;
|
||||
createTVars(): Record<string, WebAssembly.Global>;
|
||||
createPerFramePool(baseVals: unknown): Record<string, WebAssembly.Global>;
|
||||
createPerPixelPool(baseVals: unknown): Record<string, WebAssembly.Global>;
|
||||
createCustomShapePerFramePool(baseVals: unknown): Record<string, WebAssembly.Global>;
|
||||
createCustomWavePerFramePool(baseVals: unknown): Record<string, WebAssembly.Global>;
|
||||
static makeShapeResetPool(pool: Record<string, WebAssembly.Global>, variables: string[], idx: number): Record<string, WebAssembly.Global>;
|
||||
static base64ToArrayBuffer(base64: string): ArrayBuffer;
|
||||
loadPreset(presetMap: unknown, blendTime?: number): Promise<void>;
|
||||
async loadWASMPreset(preset: unknown, blendTime: number): Promise<void>;
|
||||
loadJSPreset(preset: unknown, blendTime: number): void;
|
||||
loadExtraImages(imageData: unknown): void;
|
||||
setRendererSize(width: number, height: number, opts?: VisualizerOptions): void;
|
||||
setInternalMeshSize(width: number, height: number): void;
|
||||
setOutputAA(useAA: boolean): void;
|
||||
setCanvas(canvas: HTMLCanvasElement): void;
|
||||
render(opts?: VisualizerOptions): unknown;
|
||||
launchSongTitleAnim(text: string): void;
|
||||
toDataURL(): string;
|
||||
warpBufferToDataURL(): string;
|
||||
}
|
||||
|
||||
interface ButterchurnOptions {
|
||||
width?: number;
|
||||
height?: number;
|
||||
onlyUseWASM?: boolean;
|
||||
}
|
||||
|
||||
export default class Butterchurn {
|
||||
static createVisualizer(audioContext: AudioContext, canvas: HTMLCanvasElement, options?: ButterchurnOptions): Visualizer;
|
||||
}
|
||||
}
|
||||
|
||||
declare module 'butterchurn-presets' {
|
||||
export function getPresets(): Record<string, unknown>;
|
||||
}
|
||||
@ -2,6 +2,7 @@ import { Visualizer } from './visualizers/visualizer';
|
||||
|
||||
import vudio from './visualizers/vudio';
|
||||
import wave from './visualizers/wave';
|
||||
import butterchurn from './visualizers/butterchurn';
|
||||
|
||||
import defaultConfig from '../../config/defaults';
|
||||
|
||||
@ -15,7 +16,12 @@ export default (options: ConfigType<'visualizer'>) => {
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
let visualizerType: { new(...args: any[]): Visualizer<unknown> } = vudio;
|
||||
if (optionsWithDefaults.type === 'wave') visualizerType = wave;
|
||||
|
||||
if (optionsWithDefaults.type === 'wave') {
|
||||
visualizerType = wave;
|
||||
} else if (optionsWithDefaults.type === 'butterchurn') {
|
||||
visualizerType = butterchurn;
|
||||
}
|
||||
|
||||
document.addEventListener(
|
||||
'audioCanPlay',
|
||||
|
||||
63
plugins/visualizer/visualizers/butterchurn.ts
Normal file
63
plugins/visualizer/visualizers/butterchurn.ts
Normal file
@ -0,0 +1,63 @@
|
||||
import Butterchurn from 'butterchurn';
|
||||
import ButterchurnPresets from 'butterchurn-presets';
|
||||
|
||||
import { Visualizer } from './visualizer';
|
||||
|
||||
import { ConfigType } from '../../../config/dynamic';
|
||||
|
||||
const presets = ButterchurnPresets.getPresets();
|
||||
|
||||
class ButterchurnVisualizer extends Visualizer<Butterchurn> {
|
||||
visualizer: ReturnType<typeof Butterchurn.createVisualizer>;
|
||||
private readonly renderingFrequencyInMs: number;
|
||||
|
||||
constructor(
|
||||
audioContext: AudioContext,
|
||||
audioSource: MediaElementAudioSourceNode,
|
||||
visualizerContainer: HTMLElement,
|
||||
canvas: HTMLCanvasElement,
|
||||
audioNode: GainNode,
|
||||
stream: MediaStream,
|
||||
options: ConfigType<'visualizer'>,
|
||||
) {
|
||||
super(
|
||||
audioContext,
|
||||
audioSource,
|
||||
visualizerContainer,
|
||||
canvas,
|
||||
audioNode,
|
||||
stream,
|
||||
options,
|
||||
);
|
||||
|
||||
this.visualizer = Butterchurn.createVisualizer(
|
||||
audioContext,
|
||||
canvas,
|
||||
{
|
||||
width: canvas.width,
|
||||
height: canvas.height,
|
||||
}
|
||||
);
|
||||
|
||||
const preset = presets[options.butterchurn.preset];
|
||||
this.visualizer.loadPreset(preset, options.butterchurn.blendTimeInSeconds);
|
||||
|
||||
this.visualizer.connectAudio(audioNode);
|
||||
|
||||
this.renderingFrequencyInMs = options.butterchurn.renderingFrequencyInMs;
|
||||
}
|
||||
|
||||
resize(width: number, height: number) {
|
||||
this.visualizer.setRendererSize(width, height);
|
||||
}
|
||||
|
||||
render() {
|
||||
const renderVisualizer = () => {
|
||||
requestAnimationFrame(renderVisualizer);
|
||||
this.visualizer.render();
|
||||
};
|
||||
setTimeout(renderVisualizer, this.renderingFrequencyInMs);
|
||||
}
|
||||
}
|
||||
|
||||
export default ButterchurnVisualizer;
|
||||
Reference in New Issue
Block a user