Oto : une bibliothèque Go de bas niveau pour jouer du son
Une bibliothèque de bas niveau pour lire du son sur plusieurs plates-formes. Linux, FreeBSD, OpenBSD Oto utilise PulseAudio sur les systèmes Linux et BSD via le package pure-Go github.com/jfreymuth/pulse, bien que les systèmes BSD ne soient pas bien testés.
En bref
- De quoi s’agit-il ?
- Le README de ebitengine/oto explique comment utiliser son Context et ses Player pour jouer de l'audio depuis la mémoire ou des fichiers en streaming sur de nombreuses plateformes.
- À qui s’adresse-t-il ?
- Le dépôt ne mentionne aucun benchmark, utilisateur en production ou garantie de sécurité ; le README se concentre sur l'API et les notes de construction spécifiques aux plateformes.
- Puis-je l’utiliser commercialement ?
- Oui. Apache-2.0 est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
- Est-il encore maintenu ?
- Oui. Les derniers commits datent d’il y a 3 jours.
- En quel langage est-il écrit ?
- Principalement Go, d’après les statistiques de langage de GitHub.
Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 14 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.
ANALYSE OPEN SOURCE APPROFONDIE
Une bibliothèque sonore de bas niveau
Oto est une bibliothèque Go pour jouer du son, décrite dans son dépôt comme de bas niveau. Le README présente deux composants principaux : un Context, qui gère les interactions avec le système d'exploitation et les pilotes audio, et des Player, qui lisent des octets depuis un io.Reader et les jouent. Un programme ne peut avoir qu'un seul contexte, mais à partir de ce contexte, vous pouvez créer un nombre quelconque de lecteurs. Un seul io.Reader ne doit pas être partagé entre plusieurs lecteurs. La bibliothèque fait partie du projet ebitengine, mais c'est un module autonome.
Plateformes et exigences Cgo
Le README liste les plateformes prises en charge : Windows, macOS, Linux, FreeBSD, OpenBSD, Android, iOS, WebAssembly, Nintendo Switch et Xbox. Pour Windows, macOS, Linux, FreeBSD, OpenBSD et WebAssembly, aucun Cgo n'est requis. Android, iOS et les cibles console n'ont pas cette déclaration ; le README dit plus tard que sur certaines plateformes, vous avez besoin d'un compilateur C/C++ que Go peut utiliser, et les cibles console peuvent encore avoir besoin d'une chaîne d'outils C/C++ fonctionnelle. Le README ne précise pas les exigences exactes du compilateur pour Android ou iOS.
Prérequis pour des plateformes spécifiques
macOS nécessite AudioToolbox.framework, mais le README dit qu'il est automatiquement lié. iOS nécessite AVFoundation.framework et AudioToolbox.framework, que vous ajoutez dans Xcode. Pour Linux, FreeBSD et OpenBSD, Oto utilise PulseAudio via le package pur Go github.com/jfreymuth/pulse, bien que les systèmes BSD ne soient pas bien testés. Si le serveur PulseAudio n'est pas découvrable, définissez PULSE_SERVER. Lorsqu'aucun serveur PulseAudio n'est joignable, Oto retombe sur ALSA, chargeant libasound.so.2 dynamiquement à l'exécution, donc aucun en-tête de développement n'est nécessaire, mais la bibliothèque partagée doit être présente. Sur FreeBSD, compiler avec CGO_ENABLED=0 nécessite un argument gcflags supplémentaire pour purego/fakecgo ; les builds FreeBSD natifs ne nécessitent rien de plus.
Jouer des sons depuis la mémoire
Le README fournit un exemple complet pour jouer un fichier MP3. Vous lisez le fichier en mémoire, l'enveloppez dans un bytes.Reader, le décodez avec github.com/hajimehoshi/go-mp3, puis créez un contexte avec des options : taux d'échantillonnage, nombre de canaux et format. Le taux d'échantillonnage est généralement 44100 ou 48000 ; le README avertit que d'autres valeurs peuvent provoquer des distorsions. Le nombre de canaux est 1 ou 2. Le format est signé 16 bits little-endian pour go-mp3. Après avoir créé le contexte, vous attendez sur le canal prêt, puis créez un lecteur, appelez Play, et interrogez IsPlaying jusqu'à ce que le son se termine. L'exemple montre aussi comment chercher avec io.Seeker.
Streaming depuis un fichier
Pour des sons plus longs, charger tout le fichier en mémoire peut être irréaliste. Le README montre que vous pouvez utiliser os.Open pour ouvrir le fichier et passer le descripteur de fichier directement au décodeur. Le fichier est décodé pendant la lecture, donc tout le fichier n'est pas conservé en mémoire. L'avertissement important est que l'objet fichier doit être maintenu en vie pendant la lecture ; le fermer trop tôt provoque du statique. Le README conseille de garder une référence à l'objet fichier, par exemple dans une structure.
Utilisation avancée : contrôle du tampon
Les lecteurs ont un tampon de données audio interne. Les données passent du io.Reader à ce tampon, puis au périphérique audio, mais le moment de la deuxième étape n'est pas garanti, donc il peut y avoir un petit délai. La quantité de données tamponnées peut être obtenue avec Player.BufferedSize(). Vous pouvez définir la taille du tampon en faisant une assertion de type sur le lecteur en oto.BufferSizeSetter et en appelant SetBufferSize. Le README note que les lecteurs implémentent à la fois les interfaces Player et BufferSizeSetter.
Crosscompilation et licence
La crosscompilation vers macOS, Windows, Linux ou BSD se fait en définissant GOOS en conséquence. Pour d'autres plateformes, vous devez installer les bibliothèques cibles et définir CGO_ENABLED=1, car Go désactive Cgo par défaut lors des crosscompilations. Le dépôt est sous licence Apache-2.0. La licence accorde des droits de copyright et de brevet, mais l'extrait fourni ne comprend pas de conditions de garantie ; le README ne discute pas non plus du support ou des garanties de sécurité.
Conclusion éditoriale
Le dépôt ne mentionne aucun benchmark, utilisateur en production ou garantie de sécurité ; le README se concentre sur l'API et les notes de construction spécifiques aux plateformes.
Notes de la communauté