new AudioMixer
src/mediamixer.ts:107new AudioMixer(options?: AudioMixerOptions)Mixes multiple PCM sources (e.g. each user's decoded voice) into one continuous stream Packets are placed using their RTP timestamps, so jitter and bursts don't smear the audio Emits data with one mixed PCM frame (of format.frameDuration) at a steady rate while running Only signed 16-bit little-endian interleaved PCM is supported (what opus decoders output)
Mixes multiple PCM sources (e.g. each user's decoded voice) into one continuous stream Packets are placed using their RTP timestamps, so jitter and bursts don't smear the audio Emits data with one mixed PCM frame (of format.frameDuration) at a steady rate while running Only signed 16-bit little-endian interleaved PCM is supported (what opus decoders output)
import { MediaMixer } from 'detritus-client-socket';
MediaMixer.AudioMixer;new AudioMixer(options?: AudioMixerOptions)addUserId(userId: string): voidanchor(source: AudioMixerSource, rtpTimestamp?: number): numberclear(position: number, samples: number): voidisMixing(userId: string): booleanmsToSamples(ms: number): numbernow(): numberon(event: string | symbol, listener: (...args: any[]) => void): thisAdds the listener function to the end of the listeners array for the event named eventName. No checks are made to see if the listener has already been added. Multiple calls passing the same combination of eventName and listener will result in the listener being added, and called, multiple times.
server.on('connection', (stream) => {
console.log('someone connected!');
});Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// aThe callback function
on(event: "data", listener: (frame: Buffer) => any): thispush(sourceId: string, pcm: Buffer, rtpTimestamp?: number): voidAdds a PCM frame from a source into the mix rtpTimestamp is optional, without it the frame is placed right after the source's previous frame
read(): Buffer<ArrayBufferLike> | nullremoveSource(sourceId: string): voidremoveUserId(userId: string): voidschedule(): voidsetUserIds(userIds: Iterable<string, any, any> | null): voidOnly mix these users, pass null to mix everyone
start(): voidstop(): voidtick(): voidtimestampDiff(a: number, b: number): numbertimestampToSamples(diff: number): number