USBD_AUDIO_SendData函数
时间: 2023-12-16 21:03:37 浏览: 72
`USBD_AUDIO_SendData` 函数是在 `usbd_audio_if.c` 源文件中定义的,用于向 USB 主机发送音频数据。函数原型如下:
```c
uint8_t USBD_AUDIO_SendData(USBD_HandleTypeDef* pdev, uint16_t* pbuf, uint32_t size);
```
函数参数说明:
- `pdev`:指向 `USBD_HandleTypeDef` 结构体的指针,该结构体包含了 USB Audio 设备的状态信息。
- `pbuf`:指向要发送的音频数据的缓冲区指针。
- `size`:要发送的音频数据的字节数。
函数返回值说明:
- 如果函数执行成功,返回 `USBD_OK`。
- 如果函数执行失败,返回 `USBD_FAIL`。
`USBD_AUDIO_SendData` 函数的实现如下:
```c
uint8_t USBD_AUDIO_SendData(USBD_HandleTypeDef* pdev, uint16_t* pbuf, uint32_t size)
{
USBD_AUDIO_HandleTypeDef* haudio;
if (pdev->pClassData == NULL)
{
return USBD_FAIL;
}
haudio = (USBD_AUDIO_HandleTypeDef*)pdev->pClassData;
if (haudio->alt_setting == AUDIO_MIC1_STREAMING_ALTSETTING)
{
if (haudio->mic1_state == AUDIO_STATE_IDLE)
{
haudio->mic1_state = AUDIO_STATE_WAITING;
USBD_LL_Transmit(pdev, AUDIO_MIC1_EP, (uint8_t*)pbuf, size);
}
else if (haudio->mic1_state == AUDIO_STATE_WAITING)
{
return USBD_BUSY;
}
else
{
return USBD_FAIL;
}
}
else if (haudio->alt_setting == AUDIO_SPK1_STREAMING_ALTSETTING)
{
if (haudio->spk1_state == AUDIO_STATE_IDLE)
{
haudio->spk1_state = AUDIO_STATE_WAITING;
USBD_LL_Transmit(pdev, AUDIO_SPK1_EP, (uint8_t*)pbuf, size);
}
else if (haudio->spk1_state == AUDIO_STATE_WAITING)
{
return USBD_BUSY;
}
else
{
return USBD_FAIL;
}
}
else
{
return USBD_FAIL;
}
return USBD_OK;
}
```
在 `USBD_AUDIO_SendData` 函数中,我们首先获取指向 `USBD_AUDIO_HandleTypeDef` 结构体的指针 `haudio`,该结构体包含了 USB Audio 设备的状态信息。然后,我们根据当前的音频配置设置,选择要发送音频数据的端点。如果当前配置是麦克风音频流,则使用 `AUDIO_MIC1_EP` 端点发送数据;如果当前配置是扬声器音频流,则使用 `AUDIO_SPK1_EP` 端点发送数据。
接下来,我们检查当前端点的状态。如果当前端点的状态是 `AUDIO_STATE_IDLE`,则将端点状态设置为 `AUDIO_STATE_WAITING`,并使用 `USBD_LL_Transmit` 函数将音频数据发送到主机。如果当前端点的状态是 `AUDIO_STATE_WAITING`,则返回 `USBD_BUSY`,表示当前端点正在等待上一次传输完成。如果当前端点的状态不是 `AUDIO_STATE_IDLE` 或 `AUDIO_STATE_WAITING`,则返回 `USBD_FAIL`,表示当前端点状态错误。
最后,返回 `USBD_OK` 表示函数执行成功。
以上是 `USBD_AUDIO_SendData` 函数的实现和使用说明,供参考。在实际应用中,您需要根据您的具体需求进行修改。
阅读全文