当前位置:网站首页>关于es8316的音频爆破音的解决
关于es8316的音频爆破音的解决
2022-07-06 04:38:00 【永不秃头的程序员】
最近在项目中遇到了一个关于播放音频前后,喇叭会产生 哒 的一声,目前没有找到真正原因,但是可以做软件规避。
一、规避思路
对喇叭的功放角进行控制,在使用喇叭之前打开功放角,在使用完喇叭过后关闭功放角,这样就可以规避这种声音的出现。
二、相关代码
frameworks/av/
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index dce34db..1b2db64 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -31,6 +31,12 @@
#include <media/AudioUtilmtk.h>
#endif
//这里添加节点路径
+const char *SPEAKER_ENABLE_PATH = "/sys/class/gpio/gpio114/value";
+static bool stream_system_on = false;
+static bool stream_notification_on = false;
+static bool stream_music_on = false;
+static bool stream_other_on = false;
+
namespace android {
@@ -270,8 +276,33 @@
sp<AudioPlaybackClient> client;
sp<AudioPolicyEffects>audioPolicyEffects;
//打开audio的流程时候使能功放
+ FILE *fp = fopen(SPEAKER_ENABLE_PATH, "w");
+ if (fp != NULL) {
+ char buf[2] = "1";
+ if (fwrite(buf, 1, 1, fp))
+ ALOGE("%s() fwrite success", __FUNCTION__);
+ else
+ ALOGE("%s() fwrite fail", __FUNCTION__);
+ fclose(fp);
+ } else
+ ALOGE("+%s() open failed", __FUNCTION__);
+
getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
+ switch (client->stream) {
+ case 1: //AUDIO_STREAM_SYSTEM button sound
+ stream_system_on = true;
+ break;
+ case 3: //AUDIO_STREAM_MUSIC
+ stream_music_on = true;
+ break;
+ case 5://AUDIO_STREAM_NOTIFICATION
+ stream_notification_on = true;
+ break;
+ default:
+ stream_other_on = true;
+ }
+
if (audioPolicyEffects != 0) {
// create audio processors according to stream
status_t status = audioPolicyEffects->addOutputSessionEffects(
@@ -307,6 +338,34 @@
getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
+ switch (client->stream) {
+ case 1: //AUDIO_STREAM_SYSTEM button sound
+ stream_system_on = false;
+ break;
+ case 3: //AUDIO_STREAM_MUSIC
+ stream_music_on = false;
+ break;
+ case 5://AUDIO_STREAM_NOTIFICATION
+ stream_notification_on = false;
+ break;
+ default:
+ stream_other_on = false;
+ }
+ //关闭audio的流程时候关闭功放
+ if ((stream_system_on == false) && (stream_music_on == false) &&
+ (stream_notification_on == false) && (stream_other_on == false)) {
+ FILE *fp = fopen(SPEAKER_ENABLE_PATH, "w");
+ if (fp != NULL) {
+ char buf[2] = "0";
+ if (fwrite(buf, 1, 1, fp))
+ ALOGE("%s() fwrite success", __FUNCTION__);
+ else
+ ALOGE("%s() fwrite fail", __FUNCTION__);
+ fclose(fp);
+ } else
+ ALOGE("+%s() open failed", __FUNCTION__);
+ }
+
if (audioPolicyEffects != 0) {
// release audio processors from the stream
status_t status = audioPolicyEffects->releaseOutputSessionEffects(
device/nxp/
添加对应权限
diff --git a/init.mt8168.rc b/init.mt8168.rc
index 40ef21b..015f327 100644
--- a/init.mt8168.rc
+++ b/init.mt8168.rc
@@ -623,6 +623,10 @@
# EEPROM
chmod 0666 /sys/bus/i2c/devices/2-0050/eeprom
+# SPEAKER_ENABLE
+ chown system system /sys/class/gpio/gpio114/value
+ chmod 0666 /sys/class/gpio/gpio114/value
+
on property:vold.decrypt=trigger_reset_main
write /proc/bootprof "INIT:vold.decrypt=trigger_reset_main"
setprop sys.boot_completed 0
kernel中将frameworks需要的节点申请出来
diff --git a/drivers/misc/biol_misc.c b/drivers/misc/biol_misc.c
index 6d98a60ed992..a651892d2dda 100644
--- a/drivers/misc/biol_misc.c
+++ b/drivers/misc/biol_misc.c
@@ -122,8 +122,9 @@ static int sbc_biol_probe(struct platform_device *pdev)
amp_en = of_get_named_gpio(np,"amp-en", 0);
if (!gpio_is_valid(amp_en))
{
return -ENODEV;
}
gpio_request(amp_en, "amp-en");
gpio_direction_output(amp_en, 0);
//申请节点,后面需要改为1 不然 没有/sys/class/gpio/gpio114/ 的 direction 目录
gpio_export(amp_en, 1);
msleep(1);
gpio_set_value(amp_en, 1);
msleep(1);
// 对应的dts可以参考我之前写的,只是多了一个添加节点的工具罢了
// https://blog.csdn.net/weixin_51178981/article/details/125097672?spm=1001.2014.3001.5501
边栏推荐
- Microservice resource address
- A blog to achieve embedded entry
- 【Try to Hack】john哈希破解工具
- P2102 floor tile laying (DFS & greed)
- MIT CMS. 300 session 8 – immersion / immersion
- [network] channel attention network and spatial attention network
- After learning classes and objects, I wrote a date class
- 团队协作出了问题,项目经理怎么办?
- Overturn your cognition? The nature of get and post requests
- How to realize automatic playback of H5 video
猜你喜欢

Query the number and size of records in each table in MySQL database

Unity screen coordinates ugui coordinates world coordinates conversion between three coordinate systems

ue5 小知识点 开启lumen的设置

Visio draw fan

CADD course learning (8) -- virtual screening of Compound Library

Fedora/REHL 安装 semanage

Use sentinel to interface locally

Case of Jiecode empowerment: professional training, technical support, and multiple measures to promote graduates to build smart campus completion system

One question per day (Mathematics)

Guitar Pro 8.0最详细全面的更新内容及全部功能介绍
随机推荐
729. My schedule I (set or dynamic open point segment tree)
Solve the compilation problem of "c2001: line breaks in constants"
优秀PM必须经历这3层蜕变!
Selection sort
[Chongqing Guangdong education] Suzhou University English film and Television Appreciation reference materials
力扣(LeetCode)186. 翻转字符串里的单词 II(2022.07.05)
Easyrecovery靠谱不收费的数据恢复电脑软件
1291_ Add timestamp function in xshell log
A blog to achieve embedded entry
Redis - redis in action - redis actual combat - actual combat Chapter 1 - SMS login function based on redis - redis + token shared session application - with code
Query the number and size of records in each table in MySQL database
Scala function advanced
cdc 能全量拉去oracle 表嘛
2328. Number of incremental paths in the grid graph (memory search)
也算是學習中的小總結
ue5 小知识点 开启lumen的设置
几种RS485隔离通讯的方案介绍
Lombok principle and the pit of ⽤ @data and @builder at the same time
[detailed steps of FreeRTOS shift value for the first time]
How does vs change the project type?