PCM を開いた直後は、ハードウェア構成がインストールされていないため、常にセットする必要がある。
int snd_pcm_hw_params_any(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
PCM デバイスで利用可能な、すべてのパラメータがセットされる。
PCM デバイスに現在インストールされているハードウェア構成によって、スペースが制約される可能性があることに注意。
制約を削除するには、まず snd_pcm_hw_free を使用して、構成を解放する。
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 状態になる。
ストリームの実行中は、ハードウェアパラメーターを変更できないが、ソフトウェアパラメータはいつでも変更できる。
構成スペースは、選択したパラメータを反映するように更新される。
構成は、「最初のアクセスタイプ、最初のフォーマット、最初のサブフォーマット、最小のチャンネル数、最小のサンプルレート、最小のピリオド時間、最大のバッファサイズ」の順で、単一値を固定して選択される。
相互に互換性のあるパラメータのセットを選択できない場合は、負のエラーコードが返される。
この呼び出しの後、snd_pcm_prepare() が自動的に呼び出され、ストリームは SND_PCM_STATE_PREPARED 状態になる。
ストリームの実行中は、ハードウェアパラメーターを変更できないが、ソフトウェアパラメータはいつでも変更できる。
構成スペースは、選択したパラメータを反映するように更新される。
戻り値
0 で成功、負でエラーコード。
int snd_pcm_hw_params_current(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
現在の PCM ハードウェア構成を取得
戻り値
0 で成功、負でエラーコード。
-EBADFD : ハードウェア構成が設定されていない。
-EBADFD : ハードウェア構成が設定されていない。
操作
チェック
int snd_pcm_hw_params_can_mmap_sample_resolution(const snd_pcm_hw_params_t *params);
ハードウェアが、mmap サンプル解像度をサポートしているかどうか。
この関数は、snd_pcm_hw_params() によってインストールされ、単一の構成が含まれている場合にのみ呼び出す必要がある (以下の関数も同様)。
この関数は、snd_pcm_hw_params() によってインストールされ、単一の構成が含まれている場合にのみ呼び出す必要がある (以下の関数も同様)。
戻り値
1 でサポートしている、0 でサポートしていない
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 で、書き込まれたデータが再生し終わるまで待つ場合、ピリオド単位で余分な無音を追加するのではなく、ちょうど書き込まれた位置までを使用するかどうか。
完全な 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 を生成する実装は、将来変更される可能性があるため、アプリケーションはハードコードされた値との比較を行わないこと。
同期 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() の使用は、エラーの場合に限定する必要がある。
アプリケーションは、外部イベントまたはタイマーを使用して、リングバッファの状態を確認し、適切に補充する必要がある。
この関数は、非ブロッキングモードが有効になっているデバイスでのみ呼び出す。
ハードウェアが、ピリオドのウェイクアップの無効化をサポートしているかどうかを確認するには、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 の無音メカニズムが使用される場合があることに注意する。
無効の場合、アプリケーションは、ストリームの終了を適切に処理する必要がある。
(ピリオドサイズに合わせて、無音サンプルを埋め、ハードウェア/ドライバ用に、完全なドレインのない追加のサンプルを追加する)。
この目的のために、巻き戻しまたは sw_params の無音メカニズムが使用される場合があることに注意する。
val
0 = 無効、1 = 有効 (default)
戻り値
0 で成功。負の値でエラーコード