trtc-electron-sdk
Version:
trtc electron sdk
429 lines (428 loc) • 18.9 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TRTCAudioEffectManager = void 0;
const logger_1 = __importDefault(require("../../logger"));
const NodeTRTCEngine = require('../../../build/Release/trtc_electron_sdk.node');
/**
* 音效管理器
*/
class TRTCAudioEffectManager {
constructor(options) {
this.logPrefix = "[TRTCAudioEffectManager]";
this.promiseStore = new Map();
this.eventHandler = this.eventHandler.bind(this);
this.isIPCMode = options.isIPCMode;
if (this.isIPCMode) {
this.nodeAudioEffectManager = new NodeTRTCEngine.NodeRemoteAudioEffectManager();
this.nodeAudioEffectManager.setRemoteAudioEffectManagerCallback(this.eventHandler);
}
else {
this.nodeAudioEffectManager = options.nodeTRTCCloud;
}
}
destroy() {
var _a, _b;
this.nodeAudioEffectManager = null;
(_a = this.promiseStore) === null || _a === void 0 ? void 0 : _a.forEach((value) => {
value.forEach(({ reject }) => {
reject();
});
});
(_b = this.promiseStore) === null || _b === void 0 ? void 0 : _b.clear();
this.promiseStore = undefined;
}
/////////////////////////////////////////////////////////////////////////////////
//
// 人声相关的特效接口
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 开启耳返
*
* 主播开启耳返后,可以在耳机里听到麦克风采集到的自己发出的声音,该特效适用于主播唱歌的应用场景中。
* 需要您注意的是,由于蓝牙耳机的硬件延迟非常高,所以在主播佩戴蓝牙耳机时无法开启此特效,请尽量在用户界面上提示主播佩戴有线耳机。
* 同时也需要注意,并非所有的手机开启此特效后都能达到优秀的耳返效果,我们已经对部分耳返效果不佳的手机屏蔽了该特效。
*
* 注意:仅在主播佩戴耳机时才能开启此特效,同时请您提示主播佩戴有线耳机。
*
* @param {Boolean} enable - true:开启;false:关闭。
* @returns {Promise<void>}
*/
enableVoiceEarMonitor(enable) {
logger_1.default.debug(`${this.logPrefix}enableVoiceEarMonitor:${enable}`);
this.nodeAudioEffectManager.enableVoiceEarMonitor(enable);
return Promise.resolve();
}
/**
* 设置耳返音量
*
* 通过该接口您可以设置耳返特效中声音的音量大小。
* 注意:如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*
* @param {Number} volume - 音量大小,取值范围为 0 - 100,默认值:100。
* @returns {Promise<void>}
*/
setVoiceEarMonitorVolume(volume) {
logger_1.default.debug(`${this.logPrefix}setVoiceEarMonitorVolume:${volume}`);
this.nodeAudioEffectManager.setVoiceEarMonitorVolume(volume);
return Promise.resolve();
}
/**
* 设置人声的混响效果
*
* 通过该接口您可以设置人声的混响效果,具体特效请参见枚举定义 {@link TRTCVoiceReverbType}。
* 注意:设置的效果在退出房间后会自动失效,如果下次进房还需要对应特效,需要调用此接口再次进行设置。
*
* @param {TRTCVoiceReverbType} type - 混响类型
* @returns {Promise<void>}
*/
setVoiceReverbType(type) {
logger_1.default.debug(`${this.logPrefix}setVoiceReverbType: ${type}`);
this.nodeAudioEffectManager.setVoiceReverbType(type);
return Promise.resolve();
}
/**
* 设置人声的变声特效
*
* 通过该接口您可以设置人声的变声特效,具体特效请参见枚举定义 {@link TRTCVoiceChangerType}。
* 注意:设置的效果在退出房间后会自动失效,如果下次进房还需要对应特效,需要调用此接口再次进行设置。
*
* @param {TRTCVoiceChangerType} type - 变声类型
* @returns {Promise<void>}
*/
setVoiceChangerType(type) {
logger_1.default.debug(`${this.logPrefix}setVoiceChangerType: ${type}`);
this.nodeAudioEffectManager.setVoiceChangerType(type);
return Promise.resolve();
}
/**
* 设置语音音量
*
* 该接口可以设置语音音量的大小,一般配合音乐音量的设置接口 {@link setAllMusicVolume} 协同使用,用于调谐语音和音乐在混音前各自的音量占比。
* 注意:如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*
* @param {Number} volume - 音量大小,取值范围为0 - 100,默认值:100。
* @returns {Promise<void>}
*/
setVoiceCaptureVolume(volume) {
logger_1.default.debug(`${this.logPrefix}setVoiceCaptureVolume: ${volume}`);
this.nodeAudioEffectManager.setVoiceCaptureVolume(volume);
return Promise.resolve();
}
/**
* 设置语音音调
*
* 该接口可以设置语音音调,用于实现变调不变速的目的。
* @param {Number} pitch - 音调,取值范围为-1.0f~1.0f,默认值:0.0f。
* @returns {Promise<void>}
*/
setVoicePitch(pitch) {
logger_1.default.debug(`${this.logPrefix}setVoicePitch: ${pitch}`);
this.nodeAudioEffectManager.setVoicePitch(pitch);
return Promise.resolve();
}
/////////////////////////////////////////////////////////////////////////////////
//
// 背景音乐的相关接口
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 设置背景音乐的事件回调监听
*
* 请在播放背景音乐之前使用该接口设置播放事件回调,以便感知背景音乐的播放进度。
*
* @param {TRTCMusicPlayObserver} observer - 背景音乐播放事件回调
* @returns {Promise<void>}
*/
setMusicObserver(observer) {
logger_1.default.debug(`${this.logPrefix}setMusicObserver:`, observer);
this.nodeAudioEffectManager.setMusicObserver(observer.onStart, observer.onPlayProgress, observer.onComplete);
return Promise.resolve();
}
/**
* 开始播放背景音乐
*
* @param {TRTCAudioMusicParam} musicParam - 背景音乐参数
* @returns {Promise<void>}
*/
startPlayMusic(param) {
logger_1.default.debug(`${this.logPrefix}startPlayMusic:`, param);
this.nodeAudioEffectManager.startPlayMusic(param);
return Promise.resolve();
}
/**
* 停止播放背景音乐
*
* @param {Number} id - 音乐 ID
* @returns {Promise<void>}
*/
stopPlayMusic(id) {
logger_1.default.debug(`${this.logPrefix}stopPlayMusic:${id}`);
this.nodeAudioEffectManager.stopPlayMusic(id);
return Promise.resolve();
}
/**
* 暂停播放背景音乐
*
* @param {Number} id 音乐 ID
* @returns {Promise<void>}
*/
pausePlayMusic(id) {
logger_1.default.debug(`${this.logPrefix}pausePlayMusic:${id}`);
this.nodeAudioEffectManager.pausePlayMusic(id);
return Promise.resolve();
}
/**
* 恢复播放背景音乐
*
* @param {Number} id 音乐 ID
* @returns {Promise<void>}
*/
resumePlayMusic(id) {
logger_1.default.debug(`${this.logPrefix}resumePlayMusic:${id}`);
this.nodeAudioEffectManager.resumePlayMusic(id);
return Promise.resolve();
}
/**
* 设置所有背景音乐的本地音量和远端音量的大小
*
* 该接口可以设置所有背景音乐的本地音量和远端音量。
* - 本地音量:即主播本地可以听到的背景音乐的音量大小。
* - 远端音量:即观众端可以听到的背景音乐的音量大小。
*
* 注意:如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*
* @param {Number} volume - 音量大小,100为正常音量,取值范围为0 - 200。
* @returns {Promise<void>}
*/
setAllMusicVolume(volume) {
logger_1.default.debug(`${this.logPrefix}setAllMusicVolume:${volume}`);
this.nodeAudioEffectManager.setAllMusicVolume(volume);
return Promise.resolve();
}
/**
* 设置背景音乐远端播放音量的大小
*
* 播放背景音乐混音时使用,用来控制背景音乐在远端播放时的音量大小。
*
* @param {Number} id - 音乐 ID
* @param {Number} volume - 音量大小,100为正常音量,取值范围为0 - 100;默认值:100
* @returns {Promise<void>}
*/
setMusicPublishVolume(id, volume) {
logger_1.default.debug(`${this.logPrefix}setMusicPublishVolume:${id} ${volume}`);
this.nodeAudioEffectManager.setMusicPublishVolume(id, volume);
return Promise.resolve();
}
/**
* 设置背景音乐本地播放音量的大小
*
* 播放背景音乐混音时使用,用来控制背景音乐在本地播放时的音量大小。
*
* @param {Number} id - 音乐 ID
* @param {Number} volume - 音量大小,100为正常音量,取值范围为0 - 100;默认值:100
* @returns {Promise<void>}
*/
setMusicPlayoutVolume(id, volume) {
logger_1.default.debug(`${this.logPrefix}setMusicPlayoutVolume:${id} ${volume}`);
this.nodeAudioEffectManager.setMusicPlayoutVolume(id, volume);
return Promise.resolve();
}
/**
* 调整背景音乐的音调高低
*
* @param {Number} id - 音乐 ID。
* @param {Number} pitch - 音调,默认值是0.0f,范围是:[-1 ~ 1] 之间的浮点数。
* @returns {Promise<void>}
*/
setMusicPitch(id, pitch) {
logger_1.default.debug(`${this.logPrefix}setMusicPitch:${id} ${pitch}`);
this.nodeAudioEffectManager.setMusicPitch(id, pitch);
return Promise.resolve();
}
/**
* 调整背景音乐的变速效果
*
* @param {Number} id - 音乐 ID。
* @param {Number} speedRate - 速度,默认值是1.0f,范围是:[0.5 ~ 2] 之间的浮点数。
* @returns {Promise<void>}
*/
setMusicSpeedRate(id, speedRate) {
logger_1.default.debug(`${this.logPrefix}setMusicSpeedRate:${id} ${speedRate}`);
this.nodeAudioEffectManager.setMusicSpeedRate(id, speedRate);
return Promise.resolve();
}
/**
* 获取背景音乐的播放进度(单位:毫秒)
*
* @param {Number} id - 音乐 ID。
* @return {Promise<Number>|Number} 成功返回当前播放时间,单位:毫秒,失败返回 -1。
*/
getMusicCurrentPosInMS(id) {
logger_1.default.debug(`${this.logPrefix}getMusicCurrentPosInMS: ${id}`);
if (this.isIPCMode) {
return new Promise((resolve, reject) => {
const key = `onGetMusicCurrentPosInMS-${id}`;
this.addPromise(key, resolve, reject);
this.nodeAudioEffectManager.getMusicCurrentPosInMS(id);
});
}
else {
return this.nodeAudioEffectManager.getMusicCurrentPosInMS(id);
}
}
/**
* 获取背景音乐的总时长(单位:毫秒)
*
* @param {String} path - 音乐文件路径。
* @return {Promise<number>|Number} 成功返回时长,失败返回 -1。
*/
getMusicDurationInMS(path) {
logger_1.default.debug(`${this.logPrefix}getMusicDurationInMS: ${path}`);
if (this.isIPCMode) {
return new Promise((resolve, reject) => {
const key = `onGetMusicDurationInMS-${path}`;
this.addPromise(key, resolve, reject);
this.nodeAudioEffectManager.getMusicDurationInMS(path);
});
}
else {
return this.nodeAudioEffectManager.getMusicDurationInMS(path);
}
}
/**
* 设置背景音乐的播放进度(单位:毫秒)
*
* 注意:请尽量避免过度频繁地调用该接口,因为该接口可能会再次读写音乐文件,耗时稍高。
* 因此,当用户拖拽音乐的播放进度条时,请在用户完成拖拽操作后再调用本接口。
* 因为 UI 上的进度条控件往往会以很高的频率反馈用户的拖拽进度,如不做频率限制,会导致较差的用户体验。
* @param {Number} id - 音乐 ID
* @param {Number} pts - 单位: 毫秒
* @returns {Promise<void>}
*/
seekMusicToPosInTime(id, pts) {
logger_1.default.debug(`${this.logPrefix}seekMusicToPosInTime:${id} ${pts}`);
this.nodeAudioEffectManager.seekMusicToPosInTime(id, pts);
return Promise.resolve();
}
/**
* 调整搓碟的变速效果
*
* @param {Number} id - 音乐 ID。
* @param {Number} scratchSpeedRate - 搓碟速度,默认值是1.0f,范围是:[-12.0 ~ 12.0] 之间的浮点数, 速度值正/负表示方向正/反,绝对值大小表示速度快慢。
* 注意:前置条件 preloadMusic 成功。
* @returns {Promise<void>}
*/
setMusicScratchSpeedRate(id, speedRate) {
logger_1.default.debug(`${this.logPrefix}seekMusicToPosInTime:${id} ${speedRate}`);
this.nodeAudioEffectManager.setMusicScratchSpeedRate(id, speedRate);
return Promise.resolve();
}
/**
* 设置预加载事件回调
*
* 请在预加载背景音乐之前使用该接口设置回调,以便感知背景音乐的预加载进度。
* @param {TRTCMusicPreloadObserver} observer - 音乐加载监听
* @returns {Promise<void>}
*/
setPreloadObserver(observer) {
logger_1.default.debug(`${this.logPrefix}setPreloadObserver:`, observer);
this.nodeAudioEffectManager.setPreloadObserver(observer.onLoadProgress, observer.onLoadError);
return Promise.resolve();
}
/**
* 预加载背景音乐
*
* 每个音乐都需要您指定具体的 ID,您可以通过该 ID 对音乐的开始、停止、音量等进行设置。
* 注意:
* 1. 预先加载最多同时支持2个不同 ID 的预加载,且预加载时长不超过10分钟,使用完需 stopPlayMusic,否则内存不释放。
* 2. 若该ID对应的音乐正在播放中,预加载会失败,需先调用 stopPlayMusic。
* 3. 当 musicParam 和传入 startPlayMusic 的 musicParam 完全相同时,预加载有效。
*
* @param {TRTCAudioMusicParam} preloadParam - 预加载音乐参数。
* @returns {Promise<void>}
*/
preloadMusic(param) {
logger_1.default.debug(`${this.logPrefix}preloadMusic:`, param);
this.nodeAudioEffectManager.preloadMusic(param);
return Promise.resolve();
}
/**
* 获取背景音乐的音轨数量
*
* @param {Number} id - 音乐 ID。
* @returns {Promise<Number>|Number}
*/
getMusicTrackCount(id) {
logger_1.default.debug(`${this.logPrefix}getMusicTrackCount: ${id}`);
if (this.isIPCMode) {
return new Promise((resolve, reject) => {
const key = `onGetMusicTrackCount-${id}`;
this.addPromise(key, resolve, reject);
this.nodeAudioEffectManager.getMusicTrackCount(id);
});
}
else {
return this.nodeAudioEffectManager.getMusicTrackCount(id);
}
}
/**
* 指定背景音乐的播放音轨
*
* 注意:音轨总数量可通过 getMusicTrackCount 接口获取。
*
* @param {Number} id - 音乐 ID。
* @param {Number} index - 默认播放第一个音轨。取值范围[0, 音轨总数)。
* @returns {Promise<void>}
*/
setMusicTrack(id, trackIndex) {
logger_1.default.debug(`${this.logPrefix}getMusicTrackCount:${id} ${trackIndex}`);
this.nodeAudioEffectManager.setMusicTrack(id, trackIndex);
return Promise.resolve();
}
eventHandler(args) {
logger_1.default.debug(`${this.logPrefix} event:`, args);
const key = args[0];
const data = args[1];
logger_1.default.debug(`${this.logPrefix} event key: ${key} data:`, data);
switch (key) {
case "onGetMusicCurrentPosInMS":
this.removePromise(`${key}-${data.id}`, data.currentPos);
break;
case 'onGetMusicDurationInMS':
this.removePromise(`${key}-${data.path}`, data.durationInMS);
break;
case 'onGetMusicTrackCount':
this.removePromise(`${key}-${data.id}`, data.trackCount);
break;
default:
logger_1.default.warn(`${this.logPrefix}eventHandler un-supported event:`, key);
}
}
addPromise(key, resolve, reject) {
var _a, _b, _c;
if (!((_a = this.promiseStore) === null || _a === void 0 ? void 0 : _a.has(key))) {
(_b = this.promiseStore) === null || _b === void 0 ? void 0 : _b.set(key, []);
}
const storedPromises = (_c = this.promiseStore) === null || _c === void 0 ? void 0 : _c.get(key);
storedPromises === null || storedPromises === void 0 ? void 0 : storedPromises.push({
resolve,
reject
});
}
removePromise(key, value) {
var _a, _b;
const storedPromises = (_a = this.promiseStore) === null || _a === void 0 ? void 0 : _a.get(key);
if (storedPromises) {
storedPromises.forEach(({ resolve, reject }) => {
resolve(value);
});
(_b = this.promiseStore) === null || _b === void 0 ? void 0 : _b.delete(key);
}
}
}
exports.TRTCAudioEffectManager = TRTCAudioEffectManager;
exports.default = TRTCAudioEffectManager;