Skip to content

Commit

Permalink
chore: rewrite
Browse files Browse the repository at this point in the history
  • Loading branch information
twlite committed Dec 5, 2024
1 parent 4555b9f commit 15506fd
Show file tree
Hide file tree
Showing 29 changed files with 731 additions and 425 deletions.
7 changes: 6 additions & 1 deletion .github/renovate.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:base", "group:allNonMajor", ":preserveSemverRanges", ":disablePeerDependencies"],
"extends": [
"config:base",
"group:allNonMajor",
":preserveSemverRanges",
":disablePeerDependencies"
],
"labels": ["dependencies"],
"packageRules": [
{
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
branches:
- main
tags-ignore:
- '**'
- "**"
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
Expand All @@ -21,7 +21,7 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'yarn'
cache: "yarn"

- name: Install
uses: dtolnay/rust-toolchain@stable
Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,25 +56,25 @@ The default probe size is `2MB`, but you can adjust this as needed by passing th

```js
// probe only 1024 bytes
const { result } = await mediaplex.probeStream(stream, 1024)
const { result } = await mediaplex.probeStream(stream, 1024);

// probe 5 MB
const { result } = await mediaplex.probeStream(stream, 5 * 1024 * 1024)
const { result } = await mediaplex.probeStream(stream, 5 * 1024 * 1024);
```

## Opus Encoder

Mediaplex also includes an Opus encoder/decoder, which can be used as a drop-in replacement for [`@discordjs/opus`](https://github.com/discordjs/opus). Here's an example on how to use it:

```js
const { OpusEncoder, getOpusVersion } = require('mediaplex')
const { OpusEncoder, getOpusVersion } = require("mediaplex");

console.log(getOpusVersion()) // libopus xxx
console.log(getOpusVersion()); // libopus xxx

const encoder = new OpusEncoder(48000, 2)
const encoder = new OpusEncoder(48000, 2);

const encoded = encoder.encode(buffer)
const decoded = encoder.decode(encoded)
const encoded = encoder.encode(buffer);
const decoded = encoder.decode(encoded);
```

You can use `OpusEncoder` to encode pcm data to opus and decode opus data to pcm format. Stream interface is provided by [@discord-player/opus](https://npm.im/@discord-player/opus) package.
8 changes: 4 additions & 4 deletions __test__/index.spec.mjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import test from 'ava'
import test from "ava";

test('sum from native', (t) => {
t.pass()
})
test("sum from native", (t) => {
t.pass();
});
71 changes: 43 additions & 28 deletions benchmark/common.mjs
Original file line number Diff line number Diff line change
@@ -1,59 +1,74 @@
import { readFileSync } from 'node:fs'
import djs from '@discordjs/opus'
import opusscript from 'opusscript'
import mediaplex from '../index.js'
import * as evanOpus from '@evan/opus'
import * as evanOpusWasm from '@evan/opus/wasm/index.mjs'
import * as simdEvanOpus from '@evan/wasm/target/opus/node.mjs'
import { readFileSync } from "node:fs";
import djs from "@discordjs/opus";
import opusscript from "opusscript";
import mediaplex from "../index.js";
import * as evanOpus from "@evan/opus";
import * as evanOpusWasm from "@evan/opus/wasm/index.mjs";
import * as simdEvanOpus from "@evan/wasm/target/opus/node.mjs";

export const generatePCMSample = (sampleSize) => {
return readFileSync(new URL(`./data/sample.pcm`, import.meta.url)).subarray(0, sampleSize)
}
return readFileSync(new URL(`./data/sample.pcm`, import.meta.url)).subarray(
0,
sampleSize,
);
};

export const generateOpusSample = () => {
return readFileSync(new URL(`./data/sample.opus`, import.meta.url))
}
return readFileSync(new URL(`./data/sample.opus`, import.meta.url));
};

export const createMediaplexEncoder = (config) => new mediaplex.OpusEncoder(config.SAMPLE_RATE, config.CHANNELS)
export const createDjsEncoder = (config) => new djs.OpusEncoder(config.SAMPLE_RATE, config.CHANNELS)
export const createMediaplexEncoder = (config) =>
new mediaplex.OpusEncoder(config.SAMPLE_RATE, config.CHANNELS);
export const createDjsEncoder = (config) =>
new djs.OpusEncoder(config.SAMPLE_RATE, config.CHANNELS);
export const createOpusScriptWasmEncoder = (config) =>
new opusscript(config.SAMPLE_RATE, config.CHANNELS, opusscript.Application.AUDIO, {
wasm: true,
})
new opusscript(
config.SAMPLE_RATE,
config.CHANNELS,
opusscript.Application.AUDIO,
{
wasm: true,
},
);
export const createOpusScriptAsmEncoder = (config) =>
new opusscript(config.SAMPLE_RATE, config.CHANNELS, opusscript.Application.AUDIO, {
wasm: false,
})
new opusscript(
config.SAMPLE_RATE,
config.CHANNELS,
opusscript.Application.AUDIO,
{
wasm: false,
},
);
export const createEvanOpusEncoder = (config) =>
new evanOpus.Encoder({
application: 'voip',
application: "voip",
channels: config.CHANNELS,
sample_rate: config.SAMPLE_RATE,
})
});
export const createEvanOpusDecoder = (config) =>
new evanOpus.Decoder({
channels: config.CHANNELS,
sample_rate: config.SAMPLE_RATE,
})
});
export const createEvanOpusEncoderWasm = (config) =>
new evanOpusWasm.Encoder({
application: 'voip',
application: "voip",
channels: config.CHANNELS,
sample_rate: config.SAMPLE_RATE,
})
});
export const createEvanOpusDecoderWasm = (config) =>
new evanOpusWasm.Decoder({
channels: config.CHANNELS,
sample_rate: config.SAMPLE_RATE,
})
});
export const createSimdEvanOpusEncoder = (config) =>
new simdEvanOpus.Encoder({
application: 'voip',
application: "voip",
channels: config.CHANNELS,
sample_rate: config.SAMPLE_RATE,
})
});
export const createSimdEvanOpusDecoder = (config) =>
new simdEvanOpus.Decoder({
channels: config.CHANNELS,
sample_rate: config.SAMPLE_RATE,
})
});
68 changes: 34 additions & 34 deletions benchmark/decoder.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as mitata from 'mitata'
import * as mitata from "mitata";

// prettier-ignore
import {
Expand All @@ -16,40 +16,40 @@ const config = {
FRAME_SIZE: 960,
SAMPLE_RATE: 48000,
CHANNELS: 2,
}
};

const mediaplexEncoder = createMediaplexEncoder(config)
const nativeEncoder = createDjsEncoder(config)
const wasmEncoder = createOpusScriptWasmEncoder(config)
const asmEncoder = createOpusScriptAsmEncoder(config)
const evanOpus = createEvanOpusDecoder(config)
const evanOpusWasm = createEvanOpusDecoderWasm(config)
const evanWasmOpus = createSimdEvanOpusDecoder(config)
const mediaplexEncoder = createMediaplexEncoder(config);
const nativeEncoder = createDjsEncoder(config);
const wasmEncoder = createOpusScriptWasmEncoder(config);
const asmEncoder = createOpusScriptAsmEncoder(config);
const evanOpus = createEvanOpusDecoder(config);
const evanOpusWasm = createEvanOpusDecoderWasm(config);
const evanWasmOpus = createSimdEvanOpusDecoder(config);

const SAMPLE = generateOpusSample()
const SAMPLE = generateOpusSample();

mitata.group('OpusDecoder', () => {
mitata.bench('mediaplex', () => {
mediaplexEncoder.decode(SAMPLE)
})
mitata.bench('@discordjs/opus', () => {
nativeEncoder.decode(SAMPLE)
})
mitata.bench('opusscript', () => {
wasmEncoder.decode(SAMPLE)
})
mitata.bench('opusscript (no wasm)', () => {
asmEncoder.decode(SAMPLE)
})
mitata.bench('@evan/opus', () => {
evanOpus.decode(SAMPLE)
})
mitata.bench('@evan/opus (wasm)', () => {
evanOpusWasm.decode(SAMPLE)
})
mitata.bench('@evan/wasm', () => {
evanWasmOpus.decode(SAMPLE)
})
})
mitata.group("OpusDecoder", () => {
mitata.bench("mediaplex", () => {
mediaplexEncoder.decode(SAMPLE);
});
mitata.bench("@discordjs/opus", () => {
nativeEncoder.decode(SAMPLE);
});
mitata.bench("opusscript", () => {
wasmEncoder.decode(SAMPLE);
});
mitata.bench("opusscript (no wasm)", () => {
asmEncoder.decode(SAMPLE);
});
mitata.bench("@evan/opus", () => {
evanOpus.decode(SAMPLE);
});
mitata.bench("@evan/opus (wasm)", () => {
evanOpusWasm.decode(SAMPLE);
});
mitata.bench("@evan/wasm", () => {
evanWasmOpus.decode(SAMPLE);
});
});

await mitata.run()
await mitata.run();
68 changes: 34 additions & 34 deletions benchmark/encoder.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as mitata from 'mitata'
import * as mitata from "mitata";
// prettier-ignore
import {
createDjsEncoder,
Expand All @@ -15,40 +15,40 @@ const config = {
FRAME_SIZE: 960,
SAMPLE_RATE: 48000,
CHANNELS: 2,
}
};

const mediaplexEncoder = createMediaplexEncoder(config)
const nativeEncoder = createDjsEncoder(config)
const wasmEncoder = createOpusScriptWasmEncoder(config)
const asmEncoder = createOpusScriptAsmEncoder(config)
const evanOpus = createEvanOpusEncoder(config)
const evanOpusWasm = createEvanOpusEncoderWasm(config)
const evanWasmOpus = createSimdEvanOpusEncoder(config)
const mediaplexEncoder = createMediaplexEncoder(config);
const nativeEncoder = createDjsEncoder(config);
const wasmEncoder = createOpusScriptWasmEncoder(config);
const asmEncoder = createOpusScriptAsmEncoder(config);
const evanOpus = createEvanOpusEncoder(config);
const evanOpusWasm = createEvanOpusEncoderWasm(config);
const evanWasmOpus = createSimdEvanOpusEncoder(config);

const SAMPLE = generatePCMSample(config.FRAME_SIZE * config.CHANNELS * 6)
const SAMPLE = generatePCMSample(config.FRAME_SIZE * config.CHANNELS * 6);

mitata.group('OpusEncoder', () => {
mitata.bench('mediaplex', () => {
mediaplexEncoder.encode(SAMPLE)
})
mitata.bench('@discordjs/opus', () => {
nativeEncoder.encode(SAMPLE)
})
mitata.bench('opusscript', () => {
wasmEncoder.encode(SAMPLE, config.FRAME_SIZE)
})
mitata.bench('opusscript (no wasm)', () => {
asmEncoder.encode(SAMPLE, config.FRAME_SIZE)
})
mitata.bench('@evan/opus', () => {
evanOpus.encode(SAMPLE)
})
mitata.bench('@evan/opus (wasm)', () => {
evanOpusWasm.encode(SAMPLE)
})
mitata.bench('@evan/wasm', () => {
evanWasmOpus.encode(SAMPLE)
})
})
mitata.group("OpusEncoder", () => {
mitata.bench("mediaplex", () => {
mediaplexEncoder.encode(SAMPLE);
});
mitata.bench("@discordjs/opus", () => {
nativeEncoder.encode(SAMPLE);
});
mitata.bench("opusscript", () => {
wasmEncoder.encode(SAMPLE, config.FRAME_SIZE);
});
mitata.bench("opusscript (no wasm)", () => {
asmEncoder.encode(SAMPLE, config.FRAME_SIZE);
});
mitata.bench("@evan/opus", () => {
evanOpus.encode(SAMPLE);
});
mitata.bench("@evan/opus (wasm)", () => {
evanOpusWasm.encode(SAMPLE);
});
mitata.bench("@evan/wasm", () => {
evanWasmOpus.encode(SAMPLE);
});
});

await mitata.run()
await mitata.run();
8 changes: 4 additions & 4 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { ProbeResult } from './js-binding';
import type { Readable } from 'stream';
import type { ProbeResult } from "./js-binding";
import type { Readable } from "stream";

export class OpusEncoder {
public constructor(sampleRate: number, channels: number);
Expand All @@ -22,7 +22,7 @@ export {
getOpusVersion,
probe,
probeSync,
} from './js-binding';
} from "./js-binding";

export type StreamProbeResult = {
stream: Readable;
Expand Down Expand Up @@ -53,6 +53,6 @@ export interface ProbeStreamOptions {

export function probeStream(
stream: Readable,
options?: ProbeStreamOptions
options?: ProbeStreamOptions,
): Promise<StreamProbeResult>;
export function readMetadata(result: ProbeResult): Metadata;
Loading

0 comments on commit 15506fd

Please sign in to comment.