UNPKG

minigame-std

Version:

Cross-platform standard library for WeChat minigame and web browsers with unified APIs for crypto, fs, fetch, storage, and more.

144 lines (143 loc) 4.63 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); let happy_rusty = require("happy-rusty"); let src_std_fetch_mod_ts = require("./fetch.cjs"); let src_std_fs_mod_ts = require("./fs.cjs"); let src_std_internal_mod_ts = require("./_internal.cjs"); //#region src/macros/env.ts /** * 如果在小游戏环境中返回 true,否则返回 false。 */ const IS_MINA = __MINIGAME_STD_MINA__; //#endregion //#region src/std/audio/web_audio.ts /** * Web/小游戏 平台的音频播放实现。 */ /** * 缓存的 AudioContext。 */ const audioContext = /*#__PURE__*/ (0, happy_rusty.Once)(); /** * 获取缓存的 AudioContext。 * @returns 返回缓存的 AudioContext。 * @since 1.5.0 * @example * ```ts * const context = audio.getGlobalAudioContext(); * ``` */ function getGlobalAudioContext() { return audioContext.getOrInit(createWebAudioContext); } /** * 关闭缓存的 AudioContext。 * @returns 返回一个 AsyncVoidIOResult。 * @since 1.5.0 * @example * ```ts * await audio.closeGlobalAudioContext(); * ``` */ function closeGlobalAudioContext() { if (!audioContext.isInitialized()) return src_std_internal_mod_ts.ASYNC_RESULT_VOID; return (0, happy_rusty.tryAsyncResult)(audioContext.take().unwrap().close()); } /** * 创建一个 AudioContext。 * 如果要获取缓存的实例,请使用 `getGlobalAudioContext`。 * @returns 返回一个 AudioContext实例。 * @since 1.5.0 * @example * ```ts * const context = audio.createWebAudioContext(); * ``` */ function createWebAudioContext() { return IS_MINA ? wx.createWebAudioContext() : new AudioContext(); } /** * 播放一个 AudioBuffer。 * @param buffer - 解码后的 AudioBuffer。 * @param options - 播放选项。 * @returns 正在播放的 AudioBufferSourceNode。 * @since 1.5.0 * @example * ```ts * const source = audio.playWebAudioFromAudioBuffer(audioBuffer, { loop: true }); * ``` */ function playWebAudioFromAudioBuffer(buffer, options) { const { loop = false, autoDisconnect = true } = options ?? {}; const context = getGlobalAudioContext(); const source = context.createBufferSource(); source.buffer = buffer; source.loop = loop; source.connect(context.destination); if (autoDisconnect) source.onended = () => { source.disconnect(); }; source.start(); return source; } /** * 使用 Buffer 进行解码播放。 * @param buffer - 需要解码的 Buffer。 * @param options - 播放选项。 * @returns 正在播放的 AudioBufferSourceNode。 * @since 1.5.0 * @example * ```ts * const result = await audio.playWebAudioFromBufferSource(buffer); * if (result.isOk()) { * const source = result.unwrap(); * } * ``` */ async function playWebAudioFromBufferSource(buffer, options) { const context = getGlobalAudioContext(); return (await (0, happy_rusty.tryAsyncResult)(() => context.decodeAudioData((0, src_std_internal_mod_ts.bufferSourceToAb)(buffer)))).map((audioBuffer) => playWebAudioFromAudioBuffer(audioBuffer, options)); } /** * 读取文件并播放。 * @param filePath - 文件路径。 * @param options - 播放选项。 * @returns 正在播放的 AudioBufferSourceNode。 * @since 1.5.0 * @example * ```ts * const result = await audio.playWebAudioFromFile('/path/to/audio.mp3'); * if (result.isOk()) { * const source = result.unwrap(); * } * ``` */ async function playWebAudioFromFile(filePath, options) { return (await (0, src_std_fs_mod_ts.readFile)(filePath)).andThenAsync((bytes) => playWebAudioFromBufferSource(bytes.buffer, options)); } /** * 从远程 URL 下载音频并解码播放。 * 会先完整下载音频数据再调用 `decodeAudioData`,适合短音效,不适合长音频或流式播放。 * @param url - 音频资源 URL。 * @param options - 播放选项。 * @returns 正在播放的 AudioBufferSourceNode。 * @since 2.2.0 * @example * ```ts * const result = await audio.playWebAudioFromUrl('https://example.com/audio.mp3'); * if (result.isOk()) { * const source = result.unwrap(); * } * ``` */ async function playWebAudioFromUrl(url, options) { return (await (0, src_std_fetch_mod_ts.fetchT)(url, { responseType: "arraybuffer" }).result).andThenAsync((ab) => playWebAudioFromBufferSource(ab, options)); } //#endregion exports.closeGlobalAudioContext = closeGlobalAudioContext; exports.createWebAudioContext = createWebAudioContext; exports.getGlobalAudioContext = getGlobalAudioContext; exports.playWebAudioFromAudioBuffer = playWebAudioFromAudioBuffer; exports.playWebAudioFromBufferSource = playWebAudioFromBufferSource; exports.playWebAudioFromFile = playWebAudioFromFile; exports.playWebAudioFromUrl = playWebAudioFromUrl; //# sourceMappingURL=audio.cjs.map