Nginx域名重定向
背景需求想让自己的一级域名地址都直接跳转到博客地址:https://notes.z-dd.online/
配置修改Nginx的配置文件(nginx.conf),或者自己定义的配置文件,在后面添加:
server {
listen 80;
server_name notes.z-dd.online;
rewrite ^(.*)$ https://$host$1 permanent;
}
这样将基于z-dd.net域名的所有http请求都强制跳转到了https上
其他办法(未验证):参考baidu.com的做法,利用meta的刷新作用
index.html<html>
<meta http-equiv="refresh" content="0;url=https://test.com/">
</html>
Nginx配置server {
listen 192.168.1.11:80;
server_name test.com;
location ...
音频POP音、咚啪音问题
背景问题一般带音频的设备可能都会遇到POP音、咚啪音问题,特别是在工作的时候动态切换通道路径,或者开始工作或结束工作的时候。但出现这种问题的原因有很多,要具体分析每种情况,各个击破
分析分析POP音主要原因还是因为电平跳变导致,比如使用MIC咪头时,偏置电压Vbias瞬变,工作中动态切换通道路径等。分析POP音的来源,然后对症下药。例如我遇到有一种情况,我把codec内部输出的通道全断开,但是在切换输入通道的时候还是会听到POP声,那很有可能需要硬件去分析了,电源地平面完整性等,反弹噪声等。
解决总的原则是:规避和削弱改善
规避:控制电源时序和控制使能时序电源时序是指系统中各种芯片电源供电或者断电的时序使能时序是系统供电稳定后由各个控制信号控制的功能模块的使能或关闭顺序
控制使能时序带功放设备噪声先出来之前Mute掉功放,不带功放设备可以使用Mute硬件电路等;正常工作时切换内部音频通路时,切换之前可以将输出(HP,LO)Mute,切换完成后再unMute。
电源时序上电时序:音频IC先上电,然后功放上电掉电时序:功放先断电,然后音频IC断电
削弱改善:
加DRV632(无噼啪声音 ...
RK3399烧写Android固件
环境
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
Host:Ubuntu16.04 X64
这里只讨论在Linux环境下的烧写
烧写工具安装及问题官方upgrade_tool安装下载并解压,并拷贝到系统文件夹,并赋予执行权限。SDK的工具目录下也有。
unzip Linux_Upgrade_Tool_xxxx.zip
cd Linux_UpgradeTool_xxxx
sudo mv upgrade_tool /usr/local/bin
sudo chown root:root /usr/local/bin/upgrade_tool
sudo chmod a+x /usr/local/bin/upgrade_tool
遇到的问题:
upgrade_tool: error while loading shared libraries: libudev.so.1: cannot open shared object file: No such file or directory
64位ubuntu 16.04: sudo a ...
win10搭建flutter开发环境(Android)
背景
Platform: X64
OS: Win10 Desktop
前期准备
Android Studio安装
Android SDK安装
Git for Windows安装
镜像配置由于国内访问Flutter会有些限制,官方给中国开发者提供了镜像站:https://flutter-io.cn配置镜像:在环境变量中新增添加以下2条
PUB_HOSTED_URL:https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL:https://storage.flutter-io.cn
注:详情可参考官方关于镜像的最新动态(Using Flutter in China)
Flutter SDK 安装下载安装有2种下载方式:
直接下载包 下载地址:https://flutter.cn/docs/development/tools/sdk/releases 解压至你需要安装的目录,不要放在需要特殊权限的地方
git获取 git clone https://github.com/flutter/flutter.git -b stable
执 ...
Win10分区问题
背景
Platform: X64
OS: Win10 Desktop
问题及分析
“Windows 无法安装到这个磁盘。选中的磁盘具有MBR分区表。在EFI系统上,Windows只能安装到GPT磁盘。”
在新买的未装系统的电脑上,容易遇到这个问题。
win10系统的快速启动功能,要求UEFI+GPT格式的硬盘分区。现在新买的电脑默认都是UEFI+GPT,早年的电脑为BIOS(Legace)+MBR,这两者都是一一对应的,如果引导设置为BIOS(Legace)引导,则分区的时候要用MBR分区,同理UEFI引导则用GPT分区。
MBR格式和GPT格式是可以相互转化的,但需注意:此操作都会清空磁盘的所有数据
分区转换在安装系统时,按Shift+F10或者Shift+Fn+F10调出cmd窗口。依次输入下面命令:
diskpart —(启动分区管理工具)
list disk — (列出连接到电脑的所有磁盘及其编号)
select disk x —(选择需要转换分区的磁盘的编号x)
clean —(清除磁盘原有数据)
convert xxx — (选择磁盘转换的类型)xxx代表要转换 ...
搭建Git服务器
背景
Platform: X64
OS: Ubuntu16.04 Desktop
搭建
安装git:$ sudo apt-get install git
创建一个git用户,用来运行git服务:$ sudo adduser git
创建证书登录:收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
初始化Git仓库:先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:$ sudo git init --bare sample.gitGit就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:$ sudo chown -R git:git sample.git
禁用shell登录:出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面 ...
在Android的C和C++层打印log
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
在Android的C/C++层打印log不使用TAG
添加头文件#include <utils/Log.h>D
在需要的地方使用ALOGE、ALOGI或ALOGD,例如ALOGE("log");使用TAG方法如下:在需打印的C/C++文件中添加#define LOG_TAG "JNI_DEBUG"
#include <android/log.h>
#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,## __VA_ARGS__)
#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG, ## __VA_ARGS__)
#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, ## __VA_ARGS__)
fun()
...
RK3399预置APK及问题
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
正常流程按照官方文档,步骤如下:
在device/rockchip/rk3399/xxx/目录下新建preinstall_del、preinstall_del_forever或preinstall文件夹。
preinstall_del:可卸载预装,恢复出厂后应用会恢复
preinstall_del_forever:可卸载预装,恢复出厂后应用不会恢复
preinstall:不可卸载预装
拷贝预安装的APK到上述新建的文件夹中,注意文件名尽量使用英文,避免空格
编译。auto_generator.py会在编译过程中,将拷贝的apk解包,自动生成编译mk文件。编译完之后预置的APK会拷贝到system固件中,烧录后,系统启动的时候会自动安装到data/app目录中(通过PackageManager)
注:预置的 APK 应用需要得到对应厂商授权
附auto_generator.py源码:
#!/usr/bin/env python
import sys
import os
i ...
Ubuntu16.04网络配置
背景
Platform: X64
OS: Ubuntu16.04 Desktop
过程以前在嵌入式Linux中,一直是通过/etc/network/interfaces来配置静态IP。在Ubuntu的Desktop版本一直使用图形界面配置的静态IP。这次没接显示器,想通过命令行来配置,然后cat /etc/network/interfaces,发现不对,以前配置的静态IP根本不在里面,里面只有Loopback:
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
后面发现Ubuntu16.04的Desktop版本里,图形界面配置是通过第三方网络管理工具NetworkManager进行配置的。也可以通过interfaces进行配置,但是两者不能同时配置,会冲突出现一些莫名其妙的问题。
其实,只要弄清楚interfaces和 nm之间的关系,这些问题就不难解释了。首先,当系统内没有第三方网络管理工具(比如nm)时,系统默认使用nterfaces文件内的参数进行网络配置 ...
Android重采样与频响
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
问题Android项目产品频响测试不达标,22.05K的采样率,频响只有7.5kHz左右。
分析这是android系统著名的src问题,当播放或者录音的采样率与底层硬件设置的采样率不一致系统就会重采样。Android系统为了统一不同的音轨,底层硬件设置的采样率一般都是固定的44.1k或是48k。重采样的算法,特别是非整数倍SRC,会对频响有一定的影响,线性插值效果最差,而Android默认的重采样质量使用的是DYN_LOW_QUALITY,其采用的重采样算法就是线性插值,但使用sinc等高质量的算法,CPU Load就会更高。见参考[3]
AudioMixer::track_t::setResampler:
///frameworks/av/services/audioflinger/AudioMixer.c
if (trackSampleRate != devSampleRate || resam ...
Android音量控制
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
系统输出音量总输出音量 = Android系统软件音量 * 音频Codec硬件音量****音频Codec硬件音量 = 音频Codec-DAC音量(数字音量) * 音频Codec-通道音量(AP模拟音量)Android系统音量(数字音量) = stream Volume * master Volume * track Volume注:stream 音量: 系统控制音量等级,系统针对不同的stream type和不同输出device,有不同的音量level,韦伯定律(可展开,心理,情侣买礼物,金融等,)Track volume: 通过AudioTrack.setVolume来设置,取值为0~1.0master Volume: 音效
Android音量计算流程注:这里所说的音量是上面所说的stream Volume流音量整个流程即是数字音量增益调节的流程,纯数字实现,与底层音频codec无关.整个流程大致分为以下2大步
AudioPolicyManager::checkAndSetV ...
Android网络广播和本地播放输出不一致的问题
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
问题现象:相同的音频文件,最大的音量等级,网络广播音频codec输出的幅度始终比本地播放的小,达不到音频codec理论上的满幅输出(RMS:500mV)。大致数据结果:android音量等级调到最大,网络广播(RMS:250mV), 本地播放(RMS:500mV)。
分析我们APK通过网络接收广播数据,然后用AudioTrack播放,本地播放也是使用相同的接口。x根据Android的音量控制x框架(具体可参考我以前的文章),
总输出音量 = Android系统软件音量 * 音频Codec硬件音量****音频Codec硬件音量 = 音频Codec-DAC音量(数字音量) * 音频Codec-通道音量(AP模拟音量)Android系统音量(数字音量) = stream Volume * master Volume * track Volume
音频codec的硬件音量都是一样的,所以调整track Volume和master Volume音效。
使用audioTrack ...