• Android 4.4KitKat AudioFlinger 流程分析


    AudioFlinger(AF)是一个服务,具体的启动代码在avmediamediaserverMain_mediaserver.cpp中:

    int main(int argc, char** argv)
    {
        signal(SIGPIPE, SIG_IGN);
        char value[PROPERTY_VALUE_MAX];
        bool doLog = (property_get("ro.test_harness", value, "0") > 0) && (atoi(value) == 1);
        pid_t childPid;
        // FIXME The advantage of making the process containing media.log service the parent process of
        // the process that contains all the other real services, is that it allows us to collect more
        // detailed information such as signal numbers, stop and continue, resource usage, etc.
        // But it is also more complex.  Consider replacing this by independent processes, and using
        // binder on death notification instead.
        if (doLog && (childPid = fork()) != 0) {
            // media.log service
            //prctl(PR_SET_NAME, (unsigned long) "media.log", 0, 0, 0);
            // unfortunately ps ignores PR_SET_NAME for the main thread, so use this ugly hack
            strcpy(argv[0], "media.log");
            sp<ProcessState> proc(ProcessState::self());
            MediaLogService::instantiate();
            ProcessState::self()->startThreadPool();
            ......
         sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); ALOGI("ServiceManager: %p", sm.get()); AudioFlinger::instantiate(); MediaPlayerService::instantiate(); CameraService::instantiate(); AudioPolicyService::instantiate(); registerExtensions(); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); } }

    追踪AudioFlinger::instantiate()函数的实现可到nativeincludeinderBinderService.h中的

    static status_t publish(bool allowIsolated = false) {
            sp<IServiceManager> sm(defaultServiceManager());
            return sm->addService(
                    String16(SERVICE::getServiceName()),
                    new SERVICE(), allowIsolated);
        }
    static void instantiate() { publish(); }

    然后再往哪儿追踪代码就不知道了,没那个时间,不要在意细节,继续看AudioFlinger的构造函数:

    AudioFlinger::AudioFlinger()
        : BnAudioFlinger(),//初始化基类
          mPrimaryHardwareDev(NULL),
          mHardwareStatus(AUDIO_HW_IDLE),
          mMasterVolume(1.0f),
          mMasterMute(false),
          mNextUniqueId(1),
          mMode(AUDIO_MODE_INVALID),
          mBtNrecIsOff(false),
          mIsLowRamDevice(true),
          mIsDeviceTypeKnown(false),
          mGlobalEffectEnableTime(0)
    {
        getpid_cached = getpid();
        char value[PROPERTY_VALUE_MAX];
        bool doLog = (property_get("ro.test_harness", value, "0") > 0) && (atoi(value) == 1);
        if (doLog) {
            mLogMemoryDealer = new MemoryDealer(kLogMemorySize, "LogWriters");
        }
    #ifdef TEE_SINK
        (void) property_get("ro.debuggable", value, "0");
        int debuggable = atoi(value);
        int teeEnabled = 0;
        if (debuggable) {
            (void) property_get("af.tee", value, "0");
            teeEnabled = atoi(value);
        }
        if (teeEnabled & 1)
            mTeeSinkInputEnabled = true;
        if (teeEnabled & 2)
            mTeeSinkOutputEnabled = true;
        if (teeEnabled & 4)
            mTeeSinkTrackEnabled = true;
    #endif
    }

    设置硬件的各种属性状态。

  • 相关阅读:
    java1.8版本的HashMap源码剖析
    java并发包——阻塞队列BlockingQueue及源码分析
    java多线程(二)-线程的生命周期及线程间通信
    单例设计模式的回顾。。。。
    java多线程的(一)-之java线程的使用
    根据IO流源码深入理解装饰设计模式使用
    IO流回顾与总结第一篇之字节流与字符流的操作。。。。。
    java中的异常类型以及区别????
    设计模式之装饰设计案例
    集合源码(一)之hashMap、ArrayList
  • 原文地址:https://www.cnblogs.com/qiengo/p/4186915.html
Copyright © 2020-2023  润新知