Android Audio代码分析5

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 05:47 点击:

 

在我们学习AudioTrack对象的创建过程时,了解到,创建一个AudioTrack对象,必须指定一个SessionId,并与其他使用该SessionId的AudioTrack和MediaPlayer共享AudioEffect。

如果不指定SessionId,将会自动生成一个SessionId,AudioEffect会将该SessionId与新创建的AudioTrack对象关联起来。

别人可以通过getAudioSessionId函数取得该SessionId。

今天我们就看看getAudioSessionId函数。

 

在frameworks的代码中搜了一下,发现有两个地方实现了该函数,分别来说一下。

 

先说说在类MediaPlayer中的实现。

*****************************************源码*************************************************

int MediaPlayer::getAudioSessionId()

{

    Mutex::Autolock _l(mLock);

    return mAudioSessionId;

}

**********************************************************************************************

源码路径:

frameworks\base\media\libmedia\mediaplayer.cpp

 

###########################################说明################################################

代码很简单,只是将成员变量返回,没啥好说的。

那我们看看该成员变量是何时被赋值的。

 

找了下代码,发现有两个地方对该成员变量进行了赋值。

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

一个在构造函数中。

MediaPlayer::MediaPlayer()

{

    LOGV("constructor");

    mListener = NULL;

    mCookie = NULL;

    mDuration = -1;

    mStreamType = AudioSystem::MUSIC;

    mCurrentPosition = -1;

    mSeekPosition = -1;

    mCurrentState = MEDIA_PLAYER_IDLE;

    mPrepareSync = false;

    mPrepareStatus = NO_ERROR;

    mLoop = false;

    mLeftVolume = mRightVolume = 1.0;

    mVideoWidth = mVideoHeight = 0;

    mLockThreadId = 0;

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

int AudioSystem::newAudioSessionId() {

    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();

    if (af == 0) return 0;

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

int AudioFlinger::newAudioSessionId()

{

// 看到了函数nextUniqueId,我们感觉到有点熟悉。

// 不错,在我们看函数AudioSystem::getOutputSamplingRate的时候,看到,在函数AudioFlinger::openOutput中有调过函数nextUniqueId

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

int AudioFlinger::nextUniqueId()

{

// 这是一个自增的操作

// 可见,SessionId最终是在AudioFlinger中维护的。

// 关于函数android_atomic_inc,可参考以下链接:

// http://www.2cto.com/kf/201110/106982.html

    return android_atomic_inc(&mNextUniqueId);

}

----------------------------------------------------------------

    return nextUniqueId();

}

----------------------------------------------------------------

    return af->newAudioSessionId();

}

----------------------------------------------------------------

    mAudioSessionId = AudioSystem::newAudioSessionId();

    mSendLevel = 0;

}

----------------------------------------------------------------

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

另一个给成员变量mAudioSessionId赋值的地方是在函数MediaPlayer::setAudioSessionId中。

status_t MediaPlayer::setAudioSessionId(int sessionId)

{

    LOGV("MediaPl

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Android 完全退出程序
    • 原创:Android应用开发-Andorid歌词秀,含源码
    • android 屏幕保护
    • Android手机软件汉化教程---第四课 dex文件汉化
    • 众多Android 开源项目推荐,给力工作给力学习
    • Android Audio代码分析4
    • Android得到已安装的应用程序信息!
    • Android开发者指南(29) —— USB Host and Accessory
    • Android成长的幕后推手:工程师鲁宾
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1