> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SetShapeDmaReadPointer

> SetShapeDmaReadPointer

# SetShapeDmaReadPointer

设置直接内存访问 (DMA) 读取指针。

## 语法

```cpp theme={null}
HRESULT SetShapeDmaReadPointer(  
         SHAPE_DMA_CONTEXT* context,  
         UINT32 readPointer  
)  
```

### 参数

*context*   \_Inout\_\
类型：[SHAPE\_DMA\_CONTEXT\*](/reference/audio/shapedmacontext/structs/shape_dma_context)

指向 [SHAPE\_DMA\_CONTEXT](/reference/audio/shapedmacontext/structs/shape_dma_context) 结构的指针。

*readPointer*   \
类型：UINT32

读取指针的值，以帧（128 个采样的块）为单位。

### 返回值

类型：HRESULT

HRESULT 成功或错误代码。

## 备注

若要计算 DMA 缓冲区的大小，请使用以下公式：

```cpp theme={null}
fullBufferSizeInBytes = 128 * 4 * numChannels * numFrames  
```

读取指针和写入指针按以下方式递增：

```cpp theme={null}
readPointer = (readPointer + 1) % numFrames 

writePointer = (writePointer + 1) % numFrames  
```

音频缓冲区内的地址按以下方式计算：

```cpp theme={null}
readAddress = audioBuffer + (128 * 4 * ((readPointer * numChannels) + channel))   

writeAddress = audioBuffer + (128 * 4 * ((writePointer * numChannels) + channel))  
```

你可以通过确保音频缓冲区足够大以及按固定间隔（与缓冲区大小相关）传输数据，来防止 DMA 命令被阻塞。例如，如果一次传输四个硬件帧，请确保缓冲区中存有这些帧的若干倍（至少双缓冲，即八帧），以便硬件能够在标题的读取指针之前进行写入。或者，你也可以强制在提交下一个流图之前清空缓冲区（消费数据、更新 DMA 读取指针，然后提交流图）。有关更多详细信息，请参阅 [SHAPE 概述](/build/console-features/audio/overviews/shape-overview) 中的 [阻塞命令](/build/console-features/audio/overviews/shape-overview#ID4EBGAC)。

你可以将流图作为持久或非持久的形式提交进行处理。持久流图在处理完成后仍会驻留，以便在读取和写入指针推进以及其他上下文信息更新之后，在下一帧中重复其处理。

## 要求

**头文件：** shapedmacontext.h

**支持的平台：** XBOX One 系列主机和 XBOX Series 主机

## 另请参阅

[ShapeDmaContext](/reference/audio/shapedmacontext/shapedmacontext_members)


## Related topics

- [ShapeDmaContext](/zh-CN/reference/audio/shapedmacontext/shapedmacontext_members.md)
- [GetShapeDmaReadPointer](/zh-CN/reference/audio/shapedmacontext/functions/getshapedmareadpointer.md)
- [IncrementShapeDmaReadPointer](/zh-CN/reference/audio/shapedmacontext/functions/incrementshapedmareadpointer.md)
- [SetShapePcmReadPointer](/zh-CN/reference/audio/shapepcmcontext/functions/setshapepcmreadpointer.md)
- [SetShapeDmaWritePointer](/zh-CN/reference/audio/shapedmacontext/functions/setshapedmawritepointer.md)
