PulseAudio:メインループ

poll のメインループ
pa_mainloop_newメインループを作成
pa_mainloop_freeメインループを解放
pa_mainloop_get_apiメインループの API を取得
pa_mainloop_get_retvalquit で指定された戻り値を取得
pa_mainloop_iterateループを1回実行する
pa_mainloop_prepareループの1回分を準備
pa_mainloop_pollイベントが来るまで待つ
pa_mainloop_dispatchイベントをディスパッチ
pa_mainloop_runメインループを繰り返す
pa_mainloop_quitメインループを終了
pa_mainloop_set_poll_func内部の poll 関数を変更
pa_mainloop_wakeuppoll を中断する
スレッドのメインループ
pa_threaded_mainloop_newメインループ作成
pa_threaded_mainloop_freeメインループ解放
pa_threaded_mainloop_get_apiAPI を取得
pa_threaded_mainloop_startイベントループスレッドを開始
pa_threaded_mainloop_stopイベントループスレッドを停止
pa_threaded_mainloop_set_nameスレッドの名前をセット
pa_threaded_mainloop_get_retvalquit の戻り値を返す
pa_threaded_mainloop_in_threadループ中のスレッドから呼び出されたか
pa_threaded_mainloop_lock
pa_threaded_mainloop_unlock
ロック/ロック解除
pa_threaded_mainloop_once_unlockedロック状態を維持せずにコールバックを実行
pa_threaded_mainloop_waitイベントループスレッド内でシグナルが送られるまで待つ
pa_threaded_mainloop_signalwait しているスレッドにシグナルを送る
pa_threaded_mainloop_acceptシグナルを受け入れる
UNIX シグナル
pa_signal_initメインループにバインド
pa_signal_doneシグナルサブシステムを終了
pa_signal_new新しいオブジェクトを作成
pa_signal_freeオブジェクトを削除
pa_signal_set_destroy破棄された時のコールバックをセット
poll のメインループ
pa_mainloop *pa_mainloop_new(void);
メインループを作成
void pa_mainloop_free(pa_mainloop *m);
メインループを解放
pa_mainloop_api *pa_mainloop_get_api(pa_mainloop *m);
メインループの API を取得。
返されたポインタは、解放する必要はない。
int pa_mainloop_get_retval(const pa_mainloop *m);
メインループの quit() で指定された戻り値を返す。
int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval);
メインループを1回分実行する。
pa_mainloop_prepare()、pa_mainloop_poll()、pa_mainloop_dispatch() を実行するのと同じ。
block
0 以外の場合、イベントが来るまでブロックする。
0 の場合は、prepare で timeout を 0 に、それ以外は -1 にする。
retval
NULL 以外で、quit で指定された戻り値が返る。
戻り値
成功時、ディスパッチされたソースの数。
エラー、または quit 要求が来た場合、負の値。
int pa_mainloop_prepare(pa_mainloop *m, int timeout);
メインループの1回分を準備する。
timeout
この後に行う poll の最大タイムアウト (ms)。-1 で無限。
戻り値
エラーまたは quit 要求で、負の値
int pa_mainloop_poll(pa_mainloop *m);
イベントが来るまで待つ
戻り値
エラー時は負の値
int pa_mainloop_dispatch(pa_mainloop *m);
以前に実行された poll で受け取ったイベントを、ディスパッチする。
クライアント側で、対応するコールバック関数を実行するなどの処理が行われる。
戻り値
成功時、ディスパッチされたソースの数。エラー時は負の値。
int pa_mainloop_run(pa_mainloop *m, int *retval);
pa_mainloop_quit() が呼び出されるまで、メインループを永遠に繰り返す。
retval
NULL 以外の場合、quit 時の戻り値が返る
戻り値
エラー時は負の値
void pa_mainloop_quit(pa_mainloop *m, int retval);
指定した戻り値で、メインループを終了させる。
void pa_mainloop_set_poll_func(pa_mainloop *m, pa_poll_func poll_func, void *userdata);

typedef int (*pa_poll_func)(struct pollfd *ufds, unsigned long nfds, int timeout, void *userdata);
内部の poll 関数を変更
void pa_mainloop_wakeup(pa_mainloop *m);
実行中の poll を中断する (スレッド内で実行されている場合)
スレッドのメインループ
pa_threaded_mainloop *pa_threaded_mainloop_new(void);
メインループ作成
void pa_threaded_mainloop_free(pa_threaded_mainloop *m);
メインループ解放
pa_mainloop_api *pa_threaded_mainloop_get_api(pa_threaded_mainloop *m);
API を取得
int pa_threaded_mainloop_start(pa_threaded_mainloop *m);
イベントループのスレッドを開始する。
新しいスレッドが作成され、その中でイベントが処理される。
戻り値
成功すると 0、エラーで負の値
void pa_threaded_mainloop_stop(pa_threaded_mainloop *m);
イベントループスレッドを正常に終了させる。
※この関数を呼び出す前に、ロックを解除しておくこと。
void pa_threaded_mainloop_set_name(pa_threaded_mainloop *m, const char *name);
スレッドの名前をセット
int pa_threaded_mainloop_get_retval(const pa_threaded_mainloop *m);
メインループの pa_mainloop_quit() 時に指定された戻り値を返す。
int pa_threaded_mainloop_in_thread(pa_threaded_mainloop *m);
コールバック関数の実行中など、イベントループスレッド内から呼び出された場合は、0 以外を返す。
void pa_threaded_mainloop_lock(pa_threaded_mainloop *m);
void pa_threaded_mainloop_unlock(pa_threaded_mainloop *m);
イベントループをロックして、スレッドがイベントを処理するのをブロックする。
このロックは再帰的である。

※この関数は、イベントループスレッド内から呼び出すことはできない。
イベントループスレッドから実行されたコールバック関数は、このロックを保持したまま実行される。
void pa_threaded_mainloop_once_unlocked(pa_threaded_mainloop *m,
    void (*)(pa_threaded_mainloop *m, void *userdata)callback, void *userdata);
//ver 13.0
ロック状態を維持せずに、メインループスレッド内で、指定されたコールバックを実行する。

PulseAudio のデータ構造体が、スレッドセーフな方法でのみアクセスされるようにすること。
(pa_context と pa_stream による関数は、スレッドセーフではないので、何らかの同期なしにアクセスするべきではない)

これは、メインループスレッドのコンテキストで、pa_threaded_mainloop_lock() および pa_threaded_mainloop_unlock() を使用できる唯一の状況。
void pa_threaded_mainloop_wait(pa_threaded_mainloop *m);
イベントループスレッド内で、pa_threaded_mainloop_signal() によってシグナルが送られるまで待つ。

この関数は、イベントループスレッド内で呼び出すことはできない。
この呼び出しの前に、pa_threaded_mainloop_lock() を使用して、ロックする必要がある。
待っている間はロックが解除され、戻る直前に再度ロックされる。

この関数は、pa_threaded_mainloop_signal() の呼び出し以外でも終了する可能性があるため、正しく戻ってきたかどうかを判定する必要がある。
void pa_threaded_mainloop_signal(pa_threaded_mainloop *m, int wait_for_accept);
pa_threaded_mainloop_wait() でイベントを待機しているすべてのスレッドに、シグナルを送る。
これにより、wait を抜けさせることができる。
wait_for_accept
0 以外の場合、pa_threaded_mainloop_accept() と同時に使用する。
この関数の後、wait から戻ってから accept を実行するまでの間、オブジェクトはロック解除される。
void pa_threaded_mainloop_accept(pa_threaded_mainloop *m);
この関数は、pa_threaded_mainloop_signal() で wait_for_accept を 0 以外にして呼び出した場合のみ使用する。
pa_threaded_mainloop_signal() によって wait から抜けた後に実行し、イベントスレッドからのシグナルを受け入れる。

コールバック関数に渡された引数などのデータを、wait から戻ったスレッド側で使いたい場合に使用する。
UNIX シグナル
int pa_signal_init(pa_mainloop_api *api);
UNIX シグナルサブシステムを初期化し、指定されたメインループにバインドする。
void pa_signal_done(void);
シグナルサブシステムを終了
pa_signal_event *pa_signal_new(int sig, pa_signal_cb_t callback, void *userdata);

typedef void (*pa_signal_cb_t)(pa_mainloop_api *api, pa_signal_event *e, int sig, void *userdata);
新しい UNIX シグナルイベントソースオブジェクトを作成する。
sig
シグナル
callback
シグナルが発生した時のコールバック関数
void pa_signal_free(pa_signal_event *e);
オブジェクトを削除
void pa_signal_set_destroy(pa_signal_event *e, pa_signal_destroy_cb_t callback);

typedef void (*pa_signal_destroy_cb_t)(pa_mainloop_api *api, pa_signal_event *e, void *userdata);
シグナルイベントソースが破棄されたときに呼び出される関数を設定する。
必要に応じて、これを使用して、userdata を解放する。