This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2564:CC2564和 A3DP 源代码演示

Guru**** 2587365 points
Other Parts Discussed in Thread: CC2564

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/686646/cc2564-cc2564-and-a3dp-source-demo

器件型号:CC2564

您好!

我的客户正在使用 CC2564和 STM32开发产品。

他们有一个需要尽快解决的技术问题:

我们使用的是 A3DP 源演示应用程序、它连接到远程接收设备并按预期流式传输音乐、到目前为止一切正常。
然后、当我们要暂停音频流时、我们将调用 Pause (NULL)、如果我们将该流暂停30秒或更长时间、当我们再次启动该流时、在远程接收器处听到的音频会失真。

如果我们将音频流暂停更短的时间、例如10秒、则在远程接收器处听到的音频效果良好。

谢谢、

Chuchen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Chuchen、

    请向我们发送更多详细信息、具体方案和一些 FW 日志
    因此、我们可以回顾一下、看看会出现什么问题。

    BR、
    陈洛威
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您的回答、以下是一些详细信息:
    我们使用 A3DPDemo_SRC 应用程序作为基础、因此在 A3DPDemo_SRC.c 中、当我们收到'etAUD_Stream_Open_Confirmation'事件时、我们将按如下方式处理该事件:
    案例 etAUD_Stream_Open_Confirmation:
    if (AUD_Event_Data->Event_Data.AUD_Stream_Open_Confirmation_Data->OpenStatus = AUD_STREALE_OPENTIFY_CONFIRMATION_STATUS_SUCCESS)

    //这会打开流,并返回零的成功结果。
    int 结果= OpenA3DPStream (AUD_Event_Data->Event_Data.AUD_Stream_Open_Confirmation_Data);

    /*跟踪此连接的 BD_ADDR。 *
    RemoteSinkBD_ADDR = AUD_Event_Data->Event_Data.AUD_Stream_Open_Confirmation_Data->BD_ADDR;

    A3DP_RemoteName();




    然后,在用户操作后,我们将调用 PLAY (NULL):

    静态 int Play (ParameterList_t *温度参数)

    int ret_val;
    //调用此函数始终返回零,这意味着 TI 成功地请求更改流的状态。
    RET_val = AUD_Change_Stream_State (BluetoothStackID、RemoteSinkBD_ADDR、astSRC、astStreamStarted);

    如果(RET_val)

    DisplayFunctionError ("AUD_Change_Stream_State_Play"、RET_val);
    RET_val = function_error;

    其他

    DisplayFunctionSuccessess ("AUD_Change_Stream_State_Play");


    返回(ret_val);


    然后、当我们收到流状态成功更改的确认时、我们将执行以下操作:

    案例 etAUD_Stream_State_Change_Confirmation:
    if (AUD_Event_Data->Event_Data.AUD_Stream_State_Change_Confirmation_Data->StreamState =astStreamStarted)
    StartA3DPStream();
    其他
    StopA3DPStream();


    A3DP_SendRegisterNotificationResponse (AVRCP_EVENT_RELOAD_STATUS_CHANGED、AVRCP_RESPONSE_CHANGED、AUD_Event_Data->Event_Data.AUD_Stream_State_Change_Confirmation_Data->StreamState、 0x00000001、A3DP_GetRemoteSinkBD_ADDR()、A3DP_GetTransactionID();

    中断;


    其中 StartA3DPStream()的实现方式如下:
    静态 int StartA3DPStream (空)

    int ret_val = 0;

    IF (!A3DPPlaying)

    //此调用始终返回零
    RET_val = VS_A3DP_Start_Stream (BluetoothStackID、A3DPConnectionHandle);
    显示("A3DP 开始:%d\r\n"、ret_val);

    如果(RET_val = 0)

    A3DPPlaying = true;
    //在 a3dp 源演示应用程序中没有将流状态设置为“花费”的位置,因此这种情况始终存在
    //计算为 true,StreamState 设置为'sStarted'
    if (StreamState!= ssPending){
    StreamState = ssStarted;
    显示(“A3DP 流状态设置为 ssStarted \r\n”);


    其他
    显示("A3DP 保持为 false、并且 StreamState 未更改为 ssStarted \r\n);

    其他

    RET_val = function_error;
    显示("A3DP 已启动。\r\n);

    返回(ret_val);


    此时、我们能够听到连接耳机上的音频流、到目前为止一切都很好。
    现在、在用户操作中、我们要暂停音频流、因此我们调用 Pause (NULL)、它会调用 AUD_Change_Stream_State (BluetoothStackID、RemoteSinkBD_ADDR、astSRC、astStreamStopped);

    此呼叫将音频流状态更改为“已停止”,始终返回零,我的理解是,这意味着呼叫已成功进行...正确吗?

    然后我们将收到确认事件:etAUD_Stream_State_Change_Confirmation,此函数称为:StopA3DPStream();
    其中:
    静态 int StopA3DPStream (空)

    int ret_val;

    IF (A3DPPlaying)

    //此调用始终返回零
    RET_val = VS_A3DP_Stop_Stream (BluetoothStackID、A3DPConnectionHandle、STOP_STREK_FLAG_FLUSE_DATA);

    A3DPPlaying = false;

    if (StreamState!= ssPending)
    StreamState = ssStopped;

    其他

    RET_val = function_error;
    显示("A3DP 未启动。\r\n);


    返回(ret_val);


    此时、音频流停止播放、如果我们将音频流暂停不到30秒、然后再次调用 PLAY (NULL)、如上所示、则音频重新正常启动。
    但是、如果我们将音频流暂停30秒或更长时间、则在调用 PLAY (NULL)时、音频流开始、但失真。
    我很快就会附上一份日志、但我没有看到任何明显的情况、因为所有呼叫都返回成功。

    非常感谢您的见解。
    谢谢、
    ELISA
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    附加一个包含一些日志的文件时、我没有看到任何错误、 但在暂停30秒后、流变回 ssStarted 后、我们确实会听到音频失真。

    非常感谢您的帮助。

    因此、

    ELISA

    器件、*
    * GetRemoteName、OpenSink、CloseSink、Play、*
    *暂停、帮助*
    (二
    A3DP_OpenConnection:成功
    5260:Headset_InitPind
    A3DP_InsertLinkKey
    NVM 耳机 BD_ADDR:0xB869C22BC6C9。
    NVM 耳机链接密钥:0xA41BC4A64167F93C0FA2BD0FFBF34064
    5274:Headset_ManualConnect
    5277:-连接到 JBL 反射迷你 BT [0x20000839]
    A3DP_StartConnection()
    连接到 BD_ADDR:0xB869C22BC6C9。
    通过 AUD 自动连接到0xB869C22BC6C9……

    5950:Headset_InitPind
    A3DP_InsertLinkKey
    NVM 耳机 BD_ADDR:0xB869C22BC6C9。
    NVM 耳机链接密钥:0xA41BC4A64167F93C0FA2BD0FFBF34064
    5983:Headset_ManualConnect
    5989:-连接到 JBL 反射迷你 BT [0x20000839]
    A3DP_StartConnection()
    连接到 BD_ADDR:0xB869C22BC6C9。


    atLinkKeyRequest:0xB869C22BC6C9
    找到 LinkKeyInfo (索引=0):
    GAP_Authentication_Response 成功。
    动臂>
    0xB869C22BC6C9的 atAuthenticationStatus:0
    7728:耳机配对
    动臂>
    0xB869C22BC6C9的 etEncryption_Change_Result、状态:0x00、模式:启用。

    动臂>
    etAUD_Signaling_Channel_Open_Indication
    BD_ADDR:0xB869C22BC6C9

    动臂>
    etAUD_Stream_Open_Confirmation
    状态:0
    BD_ADDR:0xB869C22BC6C9
    MediaMTU:895
    A3DP 打开:0
    使用采样频率48000初始化音频
    流格式:
    频率:48000
    通道:2.
    标志:0
    AUD_Change_Stream_State_Play 成功。
    8081:- etAUD_Stream_Open_Confirmation
    8090:耳机已连接
    动臂>
    etAUD_Stream_State_Change_Confirmation
    BD_ADDR:0xB869C22BC6C9
    StreamState:已启动
    A3DP 开始:0
    A3DP 流状态设置为 ssStarted
    已更改播放状态的发送寄存器通知


    etAUD_Remote_Control_Open_Indication
    BD_ADDR:0xB869C22BC6C9
    AVRCP (通知)命令已成功发送。
    9203:- etAUD_Remote_Control_Open_Indication
    9213:Headset_已连接
    动臂>
    etAUD_Remote_Control_Command_Confirmation:10.
    RCCC 状态:0
    RCCC MSG 类型:19.
    A3DP_ProcessRemoteControlCmd 确认:19.
    RCCC 事件 ID:13.
    RCCC 卷:32
    A3DP_ProcessRemoteControlCmd 确认:AVRCP_RESPONSE_INTERIME
    9275:- etAUD_Remote_Control_Command_Confirmation

    etAUD_Remote_Control_Command_Indication
    MessageType:8.
    amtGetCapabilities:3.
    RemoteControl 功能响应:0

    动臂>
    etAUD_Remote_Control_Command_Indication
    MessageType:19.
    amtRegisterNotification- EventID:1.
    已注册回放通知
    RemoteControl 通知响应:0


    etAUD_Remote_Control_Command_Confirmation:10.
    RCCC 状态:0
    RCCC MSG 类型:22.
    A3DP_ProcessRemoteControlCmd 确认:22.
    11404:- etAUD_Remote_Control_Command_Confirmation


    etAUD_Remote_Control_Command_Confirmation:10.
    RCCC 状态:0
    RCCC MSG 类型:22.
    A3DP_ProcessRemoteControlCmd 确认:22.
    29923:- etAUD_Remote_Control_Command_Confirmation

    123816:- AVRCP_EVENT_RELOAD_STATUS_CHANGE

    123827:-暂停
    AUD_Change_Stream_State_Pause 成功。
    etAUD_Stream_State_Change_Confirmation
    BD_ADDR:0xB869C22BC6C9
    StreamState:已暂停
    A3DP 停止:0
    已更改播放状态的发送寄存器通知


    etAUD_Remote_Control_Command_Indication
    MessageType:19.
    amtRegisterNotification- EventID:1.
    已注册回放通知
    RemoteControl 通知响应:0


    185604:- AVRCP_EVENT_RELOAD_STATUS_CHANGE

    185615:-播放
    AUD_Change_Stream_State_Play 成功。
    etAUD_Stream_State_Change_Confirmation
    BD_ADDR:0xB869C22BC6C9
    StreamState:已启动
    A3DP 开始:0
    A3DP 流状态设置为 ssStarted
    已更改播放状态的发送寄存器通知


    etAUD_Remote_Control_Command_Indication
    MessageType:19.
    amtRegisterNotification- EventID:1.
    已注册回放通知
    RemoteControl 通知响应:0

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Elisa、

    感谢您提供相关信息。

    我将邀请我们的上层协议 BT 专家为您提供 UPS 方面的帮助。

    您知道如何获取 FW 日志吗?
    如果不是、请查看以下链接: processors.wiki.ti.com/.../CC256x
    日志部分和工具。

    添加这些日志后、我将能够查看 FW 接收到的确切内容、这将帮助我们了解您的问题是 UPS 问题还是 FW 问题。
    因此、我们的 BT UPS 专家将尽快解决此问题、同时、如果您能为我们提供很好的 FW 日志、那就更好了。

    BR、
    陈洛威
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    遗憾的是、我们的硬件目前无法访问 TX_DBG 引脚。
    我们还能做些什么吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Elisa、

    坏消息是、如果没有 FW 日志消息、我在这里主要猜测、无法真正看到发生了什么。
    我将咨询上层堆栈专家、了解我们可以从 UPS 中学到哪些内容并返回给您。

    BR、
    陈洛威
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是哪台主机? 您可能还想检查一下、如果暂停时间过长导致主机进入某些低功耗状态、并且在恢复时可能会丢失一些上下文数据?

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的帮助、我很感谢您的帮助、我不熟悉 TI 的 CC2564、因此我尝试观看 A3DP 源代码演示。

    是否有特定的方法、 我们应该执行函数调用? 也许我们错过了我应该做的其他一些呼叫。 已建立与远程接收器的连接,并将流状态更改为“已启动”,然后调用 VS_A3DP_Start_Stream (),似乎可以正常工作,因为我们可以在连接的远程接收器上听到我们的音频流。

    因此、为了暂停、我们遵循类似的顺序:  

    -将流状态更改为暂停、

    -调用 VS_A3DP_Stop_Stream ()

    该序列确实会暂停音频、但出于某种原因、将音频流暂停30秒或更长时间、似乎会使其失真。  音频库是否可能认为/假设30秒后不再有音频流式传输?

    应用程序级别是否应关闭音频路径并在暂停这么长时间后重新启动?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊、我看到、我们使用的是 STM32F411、它在20分钟后进入睡眠模式、但没有音频流。 我将重新检查是否存在任何其他类似的情形或条件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    出于测试目的、请禁用您可能在应用/环境中使用的任何低功耗模式/空闲模式。 这样您就可以消除任何与电源相关的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好  

    我可以确认我们的硬件和应用没有任何低功耗或空闲模式启用、并且我们仍在观察相同的行为、在30秒停止/暂停或更长时间后、启动音频流会产生失真的音频。

    我尝试在流停止后重新配置(VS_A3DP_Stop_Stream ()),我使用 VS_PCM_Codec_Config_Slave_I2S ()和 VS_A3DP_Codec_Configuration ()重新配置流; 但没有成功。

    我注意到 A3DPDemo 具有流的3种状态:已开始、待处理和已停止;但 AUDAPI.h 只有两种状态:已开始和已停止。 这种差异是否有任何特殊原因?

    我还注意到、应用程序中从未设置状态"待定"。

    我正在使用:VS_A3DP_Stop_Stream() 来停止音频流,是使用正确的功能,我一直在寻找暂停或暂停的功能,但找不到任何功能。 ?

    任何见解都非常值得赞赏、我们已经有很长一段时间了、无法找到解决问题的方法。

    谢谢你  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    通过阅读 A3DPDemo_SRC.c、我们发现他有以下几行:

    if ((HCI_DriverInformation.DriverInformation.COMMDriverInformation.Protocol =cpHCILL)||(HCI_DriverInformation.DriverInformation.COMMDriverInformation.Protocol ==cpHCILL_RTS_CTS)){
    HCILLConfig.Sleep CallbackFunction = HCI_SLEEP_Callback;
    HILLConfig.Sleep CallbackParameter = 0;
    DriverReconfigureData.ReconfigureCommand = HCI_COMM_DRIVER_RECONFIG_DATA_COMMAND_CHANGE_HCILL_PARAMETERS;
    DriverReconfigureData.ReconfigureData =(void *) HFILLConfig;
    /*注册睡眠模式回调。 请注意、如果这是*/
    /*函数返回大于0的值、然后睡眠当前为*/
    /*已启用。 *
    结果= HCI_RECONFIG_Driver ((unsigned int)结果、false、&DriverReconfigureData);
    如果(结果> 0){
    /*标志睡眠模式已启用。 *
    显示("\n\r ***** 允许睡眠。 ***** \r\n");

    }否则{
    误差=-1;

    因此、我们查找了回调函数、并添加了一条显示消息:

    /*以下是 HCI 睡眠回调。 这已在*/中注册
    /*要注意主机处理器何时进入睡眠状态的堆栈*/
    /*模式。 *
    void BTPSAPI HCI_SLEEP_Callback (BOOLEOLEO_t Sleep Allded、unsigned long CallbackParameter){
    //xxx 监视低功耗状态
    显示("\n\r 允许睡眠:%d \n\r",睡眠已全部);
    display("\n\r CallbackParameter :%d \n\r",CallbackParameter));

    事实证明、在30秒或更长时间不存在音频流后、我们确实会收到此回调函数、因此看起来 TI 正是休眠的人。

    现在的问题是、我们如何禁用此睡眠模式?

    我们一直在浏览 BluetopiaCoreAPI.pdf、但我无法找到具体方法。

    感谢您的意见、谢谢。