RK Android7.1 音频播放 Standby
一.Standby
当使用MediaPlayer停止本地播放后,如果切换我们自定义的音频通道(线路输入,只有模拟通道,数字通道没有工作),开始正常但隔几秒钟后就会没声音输出
Android系统默认播放停止后3秒(默认)会进入Standby模式来降低功耗
1.1.frameworks\av\services\audioflinger\AudioFlinger.cpp
ro.audio.flinger_standbytime_ms=2592000000
standby时间 由ro.audio.flinger_standbytime_ms控制 如果没有 这个属性 则默认是3秒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void AudioFlinger::onFirstRef() { Mutex::Autolock _l(mLock); /* TODO: move all this work into an Init() function */ char val_str[PROPERTY_VALUE_MAX] = { 0 }; if (property_get( "ro.audio.flinger_standbytime_ms" , val_str, NULL) >= 0 ) { uint32_t int_val; if ( 1 == sscanf(val_str, "%u" , &int_val)) { mStandbyTimeInNsecs = milliseconds(int_val); ALOGI( "Using %u mSec as standby time." , int_val); } else { mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs; ALOGI( "Using default %u mSec as standby time." , (uint32_t)(mStandbyTimeInNsecs / 1000000 )); } } mPatchPanel = new PatchPanel( this ); mMode = AUDIO_MODE_NORMAL; } |
1.2.\frameworks\av\services\audioflinger\AudioFlinger.h
Android系统默认播放停止后3秒会进入Standby模式以节省电源
1 2 3 | // ---------------------------------------------------------------------------- static const nsecs_t kDefaultStandbyTimeInNsecs = seconds( 3 ); |
1.3.进入Standby 之前关闭 Speak 功放
hardware/rockchip/audio/tinyalsa_hal/audio_hw.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | --- a/hardware/rockchip/audio/tinyalsa_hal/audio_hw.c +++ b/hardware/rockchip/audio/tinyalsa_hal/audio_hw.c @@ - 1162 , 6 + 1162 , 11 @@ static void do_out_standby(struct stream_out *out) } out->standby = true ; out->nframes = 0 ; + speaker_mute( 1 ); property_set( "media.audio.slice" , "0" ); if (out == adev->outputs[OUTPUT_HDMI_MULTI]) { /* force standby on low latency output stream so that it can reuse HDMI driver if static void speaker_mute( int mute) { int ret= 0 ; int fdp = 0 ; fdp= open( "/sys/class/xh_custom/xh_custom_gpio/device/speaker_en" ,O_RDWR); if (fdp > 0 ) { if (mute== 1 ) { ALOGD( "MUTE speaker" ); ret= write(fdp, "0" , 1 ); } else { ALOGD( "UNMUTE speaker" ); ret= write(fdp, "1" , 1 ); } if (ret != 1 ) { ALOGD( "MUTE speaker FAILED" ); close(fdp); } close(fdp); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】