QCC3040/QCC3056/QCC3086/QCCXXX发射(TX SOURCE)AUX/USB发射A2DP音乐/HFP通话

之前写过几篇USB 发射的文章,如下链接,现在在通话的基础上增加新的玩法。
https://blog.csdn.net/TengTaiTech/article/details/137339630?spm=1001.2014.3001.5501
https://blog.csdn.net/TengTaiTech/article/details/137790676?spm=1001.2014.3001.5501

在这里插入图片描述
可以更换USB输入方式到AUX,链路如下:
在这里插入图片描述
此方案可以保证音质,又同时兼顾一对二的方案。

如果想体验音乐和通话切换,也可以用户按键切换实现。可以动态切换。
在这里插入图片描述

在这里插入图片描述

bool kymeraA2dpSource_ConfigurePacketiser(void)
{
DEBUG_LOG_FN_ENTRY(“kymeraA2dpSource_ConfigurePacketiser”);

kymeraTaskData *theKymera = KymeraGetTaskData();
const a2dp_codec_settings *codec_settings = theKymera->a2dp_output_params;
uint16 codec_mtu = codec_settings->codecData.packet_size;

Source source = PanicNull(ChainGetOutput(theKymera->chain_input_handle, EPR_SOURCE_ENCODE_OUT));

if (codec_settings->sink == NULL)
{
    return FALSE;
}

Transform packetiser = PanicNull(TransformPacketise(source, codec_settings->sink));

switch (codec_settings->seid)
{
    case AV_SEID_APTX_CLASSIC_SRC:
    {
        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_CODEC, VM_TRANSFORM_PACKETISE_CODEC_APTX));
        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_MODE, VM_TRANSFORM_PACKETISE_MODE_RTP));
    }
    break;

    case AV_SEID_APTXHD_SRC:
    {
        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_CODEC, VM_TRANSFORM_PACKETISE_CODEC_APTX));
        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_MODE, VM_TRANSFORM_PACKETISE_MODE_RTP));
    }
    break;

    case AV_SEID_APTX_ADAPTIVE_SRC:
    {
        uint16 codec_ssrc;
        vm_transform_packetise_codec codec_format;

        if (theKymera->split_tx_mode)
        {
            /* Signal to the packetiser to add the extra header bytes required for HQ 96kHz split tx streaming. */
            codec_format = VM_TRANSFORM_PACKETISE_CODEC_APTX_ADAPTIVE;
        }
        else
        {
            /* Non-split tx uses the regular aptX packetiser codec configuration. */
            codec_format = VM_TRANSFORM_PACKETISE_CODEC_APTX;
        }

        switch (kymera_a2dp_source_data.aptxad_active_mode)
        {
            case aptxad_mode_low_latency:
                codec_ssrc = aptxAdaptiveLowLatencyStreamId_SSRC_Q2Q();
                codec_mtu = 668;
                break;
            case aptxad_mode_high_quality:
            default:
                codec_ssrc = aptxAdaptiveHQStreamId_SSRC();
                break;
        }

        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_CODEC, codec_format));
        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_MODE, VM_TRANSFORM_PACKETISE_MODE_TWSPLUS));
        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_RTP_SSRC, codec_ssrc));
        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_RTP_SSRC_HI, 0));
    }
    break;

    case AV_SEID_SBC_SRC:
    {
        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_CODEC, VM_TRANSFORM_PACKETISE_CODEC_SBC));
        PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_MODE, VM_TRANSFORM_PACKETISE_MODE_RTP));
    }
    break;

    default:
    break;
}

/* Do not check result of configuring MTU, because this feature is licensed on some platforms, e.g. QCC3056.
   If the license check fails, it will return FALSE, but play silence. This is ok, and we should continue.

   Some codecs do not account for the RTP header in their packet_size. So the MTU we pass to the packetiser
   must account for potentially an extra 12 bytes (RTP_HEADER_SIZE_MAX). It does not matter if these bytes
   end up not being utilised - the MTU is simply an upper limit to avoid fragmentation.
*/
TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_MTU, codec_mtu + RTP_HEADER_SIZE_MAX);

PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_SAMPLE_RATE, (uint16)codec_settings->rate));

/* aptX HD needs a special configuration */
if (codec_settings->seid == AV_SEID_APTXHD_SRC)
{
    PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_CPENABLE, 1));
    PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_SCMS, 0));
}
else
{
    PanicFalse(TransformConfigure(packetiser, VM_TRANSFORM_PACKETISE_CPENABLE, (uint16)codec_settings->codecData.content_protection));
}
PanicFalse(TransformStart(packetiser));

theKymera->packetiser = packetiser;

return TRUE;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565420.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文解读:(VPT)Visual Prompt Tuning

文章汇总 要解决的问题 大型模型应用于下游任务本身就存在挑战。最明显的(通常也是最有效的)适应策略是对预先训练好的模型进行全面的端到端微调。 动机 只微调参数的一个子集 解决的办法 只在输入空间中引入少量特定于任务的可学习参数,而在下游训练期间冻结…

Attention和Transformer灵魂七问

1. 引言 最近,ChatGPT和其他聊天机器人将大语言模型LLMs推到了风口浪尖。这就导致了很多不是学ML和NLP领域的人关注并学习attention和Transformer模型。在本文中,我们将针对Transformer模型结构提出几个问题,并深入探讨其背后的技术理论。这…

出海企业必备:Zoho Desk打造高效海外工单管理体系!

出海工单系统和常见的工单系统相比有什么不同呢?工单系统主要事帮助售前或者售后人员记录、处理、跟踪客户需求,不仅有利于企业内部管理的规范化,还能够有效提高客户服务质量。 工单系统可以帮助出海企业搭建统一的订单管理、售后服务、甚至…

Java多线程交替打印

多线程交互 在Java中,可以使用synchronized关键字或者java.util.concurrent包中的工具来实现多线程交替打印。以下是一个使用synchronized关键字的示例: public class AlternatePrinting {private static final Object lock new Object();private sta…

AES和RSA加解密算法学习笔记(实战版)

1. 写在前面 今天整理一篇有关密码学的学习笔记,原因是最近做的一个任务是在网络传输的时候,需要对传输的包进行加密和解密工作,以保证传输过程的安全性。所以,这个过程用到了AES和RSA两个算法。 场景:假设我要给我的老师传送毕设代码和论文, 我已经把代码和论文打成了一…

Giants Planet 宣布推出符文,建立在坚实价值的基础上

这是一项旨在释放我们不断发展的生态系统全部潜力的新功能。符文提供了一种更简单的方法来创建通证,这些通证可以从比特币区块链的安全性和去中心化中获益。 符文:建立在坚实的基础上 可以将比特币视为存储贵重物品的安全保险库。 符文就像保险库中的特…

Idea:阿里巴巴Java编码插件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、Alibaba Java Coding Guidelines插件介绍 二、使用步骤 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、Alibaba Java Coding …

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先(leader)地位。 其LCAP产品是Microsoft Power Apps,扩展了AI Builder、Dataverse、Power Automate和Power Pages,这些都包…

计算机网络实验——学习记录五(TCP协议2)

一、TCP协议重传机制 TCP协议是一种面向连接、可靠的传输层协议。为了保证数据的可靠传输,TCP采用数据包重传的机制来应对网络传输过程中可能出现的丢包、错包和乱序等问题。 TCP协议的重传包括超时重传、快速重传、带选择确认SACK的重传和重复SACK重传四种。 二、…

基于JavaWeb手工艺品购物系统的设计与实现

1、系统演示视频(演示视频) 2、需要请联系

实现游戏地图读取与射击运行

射击代码来源自2D 横向对抗射击游戏(by STF) - CodeBus 地图读取改装自 瓦片地图编辑器 解决边界检测,实现使用不同像素窗口也能移动不闪退-CSDN博客 // 程序:2D RPG 地图编辑器改游戏读取器 // 作者:民用级脑的研发…

HarmonyOS ArkUI实战开发-网页加载(Web)

移动应用开发中,网页使用的场景非常多,比如在APP内安排一个优惠活动啥的,就可以直接加载一个H5页面高效并且及时,也省去了使用原生开发要升级版本的麻烦,ArkUI开发框架提供了 Web 组件来加载一个网页,本节笔…

音频文件太大了怎么办?如何实现音乐内存压缩?超实用的音频压缩技巧分享给你

一,我们需要了解音乐文件是如何存储的。 音乐文件通常以数字格式存储,如 MP3、WAV、FLAC等。这些格式各有优缺点,但共同点是它们都需要占用一定的存储空间。文件大小取决于多个因素,包括音频质量、编码格式和采样率等。因此&…

网盘_游戏_博客自动化部署(Nginx多项目部署)

目录 一.前提介绍 二.环境介绍 三.自述(脚本) 四.关于Nginx多项目部署 一.前提介绍 在我之前的博客里详细介绍了上述项目的部署,那么如何使用简单脚本自动部署和使用Nginx多项目部署是本文来介绍的基础篇章。 二.环境介绍 CentOS Linux…

线性表的顺序存储如何设计实现?

如何存储 顺序及链式实现 计算机中的状态

springboot的开发流程

文章目录 springboot的开发流程 1.创建maven项目2.引用依赖 1)起步依赖2)项目依赖3.启动类4.配置文件5.业务代码 1)dto2)controller6.restful测试7.部署 1)打包2)部署 springboot的开发流程 1.创建maven项目 新建maven项目 配置…

键盘打字练习游戏代码

效果图 部分代码 index.html <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1.0" /> <meta http-equiv"…

编程新手必看,Python3中File(文件) 方法知识点及语法学习总结(24)

**介绍&#xff1a; Python3 中的file对象提供了多种方法来操作文件&#xff0c;以下是一些常用的文件方法&#xff1a; close()&#xff1a;关闭一个已打开的文件。这是释放文件资源的重要步骤&#xff0c;通常在文件操作完成后调用。flush()&#xff1a;刷新文件的缓冲区&am…

vos3000外呼系统客户端无法安装如何解决?

如果 VOS3000 外呼系统客户端无法安装&#xff0c;可以尝试以下解决方法&#xff1a; 检查系统要求&#xff1a; 确保你的计算机满足 VOS3000 外呼系统客户端的系统要求&#xff0c;包括操作系统版本、内存、处理器等。如果系统不符合要求&#xff0c;可能会导致安装失败或者运…

AI生图美学在淘宝的实践应用

本文介绍了如何制定和应用美学标准来评估和改善人工智能生成的图像质量&#xff0c;特别是在电商领域的应用&#xff0c;主要分为制定美学标准、训练美学模型、应用美学模型、升级淘宝风格模型四个步骤。 美学的定义与分析 图像质量标准&#xff1a;现代设计框架下&#xff0c;…