ALSA:ハードウェア構成

snd_pcm_hw_params_anyPCM で利用可能なパラメータがセットされる
snd_pcm_hw_paramsハードウェア構成をインストール
snd_pcm_hw_freeハードウェア構成を解放
snd_pcm_hw_params_current現在の PCM ハードウェア構成を取得
操作
snd_pcm_hw_params_sizeofsnd_pcm_hw_params_t のサイズを取得
snd_pcm_hw_params_mallocsnd_pcm_hw_params_t 確保
snd_pcm_hw_params_freesnd_pcm_hw_params_t 解放
snd_pcm_hw_params_copy複製
チェック
snd_pcm_hw_params_can_mmap_sample_resolutionmmap サンプル解像度をサポートしているか
snd_pcm_hw_params_is_doubleダブルバッファリングを行うか
snd_pcm_hw_params_is_batchデータ転送でダブルバッファリングを行うか
snd_pcm_hw_params_is_block_transferサンプルの転送をブロックしているか
snd_pcm_hw_params_is_monotonicタイムスタンプが単調であるかどうか
snd_pcm_hw_params_can_overrangeハードウェアが範囲外検出をサポートしているか
snd_pcm_hw_params_can_pauseハードウェアが一時停止をサポートしているか
snd_pcm_hw_params_can_resumeサスペンドからの再開をサポートしているか
snd_pcm_hw_params_is_half_duplexhalf-duplex のみか
snd_pcm_hw_params_is_joint_duplexjoint-duplex か
snd_pcm_hw_params_can_sync_start同期開始をサポートしているか
snd_pcm_hw_params_is_perfect_drain完全な drain ができるか
snd_pcm_hw_params_supports_audio_wallclock_tswallclock のタイムスタンプをサポートしているか
snd_pcm_hw_params_supports_audio_ts_type指定オーディオタイムスタンプのタイプをサポートしているか
取得
snd_pcm_hw_params_get_syncハードウェア同期IDを取得
snd_pcm_hw_params_get_rate_numdenサンプルレートの正確な情報を取得
snd_pcm_hw_params_get_sbitsサンプルのビット数を取得
snd_pcm_hw_params_get_fifo_sizeハードウェアの FIFO サイズを取得
snd_pcm_hw_params_get_min_alignサンプル内の最小転送アラインメント値を取得
リサンプリング
snd_pcm_hw_params_set_rate_resampleリサンプリングの有効/無効をセット
snd_pcm_hw_params_get_rate_resampleリサンプリングの有効/無効を取得
バッファの外部からのアクセス
snd_pcm_hw_params_set_export_bufferバッファの外部からのアクセスをセット
snd_pcm_hw_params_get_export_bufferバッファの外部からのアクセスを取得
ピリオドのウェイクアップ
snd_pcm_hw_params_set_period_wakeupピリオドのウェイクアップをセット
snd_pcm_hw_params_get_period_wakeupピリオドのウェイクアップを取得
snd_pcm_hw_params_can_disable_period_wakeupピリオドのウェイクアップを無効にできるか
drain 時無音で埋める
snd_pcm_hw_params_set_drain_silencedrain 時、最後を無音で埋めるかをセット
snd_pcm_hw_params_get_drain_silencedrain 時、最後を無音で埋めるかを取得
PCM を開いた直後は、ハードウェア構成がインストールされていないため、常にセットする必要がある。
int snd_pcm_hw_params_any(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
PCM デバイスで利用可能な、すべてのパラメータがセットされる。

PCM デバイスに現在インストールされているハードウェア構成によって、スペースが制約される可能性があることに注意。
制約を削除するには、まず snd_pcm_hw_free を使用して、構成を解放する。
int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
1つの PCM ハードウェア構成をインストールし、それを snd_pcm_prepare() する。

構成は、「最初のアクセスタイプ、最初のフォーマット、最初のサブフォーマット、最小のチャンネル数、最小のサンプルレート、最小のピリオド時間、最大のバッファサイズ」の順で、単一値を固定して選択される。
相互に互換性のあるパラメータのセットを選択できない場合は、負のエラーコードが返される。

この呼び出しの後、snd_pcm_prepare() が自動的に呼び出され、ストリームは SND_PCM_STATE_PREPARED 状態になる。

ストリームの実行中は、ハードウェアパラメーターを変更できないが、ソフトウェアパラメータはいつでも変更できる。
構成スペースは、選択したパラメータを反映するように更新される。
戻り値
0 で成功、負でエラーコード。
int snd_pcm_hw_free(snd_pcm_t *pcm);
PCM ハードウェア構成を削除し、関連するリソースを解放する。
戻り値
0 で成功、負でエラーコード。
int snd_pcm_hw_params_current(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
現在の PCM ハードウェア構成を取得
戻り値
0 で成功、負でエラーコード。
-EBADFD : ハードウェア構成が設定されていない。
操作
size_t snd_pcm_hw_params_sizeof(void);
snd_pcm_hw_params_t のサイズを取得
int snd_pcm_hw_params_malloc(snd_pcm_hw_params_t **ptr);
snd_pcm_hw_params_t 確保
戻り値
0 で成功、負でエラーコード。
void snd_pcm_hw_params_free(snd_pcm_hw_params_t *obj);
snd_pcm_hw_params_t 解放
void snd_pcm_hw_params_copy(snd_pcm_hw_params_t *dst, const snd_pcm_hw_params_t *src);
複製
チェック
int snd_pcm_hw_params_can_mmap_sample_resolution(const snd_pcm_hw_params_t *params);
ハードウェアが、mmap サンプル解像度をサポートしているかどうか。

この関数は、snd_pcm_hw_params() によってインストールされ、単一の構成が含まれている場合にのみ呼び出す必要がある (以下の関数も同様)。
戻り値
1 でサポートしている、0 でサポートしていない
int snd_pcm_hw_params_is_double(const snd_pcm_hw_params_t *params);
ハードウェアが開始/停止時に、ダブルバッファリングを行うか。
int snd_pcm_hw_params_is_batch(const snd_pcm_hw_params_t *params);
データ転送でダブルバッファリングを行うか
int snd_pcm_hw_params_is_block_transfer(const snd_pcm_hw_params_t *params);
サンプルの転送をブロックしているか
int snd_pcm_hw_params_is_monotonic(const snd_pcm_hw_params_t *params);
タイムスタンプが単調であるかどうか
int snd_pcm_hw_params_can_overrange(const snd_pcm_hw_params_t *params);
ハードウェアが範囲外検出をサポートしているか
int snd_pcm_hw_params_can_pause(const snd_pcm_hw_params_t *params);
ハードウェアが一時停止をサポートしているか
int snd_pcm_hw_params_can_resume(const snd_pcm_hw_params_t *params);
サスペンドからの再開をサポートしているか
int snd_pcm_hw_params_is_half_duplex(const snd_pcm_hw_params_t *params);
ハードウェアが、半二重のみを実行するかどうか。
int snd_pcm_hw_params_is_joint_duplex(const snd_pcm_hw_params_t *params);
ハードウェアが、ジョイントデュプレックスを実行しているかどうか (再生と録音にはある程度の相関関係がある)
int snd_pcm_hw_params_can_sync_start(const snd_pcm_hw_params_t *params);
ハードウェアが、サンプル解像度との同期開始をサポートしているかどうか。
int snd_pcm_hw_params_is_perfect_drain(const snd_pcm_hw_params_t *params);
ハードウェアが完全に drain できるかどうか。
完全な drain とは、ハードウェアが、ストリーム・アプリケーション・ポインタを超えて、サンプルを使用しないことを意味する。

つまり、drain で、書き込まれたデータが再生し終わるまで待つ場合、ピリオド単位で余分な無音を追加するのではなく、ちょうど書き込まれた位置までを使用するかどうか。
int snd_pcm_hw_params_supports_audio_wallclock_ts(const snd_pcm_hw_params_t *params);
ハードウェアが、オーディオウォールクロックのタイムスタンプをサポートしているか。
int snd_pcm_hw_params_supports_audio_ts_type(const snd_pcm_hw_params_t *params, int type);
ハードウェアが、指定オーディオ・タイムスタンプのタイプをサポートしているかどうか。
取得
const unsigned char *snd_pcm_hw_params_get_sync(const snd_pcm_hw_params_t *params);
PCM 情報から、ハードウェア同期IDを取得する。

同期 ID は、複数のデバイス (異なるカードを含む) 間の、PCM ストリームの類似クロックを決定する。
値がすべてゼロ = 設定されていないことを意味する。

ID の内容は、この関数から返される別の ID との比較にのみ使用できる。
このような同期 ID を生成する実装は、将来変更される可能性があるため、アプリケーションはハードコードされた値との比較を行わないこと。
戻り値
16 byte の ID
int snd_pcm_hw_params_get_rate_numden(const snd_pcm_hw_params_t *params, unsigned int *rate_num, unsigned int *rate_den);
サンプルレートの正確な情報を取得
rate_num
分子の値が返る
rate_den
分母の値が返る
戻り値
0 で成功。情報が利用できない場合は、負のエラーコード
int snd_pcm_hw_params_get_sbits(const snd_pcm_hw_params_t *params);
サンプルのビット数を取得
戻り値
サンプル内で実際に使用されるビット数。32bit 中の 24bit なら、24。
情報が利用できない場合は、負のエラーコード。
int snd_pcm_hw_params_get_fifo_size(const snd_pcm_hw_params_t *params);
ハードウェアの FIFO サイズを取得
戻り値
情報が利用できない場合は、負のエラーコード
int snd_pcm_hw_params_get_min_align(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
サンプル内の最小転送アラインメント値を取得
戻り値
0 で成功。単一の値のみが含まれていない場合、負のエラーコード
リサンプリング
int snd_pcm_hw_params_set_rate_resample(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
リサンプリングの有効/無効をセット
val
0 = 無効、1 = 有効 (default)
戻り値
0 で成功。負の値でエラーコード
int snd_pcm_hw_params_get_rate_resample(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
リサンプリングの有効/無効を取得
戻り値
0 で成功。負の値でエラーコード
バッファの外部からのアクセス
int snd_pcm_hw_params_set_export_buffer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
バッファの外部からのアクセスをセット
val
0 = 無効、1 = 有効 (default)
戻り値
0 で成功。負の値でエラーコード
int snd_pcm_hw_params_get_export_buffer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
バッファの外部からのアクセスを取得
戻り値
0 で成功。負の値でエラーコード
ピリオドのウェイクアップ
int snd_pcm_hw_params_set_period_wakeup(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
ピリオドのウェイクアップをセット。

この関数は、非ブロッキングモードが有効になっているデバイスでのみ呼び出す。

ハードウェアが、ピリオドのウェイクアップの無効化をサポートしているかどうかを確認するには、snd_pcm_hw_params_can_disable_period_wakeup() を呼び出す。
ハードウェアがこのモードをサポートしていない場合は、標準のピリオドウェイクアップが生成される。

ピリオドウェイクアップが無効になっている場合でも、ピリオドサイズ/時間/カウントのパラメータは有効。
snd_pcm_hw_params_set_period_size_last() を使用することを推奨する。

ピリオドウェイクアップが無効になっている場合、アプリケーションは、このデバイスでブロックする可能性のある関数を使用しないこと。
poll() の使用は、エラーの場合に限定する必要がある。
アプリケーションは、外部イベントまたはタイマーを使用して、リングバッファの状態を確認し、適切に補充する必要がある。
val
0 = 無効、1 = 有効 (default)
戻り値
0 で成功。負の値でエラーコード
int snd_pcm_hw_params_get_period_wakeup(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
ピリオドのウェイクアップを取得
戻り値
0 で成功。負の値でエラーコード
int snd_pcm_hw_params_can_disable_period_wakeup(const snd_pcm_hw_params_t *params);
ハードウェアが、ピリオドのウェイクアップを無効にできるかどうか。
drain 時無音で埋める
int snd_pcm_hw_params_set_drain_silence(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
drain 時、最後のピリオドを無音で埋めるかどうかをセットする。

無効の場合、アプリケーションは、ストリームの終了を適切に処理する必要がある。
(ピリオドサイズに合わせて、無音サンプルを埋め、ハードウェア/ドライバ用に、完全なドレインのない追加のサンプルを追加する)。

この目的のために、巻き戻しまたは sw_params の無音メカニズムが使用される場合があることに注意する。
val
0 = 無効、1 = 有効 (default)
戻り値
0 で成功。負の値でエラーコード
int snd_pcm_hw_params_get_drain_silence(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
drain 時、最後を無音で埋めるかを取得
戻り値
0 で成功。負の値でエラーコード