module_param(inject_open_err, bool, 0600);
 MODULE_PARM_DESC(inject_open_err, "Inject EBUSY error in the 'open' callback");
 
-
 struct pcmtst {
        struct snd_pcm *pcm;
        struct snd_card *card;
 
 static int snd_pcmtst_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
 {
-       struct snd_pcm_runtime *runtime = substream->runtime;
-       struct pcmtst_buf_iter *v_iter = runtime->private_data;
-
        if (inject_trigger_err)
                return -EINVAL;
 
-       v_iter->sample_bytes = runtime->sample_bits / 8;
-       v_iter->period_bytes = frames_to_bytes(runtime, runtime->period_size);
-       if (runtime->access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ||
-           runtime->access == SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED) {
-               v_iter->chan_block = runtime->dma_bytes / runtime->channels;
-               v_iter->interleaved = false;
-       } else {
-               v_iter->interleaved = true;
-       }
-       // We want to record RATE * ch_cnt samples per sec, it is rate * sample_bytes * ch_cnt bytes
-       v_iter->s_rw_ch = runtime->rate / TIMER_PER_SEC;
-       v_iter->b_rw = v_iter->s_rw_ch * v_iter->sample_bytes * runtime->channels;
-
        return 0;
 }
 
 
 static int snd_pcmtst_pcm_prepare(struct snd_pcm_substream *substream)
 {
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct pcmtst_buf_iter *v_iter = runtime->private_data;
+
        if (inject_prepare_err)
                return -EINVAL;
+
+       v_iter->sample_bytes = samples_to_bytes(runtime, 1);
+       v_iter->period_bytes = snd_pcm_lib_period_bytes(substream);
+       v_iter->interleaved = true;
+       if (runtime->access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ||
+           runtime->access == SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED) {
+               v_iter->chan_block = snd_pcm_lib_buffer_bytes(substream) / runtime->channels;
+               v_iter->interleaved = false;
+       }
+       // We want to record RATE * ch_cnt samples per sec, it is rate * sample_bytes * ch_cnt bytes
+       v_iter->s_rw_ch = runtime->rate / TIMER_PER_SEC;
+       v_iter->b_rw = v_iter->s_rw_ch * v_iter->sample_bytes * runtime->channels;
+
        return 0;
 }