{"version":3,"file":"OscilloscopeElement.cjs","sources":["../../../src/elements/OscilloscopeElement.js"],"sourcesContent":["import { BaseElement } from './BaseElement.js';\nimport { ElementType } from '../types/enums.js';\nimport { DEFAULT_ELEMENT_CONFIG } from '../types/constants.js';\nimport { deepMerge } from '../utils/helpers.js';\nimport { toPixels } from '../utils/unit-converter.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport execa from 'execa';\nimport paper from '@chnak/paper';\nimport { ensureRenderersLoaded, getRenderer } from './oscilloscope/renderer-loader.js';\n\n// 在模块加载时预加载渲染器（非阻塞）\n\n\n/**\n * 示波器元素 - 可视化音频波形\n */\nexport class OscilloscopeElement extends BaseElement {\n  constructor(config = {}) {\n    super(config);\n    this.type = ElementType.OSCILLOSCOPE;\n    \n    // 重新合并配置\n    this.config = deepMerge({}, DEFAULT_ELEMENT_CONFIG, config);\n    \n    // 音频文件路径\n    this.audioPath = config.audioPath || config.src || '';\n    \n    // 示波器通用样式配置（所有样式共享）\n    this.waveColor = config.waveColor || config.color || '#00ff00'; // 波形颜色\n    this.backgroundColor = config.backgroundColor || 'rgba(0, 0, 0, 0.3)'; // 背景颜色\n    this.lineWidth = config.lineWidth || 2; // 线条宽度\n    this.smoothing = config.smoothing !== undefined ? config.smoothing : 0.3; // 平滑度 (0-1)\n    this.mirror = config.mirror !== undefined ? config.mirror : true; // 是否镜像显示\n    this.style = config.style || 'line'; // 样式: 'line', 'bars', 'circle', 'spectrum', 'particles', 'waterfall', 'spiral', 'ripple', 'grid', 'explosion', 'blob', 'rotating3d', 'trail', 'weave', 'lightwave', 'particleflow'\n    this.sensitivity = config.sensitivity !== undefined ? config.sensitivity : 1.0; // 灵敏度\n    \n    // 注意：特定样式的配置项已移到对应的渲染器文件中\n    // 这些配置项仍然可以通过 config 传入，但会在 render 时传递给对应的渲染器\n    \n    // 音频数据\n    this.audioData = null; // 解析后的音频波形数据\n    this.sampleRate = 44100; // 采样率\n    this.channels = 1; // 声道数（单声道）\n    this.loaded = false;\n    \n    // 音频裁剪时间（从原始音频文件中裁剪的开始和结束时间）\n    this.cutFrom = config.cutFrom !== undefined ? config.cutFrom : 0; // 从音频文件的哪个时间点开始裁剪（秒）\n    this.cutTo = config.cutTo !== undefined ? config.cutTo : undefined; // 裁剪到音频文件的哪个时间点（秒，undefined 表示裁剪到文件末尾）\n    \n    // 显示窗口配置\n    this.windowSize = config.windowSize || 0.1; // 显示窗口大小（秒），0 表示显示全部\n    this.scrollSpeed = config.scrollSpeed || 1.0; // 滚动速度\n    \n    // 初始化状态\n    this._initialized = false;\n  }\n\n  async ready() {\n    await super.ready();\n    await ensureRenderersLoaded()\n    return true;\n  }\n  \n  /**\n   * 初始化元素（加载音频数据）\n   * @returns {Promise<void>}\n   */\n  async initialize() {\n    await super.initialize();\n    // 如果已经初始化，直接返回\n    if (this._initialized && this.loaded && this.audioData && this.audioData.length > 0) {\n      return;\n    }\n    \n    // 加载音频数据\n    await this.load();\n    \n    // 标记为已初始化\n    this._initialized = true;\n  }\n  \n  /**\n   * 检查元素是否已初始化\n   * @returns {boolean}\n   */\n  isInitialized() {\n    return this._initialized && this.loaded && this.audioData && this.audioData.length > 0;\n  }\n\n  /**\n   * 加载音频文件并解析波形数据\n   */\n  async load() {\n    // 如果已经在加载中，返回现有的 Promise\n    if (this._loadingPromise) {\n      return this._loadingPromise;\n    }\n    \n    // 如果已经加载完成，直接返回\n    if (this.loaded && this.audioData && this.audioData.length > 0) {\n      return;\n    }\n    \n    // 创建加载 Promise（不在这里 await，让调用者决定是否等待）\n    this._loadingPromise = this._doLoad().finally(() => {\n      // 加载完成后清除 Promise 引用\n      this._loadingPromise = null;\n    });\n    \n    return this._loadingPromise;\n  }\n  \n  /**\n   * 实际执行加载音频文件并解析波形数据\n   */\n  async _doLoad() {\n    if (!this.audioPath || !await fs.pathExists(this.audioPath)) {\n      console.warn(`音频文件不存在: ${this.audioPath}`);\n      return;\n    }\n\n    try {\n      const cutInfo = this.cutFrom > 0 || this.cutTo !== undefined \n        ? ` (截取: ${this.cutFrom}s${this.cutTo !== undefined ? ` - ${this.cutTo}s` : ' - 结束'})`\n        : '';\n    //   console.log(`[OscilloscopeElement] 开始解析音频文件: ${this.audioPath}${cutInfo}`);\n      \n      // 使用 FFmpeg 提取音频波形数据\n      // 将音频转换为单声道 PCM 16位数据\n      // 注意：临时文件放在系统临时目录，避免与源文件冲突\n      const os = await import('os');\n      const tempDir = os.tmpdir();\n      const tempPcmPath = path.join(tempDir, `oscilloscope_temp_${Date.now()}_${path.basename(this.audioPath)}.pcm`);\n      \n      try {\n        // 提取音频数据为 PCM 格式\n        // 注意：只读取源文件，不会修改或删除源文件\n        const ffmpegArgs = [];\n        \n        // 如果指定了音频起始时间，添加 -ss 参数（放在 -i 之前可以提高精度）\n        if (this.cutFrom > 0) {\n          ffmpegArgs.push('-ss', this.cutFrom.toString());\n        }\n        \n        ffmpegArgs.push('-i', this.audioPath); // 输入文件（只读）\n        \n        // 如果指定了音频结束时间，添加 -t 参数（时长 = cutTo - cutFrom）\n        if (this.cutTo !== undefined && this.cutTo > this.cutFrom) {\n          const duration = this.cutTo - this.cutFrom;\n          ffmpegArgs.push('-t', duration.toString());\n        }\n        \n        ffmpegArgs.push(\n          '-hide_banner', // 隐藏版本信息横幅\n          '-loglevel', 'error', // 只显示错误信息\n          '-f', 's16le', // 16位小端 PCM\n          '-acodec', 'pcm_s16le',\n          '-ac', '1', // 单声道\n          '-ar', '44100', // 采样率 44.1kHz\n          '-y', // 覆盖输出文件（仅对输出文件有效）\n          tempPcmPath, // 输出到临时文件\n        );\n        \n        await execa('ffmpeg', ffmpegArgs, { stdio: 'pipe' });\n        \n        // 读取 PCM 数据\n        const pcmBuffer = await fs.readFile(tempPcmPath);\n        \n        // 解析 PCM 数据为波形数组\n        this.audioData = this.parsePCMData(pcmBuffer);\n        this.sampleRate = 44100;\n        this.channels = 1;\n        \n        // console.log(`[OscilloscopeElement] 音频解析完成，采样点数: ${this.audioData.length}`);\n        \n        // 清理临时文件\n        await fs.remove(tempPcmPath).catch(() => {});\n        \n        this.loaded = true;\n        \n        // 调用 onLoaded 回调（注意：此时还没有 paperItem，所以传递 null）\n        this._callOnLoaded(this.startTime || 0, null, null);\n      } catch (error) {\n        console.error(`[OscilloscopeElement] 解析音频失败:`, error.message);\n        await fs.remove(tempPcmPath).catch(() => {});\n        this.loaded = false;\n      }\n    } catch (error) {\n      console.error(`[OscilloscopeElement] 加载音频失败:`, error.message);\n      this.loaded = false;\n    }\n  }\n\n  /**\n   * 解析 PCM 16位数据为波形数组\n   * @param {Buffer} pcmBuffer - PCM 数据缓冲区\n   * @returns {Array<number>} 归一化的波形数据数组 (-1 到 1)\n   */\n  parsePCMData(pcmBuffer) {\n    const samples = [];\n    const maxValue = 32768; // 16位 PCM 的最大值\n    \n    // 每2个字节代表一个样本（16位）\n    for (let i = 0; i < pcmBuffer.length; i += 2) {\n      // 读取16位有符号整数（小端序）\n      const sample = pcmBuffer.readInt16LE(i);\n      // 归一化到 -1 到 1\n      samples.push(sample / maxValue);\n    }\n    \n    return samples;\n  }\n\n  /**\n   * 获取指定时间范围的波形数据\n   * @param {number} startTime - 开始时间（秒）\n   * @param {number} duration - 持续时间（秒），如果为 0 则返回全部数据\n   * @returns {Array<number>} 波形数据数组\n   */\n  getWaveformData(startTime = 0, duration = 0) {\n    if (!this.loaded || !this.audioData || this.audioData.length === 0) {\n      return [];\n    }\n\n    if (duration === 0) {\n      // 返回全部数据\n      return this.audioData;\n    }\n\n    // 计算采样点范围\n    const startSample = Math.floor(startTime * this.sampleRate);\n    const sampleCount = Math.floor(duration * this.sampleRate);\n    const endSample = Math.min(startSample + sampleCount, this.audioData.length);\n\n    if (startSample >= this.audioData.length) {\n      return [];\n    }\n\n    return this.audioData.slice(startSample, endSample);\n  }\n\n  /**\n   * 平滑处理波形数据\n   * @param {Array<number>} data - 原始波形数据\n   * @param {number} smoothing - 平滑度 (0-1)\n   * @returns {Array<number>} 平滑后的数据\n   */\n  smoothData(data, smoothing) {\n    if (smoothing <= 0 || data.length === 0) {\n      return data;\n    }\n\n    const smoothed = [...data];\n    const windowSize = Math.max(1, Math.floor(data.length * smoothing * 0.1));\n\n    for (let i = 0; i < data.length; i++) {\n      let sum = 0;\n      let count = 0;\n      \n      for (let j = Math.max(0, i - windowSize); j <= Math.min(data.length - 1, i + windowSize); j++) {\n        sum += data[j];\n        count++;\n      }\n      \n      smoothed[i] = sum / count;\n    }\n\n    return smoothed;\n  }\n\n  /**\n   * 渲染示波器元素\n   * @param {paper.Layer} layer - Paper.js 图层\n   * @param {number} time - 当前时间（秒）\n   * @param {Object} paperInstance - Paper.js 实例 { project, paper }\n   */\n  async render(layer, time, paperInstance = null) {\n    if (!this.visible) return null;\n    \n    // 检查时间范围\n    if (!this.isActiveAtTime(time)) {\n      return null;\n    }\n\n    // 如果音频数据还没加载完成，尝试初始化（通常应该在渲染前通过 initialize 完成）\n    if (!this.loaded || !this.audioData || this.audioData.length === 0) {\n      // 如果正在加载中，等待加载完成\n      if (this._loadingPromise) {\n        await this._loadingPromise;\n      } else if (this.audioPath && !this._initialized) {\n        // 如果还没初始化，尝试初始化（作为后备方案）\n        await this.initialize();\n      }\n      \n      // 加载完成后再次检查\n      if (!this.loaded || !this.audioData || this.audioData.length === 0) {\n        return null;\n      }\n    }\n\n    // 获取 Paper.js 实例\n    const { paper: p, project } = this.getPaperInstance(paperInstance);\n\n    // 获取当前状态\n    const viewSize = project && project.view && project.view.viewSize \n      ? project.view.viewSize \n      : { width: 1920, height: 1080 };\n    const context = { \n      width: this.canvasWidth || viewSize.width, \n      height: this.canvasHeight || viewSize.height \n    };\n    const state = this.getStateAtTime(time, context);\n\n    // 转换位置和尺寸单位\n    // 使用 BaseElement 的通用方法转换尺寸\n    let width = state.width || 800;\n    let height = state.height || 200;\n    const size = this.convertSize(width, height, context);\n    width = size.width;\n    height = size.height;\n    \n    // state.x 和 state.y 已经在 getStateAtTime 中转换了单位\n    const x = state.x || 0;\n    const y = state.y || 0;\n\n    // 使用 BaseElement 的通用方法计算位置（包括 anchor 对齐）\n    const { x: rectX, y: rectY } = this.calculatePosition(state, context, {\n      elementWidth: width,\n      elementHeight: height,\n    });\n\n    // 计算相对时间（相对于元素开始时间）\n    const relativeTime = Math.max(0, time - this.startTime);\n    \n    // 获取波形数据\n    let waveformData;\n    if (this.windowSize > 0) {\n      // 显示窗口模式：显示当前时间附近的波形\n      const windowStartTime = Math.max(0, relativeTime - this.windowSize / 2);\n      waveformData = this.getWaveformData(windowStartTime, this.windowSize);\n    } else {\n      // 显示全部波形（从当前时间开始）\n      const maxDuration = this.duration || (this.audioData.length / this.sampleRate);\n      const remainingDuration = Math.max(0, maxDuration - relativeTime);\n      waveformData = this.getWaveformData(relativeTime, remainingDuration);\n    }\n\n    if (waveformData.length === 0) {\n      return null;\n    }\n\n    // 平滑处理\n    if (this.smoothing > 0) {\n      waveformData = this.smoothData(waveformData, this.smoothing);\n    }\n\n    // 创建一个 Group 来包含示波器的背景和波形\n    // 这样可以确保背景和波形在同一层级，背景不会被场景背景覆盖\n    const oscilloscopeGroup = new p.Group();\n    if (layer) {\n      layer.addChild(oscilloscopeGroup);\n    } else if (project && project.activeLayer) {\n      project.activeLayer.addChild(oscilloscopeGroup);\n    }\n    \n    // 绘制背景（在渲染波形之前）\n    // 注意：背景必须在渲染波形之前绘制，并且要确保在 group 的最底层\n    if (this.backgroundColor && this.backgroundColor !== 'transparent') {\n      const bgRect = new p.Path.Rectangle({\n        rectangle: new p.Rectangle(rectX, rectY, width, height),\n        fillColor: this.backgroundColor,\n        parent: oscilloscopeGroup, // 添加到 group 中\n      });\n      // 确保背景在 group 的最底层\n      bgRect.sendToBack();\n    }\n\n    // 确保渲染器已加载（通常已经在初始化时加载完成）\n    // 如果还没加载完成，这里会等待，但通常不会阻塞\n    await ensureRenderersLoaded();\n    \n    // 获取当前 activeLayer 的子元素数量，用于在渲染后识别新创建的路径\n    const activeLayer = project && project.activeLayer;\n    const childrenBeforeRender = activeLayer ? [...activeLayer.children] : [];\n    \n    // 根据样式绘制波形 - 使用动态加载的渲染器\n    const styleName = (this.style === 'dots') ? 'particles' : this.style;\n    const renderer = getRenderer(styleName) || getRenderer('line');\n    \n    if (renderer) {\n      // 从 config 中提取该样式相关的配置项\n      const styleConfig = this._extractStyleConfig(styleName);\n      \n      // 调用渲染器函数，传递 element, data, x, y, width, height, time, config\n      // 注意：所有渲染器都接受 time 和 config 参数（即使不使用）\n      renderer(this, waveformData, rectX, rectY, width, height, time, styleConfig);\n    } else {\n      console.warn(`[OscilloscopeElement] 未找到渲染器: ${styleName}，使用默认 line 渲染器`);\n      const defaultRenderer = getRenderer('line');\n      if (defaultRenderer) {\n        defaultRenderer(this, waveformData, rectX, rectY, width, height, time, {});\n      }\n    }\n    \n    // 将渲染器创建的新路径移动到 group 中\n    if (activeLayer) {\n      const childrenAfterRender = [...activeLayer.children];\n      // 找出新创建的子元素（在渲染后添加的）\n      const newChildren = childrenAfterRender.filter(child => !childrenBeforeRender.includes(child));\n      // 将新创建的子元素移动到 group 中\n      for (const child of newChildren) {\n        child.parent = oscilloscopeGroup;\n      }\n    }\n\n    // 调用 onRender 回调（传递 paperItem 和 paperInstance）\n    // 注意：OscilloscopeElement 返回 null，所以传递 null 作为 paperItem\n    this._callOnRender(time, null, paperInstance);\n\n    return null;\n  }\n\n  /**\n   * 从 config 中提取特定样式相关的配置项\n   * @param {string} styleName - 样式名称\n   * @returns {Object} 样式配置对象\n   */\n  _extractStyleConfig(styleName) {\n    const config = this.config || {};\n    const styleConfig = {};\n    \n    // 根据样式名称提取对应的配置项\n    switch (styleName) {\n      case 'particles':\n      case 'dots':\n        if (config.particleCount !== undefined) styleConfig.particleCount = config.particleCount;\n        if (config.particleMinSize !== undefined) styleConfig.particleMinSize = config.particleMinSize;\n        if (config.particleMaxSize !== undefined) styleConfig.particleMaxSize = config.particleMaxSize;\n        if (config.particleColors !== undefined) styleConfig.particleColors = config.particleColors;\n        if (config.particleTrail !== undefined) styleConfig.particleTrail = config.particleTrail;\n        if (config.particleTrailLength !== undefined) styleConfig.particleTrailLength = config.particleTrailLength;\n        break;\n      case 'waterfall':\n        if (config.waterfallHeight !== undefined) styleConfig.waterfallHeight = config.waterfallHeight;\n        if (config.waterfallBands !== undefined) styleConfig.waterfallBands = config.waterfallBands;\n        break;\n      case 'spiral':\n        if (config.spiralTurns !== undefined) styleConfig.spiralTurns = config.spiralTurns;\n        if (config.spiralRadius !== undefined) styleConfig.spiralRadius = config.spiralRadius;\n        if (config.particleColors !== undefined) styleConfig.particleColors = config.particleColors;\n        break;\n      case 'ripple':\n        if (config.rippleCount !== undefined) styleConfig.rippleCount = config.rippleCount;\n        if (config.rippleSpeed !== undefined) styleConfig.rippleSpeed = config.rippleSpeed;\n        break;\n      case 'grid':\n        if (config.gridRows !== undefined) styleConfig.gridRows = config.gridRows;\n        if (config.gridCols !== undefined) styleConfig.gridCols = config.gridCols;\n        break;\n      case 'explosion':\n        if (config.explosionParticles !== undefined) styleConfig.explosionParticles = config.explosionParticles;\n        if (config.particleColors !== undefined) styleConfig.particleColors = config.particleColors;\n        break;\n      case 'bars':\n        if (config.barWidth !== undefined) styleConfig.barWidth = config.barWidth;\n        if (config.barGap !== undefined) styleConfig.barGap = config.barGap;\n        break;\n      case 'blob':\n        if (config.blobBallCount !== undefined) styleConfig.blobBallCount = config.blobBallCount;\n        if (config.particleColors !== undefined) styleConfig.particleColors = config.particleColors;\n        break;\n      case 'rotating3d':\n        if (config.rotationSpeed !== undefined) styleConfig.rotationSpeed = config.rotationSpeed;\n        if (config.particleColors !== undefined) styleConfig.particleColors = config.particleColors;\n        break;\n      case 'trail':\n        if (config.trailParticleCount !== undefined) styleConfig.trailParticleCount = config.trailParticleCount;\n        if (config.trailLength !== undefined) styleConfig.trailLength = config.trailLength;\n        if (config.trailSpeed !== undefined) styleConfig.trailSpeed = config.trailSpeed;\n        if (config.particleColors !== undefined) styleConfig.particleColors = config.particleColors;\n        break;\n      case 'weave':\n        if (config.weaveLayers !== undefined) styleConfig.weaveLayers = config.weaveLayers;\n        if (config.weaveLayerSpacing !== undefined) styleConfig.weaveLayerSpacing = config.weaveLayerSpacing;\n        if (config.weaveSpeed !== undefined) styleConfig.weaveSpeed = config.weaveSpeed;\n        if (config.particleColors !== undefined) styleConfig.particleColors = config.particleColors;\n        break;\n      case 'lightwave':\n        if (config.lightwaveCount !== undefined) styleConfig.lightwaveCount = config.lightwaveCount;\n        if (config.lightwaveSpeed !== undefined) styleConfig.lightwaveSpeed = config.lightwaveSpeed;\n        if (config.lightwaveSegments !== undefined) styleConfig.lightwaveSegments = config.lightwaveSegments;\n        if (config.particleColors !== undefined) styleConfig.particleColors = config.particleColors;\n        break;\n      case 'particleflow':\n        if (config.flowParticleCount !== undefined) styleConfig.flowParticleCount = config.flowParticleCount;\n        if (config.flowSpeed !== undefined) styleConfig.flowSpeed = config.flowSpeed;\n        if (config.showWaveform !== undefined) styleConfig.showWaveform = config.showWaveform;\n        if (config.particleColors !== undefined) styleConfig.particleColors = config.particleColors;\n        break;\n      // 其他样式可以在这里添加\n      default:\n        // 对于没有特定配置的样式，返回空对象\n        break;\n    }\n    \n    return styleConfig;\n  }\n\n  /**\n   * 设置音频源\n   */\n  async setAudioPath(audioPath) {\n    this.audioPath = audioPath;\n    await this.load();\n  }\n\n  /**\n   * 设置波形颜色\n   */\n  setWaveColor(color) {\n    this.waveColor = color;\n    this.config.waveColor = color;\n  }\n\n  /**\n   * 设置样式\n   */\n  setStyle(style) {\n    this.style = style;\n    this.config.style = style;\n  }\n\n  /**\n   * 销毁元素\n   */\n  destroy() {\n    this.audioData = null;\n    super.destroy();\n  }\n}\n\n"],"names":["BaseElement","ElementType","deepMerge","DEFAULT_ELEMENT_CONFIG","ensureRenderersLoaded","getRenderer"],"mappings":"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"}