minimp3's sliding-window frame confirmation could spuriously discard real frames near the tail of a not-yet-full window, losing ~5.5% of a real VBR file's content even at a tuned 256KB window (~0.3% residual) - audible as the whole track finishing early with stutters at each drop. libmad's mad_stream/mad_frame/mad_synth API reports "need more data" (MAD_ERROR_BUFLEN) and "genuinely bad data" separately rather than overloading one return value, which was the actual ambiguity minimp3 couldn't resolve. Verified against the same real file with a 32KB window (vs minimp3's 256KB): frame count and duration match the Xing header exactly. Confirmed building for Linux, GameCube, and Wii (the latter two via the project's real devkitPPC/libogc Docker toolchain) - libmad ships inside libogc itself on Dolphin, no separate fetch needed there. libmad is GPL-licensed, unlike the rest of this MIT project - a deliberate tradeoff, noted at each site that pulls it in. Co-Authored-By: Claude Sonnet 5 <[email protected]>
33 lines
990 B
CMake
33 lines
990 B
CMake
# Copyright (c) 2026 Dominic Masters
|
|
#
|
|
# This software is released under the MIT License.
|
|
# https://opensource.org/licenses/MIT
|
|
|
|
# NOTE: libmad itself is GPL-licensed (see https://www.underbit.com/products/mad/),
|
|
# not MIT like the rest of this project. Any binary linking it must comply
|
|
# with the GPL - a deliberate tradeoff accepted for MP3 decode correctness
|
|
# (see audiostreammp3decodersw.c's own comment on why minimp3 wasn't enough).
|
|
|
|
find_path(LIBMAD_INCLUDE_DIR NAMES mad.h)
|
|
mark_as_advanced(LIBMAD_INCLUDE_DIR)
|
|
|
|
find_library(LIBMAD_LIBRARY NAMES mad)
|
|
mark_as_advanced(LIBMAD_LIBRARY)
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(
|
|
libmad
|
|
REQUIRED_VARS
|
|
LIBMAD_LIBRARY
|
|
LIBMAD_INCLUDE_DIR
|
|
)
|
|
|
|
if(libmad_FOUND AND NOT TARGET libmad::mad)
|
|
add_library(libmad::mad UNKNOWN IMPORTED)
|
|
set_target_properties(libmad::mad
|
|
PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES ${LIBMAD_INCLUDE_DIR}
|
|
IMPORTED_LOCATION ${LIBMAD_LIBRARY}
|
|
)
|
|
endif()
|