Ubuntu13下调试USB AUDIO的一些记录

2023-11-06

 最近想玩玩LINUX,于是双系统装了一个Ubuntu13.04。

    在新系统下用着都还好,不过我自己DIY的USB DAC出了问题。在WIN7下能正常工作,但是在Ubuntu下就爆音不断,很明显是音频数据流断流引起的。

    这说明stm32上的固件与Ubuntu的USB AUDIO驱动程序不太兼容,于是开始检查。在这个过程中,学到不少调试方法,下面详细描述下调试的过程:

  1.  第一步需要确定USB DAC已经成功连接到PC,这里使用dmesg命令查看内核的信息。

    USB DAC连接PC,输入命令:

     >> dmesg | tail  

[ 2148.890771] usb 1-1.2: Product: Ilmen Audio
[ 2148.890774] usb 1-1.2: Manufacturer: IlmenTech
[ 2148.890778] usb 1-1.2: SerialNumber: 5CDC856933
[ 2150.327668] usb 1-1.2: USB disconnect, device number 83
[ 2151.785785] usb 1-1.2: new full-speed USB device number 84 using ehci-pci
[ 2151.880680] usb 1-1.2: New USB device found, idVendor=0483, idProduct=5730
[ 2151.880687] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2151.880692] usb 1-1.2: Product: Ilmen Audio
[ 2151.880696] usb 1-1.2: Manufacturer: IlmenTech
[ 2151.880699] usb 1-1.2: SerialNumber: 5CDC856933

     可以看到设备的一些信息,USB设备已经成功的连接到PC。(由于最初我的USB配置描述符有BUG,所以可以从内核的输出信息里看到USB没有枚举成功,以及出错的原因)

  2. 第二步是查看这个USB设备的具体信息,这里用到命令lsusb。

    >> lsusb

Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 1366:0101 SEGGER J-Link ARM
Bus 001 Device 004: ID 0483:5730 SGS Thomson Microelectronics 
Bus 002 Device 003: ID 046d:c52f Logitech, Inc. Wireless Mouse M305
Bus 002 Device 004: ID 064e:f207 Suyin Corp.

    lsusb列出了当前所有可用的USB设备,在上面可以看到jlink设备,我的罗技无线鼠标,而"SGS Thomson Microelectronics"就是stm32的USB设备。

    可以看到这个设备在Bus 001下,Device为004;在知道这两个地址后,可以用lsusb命令查看更多该设备的信息。 

    于是输入 >> lsusb -D /dev/bus/usb/001/004 

Device: ID 0483:5730 SGS Thomson Microelectronics 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x0483 SGS Thomson Microelectronics
  idProduct          0x5730 
  bcdDevice            2.00
  iManufacturer           1 
  iProduct                2 
  iSerial                 3 
  bNumConfigurations      1
......

 

     命令行则会列出设备的描述符,由于很长,所以之列出前面几行信息。

     http://www.linuxnix.com/2013/05/find-usb-device-details-in-linuxunix-using-lsusb-command.html这个帖子介绍了lsusb的基本用法,可以参考。

3.  USB设备信息有了,接下来看看系统音频设备列表里的情况。

     查看当前可用的音频设备可以通过命令 >> aplay -l

**** PLAYBACK 硬體裝置清單 ****
card 0: MID [HDA Intel MID], device 0: ALC272 Analog [ALC272 Analog]
  子设备: 1/1
  子设备 #0: subdevice #0
card 0: MID [HDA Intel MID], device 1: ALC272 Digital [ALC272 Digital]
  子设备: 1/1
  子设备 #0: subdevice #0
card 1: Audio [Ilmen Audio], device 0: USB Audio [USB Audio]
  子设备: 0/1
  子设备 #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 3: HDMI 0 [HDMI 0]
  子设备: 1/1
  子设备 #0: subdevice #0

 

    从上面的信息可以看出,此时我的USB  DAC是card 1,为可用的。

    目录/proc/asound/下有各种音频设备,例如我的USB DAC就在/proc/asound/card1/文件夹下,这里可以看到很多音频设备的信息。

    音频设备的参数 >> cat /proc/asound/card1/pcm0p/sub0/hw_params  

access: MMAP_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 44100 (44100/1)
period_size: 1024
buffer_size: 16384

    查看音频流的当前参数 >> cat /proc/asound/card1/stream0

    如果没有播放声音(无音频流)

IlmenTech Ilmen Audio at usb-0000:00:1a.0-1.2, full speed : USB Audio

Playback:
  Status: Stop
  Interface 1
    Altset 1
    Format: S16_LE
    Channels: 2
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100

    若正在播放

IlmenTech Ilmen Audio at usb-0000:00:1a.0-1.2, full speed : USB Audio

Playback:
  Status: Running
    Interface = 1
    Altset = 1
    Packet Size = 196
    Momentary freq = 43640 Hz (0x2b.a3c0)
    Feedback Format = 10.14
    Packet Size = 0
    Momentary freq = 44100 Hz (0x2c.199a)
  Interface 1
    Altset 1
    Format: S16_LE
    Channels: 2
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100

    上面的信息非常有用,可以看到,此音频设备是ASYNC(异步模式),2个声道,有符号16bit的数据格式。

    再往上看,反馈(feedback)的格式是10.14,这在USB 2.0协议里有详细说明。当前反馈的采样率是43640 Hz(会变化),下面那个44100是此设备支持的采样率。

    上面这是我成功解决问题后打印出的信息,在USB DAC工作不正常时(断流),可以看到第一个Moment freq这一项的参数十分接近48000 Hz且不会变动,这是不正常的。

     在google了一天也没找到原因,最后无意间将feedback的范围从 44.1Khz +- 5Khz 减小到44.1Khz +- 1Khz才工作正常。

     可见Ubuntu与WIN7的底层音频驱动有不同,由于没看过具体代码,所也目前也只能猜测:当我反馈的采样率值超过当前设备的“额定采样率”44.1Khz过多后,就导致了当前采样率“卡”在了某一固定值,不知道这算不算一个BUG。

     有关ALSA的东西可以在这里查: http://www.alsa-project.org/main/index.php/Asoundrc

4. 最后再提一个linux下调试USB十分方便的工具:usbmon

     这个USB的抓包工具linux自带,已经编译进内核。

     具体使用方法可以参考http://blog.csdn.net/liuqz2009/article/details/7886461

     不过抓到的数据看起来很不直观, 例如下面我是一小段用usbmon抓到信息:

ead46c00 3346920735 C Zi:1:003:2 0:16:954:0 1 0:0:3 4 = f0e80b00
ead46c00 3346920736 S Zi:1:003:2 -115:16:954 1 -18:0:3 4 <
eddf8600 3346928822 C Zo:1:003:1 0:1:955:0 8 0:0:188 0:188:192 0:380:188 0:568:192 0:760:192 1524 >
eddf8600 3346928836 S Zo:1:003:1 -115:1:955 8 -18:0:188 -18:188:192 -18:380:192 -18:572:188 -18:760:192 1524 = a503c8fd 7703c6fd 3f03c3fd 0803c3fd d102c6fd 9102ccfd 5702d4fd 1602dafd
ea4cbc00 3346936710 C Zo:1:003:1 0:1:963:0 8 0:0:188 0:188:192 0:380:192 0:572:188 0:760:192 1524 >
ea4cbc00 3346936723 S Zo:1:003:1 -115:1:963 8 -18:0:188 -18:188:192 -18:380:192 -18:572:188 -18:760:192 1524 = 08fbf9fa 22fbe5fa 40fbd2fa 5efbc1fa 83fbb9fa abfbb5fa d4fbaffa 03fcb1fa
ead46e40 3346936729 C Zi:1:003:2 0:16:970:0 1 0:0:3 4 = f0e80b00

    要看懂上面的信息还需要借助http://www.mjmwired.net/kernel/Documentation/usb/usbmon.txt里面的说明信息,每一项都有它的含义,需要对照来看。

109    Here is the list of words, from left to right:
110    
111    - URB Tag. This is used to identify URBs, and is normally an in-kernel address
112      of the URB structure in hexadecimal, but can be a sequence number or any
113      other unique string, within reason.
114    
115    - Timestamp in microseconds, a decimal number. The timestamp's resolution
116      depends on available clock, and so it can be much worse than a microsecond
117      (if the implementation uses jiffies, for example).
118    
119    - Event Type. This type refers to the format of the event, not URB type.
120      Available types are: S - submission, C - callback, E - submission error.
121    
122    - "Address" word (formerly a "pipe"). It consists of four fields, separated by
123      colons: URB type and direction, Bus number, Device address, Endpoint number.
124      Type and direction are encoded with two bytes in the following manner:
125        Ci Co   Control input and output
126        Zi Zo   Isochronous input and output
127        Ii Io   Interrupt input and output
128        Bi Bo   Bulk input and output
129      Bus number, Device address, and Endpoint are decimal numbers, but they may
130      have leading zeros, for the sake of human readers.
131    
132    - URB Status word. This is either a letter, or several numbers separated
133      by colons: URB status, interval, start frame, and error count. Unlike the
134      "address" word, all fields save the status are optional. Interval is printed
135      only for interrupt and isochronous URBs. Start frame is printed only for
136      isochronous URBs. Error count is printed only for isochronous callback
137      events.
138    
139      The status field is a decimal number, sometimes negative, which represents
140      a "status" field of the URB. This field makes no sense for submissions, but
141      is present anyway to help scripts with parsing. When an error occurs, the
142      field contains the error code.
143    
144      In case of a submission of a Control packet, this field contains a Setup Tag
145      instead of an group of numbers. It is easy to tell whether the Setup Tag is
146      present because it is never a number. Thus if scripts find a set of numbers
147      in this word, they proceed to read Data Length (except for isochronous URBs).
148      If they find something else, like a letter, they read the setup packet before
149      reading the Data Length or isochronous descriptors.
150    
151    - Setup packet, if present, consists of 5 words: one of each for bmRequestType,
152      bRequest, wValue, wIndex, wLength, as specified by the USB Specification 2.0.
153      These words are safe to decode if Setup Tag was 's'. Otherwise, the setup
154      packet was present, but not captured, and the fields contain filler.
155    
156    - Number of isochronous frame descriptors and descriptors themselves.
157      If an Isochronous transfer event has a set of descriptors, a total number
158      of them in an URB is printed first, then a word per descriptor, up to a
159      total of 5. The word consists of 3 colon-separated decimal numbers for
160      status, offset, and length respectively. For submissions, initial length
161      is reported. For callbacks, actual length is reported.
162    
163    - Data Length. For submissions, this is the requested length. For callbacks,
164      this is the actual length.
165    
166    - Data tag. The usbmon may not always capture data, even if length is nonzero.
167      The data words are present only if this tag is '='.
168    
169    - Data words follow, in big endian hexadecimal format. Notice that they are
170      not machine words, but really just a byte stream split into words to make
171      it easier to read. Thus, the last word may contain from one to four bytes.
172      The length of collected data is limited and can be less than the data length
173      reported in the Data Length word. In the case of an Isochronous input (Zi)
174      completion where the received data is sparse in the buffer, the length of
175      the collected data can be greater than the Data Length value (because Data
176      Length counts only the bytes that were received whereas the Data words
177      contain the entire transfer buffer).

    现在就只看下面这一小段

ead46c00 3346920735 C Zi:1:003:2 0:16:954:0 1 0:0:3 4 = f0e80b00
ead46c00 3346920736 S Zi:1:003:2 -115:16:954 1 -18:0:3 4 <
eddf8600 3346928822 C Zo:1:003:1 0:1:955:0 8 0:0:188 0:188:192 0:380:188 0:568:192 0:760:192 1524 >
eddf8600 3346928836 S Zo:1:003:1 -115:1:955 8 -18:0:188 -18:188:192 -18:380:192 -18:572:188 -18:760:192 1524 = a503c8fd 7703c6fd 3f03c3fd 0803c3fd d102c6fd 9102ccfd 5702d4fd 1602dafd

     第一行的 “ead46c00” 就是上面说明里提到的URB Tag; "3346920735" 是时间戳,以微秒为单位,这个可以从连续的两个feedback验证,

......
ead46c00 3346920735 C Zi:1:003:2 0:16:954:0 1 0:0:3 4 = f0e80b00
......
ead46e40 3346936729 C Zi:1:003:2 0:16:970:0 1 0:0:3 4 = f0e80b00
......

    两个包的时间戳之差约为16000,而我的feedback端点的refresh间隔的确是16ms为周期。

    时间戳之后的 C 代表[feedback]事件类型;在这之后是 address项,它由4个部分组成,以符号:隔开,Zi表示同步In端点,1:003代表bus1下的003号设备,2表示该端点号。

    接下来是“URB Status word”, 包括"URB status, interval, start frame, and error count"。

    之后是“Number of isochronous frame descriptors and descriptors themselves“,这部分首先是一个数代表frame descriptor的个数, 接下来以空格为间隔,列出每个frame descriptor的信息,此信息有3个部分“status, offset, and length”,以 : 符号隔开。可以看到,第一行只有一个frame descriptor,数据长度为3。

    最后是数据长度, 紧跟着是 > < 或 =, 然后就是部分的传输数据了。

     


from: http://www.cnblogs.com/Ilmen/archive/2013/11/30/3451628.html



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu13下调试USB AUDIO的一些记录 的相关文章

  • Wwise指引贴

    几种音频软件的比较 Criware音频引擎跟Wwise在功能上有什么直接的区别么 为什么很多大厂都选择Wwise
  • 音频系统POP音的原理和解决方法

    音频系统POP音的原理和解决方法 目录 文章目录 音频系统POP音的原理和解决方法 目录 音频IC与功放IC的电源时序与功能模块使能时序 功放IC输入端INP与INN的阻抗匹配 增大VBIAS滤波电容 BTL输出和SE输出 减小输出端耦合电
  • 【C】借助DirectSound进行流的形式无缝播放的例子

    DirectSound是DirectX的一个组件 用于播放声音 BGM等 和DirectMusic不一样 DirectSound用于播放波形声音 WAV无损等 而不是midi音乐 通常大家使用DirectSound是直接把一个声波数据全部载
  • 实时音频编程(一)

    系列文章目录 实时音频编程 一 实时音频编程 二 实践与技巧 文章目录 系列文章目录 简介 实时系统 实时系统的分类 实时音频系统 什么会产生 glitch 阻塞 算法的最坏时间复杂度 锁 不使用锁的第一个原因 优先级倒置 不使用锁的第二个
  • HTML5实现音频和视频嵌入

    简介 HTML5未出来之前 在线的音频和视频都是借助Flash或者第三方工具实现的 现在HTML5也支持了这方面的功能 在一个支持HTML5的浏览器中 不需要安装任何插件就能播放音频和视频 原生的支持音频和视频 为HTML5注入了巨大的发展
  • 基于线性预测的语音编码原理解析

    早期的音频系统都是基于声音的模拟信号实现的 在声音的录制 编辑和播放过程中很容易引入各种噪声 从而导致信号的失真 随着信息技术的发展 数字信号处理技术在越来越多领域得到了应用 数字信号更是具备了易于存储和远距离传输 没有累积失真 抗干扰能力
  • C#音频采集 (笔记)

    using System using System Collections Generic using System Text using System IO using System Threading using Microsoft D
  • Android合并音频文件

    java view plain copy 需求 将两个amr格式音频文件合并为1个 注意 amr格式的头文件为6个字节的长度 param partsPaths 各部分路径 param unitedFilePath 合并后路径 public
  • Android Audio系统框架

    Audio System 二 之 Audio系统框架 二 Linux Audio系统框架 2 1 Application 层 2 2 Framework 层 2 3 Libraries 层 2 4 HAL 层 2 5 Tinyalsa 层
  • DirectSound播放PCM(可播放实时采集的音频数据)

    前言 该篇整理的原始来源为http blog csdn net leixiaohua1020 article details 40540147 非常感谢该博主的无私奉献 写了不少关于不同多媒体库的博文 让我这个小白学习到不少 现在将其整理是
  • 音频——WAV 格式详解

    文章目录 WAV 文件格式解析 概述 块解析 RIFF chunk fmt chunk data chunk 示例分析 代码解析 WAV 文件格式解析 概述 wav 文件支持多种不同的比特率 采样率 多声道音频 WAV 文件格式是 Micr
  • BES 的蓝牙串口SPP数据收发实验

    1
  • C++ 播放音频流(PCM裸流)

    直接上代码 如果有需要可以直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用了 注意将声道和频率与你自己的文件对应 当然我自己也用VS2008写了个例子上传了 如果有需要下载地址如下 点击打开链接 这份代码是打开文件截取一段数
  • A²B汽车音频总线介绍

    A B使远程I S TDM成为可能 I S是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准 该总线专责于设备之间的数据传输 广泛应用于各种多媒体系统 I C是两线式串行总线 用于连接微控制器及其外围设备 简单来说就是I C传
  • 免费的包噪音网站分享

    免费的包噪音网站分享 现代生活中 噪音扰人 影响健康和情绪 白噪音可以为人们提供放松心情 提高睡眠质量和专注力的帮助 现在有很多免费的白噪音网站可以任意使用和分享 包括海浪声 雨声 蝉鸣声等等 非常适合在办公室 家里或者旅途中使用 本文为您
  • Android开发之合并文件的几种方式

    下面介绍合并文件的几种方式 并通过合并amr文件来举例介绍合并文件的具体流程 amr格式的文件头是6字节 所以在进行文件合并的时候要减去除第一个文件以外的其他文件的文件头 注意 不同文件的文件头是不一样的 所以在合并的时候根据不同文件相应的
  • 采样位数、采样率、波特率

    实例 16bit 16K 115200 1 采样位数 即采样值或取样值 就是将采样样本幅度量化 它是用来衡量声音波动变化的一个参数 也可以说是声卡的分辨率 它的数值越大 分辨率也就越高 所发出声音的能力越强 在计算机中采样位数一般有8位和1
  • Android 14 CarAudioService

    文章目录 新功能 AudioMirring oemCarService 新功能 AudioMirring 简单的说就是两个bus输出的是同一个音频数据 构建的流程是 一个输入src的bus 和两个输出dst的bus 通过setParamte
  • FMOD Core API 指南

    目录 3 Core API 指南 3 1 什么是 Core API 3 2 链接的插件 3 2 1 静态 3 2 2 动态 3 3 API 功能
  • 免费音效素材网站,一次性介绍清楚

    不管是在游戏 电影 电视剧 短视频还是音频中 合适的音效能够更好的表达内容和渲染氛围 今天给大家分享几个免费音效素材 感兴趣的话可以接着往下看 一 制片帮素材 找音效 制片帮素材不仅有海量的优质视频素材 还有丰富的音效资源 分类清晰 更重要

随机推荐

  • Buuctf(Easy Calc 1)

    一 解题步骤 1 发现了一个可以得到计算结果的输入框 说明这题可能是一道命令执行 或者注入题目 我们输几个数字发现可以得到正确答案 但输入字母就会报错 我们看一下html源码 进行代码审计
  • java给byte赋值_关于JAVA中Byte数据类型二进制赋值运算报错问题

    自从JDK7更新之后 新增了二进制变量的表示 支持将整数类型用二进制来表示 用0b开头 例如 byte b byte 0b1000 0001 short s short 0b1000 0000 0000 0001 新手在这个时候会遇到一个问
  • rabbitmq 客户端golang实战

    rabbitmq消息模式 rabbitmq中进行消息控制的组建可以分为以下几部分 exchange rabbitmq中的路由部件 控制消息的转发路径 queue rabbitmq的消息队列 可以有多个消费者从队列中读取消息 consumer
  • 游戏设计模式笔记(一)[自用]

    目录 学习内容 学习笔记 设计模式简介 Design Pattern 单例模式的学习 第一种方式 第二种方式 第三种方式 单例模式的优点 学习内容 设计模式简介 Design Pattern 单例模式的学习 单例模式的优点 学习笔记 设计模
  • 电脑蓝屏终止代码irql_电脑故障排除之五种常见的蓝屏代码及解决方法

    超过10万人正在关注 赶快来关注吧 这里有你想找的热点资讯 这里有你想要的各种资料 还有海量的资源 还在等什么 快来关注 大佬带你开车 电脑蓝屏 又称蓝屏死机 BSDO 它是系统自我保护的一种现象 遇到蓝屏时不必慌张 利用以下几个方法就能解
  • 地址模块丨前端uniapp微信小程序项目

    小兔鲜儿 地址模块 能够获取不同类型的表单数据 能够动态设置导航栏的标题 能够使用 uni ui 组件库的组件 能够完成收货地址的增删改查的功能 准备工作 静态结构 地址模块共两个页面 地址管理页 地址表单页 划分到会员分包中 地址管理页
  • lua知识系列:lua5.3 GC机制

    插眼 总结 暂无 参考 Lua5 3版GC机制理解 https blog csdn net BigBrick article details 85317491 Lua5 3自动GC触发条件分析与理解 https blog csdn net
  • OpenCV样例calibration

    1 将图片地址写入到xml 创建工程 运行一下文件 C Program Files opencv sources samples cpp imagelist creator cpp cmd运行 cd至 工程目录 x64 Debug gt 命
  • macOS版tensorflow实现GPU加速

    intel版本的教程 我没有M1的所以没试 官方教程链接https developer apple com metal tensorflow plugin https developer apple com metal tensorflow
  • react hook之React.lazy()

    也不怕大家笑话 看到react lazy 我第一个想到的居然是vue 中的一个vue lazy 用户懒加载的插件 但是这两个差别还是有点大的 好了我们言归正传 开始来看看我们的react lazy 其实看见lazy 大家见名知意 就知道是来
  • 网络概述介绍

    网络概括 计算机网络 通过传输介质 通信设施和网络通信协议 把分散在不同地点的计算机设备互联起来 实现资源共享和数据传输 网络编程 编写程序代码将两个或者两个以上的设备进行数据传输 OSI参考模型 将复杂的网络问题根据功能划分到不同层次上
  • tensflower 安装

    V型从v
  • Mysql的执行日志

    Mysql的执行日志可以帮助我们确定在项目中是否完了了连接数据库 尤其是在生产环境中 直接使用命令方式进行定位能够解决很多问题 下面介绍几个常用命令 准备 确定日志开启状态 首先确认你日志是否启用了mysql gt show variabl
  • 一文入门车载以太网,吐血整理!不看后悔!

    前言 近些年来 随着为了让汽车更加安全 智能 环保等 一系列的高级辅助驾驶功能喷涌而出 未来满足这些需求 就对传统的电子电器架构带来了严峻的考验 需要越来越多的电子部件参与信息交互 导致对网络传输速率 稳定性 负载率等方面都提出了更为严格的
  • [数据库] Navicat for MySQL事件Event实现数据每日定期操作

    在我们操作数据库过程中 通常会遇到一些某个时间点操作数据库的问题 例如 1 每天凌晨12点对数据库进行定时备份 结算和汇总 2 每天凌晨2点删除数据库前三天的数据 3 插入某个数据超过一定时间改变某个值的状态 比如预警系统 这里就需要通过E
  • 耦合和解耦的理解 vue高耦合和低耦合的理解

    耦合 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象 在软件工程中 对象之间的耦合度就是对象之间的依赖性 对象之间的耦合越高 维护成本越高 因 此对象的设计应使类和构件之间的耦合最小 解耦 解耦 字面意
  • OpenAI Translator

    简介 OpenAI Translator 一款基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用 使用 ChatGPT API 进行划词翻译和文本润色 借助了 ChatGPT 强大的翻译能力 帮助用户更流畅地阅读外语和编辑
  • Mac下静态库和动态库的创建和使用

    1 演示代码 add cpp int add int a int b return a b main cpp include
  • js三元表达式

  • Ubuntu13下调试USB AUDIO的一些记录

    最近想玩玩LINUX 于是双系统装了一个Ubuntu13 04 在新系统下用着都还好 不过我自己DIY的USB DAC出了问题 在WIN7下能正常工作 但是在Ubuntu下就爆音不断 很明显是音频数据流断流引起的 这说明stm32上的固件与