wangzhibo
2026-10-08 220e4fab27b7f419b3e89e2f2d28ae789aac09d7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from pathlib import Path
 
ROOT = Path(__file__).resolve().parents[1]
 
 
def read_text(path: str) -> str:
    return (ROOT / path).read_text(encoding="utf-8")
 
 
def require(condition: bool, message: str) -> None:
    if not condition:
        raise SystemExit(message)
 
 
def main() -> None:
    app = read_text("main/application.cc")
    header = read_text("main/application.h")
    mqtt = read_text("main/boards/sening-xiaozhi-s3/mqtt.h")
 
    require(
        "void PauseSdCardMp3ForVoice();" in header,
        "Application must declare a helper for pausing SD card MP3 before voice interaction",
    )
    require(
        "void ResumeSdCardMp3AfterVoice();" in header,
        "Application must declare a helper for resuming SD card MP3 after voice interaction",
    )
    require(
        "bool resume_sdcard_mp3_after_voice_ = false;" in header,
        "Application must track SD card MP3 paused specifically for voice interaction",
    )
    require(
        "void Application::PauseSdCardMp3ForVoice()" in app,
        "Application must implement SD card MP3 pause before voice interaction",
    )
    require(
        "PauseSdCardMp3();\n        resume_sdcard_mp3_after_voice_ = true;" in app,
        "voice pause helper must remember that playback should resume later",
    )
    require(
        "void Application::ResumeSdCardMp3AfterVoice()" in app,
        "Application must implement SD card MP3 resume after voice interaction",
    )
    require(
        "ResumeSdCardMp3AfterVoice();\n            display->SetStatus(Lang::Strings::STANDBY);" in app,
        "idle state must resume SD card MP3 before returning to standby UI",
    )
    require(
        "PauseSdCardMp3ForVoice();\n            SetDeviceState(kDeviceStateConnecting);" in app,
        "manual listening must pause SD card MP3 before opening the voice channel",
    )
    require(
        "PauseSdCardMp3ForVoice();\n        audio_service_.EncodeWakeWord();" in app,
        "wake-word voice invoke must pause SD card MP3 before encoding/sending voice",
    )
    finish_tts = app.split("void Application::FinishTtsResponse()", 1)[1].split("void Application::ScheduleTtsAudio", 1)[0]
    require(
        "ResumeSdCardMp3AfterVoice();" in finish_tts,
        "TTS playback completion must resume SD card MP3 paused for voice before waiting for idle",
    )
    require(
        "sdcard_mp3_stop_requested_ = true;" in app and "BoardMqtt_StopPlaylistPlayback();" in app,
        "self.mp3.stop must terminate the MQTT playlist as well as the local MP3",
    )
    require(
        "sdcard_mp3_stop_requested_ = true;\n                        BoardMqtt_StopPlaylistPlayback();" in app,
        "self.mp3.stop must call the playlist stop API from the MCP handler",
    )
    require(
        "void BoardMqtt_StopPlaylistPlayback(void);" in mqtt,
        "MQTT header must expose a public playlist stop API",
    )
 
 
if __name__ == "__main__":
    main()