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);
    }
}

  

  

 

 

 

posted @   CrushGirl  阅读(924)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 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】
点击右上角即可分享
微信分享提示