Sobre o projeto
Oto (v3) é uma biblioteca Go de baixo nível para reproduzir som. Ela foi projetada para ficar próxima ao hardware de áudio, deixando a decodificação e o tratamento de áudio de mais alto nível para quem a utiliza.
Plataformas
Oto oferece suporte a Windows, macOS, Linux, FreeBSD e OpenBSD sem exigir Cgo. Também lista Android, iOS, WebAssembly (sem necessidade de Cgo), Nintendo Switch e Xbox como alvos suportados. Em algumas plataformas, um compilador C/C++ deve estar disponível no path para o Go usar; alvos de console ainda podem precisar de uma toolchain C/C++ funcional.
Notas sobre plataformas
No macOS, AudioToolbox.framework é necessário, mas é vinculado automaticamente. No iOS, AVFoundation.framework e AudioToolbox.framework devem ser adicionados aos frameworks vinculados do projeto Xcode. No Linux e BSD, Oto usa PulseAudio por meio do pacote Go puro github.com/jfreymuth/pulse; se o servidor PulseAudio não for descoberto, a variável de ambiente PULSE_SERVER pode ser definida. Quando nenhum servidor PulseAudio está acessível, Oto recorre ao ALSA, que também não exige Cgo: libasound.so.2 é carregada dinamicamente em tempo de execução, então nenhum cabeçalho de desenvolvimento do ALSA é necessário para compilar, embora a biblioteca compartilhada precise estar presente em tempo de execução. No FreeBSD, compilar com CGO_ENABLED=0 também exige uma configuração específica de gcflags para o pacote purego fakecgo, enquanto compilações nativas com Cgo habilitado não precisam de nada extra.
Conceitos principais
Os dois componentes principais são Context e Player. Um Context lida com interações com o sistema operacional e os drivers de áudio, e só pode haver um contexto por programa. A partir de um contexto, você pode criar qualquer número de Players, cada um recebendo um io.Reader do qual lê bytes que representam som. Um único io.Reader não deve ser compartilhado por vários players.
Uso
A criação do Context usa oto.NewContextOptions com campos como SampleRate (comumente 44100 ou 48000), ChannelCount (1 para mono ou 2 para estéreo) e Format (por exemplo, oto.FormatSignedInt16LE). oto.NewContext retorna o contexto, um canal ready e um erro; quem chama aguarda no canal ready antes de usar e então verifica o erro do contexto. Players são criados com otoCtx.NewPlayer(reader), começam pausados, e Play() é assíncrono. IsPlaying() pode ser consultado em polling para aguardar a conclusão, e Seek() permite reposicionar dentro do som.
Sons podem ser reproduzidos a partir da memória lendo um arquivo para uma slice de bytes e envolvendo-a em um bytes.Reader, ou transmitidos passando um *os.File diretamente para um decodificador. Ao fazer streaming, o objeto de arquivo deve ser mantido vivo e não fechado até a reprodução terminar, caso contrário a reprodução pode produzir estática.
Uso avançado
Players mantêm um buffer interno de dados de áudio, então bytes lidos do io.Reader não são necessariamente já reproduzidos pelo dispositivo de áudio. Os dados passam do io.Reader para o buffer interno e então para o dispositivo de áudio, e o momento da segunda etapa não é garantido, então um pequeno atraso é possível. Player.BufferedSize() informa a quantidade de dados em buffer, e SetBufferSize() ajusta o tamanho do buffer subjacente. NewPlayer retorna um *oto.Player com métodos como SetBufferSize e Seek.
Compilação cruzada
A compilação cruzada para macOS, Windows, Linux ou BSD é feita definindo GOOS como darwin, windows, linux ou a variante BSD relevante. Para outras plataformas, bibliotecas da arquitetura alvo devem ser instaladas e CGO_ENABLED=1 deve ser definido, já que o Go desabilita Cgo em compilações cruzadas por padrão.
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.