Android+Audio+相关类

来源:互联网 发布:ubuntu 删文件夹 编辑:程序博客网 时间:2024/05/20 18:18

AudioSystem类

定义了一堆枚举,包括stream类型,音频格式,音频channel等。
函数get_audio_flinger中,会获取AudioFlinger,然后创建一个AudioFlingerClient对象,并调用AudioFlinger的函数registerClient注册该AudioFlingerClient。
接下来,函数的实现,基本上都是通过调用AudioFlingerClient的函数来实现的。
包括(列的不全):
muteMicrophone
isMicrophoneMuted
setMasterVolume
setMasterMute
getMasterVolume
getMasterMute
setStreamVolume
setStreamMute
getStreamVolume
getStreamMute
setMode
isStreamActive
setParameters
getParameters
setVoiceVolume

函数get_audio_policy_service中获取AudioPolicyService,然后创建一个AudioPolicyServiceClient对象,并调用AudioPolicyService函数linkToDeath完成关联。

接下来一部分函数是通过调用AudioPolicyService的函数来实现的。

setDeviceConnectionState
getDeviceConnectionState
setPhoneState
setRingerMode
setForceUse
getForceUse
getOutput
startOutput
stopOutput
releaseOutput
getInput
startInput
stopInput
releaseInput
initStreamVolume
setStreamVolumeIndex
getOutputForEffect
registerEffect

unregisterEffect

AudioFlinger类

继承自BinderService<AudioFlinger>和BnAudioFlinger。

定义了一些枚举常量。
hardware_call_state : AUDIO_HW_OUTPUT_OPEN等
track_state : RESUMING等

类 PlaybackThread : public ThreadBase中用到的常量:
        enum type {
            MIXER,
            DIRECT,
            DUPLICATING
        };


        enum mixer_state {
            MIXER_IDLE,
            MIXER_TRACKS_ENABLED,
            MIXER_TRACKS_READY
        };

构造函数中:
调用函数AudioHardwareInterface::create()创建一个AudioHardware,之后的实现基本上是调用该AudioHardware对象来完成的。

有两个DefaultKeyedVector类型的成员变量:


mPlaybackThreads:用于记录播放线程。
mRecordThreads:用于记录录音线程。

DefaultKeyedVector< int, sp<PlaybackThread> >  mPlaybackThreads;
DefaultKeyedVector< int, sp<RecordThread> >    mRecordThreads;

函数checkPlaybackThread_l和函数checkRecordThread_l分别将mPlaybackThreads和mRecordThreads中记录的线程按编号返回。
函数checkMixerThread_l返回的也是mPlaybackThreads中记录的线程,不过将返回值转换为了MixerThread类型的指针。

函数createTrack中,

首先调用函数checkPlaybackThread_l获取播放线程。output是调用函数createTrack时传入的参数。
PlaybackThread *thread = checkPlaybackThread_l(output);

然后调用PlaybackThread的函数createTrack_l创建一个track。
 sp<PlaybackThread::Track> track;
        track = thread->createTrack_l(client, streamType, sampleRate, format,
                channelCount, frameCount, sharedBuffer, lSessionId, &lStatus);

然后以track为参数创建一个rackHandle
 sp<TrackHandle> trackHandle;
trackHandle = new TrackHandle(track);

最后将trackHandle作为返回值返回。

接下来几个函数的实现方法类似,都是先调用函数checkPlaybackThread_l获取播放线程。output是各函数的输入参数。
PlaybackThread *thread = checkPlaybackThread_l(output);
然后调用PlaybackThread的相应函数实现功能。
这样的函数包括:
sampleRate
channelCount
format
frameCount
latency

接下来有两个实现方法类似的函数,setMasterVolume和setMode。
都是首先调用mAudioHardware的对应函数,然后再调用mPlaybackThreads的对应函数。
例如,函数setMasterVolume:
mAudioHardware->setMasterVolume(value)
for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
       mPlaybackThreads.valueAt(i)->setMasterVolume(value);

可见,对mAudioHardware的函数的调用完成对硬件的操作,对mPlaybackThreads的函数的调用修改了audioflinger层保存的状态。

接下来的两个函数setMicMute和getMicMute,都是通过调用mAudioHardware的函数来实现的。

函数setMasterMute中,
遍历mPlaybackThreads中的各个线程,并分别调用他们的setMasterMute函数。
    for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
       mPlaybackThreads.valueAt(i)->setMasterMute(muted);


由此看来,MasterMute控制所有的播放线程。

接下来两个函数masterVolume和masterMute,分别将对应 的成员变量返回。

接下来是函数setStreamVolume,
如果传入的output不为0,调用函数checkPlaybackThread_l获取对应的线程,然后调用该线程的setStreamVolume函数。
否则,遍历mPlaybackThreads,分别调用各线程的setStreamVolume函数。

函数setStreamMute,
遍历mPlaybackThreads,分别调用各线程的setStreamMute函数。

函数streamVolume中,
传入的output参数若不为0,调用函数checkPlaybackThread_l获取对应的线程,然后调用该线程的streamVolume函数,并将结果作为返回值返回。
若传入的output为0,取成员变量数组mStreamTypes对应stream的volume,并返回。
成员变量数组mStreamTypes的定义:
PlaybackThread::stream_type_t       mStreamTypes[AudioSystem::NUM_STREAM_TYPES];

函数streamMute,取成员变量数组mStreamTypes对应stream的mute,并返回。

函数isStreamActive,遍历mPlaybackThreads,分别调用各线程的isStreamActive,遇到函数isStreamActive返回true时,即退出循环并返回true。
如果遍历结束,没有true的情况,即返回false。

函数setParameters中,
如果ioHandle为0,即表示参数是对整个audio hardware interface有效的,调用mAudioHardware的函数setParameters,并将结果返回。
result = mAudioHardware->setParameters(keyValuePairs);
否则,调用函数checkPlaybackThread_l和checkRecordThread_l获取ioHandle对应的线程,然后调用线程的setParameters函数。

函数getParameters的处理,与函数setParameters类似。
如果ioHandle为0,调用mAudioHardware的函数getParameters,并返回。
否则,调用checkPlaybackThread_l和checkRecordThread_l,获取对应的线程,并调用对应线程的getParameters函数。

函数getInputBufferSize,直接调用mAudioHardware的getInputBufferSize函数,并返回。

函数getInputFramesLost,调用checkRecordThread_l获取录音线程,然后调用线程的getInputFramesLost函数。

函数setVoiceVolume,直接调用mAudioHardware的setVoiceVolume函数,并将结果返回。

getRenderPosition函数,调用函数checkPlaybackThread_l获取播放线程,然后调用播放线程的getRenderPosition函数并将结果返回。函数registerClient,首先获取调用pid:    int pid = IPCThreadState::self()->getCallingPid();创建一个NotificationClient对象:        sp<NotificationClient> notificationClient = new NotificationClient(this,client,pid);调用mNotificationClients的add函数,实现notificationClient对象的注册:        mNotificationClients.add(pid, notificationClient)遍历mPlaybackThreads,分别调用各线程的sendConfigEvent函数发送AudioSystem::OUTPUT_OPENED事件。遍历mRecordThreads,分别调用各线程的sendConfigEvent函数,发送AudioSystem::INPUT_OPENED事件。函数removeNotificationClient,调用mNotificationClients的removeItem函数,删除相应的item。函数audioConfigChanged_l,遍历mNotificationClients,分别调用各notification client的ioConfigChanged函数。函数中没有做AudioFlinger::mLock处理,调用该函数时必须做AudioFlinger::mLock处理。函数removeClient_l,调用mClients的函数removeItem,删除item。在函数createTrack,openRecord和createEffect中会调用mClients的函数add追加item。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微交易出金不了怎么办 直播时出现央视影音客户端怎么办 qq账号暂时无法登录怎么办 饿了吃东西胃疼怎么办 早上不吃饭胃疼怎么办 孕晚期胃疼呕吐怎么办 胃疼了一晚上怎么办 微信视频图像倒立怎么办 ps链接图层锁定怎么办 慕课过时间了怎么办 异地恋又要考研怎么办 阴阳师手机绑定上限了怎么办 高考口令卡丢了怎么办 网易将军令换手机了怎么办 须弥bb有弱点土怎么办 战网密码忘记了怎么办 梦三账号忘了怎么办 快手手机号被注册了怎么办 快手该手机号已注册怎么办 手机号被别人注册了快手怎么办 快手显示手机号已注册怎么办 163的邮箱忘了怎么办 河长制账号密码忘了怎么办 网易登录名忘了怎么办 网易通行证安全手机忘了怎么办 美团数据获取失败怎么办 扣扣图片加载不出来怎么办 电脑qq最小化后不见了怎么办 uwp桌面快捷图标显示异常怎么办 网易云自动切歌怎么办 捡到小米手机怎么办才能自己用 dnf启动安装程序出错怎么办 苹果手机相册视频下载出错怎么办 苹果7软件闪退怎么办 微信上有钱账号就是怎么办 手机网速不给力怎么办 xp系统登录密码忘了怎么办 手机百度云网络出错怎么办 百度账号提示异常风险怎么办 刷xp框架卡米怎么办 全民k歌歌曲下架怎么办