ALSA:PCM ステータス

enum snd_pcm_state_tPCM 状態
snd_timestamp_t
snd_htimestamp_t
タイムスタンプ
snd_pcm_audio_tstamp_report_tタイムスタンプのレポート
snd_pcm_audio_tstamp_config_tタイムスタンプの設定
ステータス
snd_pcm_status実行時のスタータス情報を取得
snd_pcm_statePCM 状態を取得
snd_pcm_state_namePCM 状態から名前を取得
snd_pcm_status_t
snd_pcm_status_sizeofsnd_pcm_status_t のサイズ取得
snd_pcm_status_mallocsnd_pcm_status_t 確保
snd_pcm_status_freesnd_pcm_status_t 解放
snd_pcm_status_copy複製
取得
snd_pcm_status_get_state状態を取得
snd_pcm_status_get_trigger_tstampトリガータイムスタンプを取得
snd_pcm_status_get_trigger_htstampトリガータイムスタンプ(高解像度)を取得
snd_pcm_status_get_tstamp現在のタイムスタンプを取得
snd_pcm_status_get_htstamp現在のタイムスタンプ(高解像度)を取得
snd_pcm_status_get_audio_htstamp現在のオーディオタイムスタンプ(高解像度)を取得
snd_pcm_status_get_driver_htstamp現在のドライバタイムスタンプ(高解像度)を取得
snd_pcm_status_get_audio_htstamp_reportオーディオタイムスタンプのレポートを取得
snd_pcm_status_get_delayレイテンシを取得
snd_pcm_status_get_avail有効なフレーム数を取得
snd_pcm_status_get_avail_max有効な最大フレーム数を取得
snd_pcm_status_get_overrange範囲外検出の回数を取得
セット
snd_pcm_status_set_audio_htstamp_configオーディオタイムスタンプの設定をセット
enum snd_pcm_state_t
SND_PCM_STATE_OPEN開いている。
snd_pcm_open() 後。
SND_PCM_STATE_SETUP構成がインストールされた。
snd_pcm_prepare() を待機している。
SND_PCM_STATE_PREPARED開始する準備ができている。
SND_PCM_STATE_RUNNING実行されている。
snd_pcm_drop() または snd_pcm_drain() で停止できる。
SND_PCM_STATE_XRUNアンダーラン (再生) またはオーバーラン (録音) 状態。
読み書き時に -EPIPE が返った場合は、この状態である。
回復するには、snd_pcm_recover() を実行する。
SND_PCM_STATE_DRAININGdrain で停止を待っている
SND_PCM_STATE_PAUSEDsnd_pcm_pause() による一時停止中
SND_PCM_STATE_SUSPENDEDハードウェアがサスペンド状態。
snd_pcm_resume() で再開できる。
SND_PCM_STATE_DISCONNECTEDハードウェアが切断されている
SND_PCM_STATE_PRIVATE1ライブラリ内部で使われる値
typedef struct timeval snd_timestamp_t;
typedef struct timespec snd_htimestamp_t;
タイムスタンプ
typedef struct _snd_pcm_audio_tstamp_report {
    unsigned int valid:1;
    unsigned int actual_type:4;
    unsigned int accuracy_report:1;
    unsigned int accuracy;
} snd_pcm_audio_tstamp_report_t;
タイムスタンプのレポート
vaild
下位互換性のための値
actual_type
ハードウェアが、要求されたタイムスタンプをサポートできなかった場合の、実際のタイプ
accuracy_report
accuracy が不明の場合は 0。accuracy フィールドが有効な場合は 1
accuracy
ナノ秒単位で、最大 4.29 秒、別のフィールドにパックされる
typedef struct _snd_pcm_audio_tstamp_config {
    unsigned int type_requested:4;
    unsigned int report_delay:1;
} snd_pcm_audio_tstamp_config_t;
タイムスタンプの設定
type_requested
要求されたオーディオスタンプのタイプ
report_delay
A/D または D/A に合計遅延を追加する
ステータス
int snd_pcm_status(snd_pcm_t *pcm, snd_pcm_status_t *status);
実行時のスタータス情報を取得
戻り値
0 で成功、負の値でエラーコード
snd_pcm_state_t snd_pcm_state(snd_pcm_t *pcm);
snd_pcm_status() を呼び出さずに、PCM 状態のみを取得する。
戻り値
常に snd_pcm_state_t の1つを返す。負のエラーコードが返されることはない。
const char *snd_pcm_state_name(const snd_pcm_state_t state);
PCM 状態から名前を取得
snd_pcm_status_t
size_t snd_pcm_status_sizeof(void);
snd_pcm_status_t のサイズ取得
int snd_pcm_status_malloc(snd_pcm_status_t **ptr);
snd_pcm_status_t 確保
void snd_pcm_status_free(snd_pcm_status_t *obj);
snd_pcm_status_t 解放
void snd_pcm_status_copy(snd_pcm_status_t *dst, const snd_pcm_status_t *src);
複製
取得
snd_pcm_state_t snd_pcm_status_get_state(const snd_pcm_status_t *obj);
状態を取得
void snd_pcm_status_get_trigger_tstamp(const snd_pcm_status_t *obj, snd_timestamp_t *ptr);
トリガータイムスタンプを取得。

トリガーとは、PCM の状態遷移 (停止から実行へ、またはその逆) を意味する。
これは一時停止や中断にも適用される。
つまり、タイムスタンプには、ストリームが開始されたときや停止されたときの時刻が含まれる。
void snd_pcm_status_get_trigger_htstamp(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr);
トリガータイムスタンプ(高解像度)を取得
void snd_pcm_status_get_tstamp(const snd_pcm_status_t *obj, snd_timestamp_t *ptr);
現在のタイムスタンプを取得
void snd_pcm_status_get_htstamp(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr);
現在のタイムスタンプ(高解像度)を取得
void snd_pcm_status_get_audio_htstamp(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr);
現在のオーディオタイムスタンプ(高解像度)を取得
void snd_pcm_status_get_driver_htstamp(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr);
現在のドライバタイムスタンプ(高解像度)を取得。

ドライバによってステータスが生成された時刻。
通常のタイムスタンプとは異なる場合がある。
void snd_pcm_status_get_audio_htstamp_report(const snd_pcm_status_t *obj, snd_pcm_audio_tstamp_report_t *audio_tstamp_report);
オーディオタイムスタンプのレポートを取得
snd_pcm_sframes_t snd_pcm_status_get_delay(const snd_pcm_status_t *obj);
レイテンシをフレーム単位で取得。

delay は、現在のアプリケーションフレームの位置と、サウンドフレームの位置の間の距離。
通常の状況では、正でバッファサイズより小さく、再生が不足している場合は負になり、録音がオーバーランしている場合はバッファサイズより大きくなる。
snd_pcm_uframes_t snd_pcm_status_get_avail(const snd_pcm_status_t *obj);
有効なフレーム数を取得
戻り値
読み書きの準備が出来ているフレーム数
snd_pcm_uframes_t snd_pcm_status_get_avail_max(const snd_pcm_status_t *obj);
最後の snd_pcm_status() 呼び出し後、使用可能なフレームの最大数を取得。
この値は、snd_pcm_status 呼び出し間の、利用可能なフレームのピークを返す。
snd_pcm_uframes_t snd_pcm_status_get_overrange(const snd_pcm_status_t *obj);
前回の呼び出し以降の、ADC 範囲外検出の回数を取得。
セット
void snd_pcm_status_set_audio_htstamp_config(snd_pcm_status_t *obj, snd_pcm_audio_tstamp_config_t *audio_tstamp_config);
オーディオタイムスタンプの設定をセット
audio_tstamp_config
type_requested と report_delay のみ有効