このプロジェクトについて

Oto(v3)は、音を再生するための低レベルGoライブラリです。オーディオハードウェアに近い位置に設計されており、デコードや高レベルのオーディオ処理は呼び出し側に委ねられます。 プラットフォーム Otoは、Cgoを必要とせずにWindows、macOS、Linux、FreeBSD、OpenBSDをサポートします。また、Android、iOS、WebAssembly(Cgo不要)、Nintendo Switch、Xboxもサポート対象として挙げています。一部のプラットフォームでは、Goが使用するためにC/C++コンパイラがパス上に必要です。コンソール向けターゲットでは、動作するC/C++ツールチェーンが依然として必要な場合があります。 プラットフォームごとの注意点 macOSではAudioToolbox.frameworkが必要ですが、自動的にリンクされます。iOSでは、AVFoundation.frameworkとAudioToolbox.frameworkをXcodeプロジェクトのリンク済みフレームワークに追加する必要があります。LinuxとBSDでは、Otoは純Goパッケージgithub.com/jfreymuth/pulseを通じてPulseAudioを使用します。PulseAudioサーバーが検出できない場合は、PULSE_SERVER環境変数を設定できます。到達可能なPulseAudioサーバーがない場合、OtoはALSAにフォールバックします。これもCgoを必要としません。libasound.so.2は実行時に動的にロードされるため、ビルドにALSA開発ヘッダーは不要ですが、実行時には共有ライブラリが存在している必要があります。FreeBSDでは、CGO_ENABLED=0でビルドする場合、puregoのfakecgoパッケージ用に特定のgcflags設定が追加で必要になります。一方、Cgoを有効にしたネイティブビルドでは追加の設定は不要です。 中核となる概念 主要なコンポーネントはContextとPlayerの2つです。ContextはOSおよびオーディオドライバーとのやり取りを処理し、プログラムごとに1つしか存在できません。Contextからは任意の数のPlayerを作成でき、各Playerには音を表すバイト列を読み取るio.Readerが渡されます。単一のio.Readerを複数のPlayerで共有してはいけません。 使用方法 Contextの作成にはoto.NewContextOptionsを使用し、SampleRate(一般に44100または48000)、ChannelCount(1はモノラル、2はステレオ)、Format(例えばoto.FormatSignedInt16LE)などのフィールドを指定します。oto.NewContextはContext、readyチャネル、エラーを返します。呼び出し側は使用前にreadyチャネルを待機し、その後Contextのエラーを確認します。PlayerはotoCtx.NewPlayer(reader)で作成され、一時停止状態で開始し、Play()は非同期です。IsPlaying()をポーリングして完了を待つことができ、Seek()で音声内の位置を変更できます。 音は、ファイルをバイトスライスに読み込んでbytes.Readerでラップすることでメモリから再生できます。また、*os.Fileを直接デコーダーに渡すことでストリーミングできます。ストリーミング時には、ファイルオブジェクトを生かしたままにし、再生が終了するまで閉じてはいけません。そうしないと、再生時にノイズが発生する可能性があります。 高度な使用方法 Playerは内部にオーディオデータバッファを保持しているため、io.Readerから読み取られたバイト列が、すでにオーディオデバイスで再生済みであるとは限りません。データはio.Readerから内部バッファへ、そしてオーディオデバイスへと移動し、2番目の段階のタイミングは保証されないため、多少の遅延が発生する可能性があります。Player.BufferedSize()はバッファリングされているデータ量を報告し、SetBufferSize()は基盤となるバッファサイズを調整します。NewPlayerはSetBufferSizeやSeekなどのメソッドを持つ*oto.Playerを返します。 クロスコンパイル macOS、Windows、Linux、BSDへのクロスコンパイルは、GOOSをdarwin、windows、linux、または該当するBSD系に設定することで行います。その他のプラットフォームでは、ターゲットアーキテクチャ用のライブラリをインストールし、CGO_ENABLED=1を設定する必要があります。Goはデフォルトでクロスコンパイル時にCgoを無効にするためです。