ALSA:コントロール

開く時のモード開く時のモード
サウンドカード
snd_card_loadカードのドライバをロード
snd_card_nextサウンドカードのインデックスを列挙
snd_card_get_indexカードの文字列からインデックスを取得
snd_card_get_nameインデックスからカード名を取得
snd_card_get_longnameカードの長い名前を取得
サウンドカード操作
snd_ctl_openサウンドカードを開く
snd_ctl_open_lconfローカル設定を使用して CTL を開く
snd_ctl_open_fallbackフォールバック CTL を開く
snd_ctl_close閉じる
snd_ctl_nonblock非ブロックモードにセット
snd_ctl_name開いた時の名前を取得
snd_ctl_typeコントロールのタイプを取得
電源
snd_ctl_set_power_state電源状態をセット
snd_ctl_get_power_state実際の電源状態を取得
非同期
snd_async_add_ctl_handler非同期ハンドラを追加
snd_async_handler_get_ctl非同期ハンドラに関連付られた snd_ctl_t を返す
poll
snd_ctl_poll_descriptors_countpoll 記述子の数を取得
snd_ctl_poll_descriptorspoll 記述子を取得
snd_ctl_poll_descriptors_reventspoll 記述子で返されたイベントを取得
イベント
snd_ctl_subscribe_eventsイベントの通知を設定
snd_ctl_readイベントを読み込み
snd_ctl_waitイベントが来るまで待つ
snd_ctl_event_t
snd_ctl_event_sizeofsnd_ctl_event_t のサイズ取得
snd_ctl_event_mallocsnd_ctl_event_t を確保
snd_ctl_event_freesnd_ctl_event_t を解放
snd_ctl_event_clearクリア
snd_ctl_event_copy複製
snd_ctl_event_get_typeイベントタイプを取得
snd_ctl_event_type_nameイベントタイプの名前を取得
snd_ctl_event_elem_get_maskイベントのイベントマスクを取得
イベントの要素識別子の情報取得
snd_ctl_event_elem_get_numidイベントの要素の numid を取得
snd_ctl_event_elem_get_idイベントの要素の識別子を取得
snd_ctl_event_elem_get_interfaceイベントの要素のインターフェースを取得
snd_ctl_event_elem_get_deviceイベントの要素のデバイスを取得
snd_ctl_event_elem_get_subdeviceイベントの要素のサブデバイスを取得
snd_ctl_event_elem_get_nameイベントの要素の名前を取得
snd_ctl_event_elem_get_indexイベントの要素のインデックスを取得
PCM
snd_ctl_pcm_next_device次の PCM デバイス番号を取得
snd_ctl_pcm_prefer_subdevice優先するサブデバイス番号をセット
#define SND_CTL_NONBLOCK 0x0001
#define SND_CTL_ASYNC    0x0002
開く時のモード
SND_CTL_NONBLOCK
非ブロッキングモード
SND_CTL_ASYNC
非同期通知
サウンドカード
int snd_card_load(int card);
カードのドライバをロード
card
カードのインデックス番号
戻り値
ドライバが存在する場合は 1、ドライバが存在しない場合は 0
int snd_card_next(int *card);
物理サウンドカードを反復処理して列挙する。
※仮想サウンドカードでは機能しない。

たとえば、サウンドカードが2枚 (index: 0, 1) ある場合、card 引数の設定値と、戻った時の値は、次のようになる。
-1 -> 0 / 0 -> 1 / 1 -> -1
card
現在のインデックスを指定しておく。関数が戻ると、次のインデックスが返る。
-1 を設定した場合、最初のカードのインデックスが返る。
-1 が返った場合、終端。
戻り値
0 で成功、負の値でエラーコード
int snd_card_get_index(const char *name);
カードの文字列から、カードのインデックスを取得する。
物理サウンドカードでのみ機能し、仮想カードでは機能しない。
name
指定できる値は、以下の通り。

カードのインデックスを、文字列として指定。
カードの ID 文字列。
制御デバイス名 (/dev/snd/controlC0 など)。
戻り値
成功時、インデックス。負の値でエラーコード
int snd_card_get_name(int card, char **name);
インデックスからカード名を取得
card
カードのインデックス
name
strdup で複製された文字列のポインタが返る。使用後は解放すること。
戻り値
0 で成功、負の値でエラーコード
int snd_card_get_longname(int card, char **name);
カードの長い名前を取得
サウンドカード操作
int snd_ctl_open(snd_ctl_t **ctl, const char *name, int mode);
サウンドカードを開く
ctl
ハンドルが返る
name
カードの名前。
デフォルトのカードは "default"。
カードインデックスで指定する場合、"hw:<index>" または "hw:CARD=<ID>" で指定する。
mode
開くモード
戻り値
0 で成功、負の値でエラーコード
int snd_ctl_open_lconf(snd_ctl_t **ctl, const char *name, int mode, snd_config_t *lconf);
ローカル設定を使用して CTL を開く
name
ASCII 定義名
lconf
ローカル設定
int snd_ctl_open_fallback(snd_ctl_t **ctl, snd_config_t *root, const char *name, const char *orig_name, int mode);
フォールバック CTL を開く
root
設定のルート
name
ASCII 識別子
orig_name
オリジナル ASCII 名
int snd_ctl_close(snd_ctl_t *ctl);
指定された CTL ハンドルを閉じ、関連付けられているすべてのリソースを解放する。
int snd_ctl_nonblock(snd_ctl_t *ctl, int nonblock);
非ブロックモードにセット
nonblock
0 = block, 1 = nonblock mode, 2 = abort
戻り値
0 で成功、負の値でエラーコード
const char *snd_ctl_name(snd_ctl_t *ctl);
開いた時の名前を取得
戻り値
ASCII 文字列が返る。snd_ctl_open() で指定された識別子と同じ。
snd_ctl_type_t snd_ctl_type(snd_ctl_t *ctl);
コントロールのタイプを取得
戻り値
SND_CTL_TYPE_HWカーネルレベル CTL
SND_CTL_TYPE_SHM共有メモリクライアント CTL
SND_CTL_TYPE_INETINET クライアント CTL (まだ実装されていない)
SND_CTL_TYPE_EXT外部制御プラグイン
SND_CTL_TYPE_REMAP制御機能の再マッピング
電源
int snd_ctl_set_power_state(snd_ctl_t *ctl, unsigned int state);
電源状態を、指定された SND_CTL_POWER_* 値に設定し、電源管理を実行する。
state
SND_CTL_POWER_D0
SND_CTL_POWER_D1
SND_CTL_POWER_D2
SND_CTL_POWER_D3
SND_CTL_POWER_D3cold
SND_CTL_POWER_D3hot
戻り値
0 で成功、負の値でエラーコード
int snd_ctl_get_power_state(snd_ctl_t *ctl, unsigned int *state);
実際の電源状態を取得
戻り値
0 で成功、負の値でエラーコード
非同期
int snd_async_add_ctl_handler(snd_async_handler_t **handler, snd_ctl_t *ctl, snd_async_callback_t callback, void *private_data);

typedef void (*snd_async_callback_t)(snd_async_handler_t *handler);
非同期ハンドラを追加
handler
ハンドラが返る
private_data
コールバックに渡されるデータ
戻り値
0 で成功、負の値でエラーコード
snd_ctl_t *snd_async_handler_get_ctl(snd_async_handler_t *handler);
非同期ハンドラに関連付られた snd_ctl_t を返す
poll
int snd_ctl_poll_descriptors_count(snd_ctl_t *ctl);
イベントを待つのに必要な pollfd 構造体の数を返す。
int snd_ctl_poll_descriptors(snd_ctl_t *ctl, struct pollfd *pfds, unsigned int space);
pollfd に、イベントを待つのに必要な情報をセットする。
pfds
この配列にデータがセットされる
space
配列の数
戻り値
実際にセットされた数
int snd_ctl_poll_descriptors_revents(snd_ctl_t *ctl, struct pollfd *pfds, unsigned int nfds, unsigned short *revents);
pollfd のデータの中から、ALSA イベントの revents の値を返す (pollfd の revents の値)。
nfds
pfds 配列の数
revents
値が返る
戻り値
0 で成功、負の値でエラーコード
イベント
int snd_ctl_subscribe_events(snd_ctl_t *ctl, int subscribe);
イベントの通知を設定。
(poll、snd_async_add_ctl_handler、snd_ctl_read)
subscribe
0 = 登録解除, 1 = 登録, -1 = 登録されているか確認
戻り値
0 で成功、負の値でエラーコード
int snd_ctl_read(snd_ctl_t *ctl, snd_ctl_event_t *event);
イベントを読み込み
戻り値
読み込まれたイベントの数。負の値でエラーコード
int snd_ctl_wait(snd_ctl_t *ctl, int timeout);
少なくとも1つのイベントが保留中になるまで待つ。
timeout
待機する最大時間 (ミリ秒)
戻り値
0 で成功、負の値でエラーコード
snd_ctl_event_t
size_t snd_ctl_event_sizeof(void);
snd_ctl_event_t のサイズ取得
int snd_ctl_event_malloc(snd_ctl_event_t **ptr);
snd_ctl_event_t を確保
void snd_ctl_event_free(snd_ctl_event_t *obj);
snd_ctl_event_t を解放
void snd_ctl_event_clear(snd_ctl_event_t *obj);
クリア
void snd_ctl_event_copy(snd_ctl_event_t *dst, const snd_ctl_event_t *src);
複製
snd_ctl_event_type_t snd_ctl_event_get_type(const snd_ctl_event_t *obj);
イベントタイプを取得
戻り値
SND_CTL_EVENT_ELEM : 要素関連イベント
const char *snd_ctl_event_type_name(snd_ctl_event_type_t type);
イベントタイプの名前を取得
unsigned int snd_ctl_event_elem_get_mask(const snd_ctl_event_t *obj);
イベントのイベントマスクを取得
戻り値
イベントマスク。

SND_CTL_EVENT_MASK_REMOVE要素が削除された。
すべてのビットが ON のため、最初にこの値をチェックし、その後は他のマスクをチェックしないこと。
SND_CTL_EVENT_MASK_VALUE値の変更
SND_CTL_EVENT_MASK_INFO情報の変更
SND_CTL_EVENT_MASK_ADD要素の追加
SND_CTL_EVENT_MASK_TLVTLVの値が変更
イベントの要素識別子の情報取得
unsigned int snd_ctl_event_elem_get_numid(const snd_ctl_event_t *obj);
イベントの要素の numid を取得
void snd_ctl_event_elem_get_id(const snd_ctl_event_t *obj, snd_ctl_elem_id_t *ptr);
イベントの要素の識別子を取得
snd_ctl_elem_iface_t snd_ctl_event_elem_get_interface(const snd_ctl_event_t *obj);
イベントの要素のインターフェースを取得
unsigned int snd_ctl_event_elem_get_device(const snd_ctl_event_t *obj);
イベントの要素のデバイスを取得
unsigned int snd_ctl_event_elem_get_subdevice(const snd_ctl_event_t *obj);
イベントの要素のサブデバイスを取得
const char *snd_ctl_event_elem_get_name(const snd_ctl_event_t *obj);
イベントの要素の名前を取得
unsigned int snd_ctl_event_elem_get_index(const snd_ctl_event_t *obj);
イベントの要素のインデックスを取得
PCM
int snd_ctl_pcm_next_device(snd_ctl_t *ctl, int *device);
次の PCM デバイス番号を取得
device
現在のデバイス番号をセットする。次の番号が返る。
戻り値
0 で成功。負の値でエラーコード
int snd_ctl_pcm_prefer_subdevice(snd_ctl_t *ctl, int subdev);
優先するサブデバイス番号をセット
戻り値
0 で成功。負の値でエラーコード