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
JavaScript
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