Android Audio代码分析7

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-02 04:28 点击:

 

在看AudioTrack代码的时候,我们看到,要创建一个AudioTrack对象,需要指定一个StreamType。

今天我们只把stream type相关的代码抽取出来,详细看看stream type相关的东东。

 

java层的代码就不看了。

从函数android_media_AudioTrack_native_setup开始说起。

 

static int

android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_this,

        jint streamType, jint sampleRateInHertz, jint channels,

        jint audioFormat, jint buffSizeInBytes, jint memoryMode, jintArray jSession)

{

...

 

// 获取Frame Count和Sampling Rate的依据都是stream type。

// 其实现方法是通过stream type取得output,然后取得output的描述

// 如果取得成功,则取描述中的frame count,否则通过audio flinger取得output对应的frame count。

    if (AudioSystem::getOutputFrameCount(&afFrameCount, streamType) != NO_ERROR) {

        LOGE("Error creating AudioTrack: Could not get AudioSystem frame count.");

        return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM;

    }

    if (AudioSystem::getOutputSamplingRate(&afSampleRate, streamType) != NO_ERROR) {

        LOGE("Error creating AudioTrack: Could not get AudioSystem sampling rate.");

        return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM;

    }

 

    ...

   

 // 下面的工作是将java 侧的stream type转换为native 侧的stream type。

 // 以后使用的都是转换后的strea type。

    // check the stream type

    AudioSystem::stream_type atStreamType;

    if (streamType == javaAudioTrackFields.STREAM_VOICE_CALL) {

        atStreamType = AudioSystem::VOICE_CALL;

    } else if (streamType == javaAudioTrackFields.STREAM_SYSTEM) {

        atStreamType = AudioSystem::SYSTEM;

    } else if (streamType == javaAudioTrackFields.STREAM_RING) {

        atStreamType = AudioSystem::RING;

    } else if (streamType == javaAudioTrackFields.STREAM_MUSIC) {

        atStreamType = AudioSystem::MUSIC;

    } else if (streamType == javaAudioTrackFields.STREAM_ALARM) {

        atStreamType = AudioSystem::ALARM;

    } else if (streamType == javaAudioTrackFields.STREAM_NOTIFICATION) {

        atStreamType = AudioSystem::NOTIFICATION;

    } else if (streamType == javaAudioTrackFields.STREAM_BLUETOOTH_SCO) {

        atStreamType = AudioSystem::BLUETOOTH_SCO;

    } else if (streamType == javaAudioTrackFields.STREAM_DTMF) {

        atStreamType = AudioSystem::DTMF;

    } else {

        LOGE("Error creating AudioTrack: unknown stream type.");

        return AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE;

    }

 

    ...

 

    // 将stream type保存在AudioTrackJniStorage对象中

    lpJniStorage->mStreamType = atStreamType;

 

    ...

   

 // 调用AudioTrack对象的set

    相关新闻>>

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

      推荐热点

      • 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