我是靠谱客的博主 细心大炮,最近开发中收集的这篇文章主要介绍录音相关的处理流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

http://blog.csdn.net/ameyume/article/details/7794953

一.AudioRecord录音的初始化设置
AudioRecord::set
 ->
AudioSystem::getInput
 ->
调用IAudioPolicyService.cpp文件中的
BpAudioPolicyService的getInput函数
    remote()->transact(GET_INPUT, data, &reply);

[cpp] view plain copy
  1. BnAudioPolicyService::onTransact(  
  2. case GET_INPUT:  
  3.     audio_io_handle_t input = getInput(inputSource,  
  4.                                    samplingRate,  
  5.                                    format,  
  6.                                    channels,  
  7.                                    acoustics); // 调用的是AudioPolicyService::getInput函数  
 ->
AudioPolicyService::getInput
 ->
AudioPolicyManagerBase::getInput
    mpClientInterface->openInput
 ->
AudioPolicyService::openInput
 ->
BpAudioFlinger的openInput函数
 ->
AudioFlinger::openInput
    mAudioHardware->openInputStream
 ->
[cpp] view plain copy
  1. AudioHardwareALSA::openInputStream  
  2.     err = mALSADevice->open(&(*it), devices, mode(), 0);  
  3.   
  4.     in = new AudioStreamInALSA(this, &(*it), acoustics);  
  5.     err = in->set(format, channels, sampleRate);  
 ->
alsa_default.cpp
调用s_open函数
[cpp] view plain copy
  1. ALSAStreamOps::set  
  2.     if (rate && *rate > 0) {  
  3.         if (mHandle->sampleRate != *rate) {  
  4.             LOGE("%s L%d  mHandle->sampleRate = %d, return BAD_VALUE %d ", __FUNCTION__, __LINE__,   mHandle->sampleRate, BAD_VALUE);  
  5.             return BAD_VALUE;  
  6.         }  
  7.     }  
E/AudioHardwareALSA( 1181): set L123  mHandle->sampleRate = 8000, return BAD_VALUE -22 // 如果采样率不是8000,则返回BAD_VALUE
E/AudioHardwareALSA( 1181): openInputStream L314 in->set err = -22
// BAD_VALUE的定义是
BAD_VALUE           = -EINVAL,
#define EINVAL        3
按照以上定义,BAD_VALUE的值应该是-3,但log输出的值是-22,很奇怪。

----------------------------------------------------------------------------------
二.录音start函数的处理流程
1.如果是录像,则录像中的音频录制的调用顺序是:
MPEG4Writer::start
->
MPEG4Writer::startWriterThread()
->
MPEG4Writer::startTracks
->
MPEG4Writer::Track::start
->
录像时,video track是CameraSource,即调用CameraSource::start函数
audio track是AMRNBEncoder,即调用AMRNBEncoder::start函数
->
2.如果是单纯的录音操作,则直接走下面的路程:
AudioSource::start
->
AudioRecord::start()
->
IAudioRecord::start()
如果返回值为DEAD_OBJECT,则调用
->
AudioRecord::openRecord
  ->
  AudioFlinger::openRecord
  ->
  返回RecordHandle对象
  ->
  AudioFlinger::RecordHandle::start()
  ->
  AudioFlinger::RecordThread::start
  ->
  AudioSystem::startInput(mId);
  ->
  AudioPolicyService::startInput
  ->
  AudioPolicyManagerBase::startInput

如果AudioRecord::openRecord返回NO_ERROR,则继续调用IAudioRecord::start()
如果IAudioRecord::start()返回NO_ERROR,则启动ClientRecordThread线程。

----------------------------------------------------------------------------------
三.AudioRecord开始录音的处理流程
1.frameworksbasemediajavaandroidmediaAudioRecord.java文件中的
startRecording()函数
[cpp] view plain copy
  1. // start recording  
  2. synchronized(mRecordingStateLock) { // 一直处于同步状态,同一时间只能有一个录音  
  3.     if (native_start() == SUCCESS) { // 调用native方法  
  4.         mRecordingState = RECORDSTATE_RECORDING;  
  5.     }  
  6. }  
->
2.native_start对应frameworksbasecorejniandroid_media_AudioRecord.cpp文件中的
android_media_AudioRecord_start 函数
取得AudioRecord对象lpRecorder,然后调用lpRecorder->start()的函数,开始录音
->
3.frameworksbasemedialibmediaAudioRecord.cpp文件的
AudioRecord::start()函数
3.1 取得ClientRecordThread对象t
3.2 调用IAudioRecord对象mAudioRecord->start()
(1)如果返回DEAD_OBJECT,则执行AudioRecord::openRecord函数,调用IAudioFlinger的openRecord函数打开录音设备,然后再执行mAudioRecord->start()开始录音

最后

以上就是细心大炮为你收集整理的录音相关的处理流程的全部内容,希望文章能够帮你解决录音相关的处理流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部