当前位置: 首页 > news >正文

Android audio_policy_configuration.xml加载流程

目录

一、audio_policy_configuration.xml文件被加载流程

1、AudioPolicyService 创建阶段

2、createAudioPolicyManager 实现

3、AudioPolicyManager 构造

4、配置文件解析 loadConfig

5、核心解析逻辑 PolicySerializer::deserialize

二、AudioPolicyConfig类解析

1、AudioPolicyConfig 类定义

2、module标签

3、MixPort标签

4、DevicePort标签

5、route标签


一、audio_policy_configuration.xml文件被加载流程

1、AudioPolicyService 创建阶段

文件路径:frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp

void AudioPolicyService::onFirstRef() {mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient);
}

系统服务启动后,调用 createAudioPolicyManager,创建 AudioPolicyManager 对象。

2、createAudioPolicyManager 实现

extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface) {AudioPolicyManager *apm = new AudioPolicyManager(clientInterface);status_t status = apm->initialize();if (status != NO_ERROR) {delete apm;apm = nullptr;}return apm;
}

作用

  • 创建 AudioPolicyManager

  • 立即调用 initialize() 初始化流程;

  • 如果失败,释放资源

3、AudioPolicyManager 构造

文件
frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp


AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface): AudioPolicyManager(clientInterface, false /*forTesting*/)
{loadConfig();
}void AudioPolicyManager::loadConfig() {if (deserializeAudioPolicyXmlConfig(getConfig()) != NO_ERROR) {ALOGE("could not load audio policy configuration file, setting defaults");getConfig().setDefault();}
}

构造时直接调用 loadConfig(),开始读取音频配置文件。

4、配置文件解析 loadConfig

文件
frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp

status_t deserializeAudioPolicyFile(const char *fileName, AudioPolicyConfig *config) {PolicySerializer serializer;return serializer.deserialize(fileName, config);
}

调用 PolicySerializer::deserialize,使用 libxml2 解析音频 XML 配置文件。

5、核心解析逻辑 PolicySerializer::deserialize

status_t PolicySerializer::deserialize(const char *configFile, AudioPolicyConfig *config)
{// 使用智能指针包装 libxml2 的解析接口,解析传入的 XML 文件auto doc = make_xmlUnique(xmlParseFile(configFile));if (doc == nullptr) {// 如果解析失败,打印错误并返回 BAD_VALUEALOGE("%s: Could not parse %s document.", __func__, configFile);return BAD_VALUE;}// 获取 XML 文档的根节点xmlNodePtr root = xmlDocGetRootElement(doc.get());if (root == NULL) {// 如果根节点为空,打印错误并返回 BAD_VALUEALOGE("%s: Could not parse %s document: empty.", __func__, configFile);return BAD_VALUE;}// 处理 XInclude(XML文件可以引用其他XML文件的机制)if (xmlXIncludeProcess(doc.get()) < 0) {// 如果包含文件处理失败,记录错误,但不直接返回ALOGE("%s: libxml failed to resolve XIncludes on %s document.", __func__, configFile);}// 检查根节点名称是否符合预期if (xmlStrcmp(root->name, reinterpret_cast<const xmlChar*>(rootName)))  {ALOGE("%s: No %s root element found in xml data %s.", __func__, rootName,reinterpret_cast<const char*>(root->name));return BAD_VALUE;}// 获取根节点的 version 属性std::string version = getXmlAttribute(root, versionAttribute);if (version.empty()) {// 如果 version 属性不存在,返回错误ALOGE("%s: No version found in root node %s", __func__, rootName);return BAD_VALUE;}// 验证版本是否与期望版本一致if (version != mVersion) {ALOGE("%s: Version does not match; expect %s got %s", __func__, mVersion.c_str(),version.c_str());return BAD_VALUE;}// 开始解析子节点// Step 1: 解析 Module 列表ModuleTraits::Collection modules;status_t status = deserializeCollection<ModuleTraits>(root, &modules, config);if (status != NO_ERROR) {// 如果模块解析失败,直接返回错误状态return status;}// 将解析到的模块设置到 config 对象中config->setHwModules(modules);// Step 2: 解析全局配置GlobalConfigTraits::deseria

功能拆解

  • xmlParseFile:加载并解析 XML 文件。

  • xmlDocGetRootElement:获取根节点,确保结构有效。

  • xmlXIncludeProcess:处理 XInclude,允许配置文件嵌套引用子文件。

  • 验证 root 名称、版本号。

如果通过校验,进入内容解析:

deserializeCollection<ModuleTraits>(root, &modules, config);
config->setHwModules(modules);
GlobalConfigTraits::deserialize(root, config);
SurroundSoundTraits::deserialize(root, config);

经过以上代码之后,最终audio_policy_configuration.xml配置文件会转化为以下的C++类AudioPolicyConfig。

二、AudioPolicyConfig类解析

audio_policy_configuration.xml配置文件配置了Android Audio的设备、流以及设备和流之间的路由等相关信息。写明了Android Audio支持哪些设备、哪些流以及它们支持的编码格式、采样率等信息。文件大致内容如下。

1、AudioPolicyConfig 类定义


class AudioPolicyConfig {static const constexpr char* const kDefaultEngineLibraryNameSuffix = "default";std::string mSource; //为config字符串目录,一般在odm/etc、/vendor/etc、/system/etc下的audio_policy_configuration.xmlstd::string mEngineLibraryNameSuffix;HwModuleCollection &mHwModules; //保存了配置文件中所有的所有module标签集合,每个module标签对应一个HwModule类DeviceVector &mOutputDevices; //attchedDevices标签中,设备名称名字和devicePort标签的tagName相同,且type中有OUT字眼的DeviceDescriptor实体类集合DeviceVector &mInputDevices; //attchedDevices标签中,设备名称名字和devicePort标签的tagName相同,且type中有in字眼的DeviceDescriptor实体类集合sp<DeviceDescriptor> &mDefaultOutputDevice; //保存defaultOutputDevice标签内名字和devicePort标签的tagName相同// TODO: remove when legacy conf file is removed. true on devices that use DRC on the// DEVICE_CATEGORY_SPEAKER path to boost soft sounds, used to adjust volume curves accordingly.// Note: remove also speaker_drc_enabled from global configuration of XML config file.bool mIsSpeakerDrcEnabled;bool mIsCallScreenModeSupported;SurroundFormats mSurroundFormats;
};
<modules><!-- Primary Audio HAL --><module name="primary" halVersion="3.0"><attachedDevices><item>Speaker</item><item>Built-In Mic</item><item>Built-In Back Mic</item></attachedDevices><defaultOutputDevice>Speaker</defaultOutputDevice><mixPorts>……</mixPorts><devicePorts>……</devicePorts><!-- route declaration, i.e. list all available sources for a given sink --><routes>……</routes></module><!-- A2dp Input Audio HAL --><xi:include href="a2dp_in_audio_policy_configuration.xml"/>……</modules><!-- End of Modules section -->

2、module标签

每个module标签对应着相应的hal层实现,如primary、usb、a2dp等

<modules><!-- Primary Audio HAL --><module name="primary" halVersion="3.0"><attachedDevices><item>Speaker</item><item>Built-In Mic</item><item>Built-In Back Mic</item></attachedDevices>……</module><!-- A2dp Input Audio HAL --><xi:include href="a2dp_in_audio_policy_configuration.xml"/>……</modules><!-- End of Modules section -->

module标签对应C++实体类HWModule。

class HwModule {const String8 mName; // hal层模块对应的module名字(primary, a2dp ...)audio_module_handle_t mHandle;OutputProfileCollection mOutputProfiles; // mixport标签role为source类型,对应IOProfle实体类集合InputProfileCollection mInputProfiles;  // mixport标签role为sink的类型,对应IOProfle实体类集合uint32_t mHalVersion; // hal层模块的版本信息DeviceVector mDeclaredDevices; // 所有的deviceport标签,对应DeviceDescriptor实体类的集合DeviceVector mDynamicDevices; /**< devices that can be added/removed at runtime (e.g. rsbumix)*/AudioRouteVector mRoutes; // 所有的routePolicyAudioPortVector mPorts; // 所有的mixport,deviceport标签对应的实体类,因为IOProfle和DeviceDescriptor都继承了AudioPort,所以相当于这是一个AudioPort集合
};

3、MixPort标签

mixport标签可以理解为stream流,配置了相应的格式、采样率以及mask,且分为输出、输入流。一个mixport标签可能有多个profile属性,也就是支持很多编码格式等属性。

<mixPort name="compressed_offload" role="source"flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING"><profile name="" format="AUDIO_FORMAT_MP3"samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/><profile name="" format="AUDIO_FORMAT_AAC"samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/><profile name="" format="AUDIO_FORMAT_AAC_LC"samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
</mixPort>

一个mixport标签对应一个IOProfile实体类。

class IOProfile : public AudioPort, public PolicyAudioPort {// 可以同时打开的流的最大数量,默认为1。赋值为0时,表示无穷大。uint32_t     maxOpenCount;// 目前已打开的流的数量。uint32_t     curOpenCount;// 同时处于活跃状态的流的最大数量,默认为1。赋值为0时,表示无穷大。uint32_t     maxActiveCount;// 正处于活跃状态的流的数量。 针对于Hal层的流而言。uint32_t     curActiveCount;private:/** 当前流支持的设备集合;* 如果是sink输入流,查找规则如下:* 1. 遍历其父类的成员mRoutes,因为是输入流,所以遍历mRoute集合中sink为自己的route,也就是找有哪些源source设备把数据传给自己。* 2. 找到route后,根据route中source保存的对象,且对象type是AUDIO_PORT_TYPE_DEVICE类型(就是devicesPort标签对应的实体类DeviceDescriptor)* 3. 把DeviceDescriptor保存在集合中,保存在以下mSupportedDevices中,作为其支持的设备;* 输出流,同理;最终的结果就是:* 作为输出流source,mSupportedDevices保存此流可以输出到对应的device,stream -> device* 作为输入流sink,mSupportedDevices保存了其他device能输出数据到此流,  device -> stream**/DeviceVector mSupportedDevices;
};class AudioPort : public virtual RefBase, public virtual Parcelable
{AudioGains mGains; // gain controllers
protected:std::string  mName; // 对应mixport的nameaudio_port_type_t mType; // AUDIO_PORT_TYPE_MIX (此处固定)audio_port_role_t mRole; // AUDIO_PORT_ROLE_SOURCE/AUDIO_PORT_ROLE_SINK(由mixport的role决定)AudioProfileVector mProfiles; // AudioProfile的集合,对应mixport里面的多个profile// Audio capabilities that are defined by hardware descriptors when the format is unrecognized// by the platform, e.g. short audio descriptor in EDID for HDMI.std::vector<media::ExtraAudioDescriptor> mExtraAudioDescriptors;
};class PolicyAudioPort : public virtual RefBase, private HandleGenerator<audio_port_handle_t>
{uint32_t mFlags; // attribute flags mask (e.g primary output, direct output...).sp<HwModule> mModule;     // 通过attach函数与HwModule绑定AudioRouteVector mRoutes; // 相关连的route标签集合
};

mixport内部的Profile标签对应的C++类AudioProfile 如下。在解析以上标签至profile时,会单独创建AudioProfile。

class AudioProfile final : public RefBase, public Parcelable
{std::string  mName; // profile的name// 以下三个变量对应配置文件中profile中的置,由初始化时进行赋值audio_format_t mFormat; // The format for an audio profile should only be set when initialized.ChannelMaskSet mChannelMasks;SampleRateSet mSamplingRates;// 以下三个对应上面三位,如果三位都有值,则为false固定的,如果xml没有指定值,则为true表示是动态的值bool mIsDynamicFormat = false;bool mIsDynamicChannels = false;bool mIsDynamicRate = false;audio_encapsulation_type_t mEncapsulationType = AUDIO_ENCAPSULATION_TYPE_NONE;AudioProfile() = default;AudioProfile& operator=(const AudioProfile& other);
};

4、DevicePort标签

devicePort标签可以理解为一个device设备,设备也分output和input,以type中的关键字“IN”和“OUT”进行区分。

<devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address=""><profile name="" format="AUDIO_FORMAT_PCM_16_BIT"samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/><gains><gain name="gain_1" mode="AUDIO_GAIN_MODE_JOINT"minValueMB="-8400"maxValueMB="4000"defaultValueMB="0"stepValueMB="100"/></gains>
</devicePort>

一个devicePort对应一个C++类DeviceDescriptor。

class DeviceDescriptor : public DeviceDescriptorBase,public PolicyAudioPort, public PolicyAudioPortConfig
{std::string mTagName; // 对应的tagName字段FormatVector        mEncodedFormats; // encodedFormats转换的枚举值audio_format_t      mCurrentEncodedFormat;bool                mIsDynamic = false;const std::string   mDeclaredAddress; // address字段对应的地址
};class DeviceDescriptorBase : public AudioPort, public AudioPortConfig
{AudioDeviceTypeAddr mDeviceTypeAddr;uint32_t mEncapsulationModes = 0;uint32_t mEncapsulationMetadataTypes = 0;
};class AudioPort : public virtual RefBase, public virtual Parcelable
{AudioGains mGains; // gain controllers
protected:std::string  mName; // 对应devicePort的nameaudio_port_type_t mType; // AUDIO_PORT_TYPE_DEVICE(此处固定)audio_port_role_t mRole; // AUDIO_PORT_ROLE_SOURCE/AUDIO_PORT_ROLE_SINK(由mixport的role决定)AudioProfileVector mProfiles; // AudioProfile的集合,对应devicePort里面的多个profile// Audio capabilities that are defined by hardware descriptors when the format is unrecognized// by the platform, e.g. short audio descriptor in EDID for HDMI.std::vector<media::ExtraAudioDescriptor> mExtraAudioDescriptors;
};

同MixPort一样,devicePort也会解析内部的profile标签,创建新的AudioProfile。

class AudioProfile final : public RefBase, public Parcelable
{std::string  mName; // profile的name// 以下三个变量对应配置文件中profile中的置,由初始化时进行赋值audio_format_t mFormat; // The format for an audio profile should only be set when initialized.ChannelMaskSet mChannelMasks;SampleRateSet mSamplingRates;// 以下三个对应上面三位,如果三位都有值,则为false固定的,如果xml没有指定值,则为true表示是动态的值bool mIsDynamicFormat = false;bool mIsDynamicChannels = false;bool mIsDynamicRate = false;audio_encapsulation_type_t mEncapsulationType = AUDIO_ENCAPSULATION_TYPE_NONE;AudioProfile() = default;AudioProfile& operator=(const AudioProfile& other);
};

5、route标签

route是把deviceport和mixport连接起来的路由,数据由一个stream输出到另一个device,或者从一个device输出到另一个stream。

<route type="mix" sink="Speaker"sources="primary output,deep_buffer,compressed_offload,BT SCO Headset Mic,Telephony Rx"/>

route标签对应C++的AudioRoute类。

class AudioRoute  : public virtual RefBase
{PolicyAudioPortVector mSources; //所有的deviceport、mixport标签转化的实体类都保存到HwModule的mPorts成员了,所以是用name去mPorts里面查找,只是source可能是多个,这里用集合保存sp<PolicyAudioPort> mSink; //同上audio_route_type_t mType; //AUDIO_ROUTE_MIX/AUDIO_ROUTE_MUX:根据type而定是互斥还是可融合
};

在Primary的module配置文件中通过如下语句去配置a2dp、usb的module。

<!-- A2dp Input Audio HAL --><xi:include href="a2dp_in_audio_policy_configuration.xml"/>

相关文章:

Android audio_policy_configuration.xml加载流程

目录 一、audio_policy_configuration.xml文件被加载流程 1、AudioPolicyService 创建阶段 2、createAudioPolicyManager 实现 3、AudioPolicyManager 构造 4、配置文件解析 loadConfig 5、核心解析逻辑 PolicySerializer::deserialize 二、AudioPolicyConfig类解析 1、…...

AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解

在 Launcher3 执行涉及其他应用窗口&#xff08;即“远程窗口”&#xff09;的动画时&#xff0c;例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画&#xff0c;SurfaceControl 扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。 …...

iframe下系统访问跨域问题解决办法

问题描述&#xff1a;iframe下嵌入web页面&#xff0c;访问后端接口跨域&#xff0c;导致接口调不通。 产生原因&#xff1a;iframe下&#xff0c;web端访问后端接口时&#xff0c;会优先向后端发送请求方法为OPTIONS的预检测请求&#xff0c;该请求调用不通&#xff0c;导致真…...

Kafka 如何理解Kafka的高可用

一、Kafka高可用核心思想&#xff1a;备胎的自我修养 核心口诀&#xff1a;“别把鸡蛋放在一个篮子里&#xff0c;除非你他妈有100个篮子&#xff01;” Kafka的高可用设计&#xff0c;本质上就是一场**“分布式备胎大战”**。它的核心逻辑是&#xff1a; “老子不信任任何单…...

11-DevOps-Jenkins Pipeline流水线作业

前面已经完成了&#xff0c;通过在Jenkins中创建自由风格的工程&#xff0c;在界面上的配置&#xff0c;完成了发布、构建的过程。 这种方式的缺点就是如果要在另一台机器上进行同样的配置&#xff0c;需要一项一项去填写&#xff0c;不方便迁移&#xff0c;操作比较麻烦。 解…...

C++学习之游戏服务器开发十一DOCKER的基本使用

目录 1.多实例部署方案 2.容器的概念 3.docker初识 4.docker仓库 5.docker镜像 6.docker容器 7.docker和虚拟机的区别 8.docker命令解释 9.dockerfile构建镜像 10.离线分发镜像 1.多实例部署方案 redis 命令&#xff08; redis-cli XXXX &#xff09; set key value:…...

docker学习笔记2-最佳实践

一、在容器中启动mysql的最佳实践 &#xff08;一&#xff09;查找目录 1、mysql的配置文件路径 /etc/mysql/conf.d 2、mysql的数据目录 /var/lib/mysql 3、环境变量 4、端口 mysql的默认端口3306。 &#xff08;二&#xff09;启动命令 docker run -d -p 3306:3306 …...

【TeamFlow】4.2 Yew库详细介绍

Yew 是一个用于构建高效、交互式前端 Web 应用程序的现代 Rust 框架&#xff0c;它借鉴了 React 和 Elm 等框架的设计理念&#xff0c;同时充分利用 Rust 的语言特性。 核心特性 基于组件的架构 Yew 采用组件化开发模式&#xff0c;类似于 React: 组件是可重用的 UI 构建块 …...

第六章.java集合与泛型

文章目录 1.集合框架1. Collection 接口存储一组不唯一,无序的对象2. Set接口存储一组唯一,无序的对象3. Map接口存储一组键值对象,提供key到value的映射 2.封装3.练习题 1.集合框架 java集合框架提供了一套性能优良,使用方便的接口和类,它们位于java.util中 1. Collection 接…...

elastic/go-elasticsearch与olivere/elastic

在 Go 语言中&#xff0c;与 Elasticsearch 交互的客户端库有多种选择&#xff0c;其中 github.com/elastic/go-elasticsearch/v8 和 github.com/olivere/elastic/v7 是两个常用的库。这两个库的功能和用途有一些差异&#xff0c;以下是它们的详细对比&#xff1a; 1. github.c…...

MYSQL之基础认识(卸载安装登录, 基本概念)

一. 卸载安装和登录 卸载 MYSQL 1. 查看有无mysql服务正在运行: ps ajx | grep mysql 2. 查看到 mysql 的服务名称: systemctl list-units --typeservice | grep mysql 3. 关闭 mysql 服务 4. 卸载 dpkg -l | grep mysql | awk {print $2} | xargs sudo apt remove --purg…...

Sentinel源码—7.参数限流和注解的实现一

大纲 1.参数限流的原理和源码 2.SentinelResource注解的使用和实现 1.参数限流的原理和源码 (1)参数限流规则ParamFlowRule的配置Demo (2)ParamFlowSlot根据参数限流规则验证请求 (1)参数限流规则ParamFlowRule的配置Demo 一.参数限流的应用场景 二.参数限流规则的属性 …...

JAVA:利用 Apache Tika 提取文件内容的技术指南

1、简述 Apache Tika 是一个强大的工具,用于从各种文件中提取内容和元数据。📄Tika 支持解析文档、📸图像、🎵音频、🎥视频文件以及其他多种格式,非常适合构建🔍搜索引擎、📂内容管理系统和📊数据分析工具。 样例代码:https://gitee.com/lhdxhl/springboot-…...

SVM(支持向量机)

SVM&#xff08;支持向量机&#xff09; 原理 SVM的核心目标是找到一个最大化分类间隔的超平面&#xff0c;将不同类别的样本分隔开。其原理可分为三部分&#xff1a; 线性可分情况 通过硬间隔最大化确定超平面&#xff0c;确保所有样本正确分类且间隔最大间隔定义为超平面到最…...

Spark,hadoop的组成

&#xff08;一&#xff09;Hadoop的组成 对普通用户来说&#xff0c; Hadoop就是一个东西&#xff0c;一个整体&#xff0c;它能给我们提供无限的磁盘用来保存文件&#xff0c;可以使用提供强大的计算能力。 在Hadoop3.X中&#xff0c;hadoop一共有三个组成部分&#…...

数据结构中的各种排序

排序之冒泡排序 原理&#xff1a;比较相邻的元素&#xff0c;将大的元素放右边&#xff0c;小的元素放左边。每一趟排的最后的元素一定是最大的元素&#xff0c;所有下一趟需要排列的元素可减少一个 public int[] bubbleSort(int[] attr) {for (int i 0; i < attr.length…...

Android 中实现 GIF 图片动画

在 Android 中&#xff0c;ImageView 从 Android 9.0&#xff08;API 级别 28&#xff09; 开始原生支持 GIF 动画&#xff0c;通过 AnimatedImageDrawable 类实现。在之前的版本中&#xff0c;ImageView 并不支持直接播放 GIF 动画&#xff0c;只能显示 GIF 的第一帧。 一、 …...

linux安装mysql数据库

1.判断系统是多少位的 file /sbin/init2.下载linux安装包 5.7.25.64位安装包链接&#xff1a;https://pan.baidu.com/s/13vFuRikwJaI96K0AmUQXzg提取码&#xff1a;ga7h其他版本安装 去官网下载&#xff1a;https://dev.mysql.com/downloads/mysql/3.创建mysql文件夹 mkdir /…...

基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线。输出指标包括最小平均流动时间&#xff0c;最大完工时间&#xff0c;最小间隙时间。 2…...

uniapp云打包针对谷歌视频图片权限的解决方案

谷歌在24年底推出把图片和视频细分为两个权限&#xff0c;uniapp使用uni.chooseImage云打包默认图片视频为一个权限,不符合谷歌要求会被下架 解决方法&#xff0c;在项目根目录下新建AndroidManifest.xml移除不必要的权限 <?xml version"1.0" encoding"utf…...

DSRAM介绍

DSRAM&#xff08;双端口静态随机存储器&#xff09;介绍 1. 基本概念 DSRAM&#xff08;Dual-Port Static Random Access Memory&#xff09;是一种双端口SRAM&#xff0c;支持两个独立的读写接口&#xff0c;允许两个设备&#xff08;如CPU、DMA、FPGA&#xff09;同时访问…...

【仿Mudou库one thread per loop式并发服务器实现】HTTP协议模块实现

HTTP协议模块实现 1. Util模块2. HttpRequest模块3. HttpResponse模块4. HttpContext模块5. HttpServer模块 1. Util模块 这个模块是一个工具模块&#xff0c;主要提供HTTP协议模块所用到的一些工具函数&#xff0c;比如url编解码&#xff0c;文件读写…等。 #include "s…...

教育行业网络安全:守护学校终端安全,筑牢教育行业网络安全防线!

教育行业面临的终端安全问题日益突出&#xff0c;主要源于教育信息化进程的加速、终端设备多样化以及网络环境的开放性。 以下是教育行业终端安全面临的主要挑战&#xff1a; 1、设备类型复杂化 问题&#xff1a;教育机构使用的终端设备包括PC、服务器等&#xff0c;操作系统…...

【网工第6版】第5章 网络互联②

目录 ■ IPV6 ▲ IPV6报文格式 ◎ IPV6扩展报头&#xff08;RFC2460&#xff09; ◎ IPv6相关协议 ▲ IPV6地址分类 ◎ IPv6地址基础 ◎ IPv6地址举例 ◎ IPv6地址分类 ◎ 特殊地址对比IPv4 vs IPv6 ▲ 过渡技术 本章重要程度&#xff1a;☆☆☆☆☆ ■ IPV6 与IPv4…...

ASP.NET Core 分层项目中EFCore的使用

文章目录 前言一、核心二、项目分层结构1&#xff09;安装 NuGet 包Web 项目InfrastructureLibrary项目 2&#xff09;领域模型和仓储接口 (Domain 层)3&#xff09;基础设施层实现 (Infrastructure 层)4&#xff09;应用层服务 (Application 层)5&#xff09;Web API 配置6&am…...

.net core 中directory , directoryinfo ,file, fileinfo区别,联系,场景

一、类定义及核心功能 ‌Directory类‌ ‌类型‌&#xff1a;静态类 ‌功能‌&#xff1a;提供目录操作的静态方法&#xff0c;包括创建、删除、移动目录&#xff0c;以及获取子目录或文件列表等。例如Directory.CreateDirectory()、Directory.GetFiles()。 ‌适用场景‌&…...

jvm-获取方法签名的方法

在Java中&#xff0c;获取方法签名的方法可以通过以下几种方式实现&#xff0c;具体取决于你的需求和使用场景。以下是详细的介绍&#xff1a; 1. 使用反射 API Java 提供了 java.lang.reflect.Method 类来获取方法的相关信息&#xff0c;包括方法签名。 示例代码&#xff1a…...

three.js中的instancedMesh类优化渲染多个同网格材质的模型

three.js小白的学习之路。 在上上一篇博客中&#xff0c;简单验证了一下three.js中的网格共享。写的时候就有一些想法&#xff0c;如果说某个场景中有一万棵树&#xff0c;这些树共享一个geometry和material&#xff0c;有没有好的办法将其进行一定程度上的渲染优化&#xff0…...

2025年一站式AI创作平台主要功能介绍及使用教程

在当今迅速发展的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动创新和提升工作效率的关键工具。今天给大家分享一个全面的一站式AIGC内容创作平台&#xff0c;对其主要功能及使用教程进行讲解&#xff0c;旨在帮助用户显著提升工作和学习效率。无论您需要…...

YOLO11改进,尺度动态损失函数Scale-based Dynamic Loss,减少标签不准确对损失函数稳定性的影响

在目标检测领域,标签噪声与尺度敏感问题始终是制约模型性能提升的"阿喀琉斯之踵"。2025年CVPR最佳论文提出的尺度动态损失函数(Scale-based Dynamic Loss, SDL),通过构建自适应损失调节机制,不仅实现了对YOLOv11检测精度的指数级提升,更重新定义了损失函数的设…...

<项目代码>YOLO小船识别<目标检测>

项目代码下载链接 YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0…...

我用deepseek做了一个提取压缩文件夹下pdf和word文件工具

由于最近需要把大量的压缩文件的pdf和word文件统一复制到一个文件夹中。 我们一般正常操作方式的是把一个压缩文件一个一个解压&#xff0c;然后在把一个的解压好的文件夹下文件复制到另外一个文件夹中。 这个也需太繁琐了&#xff0c;从以往统计的需要花费两个小时间&#x…...

单例模式 (Singleton Pattern)

单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。 核心特点 唯一性&#xff1a;一个类只能有一个实例 全局访问&#xff1a;提供全局访问该实例的方式 延迟初始化&#xff1a;通常在第一次被请求时才创建实…...

01-初识前端

一、邂逅前端开发 1.1. 软件开发、软件开发体系 这儿放个图~ 1.2.完善的应用程序包括哪些&#xff1f; 服务器开发 iOS开发、Android开发 Web开发 桌面开发&#xff08;windows&#xff0c;mac os&#xff09; iOS、mac os&#xff08;OC&#xff0c;swift&#xff09;&am…...

【JavaWeb后端开发03】MySQL入门

文章目录 1. 前言1.1 引言1.2 相关概念 2. MySQL概述2.1 安装2.2 连接2.2.1 介绍2.2.2 企业使用方式(了解) 2.3 数据模型2.3.1 **关系型数据库&#xff08;RDBMS&#xff09;**2.3.2 数据模型 3. SQL语句3.1 DDL语句3.1.1 数据库操作3.1.1.1 查询数据库3.1.1.2 创建数据库3.1.1…...

使用纯前端技术html+css+js实现一个蔬果商城的前端模板!

当我们刚开始学习前端的时候&#xff0c;我们都会先学习一些基础的编程知识点。对于网站开发前端学习&#xff0c;我们就会学习 html css js 等基础的前端技术&#xff0c;我们学习了基础编程知识后&#xff0c;肯定是需要一些项目&#xff0c;或者一些练习题&#xff0c;巩固一…...

SAP系统生产跟踪报表入库数异常

生产跟踪报表入库数异常 交库21820,入库43588是不可能的 原因排查: 报表的入库数取值,是取移动类型321 (即系检验合格后过账到非限制使用)的数. 查凭证,101过账2次21807,321过账了2次21794,然后用102退1次21794.就是说这批物料重复交库了. 解决&#xff1a; 方案一:开发增强设…...

mac 本地 docker 部署 nacos

标题查看 docker 的 nacos 版本 查看可用的Nacos版本,以最新版为例. 指定版本 自己修改即可. 访问Nacos镜像库地址&#xff1a;https://hub.docker.com/r/nacos/nacos-server/tags?page1&orderinglast_updated 标题二、挂载目录配置步骤 标题‌创建本地目录‌ 按用户要…...

cgroup threaded功能例子

一、背景 cgroup在如今的系统里基本都是默认打开的一个功能。对于cgroup的cpu子系统&#xff0c;默认的颗粒度是进程为维度进行cgroup的cpu及cpuset的控制。而对于一些复杂进程&#xff0c;可能的需求是进程里一些个别线程要绑定在X1-Xn这些cpu核上&#xff0c;而除了这些个别…...

Elasticsearch插件:IDEA中的Elasticsearch开发利器

Elasticsearch插件&#xff1a;IDEA中的Elasticsearch开发利器 一、插件概述 Elasticsearch插件是为IntelliJ IDEA设计的专业工具&#xff0c;它让开发者能在IDE内直接与Elasticsearch集群交互&#xff0c;提供了查询编写、索引管理、数据分析等全方位支持。 核心价值&#…...

electron从安装到启动再到打包全教程

目录 介绍 安装 修改npm包配置 执行安装命令 源代码 运行 打包 先安装git, 安装打包工具 导入打包工具 执行打包命令 总结 介绍 electron确实好用,但安装是真的要耗费半条命。每次安装都会遇到各种问题,然后解决了之后。后面就不需要安装了,但有时候比如电脑重装…...

【Linux】轻量级命令解释器minishell

Minishell 一、项目背景 在linux操作系统中&#xff0c;用户对操作系统进行的一系列操作都不能直接操作内核&#xff0c;而是通过shell间接对内核进行操作。 Shell 是操作系统中的一种程序&#xff0c;它为用户提供了一种与操作系统内核和计算机硬件进行交互的界面。用户可以通…...

KEIL报错解决方案:No Algorithm found for: 08001000H - 080012EBH?

改这里&#xff1a; Cortex JLink/JTrace Target Drive - Flash Download - Size&#xff1a; 配好你这款芯片应该用的空间大小...

用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置

原文链接&#xff1a;用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在银河麒麟操作系统的 LiveCD 或系统试用镜像环境下&#xff0c;如何查看原系统中电脑的 IP 地址与网络打印机 IP 地址的实用教程。在系统损坏…...

DeepseekV3MLP 模块

目录 代码代码解释导入和激活函数配置类初始化方法前向传播方法计算流程 代码可视化 代码 import torch import torch.nn as nn import torch.nn.functional as F# 定义激活函数字典 ACT2FN {"relu": F.relu,"gelu": F.gelu,"silu": F.silu,&q…...

Ubuntu 系统下安装和使用性能分析工具 perf

在 Ubuntu 系统下安装和使用性能分析工具 perf 的步骤如下&#xff1a; 1. 安装 perf perf 是 Linux 内核的一部分&#xff0c;通常通过安装 linux-tools 包获取&#xff1a; # 更新软件包列表 sudo apt update# 安装 perf&#xff08;根据当前内核版本自动匹配&#xff09; …...

安恒Web安全面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...

OSPF --- LSA

文章目录 一、OSPF LSA&#xff08;链路状态通告&#xff09;详解1. LSA通用头部2. OSPFv2 主要LSA类型a. Type 1 - Router LSAb. Type 2 - Network LSAc. Type 3 - Summary LSAd. Type 4 - ASBR Summary LSAe. Type 5 - AS External LSAf. Type 7 - NSSA External LSA 3. LSA泛…...

IDEA/WebStorm中Git操作缓慢的解决方案

问题描述 在WebStorm中进行前端开发时&#xff0c;发现Git操作&#xff08;如push、checkout、pull等&#xff09;特别缓慢&#xff0c;而在命令行(cmd)中执行相同的Git命令却很快&#xff0c;排除了网络问题。 解决方案 通过修改WebStorm安装目录下的runnerw.exe文件名可以…...

网络威胁情报 | Yara

Yara 是一个在威胁情报、数字取证和威胁猎取方面较为常用的语言。本文并非是Yara语言的教程&#xff0c;更多的是希望可以让大家知道这个语言的神奇之处及其在当今信息安全领域的重要性。 Yara 是什么&#xff1f; “恶意软件研究人员&#xff08;以及其他所有人&#xff09;…...