Full SwiftUI app at clients/apple/iOS/VoiceCatiOS.xcodeproj:
- 24 Swift source files: AppState + SessionState (@Observable @MainActor),
AudioSessionManager (AVAudioSession owner + interruption/route handling),
ServerListStore/SavedServer (App Group container + Keychain sharing),
and 14 SwiftUI views covering the full feature set
- NavigationSplitView on iPad, TabView on iPhone (horizontalSizeClass)
- Channel tree via OutlineGroup, user list with context menu admin actions
- PTT via DragGesture(minimumDistance: 0) + @GestureState
- onEvent closures hop to MainActor via Task { @MainActor in ... }
- App Group: group.cat.voice.VoiceCat (shared with future ReplayKit extension)
C ABI: add vc_audio_suspend / vc_audio_resume (AudioEngine::suspend/resume)
called by AudioSessionManager on AVAudioSession interruption events.
XCFramework: add ios-arm64 and ios-arm64-simulator slices to build-xcframework.sh;
Package.swift gains .iOS(.v17) platform; CMakePresets.json adds apple-ios /
apple-ios-sim presets with arm64-ios / arm64-ios-simulator vcpkg triplets.
Verified: xcodebuild -target VoiceCatiOS -sdk iphonesimulator26.5 BUILD SUCCEEDED.
61 lines
2.7 KiB
CMake
61 lines
2.7 KiB
CMake
cmake_minimum_required(VERSION 3.25)
|
|
|
|
project(voicecat
|
|
VERSION 0.0.1
|
|
DESCRIPTION "Self-hosted native voice & text chat (see docs/)"
|
|
LANGUAGES CXX)
|
|
|
|
# On iOS, audio_engine.cpp includes miniaudio.h which pulls in AVFoundation Objective-C
|
|
# headers. Those cannot be compiled as C++; we set audio_engine.cpp's LANGUAGE to OBJCXX
|
|
# in core/CMakeLists.txt, but that requires the language to be enabled first.
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
|
enable_language(OBJCXX)
|
|
endif()
|
|
|
|
# ── Options ───────────────────────────────────────────────────────────────────
|
|
# The M0 skeleton compiles with NO third-party dependencies: every subsystem is a
|
|
# stub that returns VC_ERR_NOT_IMPLEMENTED. As each subsystem is built out, flip
|
|
# VOICECAT_USE_VCPKG_DEPS=ON so CMake pulls the real libraries (mbedTLS, libsodium,
|
|
# opus, protobuf, ...) via the vcpkg toolchain (see vcpkg.json / docs/tech-stack.md).
|
|
option(VOICECAT_USE_VCPKG_DEPS "Link real third-party deps via vcpkg" OFF)
|
|
option(VOICECAT_BUILD_SERVER "Build voicecat-server" ON)
|
|
option(VOICECAT_BUILD_TOOLS "Build the vccli headless test client" ON)
|
|
option(VOICECAT_BUILD_TESTS "Build tests" ON)
|
|
option(VOICECAT_BUILD_SHARED "Build libvoicecat as a shared library" OFF)
|
|
|
|
# ── Global settings ───────────────────────────────────────────────────────────
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
|
|
endif()
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
|
|
# ── Targets ───────────────────────────────────────────────────────────────────
|
|
add_subdirectory(core)
|
|
|
|
if(VOICECAT_BUILD_SERVER)
|
|
add_subdirectory(server)
|
|
endif()
|
|
|
|
if(VOICECAT_BUILD_TOOLS)
|
|
add_subdirectory(tools/vccli)
|
|
if(VOICECAT_USE_VCPKG_DEPS)
|
|
add_subdirectory(tools/voicecat-admin)
|
|
endif()
|
|
endif()
|
|
|
|
if(VOICECAT_BUILD_TESTS)
|
|
enable_testing()
|
|
add_subdirectory(tests)
|
|
endif()
|
|
|
|
message(STATUS "VoiceCat ${PROJECT_VERSION} configured "
|
|
"(vcpkg deps: ${VOICECAT_USE_VCPKG_DEPS}, "
|
|
"server: ${VOICECAT_BUILD_SERVER}, tools: ${VOICECAT_BUILD_TOOLS})")
|