@@ -51,11 +51,36 @@ export { encodeChunked }
5151
5252// --- format registration ---
5353
54+ // Lazy-loaded meta writers (per-format), keyed by format name. Loaded on first
55+ // use when `meta`/`markers`/`regions` is passed to that format's encoder.
56+ const META_WRITERS = {
57+ wav : ( ) => import ( '@audio/encode-wav/meta' ) . then ( m => m . writeMeta ) ,
58+ mp3 : ( ) => import ( '@audio/encode-mp3/meta' ) . then ( m => m . writeMeta ) ,
59+ flac : ( ) => import ( '@audio/encode-flac/meta' ) . then ( m => m . writeMeta ) ,
60+ }
61+
5462function reg ( name , load ) {
5563 encode [ name ] = fmt ( name , async ( opts ) => {
64+ let { meta, markers, regions, ...rest } = opts || { }
5665 let init = ( await load ( ) ) . default
57- let codec = await init ( opts )
58- return streamEncoder ( ch => codec . encode ( ch ) , ( ) => codec . flush ( ) , ( ) => codec . free ( ) )
66+ let codec = await init ( rest )
67+ // No meta requested (or unsupported by format): pass through.
68+ if ( ! META_WRITERS [ name ] || ! ( meta || markers ?. length || regions ?. length ) )
69+ return streamEncoder ( ch => codec . encode ( ch ) , ( ) => codec . flush ( ) , ( ) => codec . free ( ) )
70+ // Meta requested: buffer encoder output, splice via writeMeta on flush.
71+ let writeMeta = await META_WRITERS [ name ] ( )
72+ let parts = [ ]
73+ return streamEncoder (
74+ async ch => { let b = await codec . encode ( ch ) ; if ( b ?. length ) parts . push ( b ) ; return EMPTY } ,
75+ async ( ) => {
76+ let f = await codec . flush ( ) ; if ( f ?. length ) parts . push ( f )
77+ let total = 0 ; for ( let p of parts ) total += p . length
78+ let all = new Uint8Array ( total ) , off = 0
79+ for ( let p of parts ) { all . set ( p , off ) ; off += p . length }
80+ return writeMeta ( all , { meta : meta || { } , markers : markers || [ ] , regions : regions || [ ] } )
81+ } ,
82+ ( ) => codec . free ( ) ,
83+ )
5984 } )
6085}
6186
0 commit comments