- rme96_t *rme96 = _snd_pcm_substream_chip(substream);
- snd_pcm_runtime_t *runtime = substream->runtime;
- snd_pcm_sframes_t diff;
- size_t bytes;
-
- if (runtime->access == SNDRV_PCM_ACCESS_MMAP_INTERLEAVED) {
- diff = runtime->control->appl_ptr -
- rme96->playback_last_appl_ptr;
- rme96->playback_last_appl_ptr = runtime->control->appl_ptr;
- if (diff != 0 &&
- diff < -(snd_pcm_sframes_t)(runtime->boundary >> 1))
- {
- diff += runtime->boundary;
- }
- bytes = diff << rme96->playback_frlog;
-
- if (bytes > RME96_BUFFER_SIZE - rme96->playback_ptr) {
- memcpy_toio((void *)(rme96->iobase + RME96_IO_PLAY_BUFFER +
- rme96->playback_ptr),
- runtime->dma_area + rme96->playback_ptr,
- RME96_BUFFER_SIZE - rme96->playback_ptr);
- bytes -= RME96_BUFFER_SIZE - rme96->playback_ptr;
- if (bytes > RME96_BUFFER_SIZE) {
- bytes = RME96_BUFFER_SIZE;
- }
- memcpy_toio((void *)(rme96->iobase + RME96_IO_PLAY_BUFFER),
- runtime->dma_area,
- bytes);
- rme96->playback_ptr = bytes;
- } else if (bytes != 0) {
- memcpy_toio((void *)(rme96->iobase + RME96_IO_PLAY_BUFFER +
- rme96->playback_ptr),
- runtime->dma_area + rme96->playback_ptr,
- bytes);
- rme96->playback_ptr += bytes;
- }
- }