À propos du projet
Oto (v3) est une bibliothèque Go de bas niveau pour lire du son. Elle est conçue pour rester proche du matériel audio, laissant le décodage et la gestion audio de plus haut niveau à l'appelant.
Plateformes
Oto prend en charge Windows, macOS, Linux, FreeBSD et OpenBSD sans nécessiter Cgo. Elle liste également Android, iOS, WebAssembly (sans Cgo requis), Nintendo Switch et Xbox comme cibles prises en charge. Sur certaines plateformes, un compilateur C/C++ doit être disponible dans le PATH pour que Go puisse l'utiliser ; les cibles consoles peuvent encore nécessiter une chaîne d'outils C/C++ fonctionnelle.
Notes sur les plateformes
Sur macOS, AudioToolbox.framework est requis mais lié automatiquement. Sur iOS, AVFoundation.framework et AudioToolbox.framework doivent être ajoutés aux frameworks liés du projet Xcode. Sur Linux et BSD, Oto utilise PulseAudio via le paquet pure-Go github.com/jfreymuth/pulse ; si le serveur PulseAudio n'est pas détectable, la variable d'environnement PULSE_SERVER peut être définie. Lorsqu'aucun serveur PulseAudio n'est joignable, Oto se rabat sur ALSA, qui ne nécessite pas non plus Cgo : libasound.so.2 est chargée dynamiquement à l'exécution, donc aucun en-tête de développement ALSA n'est nécessaire pour compiler, bien que la bibliothèque partagée doive être présente à l'exécution. Sur FreeBSD, compiler avec CGO_ENABLED=0 nécessite en plus un réglage gcflags spécifique pour le paquet purego fakecgo, tandis que les compilations natives avec Cgo activé ne nécessitent rien de plus.
Concepts de base
Les deux composants principaux sont Context et Player. Un Context gère les interactions avec l'OS et les pilotes audio, et il ne peut y avoir qu'un seul contexte par programme. À partir d'un contexte, vous pouvez créer autant de Players que souhaité, chacun recevant un io.Reader depuis lequel il lit des octets représentant du son. Un même io.Reader ne doit pas être partagé par plusieurs players.
Utilisation
La création du Context utilise oto.NewContextOptions avec des champs tels que SampleRate (couramment 44100 ou 48000), ChannelCount (1 pour mono ou 2 pour stéréo) et Format (par exemple oto.FormatSignedInt16LE). oto.NewContext renvoie le contexte, un canal ready et une erreur ; l'appelant attend sur le canal ready avant utilisation puis vérifie l'erreur du contexte. Les Players sont créés avec otoCtx.NewPlayer(reader), démarrent en pause, et Play() est asynchrone. IsPlaying() peut être interrogé pour attendre la fin, et Seek() permet de se repositionner dans le son.
Les sons peuvent être lus depuis la mémoire en lisant un fichier dans une tranche d'octets et en l'enveloppant dans un bytes.Reader, ou diffusés en passant directement un *os.File à un décodeur. En streaming, l'objet fichier doit être maintenu en vie et non fermé avant la fin de la lecture, sinon la lecture peut produire des parasites.
Utilisation avancée
Les Players maintiennent un tampon interne de données audio, donc les octets lus depuis l'io.Reader ne sont pas nécessairement déjà joués par le périphérique audio. Les données passent de l'io.Reader au tampon interne puis au périphérique audio, et le timing de la seconde étape n'est pas garanti, donc un petit délai est possible. Player.BufferedSize() indique la quantité de données mises en tampon, et SetBufferSize() ajuste la taille du tampon sous-jacent. NewPlayer renvoie un *oto.Player avec des méthodes telles que SetBufferSize et Seek.
Compilation croisée
La compilation croisée vers macOS, Windows, Linux ou BSD se fait en définissant GOOS sur darwin, windows, linux ou la variante BSD concernée. Pour les autres plateformes, les bibliothèques de l'architecture cible doivent être installées et CGO_ENABLED=1 doit être défini, car Go désactive Cgo par défaut lors des compilations croisées.
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.