Phase 0: Repo-Gerüst und vier Verifikations-Spikes

Vier Annahmen des Plans vor jedem Implementierungscode geprüft:

A (SMC):  Lüftersteuerung bestätigt — F0md/F1md (klein!) als Auto/Manuell-
          Umschalter, F0Tg als Ziel, Grenzen aus F0Mn/F0Mx. SMC-Integer sind
          little-endian, nicht big-endian wie im verbreiteten Intel-Beispielcode.
          Ladelimit: CHWA/CH0B/CH0C/bfE0/bfF0 existieren auf Mac17,9 nicht.
          Key noch nicht identifiziert, deshalb smc-diff.sh für eine
          Differenzmessung ohne jeden Schreibzugriff.
B (Media): mediaremote-adapter läuft unter 26.6.1, aus dem Quellcode gebaut.
          Liefert vollständige Metadaten inkl. Cover aus Google Chrome — der
          Fall, den AppleScript nicht erreicht.
C (Audio): Process Tap + privates Aggregate-Device liefern echte Samples
          (469 Callbacks/5 s, 0 stille Puffer). Konflikt gefunden: SoundSource
          6.1.1 mit ARK.driver ist bereits installiert.
D (Group): App-Group-Container ist aus einem nicht-sandboxed Prozess erreichbar.
          Damit trägt die Sandbox-Entscheidung, die Bridge-App entfällt.

Spikes sind Wegwerfcode zur Verifikation, kein Produktionscode.
This commit is contained in:
Guido Schmit
2026-08-10 16:47:54 +02:00
commit 41ee3cc174
11 changed files with 1085 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
#!/bin/bash
# Spike B — mediaremote-adapter aus dem Quellcode bauen (ohne cmake)
#
# Repliziert das CMakeLists.txt des Projekts mit clang. Erzeugt das
# Framework-Bundle, das die Perl-Trampolin-Datei per DynaLoader lädt.
#
# Quelle: https://github.com/ungive/mediaremote-adapter (BSD-3-Clause)
set -euo pipefail
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
SRC="${SRC:-/tmp/mra}"
OUT="${OUT:-/tmp/mra-build}"
NAME=MediaRemoteAdapter
FW="$OUT/$NAME.framework"
[[ -d "$SRC" ]] || { echo "Quellen fehlen unter $SRC" >&2; exit 1; }
rm -rf "$OUT"
mkdir -p "$FW/Versions/A/Headers" "$FW/Versions/A/Resources"
SOURCES=(
"$SRC"/src/adapter/{env,get,globals,keys,now_playing,repeat,seek,send,shuffle,speed,stream,test}.m
"$SRC"/src/private/MediaRemote.m
"$SRC"/src/utility/{Debounce,helpers}.m
)
echo "→ Framework-Binary"
xcrun clang -dynamiclib -fobjc-arc -fvisibility=default -O2 \
-arch arm64 \
-I"$SRC/include" -I"$SRC/src" \
-framework Foundation -framework AppKit -framework UniformTypeIdentifiers \
-install_name "@rpath/$NAME.framework/Versions/A/$NAME" \
-o "$FW/Versions/A/$NAME" \
"${SOURCES[@]}"
cp "$SRC/include/$NAME.h" "$FW/Versions/A/Headers/"
cat > "$FW/Versions/A/Resources/Info.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key><string>$NAME</string>
<key>CFBundleIdentifier</key><string>com.vandenbe.$NAME</string>
<key>CFBundleName</key><string>$NAME</string>
<key>CFBundlePackageType</key><string>FMWK</string>
<key>CFBundleShortVersionString</key><string>0.1</string>
<key>CFBundleVersion</key><string>0.1.0</string>
</dict>
</plist>
PLIST
ln -sf A "$FW/Versions/Current"
ln -sf "Versions/Current/$NAME" "$FW/$NAME"
ln -sf Versions/Current/Headers "$FW/Headers"
ln -sf Versions/Current/Resources "$FW/Resources"
echo "→ Test-Client"
xcrun clang -fobjc-arc -O2 -arch arm64 \
-I"$SRC/src/test" \
-framework Foundation -framework MediaPlayer \
-o "$OUT/${NAME}TestClient" \
"$SRC"/src/test/{main,NowPlayingTest}.m
echo "→ ad-hoc signieren"
codesign --force --deep --sign - "$FW"
codesign --force --sign - "$OUT/${NAME}TestClient"
cp "$SRC/bin/mediaremote-adapter.pl" "$OUT/"
echo
echo "Fertig: $OUT"
ls -la "$OUT"