# LAME（MP3 の書き出しに使う部品）のソース / Source code of LAME (used for MP3 export)

このサイトは、MP3 を書き出すときだけ `@mediabunny/mp3-encoder` 1.61.4（MPL-2.0）を読み込みます。その中には、LAME 3.100（GNU Lesser General Public License 2 以降）を WebAssembly にしたものが入っています。LGPL の義務を、このサイトだけで満たせるように、ソースと組み直しに要るものをここに置きます（上流のリンクがなくなっても手に入るように）。

This site loads `@mediabunny/mp3-encoder` 1.61.4 (MPL-2.0) only when exporting MP3. It contains a WebAssembly build of LAME 3.100 (GNU Lesser General Public License, version 2 or later). The source code and everything needed to relink are kept here so that the LGPL obligations are met by this site alone.

## ここにあるもの / Contents

| ファイル / File | 何か / What it is | 入手元 / Origin |
|---|---|---|
| `lame-3.100.tar.gz` | LAME 3.100 のソース / LAME 3.100 source | https://sourceforge.net/projects/lame/files/lame/3.100/ |
| `mediabunny-mp3-encoder-v1.61.4/libmp3lame.a` | 上の LAME を Emscripten で作ったライブラリ / LAME built with Emscripten | https://github.com/Vanilagy/mediabunny/tree/v1.61.4/packages/mp3-encoder/build |
| `mediabunny-mp3-encoder-v1.61.4/lame-bridge.c` | JavaScript と LAME をつなぐ C のコード / C bridge between JavaScript and LAME | 同じ場所の `src/` / `src/` of the same package |
| `mediabunny-mp3-encoder-v1.61.4/lame.h` | LAME のヘッダー（v1.192, 2017-08-31）/ LAME header | 同じ場所の `lib/` / `lib/` of the same package |
| `mediabunny-mp3-encoder-v1.61.4/README.md` | 上流の説明（ビルドの手順を含む）/ Upstream README with build steps | 同じ場所 / same package |
| `SHA256SUMS` | それぞれのファイルの sha256 / sha256 of each file | — |

`lame-3.100.tar.gz` の sha256 は、広く知られている LAME 3.100 の値（`ddfe36ca…`）と同じです。

## 組み直しの手順 / How to rebuild or relink

[Emscripten](https://emscripten.org/) を使います（上流の README と同じ手順）。

1. LAME をビルドする（`lame-3.100.tar.gz` を展開したフォルダで）。変更した LAME に差し替えるときは、ここで差し替える

   ```sh
   emconfigure ./configure \
       CFLAGS="-DNDEBUG -DNO_STDIO -O3 -msimd128" \
       --disable-dependency-tracking --disable-shared --disable-gtktest \
       --disable-analyzer-hooks --disable-decoder --disable-frontend
   emmake make clean
   emmake make
   # libmp3lame/.libs/libmp3lame.a ができる（ここにある libmp3lame.a と同じもの）
   ```

2. 橋渡しのコードとつないで `lame.js`（WebAssembly を中に含む）を作る

   ```sh
   emcc lame-bridge.c libmp3lame.a \
       -s MODULARIZE=1 -s EXPORT_ES6=1 -s SINGLE_FILE=1 -s ALLOW_MEMORY_GROWTH=1 \
       -s ENVIRONMENT=web,worker -s EXPORTED_RUNTIME_METHODS=cwrap,HEAPU8 \
       -s EXPORTED_FUNCTIONS=_malloc,_free -msimd128 -O3 \
       -o lame.js
   ```

3. Mediabunny の `packages/mp3-encoder/build/lame.js` をこれに替えて、Mediabunny の手順（`npm run build`）で `@mediabunny/mp3-encoder` を作り直し、このサイトをビルドし直す（`npm run build`）。MP3 の部品は、サイトの中では `assets/mediabunny-mp3-encoder-*.js` という別のファイルになっている
