*参照元 [#b2bd0c8d] #backlinks *説明 [#hd84564d] -パス: [[linux-2.6.33/sound/core/pcm_lib.c]] -FIXME: これは何? -FIXME: 現在の再生位置、録音位置を取得する。 --説明 **引数 [#u7ae7246] -struct snd_pcm_substream *substream -- --[[linux-2.6.33/snd_pcm_substream]] -struct snd_pcm_runtime *runtime -- --[[linux-2.6.33/snd_pcm_runtime]] **返り値 [#r0becd3c] -snd_pcm_uframes_t -- --現在の再生、録音位置を返す。 オーバーランあるいはアンダーランの場合は SNDRV_PCM_POS_XRUN を返す。 **参考 [#l59fed48] *実装 [#td469302] static snd_pcm_uframes_t snd_pcm_update_hw_ptr_pos(struct snd_pcm_substream *substream, struct snd_pcm_runtime *runtime) { snd_pcm_uframes_t pos; -現在の再生、録音位置(オーディオフレーム単位) --[[linux-2.6.33/snd_pcm_uframes_t]] pos = substream->ops->pointer(substream); -ドライバから現在の再生、録音位置を取得する。 -substream->ops は snd_pcm_ops 型 --[[linux-2.6.33/snd_pcm_ops]] if (pos == SNDRV_PCM_POS_XRUN) return pos; /* XRUN */ -オーバーラン or アンダーランの場合は、呼び出し元にもオーバーラン or アンダーランを知らせる。 --[[linux-2.6.33/SNDRV_PCM_POS_XRUN]] if (pos >= runtime->buffer_size) { -バッファサイズを超えた位置が返ってきた場合は、 エラーメッセージを出し、位置を 0 に修正する。 if (printk_ratelimit()) { - --[[linux-2.6.33/printk_ratelimit()]] char name[16]; pcm_debug_name(substream, name, sizeof(name)); snd_printd(KERN_ERR "BUG: %s, pos = 0x%lx, " "buffer size = 0x%lx, period size = 0x%lx\n", name, pos, runtime->buffer_size, runtime->period_size); - --[[linux-2.6.33/pcm_debug_name()]] - --[[linux-2.6.33/snd_printd()]] } pos = 0; } pos -= pos % runtime->min_align; return pos; } *コメント [#yfdd9dbe]