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

Linux: ASoC 声卡硬件参数的设置过程简析

文章目录

  • 1. 前言
  • 2. ASoC 声卡设备硬件参数
    • 2.1 将 DAI、Machine 平台的硬件参数添加到声卡
    • 2.2 打开 PCM 流时将声卡硬件参数配置到 PCM 流
    • 2.3 应用程序对 PCM 流参数进行修改调整

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. ASoC 声卡设备硬件参数

ASoC(ALSA System-on-Chip) 声卡驱动框架如下图所示:
在这里插入图片描述
整个声卡驱动由 CPU DAI 驱动CODEC DAI 驱动Machine 驱动(胶水粘合驱动)3 者拼接构成,所以声卡硬件参数,自然也同时受这 3 者的共同约束。

声卡的硬件参数管理过程包括以下两步:

1. 将 DAI (CPU 侧 + CODEC 侧)、Machine 平台的 声卡硬件参数 添加到声卡
2. 打开 PCM 流时,将 声卡的硬件参数 配置到 PCM 流
3. 应用程序在硬件参数允许的范围内,对 PCM 流参数进行修改调整

2.1 将 DAI、Machine 平台的硬件参数添加到声卡

声卡硬件参数主要包括:通道数,数据格式(S16_LE,S32_LE,...),采样率,period 大小,FIFO 大小 等。这些声卡硬件参数来自于 DAI 接口驱动、Machine 平台驱动。这里以 CPU 侧 DAI 驱动硬件参数为例,来剖析声卡硬件参数的添加过程。如:

static struct snd_soc_dai_driver sun4i_i2s_dai = {.probe = sun4i_i2s_dai_probe,.capture = {.stream_name = "Capture",.channels_min = 2,.channels_max = 2,.rates = SNDRV_PCM_RATE_8000_192000,.formats = SNDRV_PCM_FMTBIT_S16_LE,},.playback = {.stream_name = "Playback",.channels_min = 2,.channels_max = 2,.rates = SNDRV_PCM_RATE_8000_192000,.formats = SNDRV_PCM_FMTBIT_S16_LE,},.ops = &sun4i_i2s_dai_ops,.symmetric_rates = 1,
};

上面的示例代码定义了 SoC CPU 一侧 DAI 接口 I2S 支持的通道数、数据格式、采样率,然后通过接口 snd_soc_register_component() ,将声卡 DAI 组件注册到系统,即添加到声卡组件对象(struct snd_soc_component)全局列表 component_list

devm_snd_soc_register_component(&pdev->dev,&sun4i_i2s_component,&sun4i_i2s_dai, 1)snd_soc_register_component()struct snd_soc_component *component;...component = kzalloc(sizeof(*component), GFP_KERNEL);...ret = snd_soc_component_initialize(component, component_driver, dev);...snd_soc_component_add(component)...list_add(&component->list, &component_list); /* (1) 添加到声卡组件全局列表 @component_list */

然后在注册声卡时,将声卡组件对象(struct snd_soc_component)添加到声卡(声卡组件对象(struct snd_soc_component)作为声卡的一部分),这一过程也将包含在 DAI 驱动内的 DAI 硬件参数添加到了声卡:

snd_soc_register_card()snd_soc_instantiate_card()soc_bind_dai_link()static int soc_bind_dai_link(struct snd_soc_card *card,struct snd_soc_dai_link *dai_link)
{.../* 集成 CPU 一侧 DAI (驱动) 到声卡 */rtd->cpu_dai = snd_soc_find_dai(&cpu_dai_component);snd_soc_rtdcom_add(rtd, rtd->cpu_dai->component);.../* Find CODEC from registered CODECs */codec_dais = rtd->codec_dais;for (i = 0; i < rtd->num_codecs; i++) { /* 集成 CODEC 一侧 DAI (驱动) 到声卡 */codec_dais[i] = snd_soc_find_dai(&codecs[i]); // 查找 DAI...snd_soc_rtdcom_add(rtd, codec_dais[i]->component); // 添加 DAI 到声卡(包括 DAI 携带的硬件参数)}...
}struct snd_soc_dai *snd_soc_find_dai(const struct snd_soc_dai_link_component *dlc)
{.../* Find CPU DAI from registered DAIs*/list_for_each_entry(component, &component_list, list) {// 匹配 DAI...list_for_each_entry(dai, &component->dai_list, list) {...return dai; // 返回匹配的 DAI}}...
}static int snd_soc_rtdcom_add(struct snd_soc_pcm_runtime *rtd,struct snd_soc_component *component)
{...list_add_tail(&new_rtdcom->list, &rtd->component_list);...
}

2.2 打开 PCM 流时将声卡硬件参数配置到 PCM 流

open("/dev/snd/pcmC%dD%dp", ...)...snd_pcm_playback_open() / snd_pcm_capture_open()snd_pcm_open()snd_pcm_open_file()snd_pcm_open_substream()struct snd_pcm_runtime {...struct snd_pcm_hardware hw;struct snd_pcm_hw_constraints hw_constraints;...
};int snd_pcm_open_substream(struct snd_pcm *pcm, int stream,struct file *file,struct snd_pcm_substream **rsubstream)
{...// 将 DAI 等的硬件参数 配置到 PCM 流if ((err = substream->ops->open(substream)) < 0) // ASoC 架构下: soc_pcm_open() goto error;...// 将 参数 转换为 约束参数形式err = snd_pcm_hw_constraints_complete(substream);...
}// 将 DAI 等的硬件参数 配置到 PCM 流
soc_pcm_open() // ASoC 架构下soc_pcm_init_runtime_hw()static void soc_pcm_init_runtime_hw(struct snd_pcm_substream *substream)
{struct snd_pcm_runtime *runtime = substream->runtime;struct snd_pcm_hardware *hw = &runtime->hw;...struct snd_soc_pcm_stream *codec_stream;struct snd_soc_pcm_stream *cpu_stream;...// CPU DAIif (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)cpu_stream = &cpu_dai_drv->playback; // &sun4i_i2s_dai.playbackelsecpu_stream = &cpu_dai_drv->capture; // &sun4i_i2s_dai.capture.../* 配置声卡 DAI 的参数到 PCM 流 */hw->channels_min = max(chan_min, cpu_stream->channels_min);hw->channels_max = min(chan_max, cpu_stream->channels_max);if (hw->formats)hw->formats &= formats & cpu_stream->formats;elsehw->formats = formats & cpu_stream->formats;...
}int snd_pcm_hw_constraints_complete(struct snd_pcm_substream *substream)
{struct snd_pcm_runtime *runtime = substream->runtime;struct snd_pcm_hardware *hw = &runtime->hw;......err = snd_pcm_hw_constraint_mask(runtime, SNDRV_PCM_HW_PARAM_ACCESS, mask);...err = snd_pcm_hw_constraint_mask64(runtime, SNDRV_PCM_HW_PARAM_FORMAT, hw->formats);...err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_CHANNELS,hw->channels_min, hw->channels_max);...err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIODS,hw->periods_min, hw->periods_max);...err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,hw->period_bytes_min, hw->buffer_bytes_max);...
}int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,unsigned int min, unsigned int max)
{struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;struct snd_interval t;t.min = min;t.max = max;t.openmin = t.openmax = 0;t.integer = 0;return snd_interval_refine(constrs_interval(constrs, var), &t);
}

2.3 应用程序对 PCM 流参数进行修改调整

2.2 小节中,在 open("/dev/snd/pcmC%dD%dp", ...) 打开 PCM 流时,设置了 PCM 的默认硬件参数,但这并不一定符合用户的预期,譬如采样率,通道数,数据格式等,这时候用户空间可以通过 ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, &hwparams) 来进行调整:

sys_ioctl()...snd_pcm_ioctl()snd_pcm_common_ioctl()snd_pcm_hw_params_user()snd_pcm_hw_params()static int snd_pcm_hw_params_user(struct snd_pcm_substream *substream,struct snd_pcm_hw_params __user * _params)
{struct snd_pcm_hw_params *params;.../* 复制用户空间参数到内核空间 */params = memdup_user(_params, sizeof(*params));.../* 按用户请求参数 @_params,对当前设置的参数做可能的调整 */err = snd_pcm_hw_params(substream, params);.../* 修改后的参数,从 @_params 返回用户空间 */if (copy_to_user(_params, params, sizeof(*params)))err = -EFAULT;
end:kfree(params);return err;
}static int snd_pcm_hw_params(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *params)
{struct snd_pcm_runtime *runtime;...params->rmask = ~0U;err = snd_pcm_hw_refine(substream, params); /* 对 所有 硬件参数,按用户请求参数 @params,做可能的调整 */.../* 更新 用户参数 @params 到 PCM 流 */runtime->access = params_access(params);runtime->format = params_format(params);runtime->subformat = params_subformat(params);runtime->channels = params_channels(params);runtime->rate = params_rate(params);runtime->period_size = params_period_size(params);runtime->periods = params_periods(params);runtime->buffer_size = params_buffer_size(params);runtime->info = params->info;runtime->rate_num = params->rate_num;runtime->rate_den = params->rate_den;...return 0;_error:...
}int snd_pcm_hw_refine(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *params)
{.../* 对所有 掩码类型参数 做可能的调整 */err = constrain_mask_params(substream, params);.../* 对所有 区间类型参数 做可能的调整 */err = constrain_interval_params(substream, params);.../* 对 所有类型(掩码类 + 区间类) 的所有参数 按 约束规则 做可能的调整 */err = constrain_params_by_rules(substream, params);...
}

这列只看 constrain_interval_params() 的调整参数的过程,其它的类似:

static int constrain_interval_params(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *params)
{// 这里的 ,正是前面 2.2 分析 PCM 打开过程中, snd_pcm_hw_constraint_minmax() 设置的struct snd_pcm_hw_constraints *constrs =&substream->runtime->hw_constraints;struct snd_interval *i;unsigned int k;...for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++) {i = hw_param_interval(params, k);.../* 对区间类型参数做可能的调整 */changed = snd_interval_refine(i, constrs_interval(constrs, k));...}return 0;
}

到此,对声卡硬件参数管理设置过程分析已毕。对应硬件参数,声卡还有软件参数,对这部分感兴趣的读者,可自行阅读相关源码。

相关文章:

Linux: ASoC 声卡硬件参数的设置过程简析

文章目录 1. 前言2. ASoC 声卡设备硬件参数2.1 将 DAI、Machine 平台的硬件参数添加到声卡2.2 打开 PCM 流时将声卡硬件参数配置到 PCM 流2.3 应用程序对 PCM 流参数进行修改调整 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&am…...

网络基础知识与配置

目录 网络基础知识 &#xff08;一&#xff09;网络的概念 &#xff08;二&#xff09;网络协议 &#xff08;三&#xff09;网络拓扑结构 &#xff08;四&#xff09;IP地址和子网掩码 显示和配置网络接口 &#xff08;一&#xff09;在Windows系统中 &#xff08;二&a…...

【STM32】ADC|多通道ADC采集

本次实现的是ADC实现数字信号与模拟信号的转化&#xff0c;数字信号时不连续的&#xff0c;模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法&#xff0c;使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时&#xff0c;0~ 3.3v(模拟信…...

centos 7 关于引用stdatomic.h的问题

问题&#xff1a;/tmp/tmp4usxmdso/main.c:6:23: fatal error: stdatomic.h: No such file or directory #include <stdatomic.h> 解决步骤&#xff1a; 1.这个错误是因为缺少C编译器的标准原子操作头文件 stdatomic.h。在Linux系统中&#xff0c;我们需要安装开发工具…...

用语言模型探索语音风格空间:无需情感标签的情 感TTS

用语言模型探索语音风格空间&#xff1a;无需情感标签的情感TTS 原文&#xff1a;Exploring speech style spaces with language models: Emotional TTS without emotion labels 今天我们要说的是 一种无需情感标签的情感TTS。提出了一个基于FastSpeech2的E-TTS框架&#xff0…...

将Excel中的图片保存下载并导出

目录 效果演示 注意事项 核心代码 有需要将excel中的图片解析出来保存到本地的小伙子们看过来&#xff01;&#xff01;&#xff01; 效果演示 注意事项 仅支持xlsx格式&#xff1a;此方法适用于Office 2007及以上版本的.xlsx文件&#xff0c;旧版.xls格式无法使用。 图片名…...

2.11日学习总结

题目一 &#xff1a; AC代码 #include <stdio.h> #include <stdlib.h>// 定义长整型 typedef long long ll;// 定义求最大值和最小值的宏函数 #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))// 定义数组和变量 ll…...

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域&#xff0c;运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌&#xff0c;安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景&#xff0c;正在为智能制造注入强劲动力&#xff01; MP3100&#xff1a;主板型运动控制…...

【腾讯地图】录入经纬度功能 - 支持地图选点

目录 效果展示代码引入地图服务地址弹框中输入框 - 支持手动输入经纬度/地图选点按钮地图选点弹框组件 当前文章 - 地图功能与 https://blog.csdn.net/m0_53562074/article/details/143677335 功能类似 效果展示 代码 引入地图服务地址 public/index.html <!-- 互联网地图…...

Mybatis快速入门与核心知识总结

Mybatis 1. 实体类&#xff08;Entity Class&#xff09;1.1 实体类的定义1.2 简化编写1.2.1 Data1.2.2 AllArgsConstructor1.2.3 NoArgsConstructor 2. 创建 Mapper 接口2.1 Param2.2 #{} 占位符2.3 SQL 预编译 3. 配置 MyBatis XML 映射文件&#xff08;可选&#xff09;3.1 …...

RK3568平台开发系列讲解(调试篇)网卡队列均衡负载

🚀返回专栏总目录 文章目录 一、RPS 的介绍1. RPS 的工作原理2. RPS 配置3. 启用和调优 RPS4. RPS 优势二、下行测试iperf测试沉淀、分享、成长,让自己和他人都能有所收获!😄 RPS(Receive Packet Steering) 是一种用于提高网络接收性能的技术,通常用于多核处理器系统中…...

Matlab机械手碰撞检测应用

本文包含三个部分&#xff1a; Matlab碰撞检测的实现URDF文件的制作机械手STL文件添加夹爪 一.Matlab碰撞检测的实现 首先上代码 %% 检测在结构环境中机器人是否与物体之间发生碰撞情况&#xff0c;如何避免&#xff1f; % https://www.mathworks.com/help/robotics/ug/che…...

【前端】几种常见的跨域解决方案代理的概念

几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff1a;2. Nginx代理3. Vue CLI配置代理&#xff1a;4 .uni-app在manifest.json中配置代理来解决&#xff1a;5. 使用WebSocket通讯…...

服务器有多少线程?发起一个请求调用第三方服务,是新增加一个请求吗?如果服务器线程使用完了怎么办?

目录 1. 服务器有多少线程? (1)服务器类型 (2)配置参数 (3)硬件资源 2. 发起一个请求调用第三方服务,是新增加一个线程吗? (1)同步调用 (2)异步调用 (3)HTTP 客户端 3. 如果服务器线程使用完了怎么办? (1)请求被拒绝 (2)性能下降 (3)解决方案…...

【Spring AI】基于SpringAI+Vue3+ElementPlus的QA系统实现一

整理不易&#xff0c;请不要吝啬你的赞和收藏。 1. 前言 这是 SpringAI 系列的第二篇文章&#xff0c;这篇文章将介绍如何基于 RAG 技术&#xff0c;使用 SpringAI Vue3 ElementPlus 实现一个 Q&A 系统。本文使用 deepseek 的 DeepSeek-V3 作为聊天模型&#xff0c;使用…...

前端快速生成接口方法

大家好&#xff0c;我是苏麟&#xff0c;今天聊一下OpenApi。 官网 &#xff1a; umijs/openapi - npm 安装命令 npm i --save-dev umijs/openapi 在根目录&#xff08;项目目录下&#xff09;创建文件 openapi.config.js import { generateService } from umijs/openapi// 自…...

【Qt 常用控件】多元素控件(QListWidget、QTabelWidgt、QTreeWidget)

**View和**Widget的区别&#xff1f; **View的实现更底层&#xff0c;**Widget是基于**View封装实现的更易用的类型。 **View使用MVC结构 MVC是软件开发中 经典的 软件结构 组织形式&#xff0c;软件设计模式。 M&#xff08;model&#xff09;模型。管理应用程序的核心数据和…...

java 读取sq3所有表数据到objectNode

1.实现效果&#xff1a;将sq3中所有表的所有字段读到objectNode 对象中&#xff0c;兼容后期表字段增删情况&#xff0c;数据组织形式如下图所示&#xff1a; 代码截图&#xff1a; 代码如下&#xff1a; package com.xxx.check.util;import java.sql.*; import java.util.Arr…...

react redux用法学习

参考资料&#xff1a; https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具&#xff1a;deepseek&#xff0c;通义灵码 第一天 安装相关依赖&#xff1a; 使用redux的中间件&#xff1a; npm i react-redu…...

C++20中的std::atomic_ref

一、std::atomic_ref 我们在学习C11后的原子操作时&#xff0c;都需要提前定义好std::atomic变量&#xff0c;然后才可以在后续的应用程序中进行使用。原子操作的优势在很多场合下优势非常明显&#xff0c;所以这也使得很多开发者越来习惯使用原子变量。 但是&#xff0c;在实…...

encodeURI(),encodeURIComponent()区别

encodeURI()&#xff0c;encodeURIComponent()区别 encodeURI(): 对整个url(链接/网络链接)进行编码。 对中文&#xff0c;完全编码。 对英文不带空格则不会编码&#xff0c;带空格则会对空格编码。 解码&#xff1a;decodeURI() 例如&#xff1a; let ChineseUrl "htt…...

Selenium:网页frame与多窗口处理

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、多窗口处理 1.1、多窗口简介 点击某些链接&#xff0c;会重新打开⼀个窗⼜&#xff0c;对于这种情况&#xff0c;想在新页⾯上操作&#xff0c;就 得先切换窗…...

自动驾驶---如何打造一款属于自己的自动驾驶系统

在笔者的专栏《自动驾驶Planning决策规划》中&#xff0c;主要讲解了行车的相关知识&#xff0c;从Routing&#xff0c;到Behavior Planning&#xff0c;再到Motion Planning&#xff0c;以及最后的Control&#xff0c;笔者都做了相关介绍&#xff0c;其中主要包括算法在量产上…...

开源机器人+具身智能 解决方案+AI

开源机器人、具身智能(Embodied Intelligence)以及AI技术的结合,可以为机器人领域带来全新的解决方案。以下是这一结合的可能方向和具体方案: 1. 开源机器人平台 开源机器人平台为开发者提供了灵活的基础架构,可以在此基础上结合具身智能和AI技术。以下是一些常用的开源机…...

【web自动化】指定chromedriver以及chrome路径

selenium自动化&#xff0c;指定chromedriver&#xff0c;以及chrome路径 对应这篇文章&#xff0c;可以点击查看&#xff0c;详情 from selenium import webdriverdef get_driver():# 获取配置对象option webdriver.ChromeOptions()option.add_experimental_option("de…...

高等代数笔记—线性变换

latex花体字母与花体数字 https://blog.csdn.net/weixin_39589455/article/details/133846783 https://blog.csdn.net/orz_include/article/details/123645710线性变换 线性空间 V V V到自身的映射称为 V V V的一个变换&#xff0c;最基本的是线性变换。 定义&#xff1a;变换…...

Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统

Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统 需求 在实际生成操作过程中&#xff0c;一般会遇到物理服务器存在多块盘的情况。 安装过程中&#xff0c;磁盘的标签是随机分配的&#xff0c;并不是空间较小的盘&#xff0c;就会使用较小的磁盘标签 而需求往往需要…...

2024BaseCTF_week4_web上

继续&#xff01;冲冲冲 目录 圣钥之战1.0 nodejs 原型 原型链 原型链污染 回到题目 flag直接读取不就行了&#xff1f; 圣钥之战1.0 from flask import Flask,request import jsonapp Flask(__name__)def merge(src, dst):for k, v in src.items():if hasattr(dst, __geti…...

大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡

大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡 背景 前端开发接口请求&#xff0c;调试&#xff0c;联调&#xff0c;接入数据&#xff0c;前端必不可少工具&#xff0c;postman是一个非常好…...

内网穿透的应用-Ubuntu本地Docker搭建pichome文件管理系统打造个人云相册

文章目录 前言1.关于pichome2.本地部署pichome3.简单使用pichome4. 安装内网穿透5.配置pichome公网地址6. 配置固定公网地址 前言 你是不是也经常遇到这样的尴尬&#xff1a;手机、电脑里堆满了照片和视频&#xff0c;想找一张特定的图片时却像在大海捞针一样无从下手&#xf…...

深度学习之神经网络框架搭建及模型优化

神经网络框架搭建及模型优化 目录 神经网络框架搭建及模型优化1 数据及配置1.1 配置1.2 数据1.3 函数导入1.4 数据函数1.5 数据打包 2 神经网络框架搭建2.1 框架确认2.2 函数搭建2.3 框架上传 3 模型优化3.1 函数理解3.2 训练模型和测试模型代码 4 最终代码测试4.1 SGD优化算法…...

DeepSeek AI R1推理大模型API集成文档

DeepSeek AI R1推理大模型API集成文档 引言 随着自然语言处理技术的飞速发展&#xff0c;大语言模型在各行各业的应用日益广泛。DeepSeek R1作为一款高性能、开源的大语言模型&#xff0c;凭借其强大的文本生成能力、高效的推理性能和灵活的接口设计&#xff0c;吸引了大量开发…...

怎麼使用靜態住宅IP進行多社媒帳號管理

隨著社交媒體平臺的多樣化&#xff0c;很多人發現一個社媒帳號已經無法滿足需求。以下是幾個常見場景&#xff1a; 企業需求&#xff1a;企業可能需要在不同平臺上運營多個品牌帳號&#xff0c;為每個市場地區單獨設立帳號。個人需求&#xff1a;一些自由職業者或內容創作者可…...

【Elasticsearch】Bucket Selector Aggregation

Elasticsearch 的Bucket Selector Aggregation是一种强大的管道聚合功能&#xff0c;用于根据条件过滤聚合结果中的桶&#xff08;buckets&#xff09;。它允许用户通过编写脚本来动态决定哪些桶应该被保留&#xff0c;哪些应该被过滤掉。以下是对Bucket Selector Aggregation的…...

CEF132 编译指南 MacOS 篇 - 启程:认识 CEF (一)

1. 引言 在当今的软件开发领域&#xff0c;将 Web 技术融入桌面应用程序已成为一种趋势。开发者们寻求一种方式&#xff0c;既能充分利用原生应用的性能&#xff0c;又能享受 Web 开发带来的高效和灵活性。Chromium Embedded Framework (CEF) 应运而生&#xff0c;它是一个基于…...

Python 操作 MongoDB 教程

一、引言 在当今数字化时代&#xff0c;数据的存储和管理至关重要。传统的关系型数据库在处理一些复杂场景时可能会显得力不从心&#xff0c;而 NoSQL 数据库应运而生。MongoDB 作为一款开源的、面向文档的 NoSQL 数据库&#xff0c;凭借其高性能、高可扩展性和灵活的数据模型…...

长安汽车发布“北斗天枢2.0”计划,深蓝汽车普及全民智驾

2月9日&#xff0c;长安汽车智能化战略“北斗天枢2.0”计划暨深蓝汽车全场景智能驾驶解决方案发布会在重庆盛大召开。此次发布会标志着长安汽车正式迈入智能化战略的新纪元&#xff0c;携手众多“中国智驾合伙人”&#xff0c;共同开启全民智驾元年。 发布会上&#xff0c;长安…...

SpringBoot速成(七)注册实战P2-P4

1.创建 数据库创建 依赖引入 <!-- mybatis起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency> <…...

大语言模型RAG,transformer

1、RAG技术流总结 第一张图是比较经典的RAG知识图谱&#xff0c;第二张图是更加详细扎实的介绍图。 1.1 索引 坦白来说这部分的技术并不是大模型领域的&#xff0c;更像是之前技术在大模型领域的应用&#xff1b;早在2019年我就做过faiss部分的尝试&#xff0c;彼时索引技术已…...

Crowdin 在线本地化平台调用硅基流动AI预翻译

平台介绍 硅基流动&#xff08;AI服务平台&#xff09; 官网&#xff1a;https://siliconflow.cn/zh-cn/ 官方介绍 我主要使用&#xff1a;云服务平台 SilliconCloud 此平台已经将热门的开源大语言模型部署&#xff0c;花钱买额度&#xff0c;就能使用 API 最近有上线 Deep…...

第5章 数据库系统(选择|案例|论文)(重点★★★★★)

5.1 数据库管理系统1 数据库是长期存储在计算机内的、有组织的、可共享的数据集合&#xff0c;数据库系统是指在计算机信息系统中引入数据库后的系统&#xff0c;一般由数据库、数据库管理系统 (DataBaseManagement System&#xff0c;DBMS)、应用系统、数据库管理员(DataBase…...

linux部署node服务

1、安装nvm管理node版本 # 下载、解压到指定目录 wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.1.tar.gz tar -zxvf nvm-0.39.0.tar.gz -C /opt/nvm # 配置环境 vim ~/.bashrc~&#xff1a;这是一个路径简写符号&#xff0c;代表当前用户的主目录。在大多数 …...

【AI赋能】蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手

蓝耘智算平台实战指南&#xff1a;3步构建企业级DeepSeek智能助手 引言&#xff1a;AI大模型时代的算力革命 在2025年全球AI技术峰会上&#xff0c;DeepSeek-R1凭借其开源架构与实时推理能力&#xff0c;成为首个通过图灵测试的中文大模型。该模型在语言理解、跨模态交互等维…...

hyperf知识问题汇总

1、简单说下 hyperf&#xff08;什么是 hyperf&#xff09; 答&#xff1a;hyperf 是一个依赖swoole扩展的 php 开源开发框架&#xff0c;它由黄朝辉团队设计创建维护&#xff0c;具备简洁而强大的组件和超强的并发性能&#xff0c;而且还支持微服务架构&#xff0c;例如&…...

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA data source1: BH coordination tabledata source2:BH layer tableprocess 1:Collect BH List To Layer Tableprocess 2:match Reduced Level from "Layer"+"BH"data source1: BH coordination…...

DeepSeek-R1技术革命:用强化学习重塑大语言模型的推理能力

引言&#xff1a;低成本高性能的AI新范式 在2025年1月&#xff0c;中国AI公司DeepSeek发布了两个标志性模型——DeepSeek-R1-Zero与DeepSeek-R1&#xff0c;以仅600万美元的训练成本实现了与OpenAI O1系列&#xff08;开发成本约5亿美元&#xff09;相当的推理性能&#xff0c…...

SQLite 约束

SQLite 约束 SQLite 是一种轻量级的数据库管理系统,它以其简洁的设计和高效的性能在众多数据库系统中脱颖而出。在SQLite中,约束是一种用于确保数据完整性和一致性的机制。本文将详细介绍SQLite中的各种约束,包括它们的用途、语法以及在实际应用中的注意事项。 1. 约束概述…...

Vue.js 状态管理库Pinia

Pinia Pinia &#xff1a;Vue.js 状态管理库Pinia持久化插件-persist Pinia &#xff1a;Vue.js 状态管理库 Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 要使用Pinia &#xff0c;先要安装npm install pinia在main.js中导入Pinia 并使用 示例…...

qwen2.5-vl-7B视觉大模型 私有化部署webUI

服务器选用&#xff1a;算力云 部署qwen2.5-vl-7B&#xff0c;24g显卡跑不起图&#xff0c;单问问题就占20g左右。有能力可以用大点的显卡 一、下载模型 Qwen2.5-VL-7B-Instruct 有conda &#xff0c;可以在conda下操作&#xff0c;不知道conda的同学可以参考本博主之前的文章…...

Spring Boot 线程池自定义拒绝策略:解决任务堆积与丢失问题

如何通过自定义线程池提升系统稳定性 背景 在高并发系统中&#xff0c;线程池管理至关重要。默认线程池可能导致&#xff1a; 资源浪费&#xff08;创建过多线程导致 OOM&#xff09;任务堆积&#xff08;队列满后任务被拒绝&#xff09;任务丢失&#xff08;默认拒绝策略丢…...