reasampler_pure_library(bridge_marshal SOURCES bridge_marshal.cpp)
reasampler_test(bridge_marshal LINK bridge_marshal)

reasampler_pure_library(trigger_seam SOURCES trigger_seam.cpp)
# Links only trigger_seam — not even editor_geometry — the plainest data-boundary proof
# available.
reasampler_test(trigger_seam LINK trigger_seam)

reasampler_pure_library(bank_sync
    SOURCES bank_sync.cpp
    LINK PUBLIC assignment_request PRIVATE wire)
# Links only bank_sync (+ its assignment_request dep): linking more would break the
# plain-data-boundary proof.
reasampler_test(bank_sync LINK bank_sync)

# The state codec is shared with the extension's preset-blob path, so it must link WITHOUT
# the voice engine: velocity_curve (the curve field) and master_gain (the wire gain cap) only.
# play_params.h also pulls in filter/'s headers (FilterSettings, MorphLaw) for the v9 filter
# tail -- plain value types, so no filter symbol is linked and this stays true.
# Two TUs on the format's OWN seam: the envelope's version ladder and the payload's, which
# the format already keeps on independent version axes (see component_state_io.h).
reasampler_pure_library(component_state_io
    SOURCES component_state_io.cpp params_payload.cpp
    LINK PUBLIC velocity_curve master_gain curve_law)
# Links only component_state_io, deliberately no sampler_core/pitch_shift: the structural
# proof the codec is engine-free, which is what keeps engine object code out of the extension.
reasampler_test(component_state_io LINK component_state_io)

# The mapping's product is plain SampleData, so the voice engine is not a dependency.
reasampler_pure_library(sample_map
    SOURCES sample_map.cpp
    LINK PUBLIC bank_book wav_codec velocity_curve peaks curve_law)
# Links only sample_map + component_state_io: the same plain-data-boundary proof, spanning
# both halves of the mapping/codec split where the frozen-format assertions live.
reasampler_test(sample_map LINK sample_map component_state_io)
