Aller au contenu

Artemis-N3DS : Le streaming sur un client à deux écrans

Artemis-N3DS adapte Moonlight Embedded à la famille Nintendo 3DS. Le projet réunit découverte et jumelage de l’hôte, interface console, commandes et affichage vidéo. Le parcours matériel de la New 3DS demande une attention particulière.

Matériel et infographie Fork Docker
  • Mis à jour
  • C++ · 76.05%
  • GPL-3.0
Crédit amont
Langages du dépôtC++ 76.05%6

Parts calculées à partir des octets GitHub Linguist.

Langage%Octets
C++76.05%385 430
C15.71%79 616
CMake4.36%22 072
Makefile2.84%14 414
Shell0.64%3 221
Dockerfile0.4%2 051

GitHub · README · Statistiques de langages

Aperçu

Pourquoi il existe

Défi d'ingénierie sous fortes contraintes : streaming 60 FPS sur architecture ARM11 double écran.

Cas d’usage

Accès distant et jeu PC sur matériel New 3DS.

Démarrage

Ces commandes viennent de la documentation du dépôt. Elles n’ont pas été exécutées pendant cette revue.

README.md · Local (devkitPro)
make
README.md · Docker (easiest)
docker build --network=host -t moonlight-n3ds .
docker run --rm -it -v .:/moonlight-N3DS -w /moonlight-N3DS moonlight-n3ds:latest
make

Références du dépôt

Extraits des guides du dépôt, dans leur langue d’origine. Les liens ouvrent la version du code consultée.

Prérequis et premier essai

Requirements

README.md

  • New 3DS / New 3DS XL / New 2DS XL recommended (hardware H.264 decode)
  • Original 3DS / 2DS works with software decode only — expect lower FPS
  • PC running Sunshine (or compatible GameStream host) on the same network
  • CFW + FBI for CIA install
Lire les instructions complètes ↗

Install

README.md

Full FBI steps: dist/INSTALL.md. CIA (HOME Menu): copy dist/artemis.cia to the SD card → open FBI → Install and delete CIA. 3DSX: copy dist/artemis.3dsx to sd:/3ds/artemis/artemis.3dsx and launch from the Homebrew Launcher.
Lire les instructions complètes ↗
Configuration et utilisation

Configuration

README.md

Settings can be changed in-app or in: That path is legacy (kept so existing pairing and configs keep working). See dist/SD-DATA.md for the full SD layout (keys, paired hosts, diagnostics). Default settings are aimed at New 3DS.
Lire les instructions complètes ↗
Développement et contributions

Contribute

README.md

  1. Fork the repo
  2. Make your changes
  3. Open a pull request
Lire les instructions complètes ↗
Documentation source

2 documents lus parmi 2 candidats.

Fonctions et composants 2

Gestion de la session
n3ds_main.cpp réunit découverte, jumelage, profils et état de connexion. L’hôte et l’application sélectionnés déterminent la demande de streaming. Le cycle de vie graphique est suivi séparément de la configuration du flux.
Médias et interaction
L’audio, les commandes et la vidéo ont leurs modules dans src. Les capacités matérielles influencent les indications affichées. L’interface peut reprendre après un flux, tandis qu’une fermeture système explicite doit terminer l’application.

Architecture

Les composants et leurs liens restent lisibles en texte. Le diagramme ajoute une vue interactive.

Contexte système Contexte
  1. Découverte et jumelage
  2. Application et profil
  3. Connexion GameStream
  4. Moteurs vidéo et audio
  5. Écrans et commandes 3DS

Liens vérifiés dans le dépôt.

Mermaid Diagramme interactif (chargement à l’ouverture)

Vue générale des composants et des échanges vérifiés dans le dépôt.

Vue statique de l’architecture de Artemis-N3DS
Aperçu statique. Le diagramme interactif le remplace après le chargement de Mermaid.
flowchart LR

subgraph group_host["Hosts and pairing"]
  node_discovery["Host discovery<br/>[host_discovery.cpp]"]
  node_pairing[("Pair records<br/>[pair_record.cpp]")]
  node_gamestream["GameStream client<br/>[client.c]"]
  node_xml["Protocol XML<br/>[xml.c]"]
end

subgraph group_session["Session coordination"]
  node_main["Application flow<br/>[n3ds_main.cpp]"]
  node_ui["Console menus<br/>[n3ds_ui.cpp]"]
  node_connection["Stream connection"]
  node_dispatcher["Message dispatcher<br/>[dispatcher.cpp]"]
end

subgraph group_stream["Stream pipeline"]
  node_presentation["Presentation state"]
  node_decoder["Video decoders"]
  node_mvd["Hardware decode<br/>[n3ds_video_mvd.cpp]"]
  node_software["Software decode"]
  node_renderer["Screen renderers"]
  node_graphics["Graphics lifecycle"]
  node_audio["Audio output<br/>[n3ds_audio.cpp]"]
end

subgraph group_interaction["Input and helpers"]
  node_input["Console input<br/>[n3ds_input.cpp]"]
  node_touch["Touch handlers<br/>[TouchHandler.hpp]"]
  node_menuhub["In-stream helper hub"]
  node_bottomui["Bottom-screen UI"]
end

subgraph group_state["Settings and telemetry"]
  node_config[("Configuration<br/>[config.cpp]")]
  node_appcache[("App list cache<br/>[app_list_cache.cpp]")]
  node_profiles["Stream profiles<br/>[stream_profile.cpp]"]
  node_telemetry[("Stream telemetry")]
  node_benchmark["Performance metrics"]
end

node_user(("3DS user"))

node_user -->|"uses"| node_main
node_main -->|"finds hosts"| node_discovery
node_main -->|"pairs host"| node_pairing
node_main -.->|"manages host"| node_gamestream
node_gamestream -->|"parses responses"| node_xml
node_discovery -->|"uses records"| node_pairing
node_main -->|"shows menus"| node_ui
node_main -->|"lists apps"| node_appcache
node_main -->|"starts session"| node_connection
node_main -->|"loads settings"| node_config
node_main -->|"selects profile"| node_profiles
node_main -->|"handles controls"| node_input
node_input -->|"posts events"| node_dispatcher
node_input -->|"owns handlers"| node_touch
node_main -->|"dispatches events"| node_dispatcher
node_user -->|"opens helpers"| node_menuhub
node_menuhub -->|"posts actions"| node_dispatcher
node_menuhub -.->|"draws interface"| node_bottomui
node_user -->|"chooses stream"| node_connection
node_connection -.->|"receives video"| node_decoder
node_decoder -.->|"hardware path"| node_mvd
node_decoder -.->|"software path"| node_software
node_decoder -->|"renders frames"| node_renderer
node_renderer -->|"uses layout state"| node_presentation
node_renderer -->|"uses graphics lifecycle"| node_graphics
node_connection -.->|"streams audio"| node_audio
node_user -->|"views or saves metrics"| node_telemetry
node_user -->|"views performance"| node_benchmark
node_main -->|"uses telemetry store"| node_telemetry


class node_discovery,node_pairing,node_gamestream,node_xml,node_user toneBlue
class node_main,node_ui,node_connection,node_dispatcher toneAmber
class node_presentation,node_decoder,node_mvd,node_software,node_renderer,node_graphics,node_audio toneMint
class node_input,node_touch,node_menuhub,node_bottomui toneRose
class node_config,node_appcache,node_profiles,node_telemetry,node_benchmark toneIndigo

Un client GameStream pour Nintendo 3DS. Les utilisateurs découvrent ou ajoutent un hôte compatible Sunshine, associent la console, choisissent une application et lancent la diffusion par les sous-systèmes de session, vidéo, rendu, entrées et écran inférieur.

Composants
25
Connexions
29
Liens appuyés par le code ou le README
23/29
Version texte du diagramme
  • Découverte et jumelage → Application et profil
  • Application et profil → Connexion GameStream
  • Connexion GameStream → Moteurs vidéo et audio
  • Moteurs vidéo et audio → Écrans et commandes 3DS
  • Écrans et commandes 3DS → Connexion GameStream
Suivre un parcours dans le code

Suivez SelectedHost et le profil avant d’entrer dans le traitement des médias. Une fermeture système et un retour normal au menu sont deux transitions distinctes; un indicateur explicite évite de les confondre.

Déploiement et exploitation

Les ports, le stockage et les relations de démarrage ci-dessous viennent de la configuration du dépôt. depends_on indique l’ordre de démarrage, pas la disponibilité du service.

Types et structure des fichiers

77 types déclarés, dont 12 dans l’aperçu des relations de base.

Diagramme des types
classDiagram
direction TB
class tc0387bd4c68b["SelectedHost"] {
  <<struct>>
}
class t72fa5c6e15be["RemoteApp"] {
  <<struct>>
}
class tf7c6d6aec7da["InputLoopContext"] {
  <<struct>>
}
class ta7f589e4be09["VideoDecoderBase"] {
  accept()
  _accept_touch_state_changed()
  _accept_keyboard_state_changed()
}
class tb2f58dc75feb["MockVideoDecoder"] {
}
class t391f53097446["SoftVideoDecoder"] {
  submit_decode_unit()
  _write_yuv_to_framebuffer()
}
class t4ad2ea8a811e["MvdDecoder"] {
  submit_decode_unit()
  _decode()
}
class t891d7e467987["_SERVER_DATA"] {
  <<struct>>
}
class ta59617f1a5fa["cb_ctx"] {
  <<struct>>
}
class tcb0c88684e67["_HTTP_DATA"] {
  <<struct>>
}
class taa2e3cf225d0["_CERT_KEY_PAIR"] {
  <<struct>>
}
class t91f7677e0266["xml_query"] {
  <<struct>>
}
class b34b203f09b57["ISubscriber"] {
  <<unresolved_base>>
}
b34b203f09b57 <|-- ta7f589e4be09
ta7f589e4be09 <|-- tb2f58dc75feb
ta7f589e4be09 <|-- t391f53097446
ta7f589e4be09 <|-- t4ad2ea8a811e

Les bases non résolues restent identifiées; les signatures complètes ne sont pas reconstruites.

Index des types

Référence

101 / 101 fichiers admissibles lus (174 dans l’arbre); 0 trop volumineux, 0 échec de lecture et 6 diagnostic de syntaxe.

Ce que couvre l’analyse

Les dossiers connus de dépendances et de compilation, les fichiers d’identifiants et les binaires sont exclus. La collecte couvre les README, les manifestes reconnus et les fichiers source pris en charge.

Les statistiques Linguist couvrent l’ensemble du dépôt et peuvent inclure d’autres langages.

Carte des fichiers
flowchart TD
  root["Artemis-N3DS"]
  f0["src/hardware_capabilities.cpp"]
  root --> f0
  f1["src/n3ds_main.cpp"]
  root --> f1
  f2["src/video/video.hpp"]
  root --> f2
  f3["CMakeLists.txt"]
  root --> f3
  f4["Makefile"]
  root --> f4
  f5["README.md"]
  root --> f5
  f6["3ds/build-expat.sh"]
  root --> f6
  f7["3ds/build-ffmpeg.sh"]
  root --> f7
  f8["3ds/build-openssl.sh"]
  root --> f8
  f9["libgamestream/CMakeLists.txt"]
  root --> f9
  f10["libgamestream/client.c"]
  root --> f10
  f11["libgamestream/client.h"]
  root --> f11
  f12["libgamestream/discover.c"]
  root --> f12
  f13["libgamestream/discover.h"]
  root --> f13
  f14["libgamestream/errors.h"]
  root --> f14
  f15["libgamestream/http.c"]
  root --> f15

Fichiers à lire 3

Références