{"version":3,"file":"index.mjs","names":[],"sources":["../../src/audio/audio.ts"],"sourcesContent":["/* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD */\n/* SPDX-License-Identifier: Apache-2.0 */\n\n/**\n * Audio playback service module for JS apps — wraps `brookesia_service_audio` RPC.\n *\n * @example\n * import audio from '@brookesia/service/audio';\n * if (audio.available()) {\n *   audio.setVolume(80);\n *   audio.play('file://littlefs/example.mp3');\n *   audio.close();\n * }\n */\n\nimport {\n  closeAudioPlayback,\n  getMute,\n  getVolume,\n  isAudioPlaybackAvailable,\n  loadAudioData,\n  openAudioPlayback,\n  pause,\n  play,\n  playUrls,\n  resetAudioData,\n  resume,\n  setMute,\n  setVolume,\n  stop,\n  type AudioPlaybackClientOptions,\n  type AudioPlaybackHandle,\n} from './audio-client.ts';\nimport type { AudioPlayState, AudioPlayUrlConfig } from './audio-types.ts';\n\nexport type { AudioPlayState, AudioPlayUrlConfig };\n\nexport type AudioModuleOptions = AudioPlaybackClientOptions;\n\ntype State = {\n  handle: AudioPlaybackHandle | null;\n  options: AudioModuleOptions;\n};\n\nconst state: State = { handle: null, options: {} };\n\nfunction handle(): AudioPlaybackHandle {\n  if (state.handle !== null) {\n    return state.handle;\n  }\n  if (!isAudioPlaybackAvailable(state.options)) {\n    throw new Error('AudioPlayback service is not available');\n  }\n  state.handle = openAudioPlayback(state.options);\n  return state.handle;\n}\n\n/**\n * Inject a mock RPC host and reset the cached service handle (vitest / Node only).\n *\n * @param options - Client options, typically `{ host }` from `@brookesia/service/hosts/audio`\n */\nexport function configure(options: AudioModuleOptions): void {\n  if (state.handle !== null) {\n    closeAudioPlayback(state.handle, state.options);\n  }\n  state.handle = null;\n  state.options = options;\n}\n\nconst audio = {\n  /** @returns `true` when AudioPlayback service is registered */\n  available(): boolean {\n    return isAudioPlaybackAvailable(state.options);\n  },\n\n  /** Release the AudioPlayback service binding. */\n  close(): void {\n    if (state.handle === null) {\n      return;\n    }\n    closeAudioPlayback(state.handle, state.options);\n    state.handle = null;\n  },\n\n  /**\n   * Play a single audio URL.\n   *\n   * @param url - e.g. `'file://littlefs/example.mp3'`\n   * @param config - Optional playback options\n   */\n  play(url: string, config: AudioPlayUrlConfig = {}): void {\n    play(handle(), url, config, state.options);\n  },\n\n  /**\n   * Play a list of URLs sequentially or in a loop.\n   *\n   * @param urls - Audio file URLs\n   * @param config - `{ loop_count, interrupt }`\n   */\n  playUrls(urls: string[], config: AudioPlayUrlConfig = {}): void {\n    playUrls(handle(), urls, config, state.options);\n  },\n\n  /** Pause current playback. */\n  pause(): void {\n    pause(handle(), state.options);\n  },\n\n  /** Resume paused playback. */\n  resume(): void {\n    resume(handle(), state.options);\n  },\n\n  /** Stop playback and release decoder. */\n  stop(): void {\n    stop(handle(), state.options);\n  },\n\n  /**\n   * Set output volume.\n   *\n   * @param volume - 0–100\n   */\n  setVolume(volume: number): void {\n    setVolume(handle(), volume, state.options);\n  },\n\n  /** @returns Current volume 0–100 */\n  getVolume(): number {\n    return getVolume(handle(), state.options);\n  },\n\n  /**\n   * Mute or unmute output.\n   *\n   * @param enable - `true` to mute\n   */\n  setMute(enable: boolean): void {\n    setMute(handle(), enable, state.options);\n  },\n\n  /** @returns `true` when muted */\n  getMute(): boolean {\n    return getMute(handle(), state.options);\n  },\n\n  /** Load persisted volume / mute from storage. */\n  loadData(): void {\n    loadAudioData(handle(), state.options);\n  },\n\n  /** Reset volume / mute to defaults. */\n  resetData(): void {\n    resetAudioData(handle(), state.options);\n  },\n};\n\nexport default audio;\n"],"mappings":";;;;;;;;;;;;;AA4CA,MAAM,QAAe;CAAE,QAAQ;CAAM,SAAS,CAAC;AAAE;AAEjD,SAAS,SAA8B;CACrC,IAAI,MAAM,WAAW,MACnB,OAAO,MAAM;CAEf,IAAI,CAAC,yBAAyB,MAAM,OAAO,GACzC,MAAM,IAAI,MAAM,wCAAwC;CAE1D,MAAM,SAAS,kBAAkB,MAAM,OAAO;CAC9C,OAAO,MAAM;AACf;;;;;;AAOA,SAAgB,UAAU,SAAmC;CAC3D,IAAI,MAAM,WAAW,MACnB,mBAAmB,MAAM,QAAQ,MAAM,OAAO;CAEhD,MAAM,SAAS;CACf,MAAM,UAAU;AAClB;AAEA,MAAM,QAAQ;;CAEZ,YAAqB;EACnB,OAAO,yBAAyB,MAAM,OAAO;CAC/C;;CAGA,QAAc;EACZ,IAAI,MAAM,WAAW,MACnB;EAEF,mBAAmB,MAAM,QAAQ,MAAM,OAAO;EAC9C,MAAM,SAAS;CACjB;;;;;;;CAQA,KAAK,KAAa,SAA6B,CAAC,GAAS;EACvD,KAAK,OAAO,GAAG,KAAK,QAAQ,MAAM,OAAO;CAC3C;;;;;;;CAQA,SAAS,MAAgB,SAA6B,CAAC,GAAS;EAC9D,SAAS,OAAO,GAAG,MAAM,QAAQ,MAAM,OAAO;CAChD;;CAGA,QAAc;EACZ,MAAM,OAAO,GAAG,MAAM,OAAO;CAC/B;;CAGA,SAAe;EACb,OAAO,OAAO,GAAG,MAAM,OAAO;CAChC;;CAGA,OAAa;EACX,KAAK,OAAO,GAAG,MAAM,OAAO;CAC9B;;;;;;CAOA,UAAU,QAAsB;EAC9B,UAAU,OAAO,GAAG,QAAQ,MAAM,OAAO;CAC3C;;CAGA,YAAoB;EAClB,OAAO,UAAU,OAAO,GAAG,MAAM,OAAO;CAC1C;;;;;;CAOA,QAAQ,QAAuB;EAC7B,QAAQ,OAAO,GAAG,QAAQ,MAAM,OAAO;CACzC;;CAGA,UAAmB;EACjB,OAAO,QAAQ,OAAO,GAAG,MAAM,OAAO;CACxC;;CAGA,WAAiB;EACf,cAAc,OAAO,GAAG,MAAM,OAAO;CACvC;;CAGA,YAAkB;EAChB,eAAe,OAAO,GAAG,MAAM,OAAO;CACxC;AACF"}