==========================================
Windows 版HARK音響ライブラリが提供する API
==========================================

Windows 版HARK音響ライブラリが提供する API は以下の通りである。


ミドルウェア部のクラス
----------------------

.. cpp:class:: NetworkDef

    ネットワークの構成を定義するためのクラス。

    .. cpp:function:: void build(Network network, DataSourceMap input, DataSinkMap output)

    ネットワークの構成を定義するためにHARK音響ライブラリから呼ばれるメソッド。
    ユーザは、このメソッドを override して、ネットワークを構成する処理を記述する。

    ユーザは、ネットワークが引数 :cpp:expr:`network` に渡されていて、その入力が :cpp:expr:`input` に、また出力が :cpp:expr:`output` に渡されているものとして、処理フローを実装により定義する。

    以下は、AUDIO_INPUT という名前のネットワーク入力から得たデータについて、FFT 処理を行って結果を SPEC_OUTPUT という名前の出力に吐き出すネットワーク定義の例である。

    .. code-block:: csharp

        class FFTNetwork : NetworkDef
        {
            public override void build(Network network, DataSourceMap input, DataSinkMap output)
            {
                var node_multi_fft = network.create<MultiFFT>("MultiFFT");

                node_multi_fft
                    .add_input("INPUT", input["AUDIO_INPUT"]);

                output
                    .add_input("SPEC_OUTPUT", node_multi_fft["OUTPUT"]);
            }
        }

.. cpp:class:: Network

    ネットワークの実体を管理するためのクラス。

    .. cpp:function:: template<typename NETWORKDEF> \
                      static Network create<NETWORKDEF>(String name)

        ネットワーク定義 :cpp:expr:`NETWORKDEF` のネットワークを構築して返す。

    .. cpp:function:: template<typename NETWORKDEF> Network create<NETWORKDEF>()

        自ネットワーク内にネットワーク定義 :cpp:expr:`NETWORKDEF` のネットワークを構築して返す。

    .. cpp:function:: template<typename NETWORKDEF, typename DISPATCH> Network create<NETWORKDEF, DISPATCH>()

        自ネットワーク内にネットワーク定義 :cpp:expr:`NETWORKDEF` のネットワークを構築して返す。
        構築したネットワークを制御するディスパッチャとして :cpp:expr:`DISPATCH` 型を用いる。

    .. cpp:function:: template<typename NETWORKDEF> Network create<NETWORKDEF>(String name)

        自ネットワーク内にネットワーク定義 :cpp:expr:`NETWORKDEF` のネットワークを構築して返す。
        構築するネットワークの名前を :cpp:expr:`name` とする。

    .. cpp:function:: template<typename NETWORKDEF, typename DISPATCH> Network create<NETWORKDEF, DISPATCH>(String name)

        自ネットワーク内にネットワーク定義 :cpp:expr:`NETWORKDEF` のネットワークを構築して返す。
        構築するネットワークの名前を :cpp:expr:`name` とする。
        構築したネットワークを制御するディスパッチャとして :cpp:expr:`DISPATCH` 型を用いる。

    .. cpp:function:: template<typename NODEDEF> Node create<NODEDEF>()

        自ネットワーク内にノード定義 :cpp:expr:`NODEDEF` のノードを構築して返す。

    .. cpp:function:: template<typename NODEDEF, typename DISPATCH> Node create<NODEDEF, DISPATCH>()

        自ネットワーク内にノード定義 :cpp:expr:`NODEDEF` のノードを構築して返す。
        構築したノードを制御するディスパッチャとして :cpp:expr:`DISPATCH` 型を用いる。

    .. cpp:function:: template<typename NODEDEF> Node create<NODEDEF>(String name)

        自ネットワーク内にノード定義 :cpp:expr:`NODEDEF` のノードを構築して返す。
        構築するノードの名前を :cpp:expr:`name` とする。

    .. cpp:function:: template<typename NODEDEF, typename DISPATCH> Node create<NODEDEF, DISPATCH>(String name)

        自ネットワーク内にノード定義 :cpp:expr:`NODEDEF` のノードを構築して返す。
        構築するノードの名前を :cpp:expr:`name` とする。
        構築したノードを制御するディスパッチャとして :cpp:expr:`DISPATCH` 型を用いる。

    .. cpp:function:: NodeDef query_nodedef(String name)

        自ネットワーク内から名前が :cpp:expr:`name` であるノードを検索し、見つかったノードの定義を返す。
        該当するノードが見つからない場合は :cpp:expr:`null` を返す。

    .. cpp:function:: Network add_input(String name, DataSource source)

        ネットワークに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは :cpp:expr:`source` から得られるデータである。

    .. cpp:function:: Network add_input(String name, String value)

        ネットワークに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは固定値 :cpp:expr:`value` である。

    .. cpp:function:: Network add_input(String name, int value)

        ネットワークに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは固定値 :cpp:expr:`value` である。

    .. cpp:function:: Network add_input(String name, double value)

        ネットワークに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは固定値 :cpp:expr:`value` である。

    .. cpp:function:: Network add_input(String name, bool value)

        ネットワークに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは固定値 :cpp:expr:`value` である。

    .. cpp:function:: DataSource this[String] { get; }

        ネットワークからの出力のうち、指定した名前のものを返す。
        名前は :cpp:expr:`name` で指定する。該当する名前の出力が存在しない場合、例外を throw する。

    .. cpp:function:: void execute()

        ネットワークの処理を開始する。
        処理が完了するまで、制御を返さない。

    .. cpp:function:: void stop()

        ネットワークの処理を終了するよう要求する。
        処理が完了するのを待たずに、制御を返す。

.. cpp:class:: Node

    ノードの実体を管理するためのクラス。

    .. cpp:function:: Node add_input(String name, DataSource source)

        ノードに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは :cpp:expr:`source` から得られるデータである。

    .. cpp:function:: Node add_input(String name, String value)

        ノードに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは固定値 :cpp:expr:`value` である。

    .. cpp:function:: Node add_input(String name, int value)

        ノードに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは固定値 :cpp:expr:`value` である。

    .. cpp:function:: Node add_input(String name, double value)

        ノードに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは固定値 :cpp:expr:`value` である。

    .. cpp:function:: Node add_input(String name, bool value)

        ノードに入力を追加する。
        追加する入力の名前は :cpp:expr:`name` であり、入力されるデータは固定値 :cpp:expr:`value` である。

    .. cpp:function:: DataSource this[String] { get; }

        ノードからの出力のうち、指定した名前のものを返す。
        名前は :cpp:expr:`name` で指定する。該当する名前の出力が存在しない場合、例外を throw する。

.. cpp:class:: PublishData

  HARK音響ライブラリ外部から、HARK音響ライブラリにデータを流し込む目的で用いるノード定義。

    .. cpp:function:: void push(short[] sdata)

        引数 :cpp:expr:`sdata` に与えた :cpp:expr:`short` 型の配列を、HARK音響ライブラリに流し込む。

.. cpp:class:: SubscribeData

  HARK音響ライブラリから、HARK音響ライブラリ外部にデータを返す目的で用いるノード定義。

  .. cpp:member:: SubscribeDataDelegate Received

    HARK音響ライブラリからデータが得られた際に発行されるイベント。

.. cpp:class:: SubscribeDataEventArgs

    SubscribeData において、Received イベントが発行された際に、引数として渡されるイベントデータ。

    .. cpp:member:: object ReceivedData

      HARK音響ライブラリから受け取ったデータ。

.. cpp:class:: DataSource

    データの取得元を管理するクラス。
    
    ノードにその外部（他のノード、あるいはネットワーク）からアクセスする場合、ノードから出力される端子が DataSource に相当する。
    ノードにその内部からアクセスする場合、すなわちノードの処理を実装する場合、ノードに入力される端子が DataSource に相当する。

.. image:: datasource-sink.png
    :width: 640px

.. cpp:class:: DataSink

    データの出力先を管理するクラス。

    ノードにその外部（他のノード、あるいはネットワーク）からアクセスする場合、ノードに入力する端子が DataSink に相当する。
    ノードにその内部からアクセスする場合、すなわちノードの処理を実装する場合、ノードから出力される端子が DataSink に相当する。

.. cpp:class:: DataSourceMap

    データの取得元の集合を管理するクラス。
    通常、ノードやネットワークについて、以下の場合に用いられる。
    * ノード・ネットワーク外から、その出力を参照する
    * ノード・ネットワーク内から、その入力を参照する

    .. cpp:function:: DataSource this[String] { get; }

        データの取得元のうち、指定した名前のものを返す。
        名前は :cpp:expr:`name` で指定する。該当する名前の出力が存在しない場合、例外を throw する。

.. cpp:class:: DataSinkMap

    データの出力先の集合を管理するクラス。
    通常、ノードやネットワークについて、以下の場合に用いられる。
    * ノード・ネットワーク外から、その入力を参照する
    * ノード・ネットワーク内から、その出力を参照する

    .. cpp:function:: Node add_input(String name, DataSource source)

        データの出力先のうち、指定した名前のものを返す。
        名前は :cpp:expr:`name` で指定する。該当する名前の出力が存在しない場合、例外を throw する。
