Lumino
ln::AudioNode Class Referenceabstract

#include <AudioNode.hpp>

Inherits ln::Object.

Inherited by ln::AudioDestinationNode, ln::AudioGainNode, ln::AudioPannerNode, ln::AudioProcessorNode, and ln::AudioSourceNode.

Public Member Functions

void disconnect ()
 このノードをの全ての接続を解除します。
 

Detailed Description

Note
Audio graph の実装のフロントエンド。Graph の実態は Core と呼んでおり、別スレッドで実行される。 フロントエンドの実装の注意点として、状態変化は直接 Core に設定してはならない。 変更は必ず遅延設定で実装する。 変化は一度 AudioNode のフィールドに保持しておいて、AudioNode::commit() が呼ばれたときに、その内部から Core に変更を設定する。

AudioNode::commit() は Audio thread から呼び出される。 そのため AudioNode のフィールドを設定する、ユーザープログラムから呼ばれる setVolume() などの setter は、mutex を Write-lock する必要がある。 一方 AudioNode::commit() では Read-lock する。

× インスタンスの削除は常に Audio-thread 上から行われる。インスタンス作成と同時に AudioContext の管理下に入り強参照される。 → Binding で公開するクラスなので、別スレッドからの削除は非常に危険。 もともと Audio モジュールは Engine::update() 無しでも使いたいコンセプトだったけど、AudioGraph はかなり難しい。 「従来通り Sound クラスだけ使ってるなら Engine::update() は不要だけど、AudioGraph 使うなら必須だよ」 くらいの仕様にしたほうがよさそう。

[2020/7/6] AudioNode のライフサイクル

create() した後、AudioContext に追加するのはユーザープログラムの役目とする。 ちょうど、ノードエディタのキャンバス上に Node を置くイメージ。 なので、Context から Node を外すのもユーザープログラムの役目。 内部的に参照カウントを監視して自動開放したりはしない。 → 以前はそのような想定だったが、マルチスレッドの難易度が跳ね上がるのと、AudioNode を積極的にユーザープログラムで書くことは少ない (それよりも Sound クラスを使ってね) なスタイルなので、ちょっと凝ったことする人は気を付けてね、な方向にしてみる。 ↑ よく考えたらこれだけじゃだめ。Binding の件で、Object の派生は必ずメインスレッドで開放しなければならない。


The documentation for this class was generated from the following file: