Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
fa0eeaeb
D
Docs
项目概览
OpenHarmony
/
Docs
大约 2 年 前同步成功
通知
161
Star
293
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
fa0eeaeb
编写于
5月 17, 2022
作者:
O
openharmony_ci
提交者:
Gitee
5月 17, 2022
浏览文件
操作
浏览文件
下载
差异文件
!3974 【OpenHarmony开源贡献者计划2022】audio&camera相关格式及表达问题
Merge pull request !3974 from king_he/peripheral-1
上级
e716d144
3dbc38dd
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
111 addition
and
111 deletion
+111
-111
zh-cn/device-dev/driver/driver-peripherals-audio-des.md
zh-cn/device-dev/driver/driver-peripherals-audio-des.md
+84
-84
zh-cn/device-dev/driver/driver-peripherals-camera-des.md
zh-cn/device-dev/driver/driver-peripherals-camera-des.md
+27
-27
未找到文件。
zh-cn/device-dev/driver/driver-peripherals-audio-des.md
浏览文件 @
fa0eeaeb
...
...
@@ -5,7 +5,7 @@
多媒体系统是物联网设备开发中不可缺少的一部分,Audio作为其中重要的一个模块,Audio驱动模型的构建显得尤为重要。
本文主要介绍基于HDF
(Hardware Driver Foundation)
驱动框架开发的Audio驱动,包括Audio驱动的架构组成和功能部件。芯片厂商可以根据此驱动架构,进行各自驱动的开发及HAL层接口的调用。
本文主要介绍基于HDF
(Hardware Driver Foundation)
驱动框架开发的Audio驱动,包括Audio驱动的架构组成和功能部件。芯片厂商可以根据此驱动架构,进行各自驱动的开发及HAL层接口的调用。
...
...
@@ -16,45 +16,45 @@ Audio驱动框架基于[HDF驱动框架](https://device.harmonyos.com/cn/docs/do

驱动架构主要由以下几部分组成。
-
HDI adapter
: 实现Audio HAL层驱动(HDI接口适配),给Audio服务(frameworks)提供所需的音频硬件驱动能力接口。包含 Audio Manager、Audio Adapter、 Audio Control、Audio Capture、Audio Render
等接口对象。
-
Audio Interface Lib
: 配合内核中的Audio Driver Model使用,实现音频硬件的控制、录音数据的读取、播放数据的写入。它里面包括Stream_ctrl_common 通用层,主要是为了和上层的audio HDI adapter
层进行对接。
-
ADM(Audio Driver Model):
音频驱动框架模型,向上服务于多媒体音频子系统,便于系统开发者能够更便捷的根据场景来开发应用。向下服务于具体的设备厂商,对于Codec和DSP设备厂商来说,可根据ADM模块提供的向下统一接口适配各自的驱动代码,就可以实现快速开发和适配OpenHarmony系统。
-
Audio Control Dispatch
: 接收lib层的控制指令并将控制指令分发到驱动层。
-
Audio Stream Dispatch
: 接收lib层的数据并将数据分发到驱动层。
-
HDI adapter
: 实现Audio HAL层驱动(HDI接口适配),给Audio服务(frameworks)提供所需的音频硬件驱动能力接口。包含 Audio Manager、Audio Adapter、Audio Control、Audio Capture、Audio Render
等接口对象。
-
Audio Interface Lib
:配合内核中的Audio Driver Model使用,实现音频硬件的控制、录音数据的读取、播放数据的写入。它里面包括Stream_ctrl_common 通用层,主要是为了和上层的audio HDI adapter
层进行对接。
-
ADM(Audio Driver Model):音频驱动框架模型,向上服务于多媒体音频子系统,便于系统开发者能够更便捷的根据场景来开发应用。向下服务于具体的设备厂商,对于Codec和DSP设备厂商来说,可根据ADM模块提供的向下统一接口适配各自的驱动代码,就可以实现快速开发和适配OpenHarmony系统。
-
Audio Control Dispatch: 接收lib层的控制指令并将控制指令分发到驱动层。
-
Audio Stream Dispatch: 接收lib层的数据并将数据分发到驱动层。
-
Card Manager
: 多声卡管理模块。每个声卡含有Dai、Platform、Codec、Accessory、Dsp、SAPM模块。
-
Platform Drivers
: 驱动适配层。
-
SAPM
(Smart Audio Power Manager) :
电源管理模块,对整个ADM电源进行功耗策略优化。
-
Card Manager: 多声卡管理模块。每个声卡含有Dai、Platform、Codec、Accessory、Dsp、SAPM模块。
-
Platform Drivers: 驱动适配层。
-
SAPM
(Smart Audio Power Manager):
电源管理模块,对整个ADM电源进行功耗策略优化。
## Audio驱动开发
以下将基于Audio驱动框架,并以Hi3516DV300平台为例,介绍相关驱动开发的具体步骤。
### Audio ADM模块框架介绍
Audio驱动对HDI层提供三个服务hdf_audio_render、hdf_audio_capture、hdf_audio_control。开发板dev目录下
驱动服务节点如下:
Audio驱动对HDI层提供三个服务hdf_audio_render、hdf_audio_capture、hdf_audio_control。开发板dev目录下驱动服务节点如下:
```
c
# ls -l hdf_audio*
crw
-
rw
----
1
system
system
248
,
6
1970
-
01
-
01
00
:
00
hdf_audio_capture
//音频数据录音流服务。
crw
-
rw
----
1
system
system
248
,
4
1970
-
01
-
01
00
:
00
hdf_audio_codec_dev0
//音频声卡设备0名称。
crw
-
rw
----
1
system
system
248
,
4
1970
-
01
-
01
00
:
00
hdf_audio_codec_dev1
//音频声卡设备1名称。
crw
-
rw
----
1
system
system
248
,
5
1970
-
01
-
01
00
:
00
hdf_audio_control
//音频控制流服务。
crw
-
rw
----
1
system
system
248
,
7
1970
-
01
-
01
00
:
00
hdf_audio_render
//音频数据播放流务。
crw
-
rw
----
1
system
system
248
,
6
1970
-
01
-
01
00
:
00
hdf_audio_capture
//
音频数据录音流服务。
crw
-
rw
----
1
system
system
248
,
4
1970
-
01
-
01
00
:
00
hdf_audio_codec_dev0
//
音频声卡设备0名称。
crw
-
rw
----
1
system
system
248
,
4
1970
-
01
-
01
00
:
00
hdf_audio_codec_dev1
//
音频声卡设备1名称。
crw
-
rw
----
1
system
system
248
,
5
1970
-
01
-
01
00
:
00
hdf_audio_control
//
音频控制流服务。
crw
-
rw
----
1
system
system
248
,
7
1970
-
01
-
01
00
:
00
hdf_audio_render
//
音频数据播放流务。
```
音频声卡设备包括的驱动服务:
hdf_audio_codec_dev0
-
dma_service_0 : dma
服务
-
dai_service : cpu dai
服务
-
codec_service_0 : codec
服务(特指内置codec)
-
dma_service_0 : dma服务
-
dai_service : cpu dai服务
-
codec_service_0 : codec服务(特指内置codec)
-
dsp_service_0 : dsp 服务(可选项)
hdf_audio_codec_dev1
-
dma_service_0 : dma
服务
-
dai_service : cpu dai
服务
-
codec_service_1 : accessory
服务(特指smartPA)
-
dsp_service_0 : dsp
服务(可选项)
-
dma_service_0 : dma服务
-
dai_service : cpu dai服务
-
codec_service_1 : accessory服务(特指smartPA)
-
dsp_service_0 : dsp服务(可选项)
#### 启动流程
...
...
@@ -99,7 +99,7 @@ hdf_audio_codec_dev1
#### 已有平台开发
ADM适配已有平台
(Hi3516DV300)
Codec或Accessory(Smart PA)的驱动开发流程:
ADM适配已有平台
(Hi3516DV300)
Codec或Accessory(Smart PA)的驱动开发流程:

...
...
@@ -166,7 +166,7 @@ struct AudioDaiOps g_codecDaiDeviceOps = {
struct
DaiData
g_codecDaiData
=
{
.
DaiInit
=
CodecDaiDeviceInit
,
// codecdai设备初始化(适配新平台需重新实现)
.
ops
=
&
g_codecDaiDeviceOps
,
//codecdai操作函数
.
ops
=
&
g_codecDaiDeviceOps
,
//
codecdai操作函数
};
```
...
...
@@ -178,27 +178,27 @@ CodecDeviceInit将完成AIAO的设置、寄存器默认值初始化、g_audioCon
int32_t
CodecDeviceInit
(
struct
AudioCard
*
audioCard
,
struct
CodecDevice
*
codec
)
{
...
/* hi3516平台AIAO的Set和Get
注册
*/
/* hi3516平台AIAO的Set和Get
注册
*/
CodecSetCtlFunc
(
codec
->
devData
,
AudioCodecAiaoGetCtrlOps
,
AudioCodecAiaoSetCtrlOps
)
...
/* hi3516平台codec寄存器IoRemap*/
/* hi3516平台codec寄存器IoRemap
*/
CodecHalSysInit
();
...
/* hi3516平台codec寄存器默认值初始化*/
/* hi3516平台codec寄存器默认值初始化
*/
CodecRegDefaultInit
(
codec
->
devData
->
regCfgGroup
);
...
/* hi3516平台g_audioControls
挂到Control链表上
*/
/* hi3516平台g_audioControls
挂到Control链表上
*/
AudioAddControls
(
audioCard
,
codec
->
devData
->
controls
,
codec
->
devData
->
numControls
);
...
/* hi3516平台codec加载到sapm*/
/* hi3516平台codec加载到sapm
*/
AudioSapmNewComponents
(
audioCard
,
codec
->
devData
->
sapmComponents
,
codec
->
devData
->
numSapmComponent
);
...
/* hi3516平台codec加挂到通路选择链表上*/
/* hi3516平台codec加挂到通路选择链表上
*/
AudioSapmAddRoutes
(
audioCard
,
g_audioRoutes
,
HDF_ARRAY_SIZE
(
g_audioRoutes
);
...
AudioSapmNewControls
(
audioCard
);
...
/* hi3516平台codec电源管理*/
/* hi3516平台codec电源管理
*/
AudioSapmSleep
(
audioCard
);
...
return
HDF_SUCCESS
;
...
...
@@ -357,7 +357,7 @@ vendor/hisilicon/hispark_taurus/hdf_config/
permission
=
0666
;
moduleName
=
"CODEC_HI3516"
;
// 名字会与HdfDriverEntry结构体中moduleName进行匹配
serviceName
=
"codec_service_0"
;
// 对外提供的服务名称
deviceMatchAttr
=
"hdf_codec_driver"
;
//
私有配置属性名称,
通过此名称匹配对应的私有数据(包含寄存器配置)
deviceMatchAttr
=
"hdf_codec_driver"
;
//
私有配置属性名称,
通过此名称匹配对应的私有数据(包含寄存器配置)
}
}
```
...
...
@@ -373,15 +373,15 @@ root {
platform
{
...
controller_0x120c1001
::
card_controller
{
//配置私有数据属性名称,与device_info.hcs中的deviceMatchAttr对应
//
配置私有数据属性名称,与device_info.hcs中的deviceMatchAttr对应
match_attr
=
"hdf_audio_driver_1"
;
serviceName
=
"hdf_audio_smartpa_dev0"
;
//对外提供的服务名称
accessoryName
=
"codec_service_1"
;
//外置codec服务名称
platformName
=
"dma_service_0"
;
//dma服务
cpuDaiName
=
"dai_service"
;
//
cpu dai
服务
accessoryDaiName
=
"accessory_dai"
;
//外置dai
dspName
=
"dsp_service_0"
;
//dsp服务名称
dspDaiName
=
"dsp_dai"
;
//dsp dai
serviceName
=
"hdf_audio_smartpa_dev0"
;
//
对外提供的服务名称
accessoryName
=
"codec_service_1"
;
//
外置codec服务名称
platformName
=
"dma_service_0"
;
//
dma服务
cpuDaiName
=
"dai_service"
;
//
cpu dai
服务
accessoryDaiName
=
"accessory_dai"
;
//
外置dai
dspName
=
"dsp_service_0"
;
//
dsp服务名称
dspDaiName
=
"dsp_dai"
;
//
dsp dai
}
}
}
...
...
@@ -405,7 +405,7 @@ root {
-
initSeqConfig:初始化过程寄存器配置组名称。
-
controlsConfig:控制功能配置组,其中array index(具体业务场景)和
iface(与HAL保持一致)为固定的值。
-
controlsConfig:控制功能配置组,其中array index(具体业务场景)和iface(与HAL保持一致)为固定的值。
```
array index
...
...
@@ -446,9 +446,9 @@ ctrlParamsSeqConfig:控制功能寄存器配置组,其中item与controlsConf
/* 3516寄存器基地址 */
idInfo
{
chipName
=
"hi3516"
;
//codec名字
chipIdRegister
=
0x113c0000
;
//
codec
基地址
chipIdSize
=
0x1000
;
//
codec
地址偏移
chipName
=
"hi3516"
;
//
codec名字
chipIdRegister
=
0x113c0000
;
//
codec
基地址
chipIdSize
=
0x1000
;
//
codec
地址偏移
}
/* 寄存器配置,包含各种寄存器配置信息 */
...
...
@@ -494,13 +494,13 @@ ctrlParamsSeqConfig:控制功能寄存器配置组,其中item与controlsConf
/* control function register config
reg, rreg, shift, rshift, min, max, mask, invert, value */
ctrlParamsSeqConfig
=
[
0x3c
,
0x3c
,
24
,
24
,
0x0
,
0x57
,
0x7F
,
1
,
0
,
//"Main Capture Volume"
0x38
,
0x38
,
31
,
31
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//"Playback Mute"
0x3c
,
0x3c
,
31
,
31
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//"Capture Mute"
0x20
,
0x20
,
16
,
16
,
0x0
,
0xF
,
0x1F
,
0
,
0
,
//"Mic Left Gain"
0x20
,
0x20
,
24
,
24
,
0x0
,
0xF
,
0x1F
,
0
,
0
,
//"Mic Right Gain"
0x2000
,
0x2000
,
16
,
16
,
0x0
,
0x7
,
0x7
,
0
,
0
,
//"Render Channel Mode"
0x1000
,
0x1000
,
16
,
16
,
0x0
,
0x7
,
0x7
,
0
,
0
//"Capture Channel Mode"
0x3c
,
0x3c
,
24
,
24
,
0x0
,
0x57
,
0x7F
,
1
,
0
,
//
"Main Capture Volume"
0x38
,
0x38
,
31
,
31
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//
"Playback Mute"
0x3c
,
0x3c
,
31
,
31
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//
"Capture Mute"
0x20
,
0x20
,
16
,
16
,
0x0
,
0xF
,
0x1F
,
0
,
0
,
//
"Mic Left Gain"
0x20
,
0x20
,
24
,
24
,
0x0
,
0xF
,
0x1F
,
0
,
0
,
//
"Mic Right Gain"
0x2000
,
0x2000
,
16
,
16
,
0x0
,
0x7
,
0x7
,
0
,
0
,
//
"Render Channel Mode"
0x1000
,
0x1000
,
16
,
16
,
0x0
,
0x7
,
0x7
,
0
,
0
//
"Capture Channel Mode"
];
/* 上层下发参数后,写入音频相关信息的寄存器
...
...
@@ -514,10 +514,10 @@ ctrlParamsSeqConfig:控制功能寄存器配置组,其中item与controlsConf
/* 电源管理功能寄存器配置
reg, rreg, shift, rshift, min, max, mask, invert, value */
ctrlSapmParamsSeqConfig
=
[
0x20
,
0x20
,
23
,
23
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//LPGA MIC 0 -- connect MIC
0x20
,
0x20
,
31
,
31
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//RPGA MIC 0 -- connect MIC
0x30
,
0x30
,
27
,
27
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//dacl to dacr mixer
0x30
,
0x30
,
26
,
26
,
0x0
,
0x1
,
0x1
,
0
,
0
//dacr to dacl mixer
0x20
,
0x20
,
23
,
23
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//
LPGA MIC 0 -- connect MIC
0x20
,
0x20
,
31
,
31
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//
RPGA MIC 0 -- connect MIC
0x30
,
0x30
,
27
,
27
,
0x0
,
0x1
,
0x1
,
0
,
0
,
//
dacl to dacr mixer
0x30
,
0x30
,
26
,
26
,
0x0
,
0x1
,
0x1
,
0
,
0
//
dacr to dacl mixer
];
/*
...
...
@@ -526,15 +526,15 @@ ctrlParamsSeqConfig:控制功能寄存器配置组,其中item与controlsConf
sapmType,compNameIndex,reg, mask,shift,invert, kcontrolNews,kcontrolsNum
*/
sapmComponent
=
[
10
,
0
,
0x20
,
0x1
,
15
,
1
,
0
,
0
,
//ADCL
10
,
1
,
0x20
,
0x1
,
14
,
1
,
0
,
0
,
//ADCR
11
,
2
,
0x14
,
0x1
,
11
,
1
,
0
,
0
,
//DACL
11
,
3
,
0x14
,
0x1
,
12
,
1
,
0
,
0
,
//DACR
8
,
4
,
0x20
,
0x1
,
13
,
1
,
1
,
1
,
//LPGA
8
,
5
,
0x20
,
0x1
,
12
,
1
,
2
,
1
,
//RPGA
15
,
6
,
0
,
0x1
,
0
,
0
,
3
,
1
,
//SPKL
15
,
7
,
0
,
0x1
,
0
,
0
,
4
,
1
,
//SPKR
0
,
8
,
0
,
0x1
,
0
,
0
,
0
,
0
//MIC
10
,
0
,
0x20
,
0x1
,
15
,
1
,
0
,
0
,
//
ADCL
10
,
1
,
0x20
,
0x1
,
14
,
1
,
0
,
0
,
//
ADCR
11
,
2
,
0x14
,
0x1
,
11
,
1
,
0
,
0
,
//
DACL
11
,
3
,
0x14
,
0x1
,
12
,
1
,
0
,
0
,
//
DACR
8
,
4
,
0x20
,
0x1
,
13
,
1
,
1
,
1
,
//
LPGA
8
,
5
,
0x20
,
0x1
,
12
,
1
,
2
,
1
,
//
RPGA
15
,
6
,
0
,
0x1
,
0
,
0
,
3
,
1
,
//
SPKL
15
,
7
,
0
,
0x1
,
0
,
0
,
4
,
1
,
//
SPKR
0
,
8
,
0
,
0x1
,
0
,
0
,
0
,
0
//
MIC
];
/* 电源管理功能配置
...
...
@@ -624,11 +624,11 @@ SmartPA归属于Accessory驱动的一种,开发步骤类似于codec:
Accessory模块需要填充如下3个结构体:
-
g_tfa9879Data
:accessory设备操作函数集,其中包含HCS文件中的配置信息,且定义与映射了accessory设备的初始化、读写寄存器的方法函数。
-
g_tfa9879Data:accessory设备操作函数集,其中包含HCS文件中的配置信息,且定义与映射了accessory设备的初始化、读写寄存器的方法函数。
-
g_tfa9879DaiDeviceOps
:accessory设备DAI的数据集,其中定义与映射了accessory设备DAI的操作集。
-
g_tfa9879DaiDeviceOps:accessory设备DAI的数据集,其中定义与映射了accessory设备DAI的操作集。
-
g_tfa9879DaiData
:accessory设备DAI的数据集,其中定义与映射了accessory设备的数据访问接口的驱动名、初始化和操作集。
-
g_tfa9879DaiData:accessory设备DAI的数据集,其中定义与映射了accessory设备的数据访问接口的驱动名、初始化和操作集。
```
c
struct
AccessoryData
g_tfa9879Data
=
{
...
...
@@ -850,13 +850,13 @@ struct AudioDmaOps g_dmaDeviceOps = {
.
DmaPrep
=
Hi3516DmaPrep
,
// dma准备函数接口
.
DmaSubmit
=
Hi3516DmaSubmit
,
// dma submit函数接口
.
DmaPending
=
Hi3516DmaPending
,
// dma pending函数接口
.
DmaPause
=
Hi3516DmaPause
,
// dma
暂停、停止函数接口
.
DmaResume
=
Hi3516DmaResume
,
// dma
恢复函数接口
.
DmaPause
=
Hi3516DmaPause
,
// dma暂停、停止函数接口
.
DmaResume
=
Hi3516DmaResume
,
// dma恢复函数接口
.
DmaPointer
=
Hi3516DmaPointer
,
// dma获取当前播放或录音位置函数接口
};
struct
PlatformData
g_platformData
=
{
.
PlatformInit
=
AudioDmaDeviceInit
,
//dma设备初始化接口
.
PlatformInit
=
AudioDmaDeviceInit
,
//
dma设备初始化接口
.
ops
=
&
g_dmaDeviceOps
,
};
```
...
...
@@ -904,7 +904,7 @@ int32_t Hi3516DmaPointer(struct PlatformData *data, uint32_t *pointer);
-
填充g_platformDriverEntry结构体
-
moduleName与device_info.hcs中的moduleName匹配
-
实现Bind、Init、Release函数指针
。
-
实现Bind、Init、Release函数指针
drivers/peripheral/audio/chipsets/hi3516dv300/soc/src/hi3516_dma_adapter.c
...
...
@@ -961,9 +961,9 @@ Dai驱动开发主要包含如下几个重要步骤:
Dai模块需要填充如下2个结构体:
-
g_daiData
:dai设备私有配置,其中包含dai设备的初始化、读写寄存器、操作函数。
-
g_daiData:dai设备私有配置,其中包含dai设备的初始化、读写寄存器、操作函数。
-
g_daiDeviceOps
:dai设备操作函数集,包含了dai的参数设置、触发、启动。
-
g_daiDeviceOps:dai设备操作函数集,包含了dai的参数设置、触发、启动。
```
c
struct
AudioDaiOps
g_daiDeviceOps
=
{
...
...
@@ -1196,9 +1196,9 @@ $(KHDF_AUDIO_HI3516DV300_DIR)/soc/src/hi3516_dma_adapter.c
│ │ └── hi3516_dma_ops.h
│ ├── src
│ │ ├── hi3516_aiao_impl.c
│ │ ├── hi3516_dai_adapter.c //dai驱动入口
│ │ ├── hi3516_dai_adapter.c //
dai驱动入口
│ │ ├── hi3516_dai_ops.c
│ │ ├── hi3516_dma_adapter.c //dma驱动入口
│ │ ├── hi3516_dma_adapter.c //
dma驱动入口
│ │ └── hi3516_dma_ops.c
│ └── test
│ └── unittest
...
...
@@ -1265,7 +1265,7 @@ HAL(Hardware Abstraction Layer)的核心功能说明如下:
4.
调用创建好的播放类中挂载的方法调用render->control.Start()、render->RenderFrame()进行下发开始命令,音频数据循环下发。
5.
播放过程中可调用其他控制命令对播放业务进行控制操作,例如调节音量、暂停、静音等render->control.Pause()、
render->control.Resume()、
render->volume.SetVolume()。
5.
播放过程中可调用其他控制命令对播放业务进行控制操作,例如调节音量、暂停、静音等render->control.Pause()、
render->control.Resume()、
render->volume.SetVolume()。
6.
播放业务完成后,下发停止命令、销毁播放类、卸载声卡。
...
...
@@ -1334,23 +1334,23 @@ static void *hal_main()
/* 根据匹配到的声卡信息进行加载声卡 */
struct
AudioAdapter
*
adapter
=
NULL
;
struct
AudioAdapterDescriptor
*
desc
=
&
descs
[
index
];
// 根据匹配到的声卡信息获取对应设备
manager
->
LoadAdapter
(
manager
,
desc
,
&
adapter
);
//加载声卡,获取声卡方法实例
manager
->
LoadAdapter
(
manager
,
desc
,
&
adapter
);
//
加载声卡,获取声卡方法实例
/* 创建播放类 */
struct
AudioRender
*
render
;
struct
AudioDeviceDescriptor
devDesc
;
struct
AudioSampleAttributes
attrs
;
InitDevDesc
(
&
devDesc
,
renderPort
.
portId
);
//初始化设置设备参数
InitDevDesc
(
&
devDesc
,
renderPort
.
portId
);
//
初始化设置设备参数
WavHeadAnalysis
(
g_file
,
&
attrs
);
// 解析音频文件设置Attributes
adapter
->
CreateRender
(
adapter
,
&
devDesc
,
&
attrs
,
&
render
);
/* 下发音频数播放 */
render
->
control
.
Start
((
AudioHandle
)
render
);
// 下发控制命令start,准备动作
pthread_create
(
&
g_tids
,
NULL
,
(
void
*
)(
&
FrameStart
),
&
g_str
);
// 起线程进行播放
pthread_create
(
&
g_tids
,
NULL
,
(
void
*
)(
&
FrameStart
),
&
g_str
);
//
拉
起线程进行播放
/* 控制命令 */
render
->
control
.
Pause
((
AudioHandle
)
render
);
// 下发
进行
暂停操作
render
->
control
.
Resume
((
AudioHandle
)
render
);
// 恢复操作
render
->
control
.
Pause
((
AudioHandle
)
render
);
// 下发暂停操作
render
->
control
.
Resume
((
AudioHandle
)
render
);
//
下发
恢复操作
render
->
volume
.
SetVolume
((
AudioHandle
)
render
,
0
.
5
);
// 设置音量
/* 停止播放,销毁播放类 */
...
...
zh-cn/device-dev/driver/driver-peripherals-camera-des.md
浏览文件 @
fa0eeaeb
...
...
@@ -4,7 +4,7 @@
### 功能简介<a name="2"></a>
OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Device Interface)接口,对下实现相机Pipeline模型,管理相机各个硬件设备。
该驱动框架模型内部分为三层,依次为HDI实现层、框架层和设备适配层
,
各层基本概念如下:
该驱动框架模型内部分为三层,依次为HDI实现层、框架层和设备适配层
。
各层基本概念如下:
+
HDI实现层:实现OHOS(OpenHarmony Operation System)相机标准南向接口。
+
框架层:对接HDI实现层的控制、流的转发,实现数据通路的搭建,管理相机各个硬件设备等功能。
...
...
@@ -51,7 +51,7 @@ Camera模块主要用以相机预览、拍照、视频流等场景下对相机
| 功能描述 | 接口名称 |
| ---------------------------- | ------------------------------------------------------------ |
| 获取流控制器 | CamRetCode GetStreamOperator(
<br
/>
const OHOS::sptr
<IStreamOperatorCallback>
&callback,
<br/>
OHOS::sptr
<IStreamOperator>
&streamOperator) |
| 获取流控制器 | CamRetCode GetStreamOperator(
<br
>
const OHOS::sptr
<IStreamOperatorCallback>
&callback,
<br>
OHOS::sptr
<IStreamOperator>
&streamOperator) |
| 更新设备控制参数 | CamRetCode UpdateSettings(const std::shared_ptr
<CameraSetting>
&settingss) |
| 设置Result回调模式和回调函数 | CamRetCode SetResultMode(const ResultCallbackMode &mode) |
| 获取使能的ResultMeta | CamRetCode GetEnabledResults(std::vector
<MetaType>
&results) |
...
...
@@ -73,8 +73,8 @@ Camera模块主要用以相机预览、拍照、视频流等场景下对相机
| ------------------------------ | ------------------------------------------------------------ |
| 设置ICameraHost回调接口 | CamRetCode SetCallback(const OHOS::sptr
<ICameraHostCallback>
&callback) |
| 获取当前可用的Camera设备ID列表 | CamRetCode GetCameraIds(std::vector
\<
std::string
\>
&cameraIds) |
| 获取Camera设备能力集合 | CamRetCode GetCameraAbility(const std::string &cameraId,
<br/>
std::shared_ptr
<CameraAbility>
&ability) |
| 打开Camera设备 | CamRetCode OpenCamera(const std::string &cameraId,
<br
/>
const OHOS::sptr
<ICameraDeviceCallback>
&callback,
<br/>
OHOS::sptr
<ICameraDevice>
&device) |
| 获取Camera设备能力集合 | CamRetCode GetCameraAbility(const std::string &cameraId, std::shared_ptr
<CameraAbility>
&ability) |
| 打开Camera设备 | CamRetCode OpenCamera(const std::string &cameraId,
<br
>
const OHOS::sptr
<ICameraDeviceCallback>
&callback,
<br>
OHOS::sptr
<ICameraDevice>
&device) |
| 打开或关闭闪光灯 | CamRetCode SetFlashlight(const std::string &cameraId, bool &isEnable) |
-
icamera_host_callback.h
...
...
@@ -96,30 +96,30 @@ Camera模块主要用以相机预览、拍照、视频流等场景下对相机
| 功能描述 | 接口名称 |
| -------------------------------- | ------------------------------------------------------------ |
| 查询是否支持添加参数对应的流 | CamRetCode IsStreamsSupported(
<br
/>
OperationMode mode,
<br/>
const std::shared_ptr
\<
Camera::CameraMetadata
\>
&modeSetting,
<br/>
const std::vector<std::shared_ptr<StreamInfo>> &info,
<br/>
StreamSupportType &type) |
| 查询是否支持添加参数对应的流 | CamRetCode IsStreamsSupported(
<br
>
OperationMode mode,
<br>
const std::shared_ptr
\<
Camera::CameraMetadata
\>
&modeSetting,
<br>
const std::vector<std::shared_ptr<StreamInfo>> &info,
<br>
StreamSupportType &type) |
| 创建流 | CamRetCode CreateStreams(const std::vector
<std::shared_ptr
<
StreamInfo
>
> &streamInfos) |
| 释放流 | CamRetCode ReleaseStreams(const std::vector
<int>
&streamIds) |
| 配置流 | CamRetCode CommitStreams(OperationMode mode,
<br/>
const std::shared_ptr
<CameraMetadata>
&modeSetting) |
| 获取流的属性 | CamRetCode GetStreamAttributes(
<br/>
std::vector
<std::shared_ptr
<
StreamAttribute
>
> &attributes) |
| 配置流 | CamRetCode CommitStreams(OperationMode mode, const std::shared_ptr
<CameraMetadata>
&modeSetting) |
| 获取流的属性 | CamRetCode GetStreamAttributes(std::vector
<std::shared_ptr
<
StreamAttribute
>
> &attributes) |
| 绑定生产者句柄和指定流 | CamRetCode AttachBufferQueue(int streamId, const OHOS::sptr
\<
OHOS::IBufferProducer
\>
&producer) |
| 解除生产者句柄和指定流的绑定关系 | CamRetCode DetachBufferQueue(int streamId) |
| 捕获图像 | CamRetCode Capture(int captureId,
<br/>
const std::shared_ptr
<CaptureInfo>
&info, bool isStreaming) |
| 捕获图像 | CamRetCode Capture(int captureId, const std::shared_ptr
<CaptureInfo>
&info, bool isStreaming) |
| 取消捕获 | CamRetCode CancelCapture(int captureId) |
| 将指定流转换成离线流 | CamRetCode ChangeToOfflineStream(const std::vector
<int>
&streamIds,
<br
/>
OHOS::sptr
<IStreamOperatorCallback>
&callback,
<br/>
OHOS::sptr
<IOfflineStreamOperator>
&offlineOperator) |
| 将指定流转换成离线流 | CamRetCode ChangeToOfflineStream(const std::vector
<int>
&streamIds,
<br
>
OHOS::sptr
<IStreamOperatorCallback>
&callback,
<br>
OHOS::sptr
<IOfflineStreamOperator>
&offlineOperator) |
-
istream_operator_callback.h
| 功能描述 | 接口名称 |
| ---------------------------------------- | ------------------------------------------------------------ |
| 捕获开始回调,在捕获开始时调用 | void OnCaptureStarted(int32_t captureId, const std::vector
<int32_t>
&streamIds) |
| 捕获结束回调,在捕获结束时调用 | void OnCaptureEnded(int32_t captureId,
<br/>
const std::vector
<std::shared_ptr
<
CaptureEndedInfo
>
> &infos) |
| 捕获错误回调,在捕获过程中发生错误时调用 | void OnCaptureError(int32_t captureId,
<br/>
const std::vector
<std::shared_ptr
<
CaptureErrorInfo
>
> &infos) |
| 帧捕获回调 | void OnFrameShutter(int32_t captureId,
<br
/>
const std::vector
<int32_t>
&streamIds, uint64_t timestamp) |
| 捕获结束回调,在捕获结束时调用 | void OnCaptureEnded(int32_t captureId, const std::vector
<std::shared_ptr
<
CaptureEndedInfo
>
> &infos) |
| 捕获错误回调,在捕获过程中发生错误时调用 | void OnCaptureError(int32_t captureId, const std::vector
<std::shared_ptr
<
CaptureErrorInfo
>
> &infos) |
| 帧捕获回调 | void OnFrameShutter(int32_t captureId,
<br
>
const std::vector
<int32_t>
&streamIds, uint64_t timestamp) |
### 开发步骤<a name="7"></a>
Camera驱动的开发过程主要包含以下步骤:
1.
**注册CameraHost**
1.
注册CameraHost
定义Camera的HdfDriverEntry结构体,该结构体中定义了CameraHost初始化的方法。
```
...
...
@@ -133,7 +133,7 @@ Camera驱动的开发过程主要包含以下步骤:
HDF_INIT(g_cameraHostDriverEntry); // 将Camera的HdfDriverEntry结构体注册到HDF上
```
2.
**初始化Host服务**
2.
初始化Host服务
步骤1中提到的HdfCameraHostDriverBind接口提供了CameraServiceDispatch和CameraHostStubInstance的注册。这两个接口一个是远端调用CameraHost的方法,如OpenCamera(),SetFlashlight()等,另外一个是Camera设备的初始化,在开机时被调用。
...
...
@@ -142,7 +142,7 @@ Camera驱动的开发过程主要包含以下步骤:
{
HDF_LOGI("HdfCameraHostDriverBind enter!");
if (deviceObject == nullptr) {
HDF_LOGE("HdfCameraHostDriverBind: HdfDeviceObject is NULL
!");
HDF_LOGE("HdfCameraHostDriverBind: HdfDeviceObject is NULL!");
return HDF_FAILURE;
}
HdfCameraService
*hdfCameraService = reinterpret_cast<HdfCameraService *
>(OsalMemAlloc(sizeof(HdfCameraService)));
...
...
@@ -192,7 +192,7 @@ Camera驱动的开发过程主要包含以下步骤:
CameraHostStubInstance()接口最终调用CameraHostImpl::Init()方法,该方法会获取物理Camera,并对DeviceManager和PipelineCore进行初始化。
3.
**获取Host服务**
3.
获取Host服务
调用Get()接口从远端CameraService中获取CameraHost对象。get()方法如下:
...
...
@@ -218,7 +218,7 @@ Camera驱动的开发过程主要包含以下步骤:
}
```
4.
**打开设备**
4.
打开设备
CameraHostProxy对象中有五个方法,分别是SetCallback、GetCameraIds、GetCameraAbility、OpenCamera和SetFlashlight。下面着重描述OpenCamera接口。
CameraHostProxy的OpenCamera()接口通过CMD_CAMERA_HOST_OPEN_CAMERA调用远端CameraHostStubOpenCamera()接口并获取ICameraDevice对象。
...
...
@@ -285,7 +285,7 @@ Camera驱动的开发过程主要包含以下步骤:
}
```
5.
**获取流**
5.
获取流
CameraDeviceImpl定义了GetStreamOperator、UpdateSettings、SetResultMode和GetEnabledResult等方法,获取流操作方法如下:
...
...
@@ -299,7 +299,7 @@ Camera驱动的开发过程主要包含以下步骤:
}
spCameraDeviceCallback_ = callback;
if (spStreamOperator_ == nullptr) {
// 这里
new了
一个spStreamOperator对象传递给调用者,以便对stream进行各种操作。
// 这里
新建
一个spStreamOperator对象传递给调用者,以便对stream进行各种操作。
spStreamOperator_ = new(std::nothrow) StreamOperatorImpl(spCameraDeviceCallback_, shared_from_this());
if (spStreamOperator_ == nullptr) {
CAMERA_LOGW("create stream operator failed.");
...
...
@@ -315,7 +315,7 @@ Camera驱动的开发过程主要包含以下步骤:
}
```
6.
**创建流**
6.
创建流
调用CreateStreams创建流前需要填充StreamInfo结构体,具体内容如下:
...
...
@@ -439,17 +439,17 @@ Camera驱动的开发过程主要包含以下步骤:
}
```
9.
**取消捕获和释放离线流**
9.
取消捕获和释放离线流
StreamOperatorImpl类中的CancelCapture()接口的主要作用是根据captureId取消数据流的捕获。
```
CamRetCode StreamOperatorImpl::CancelCapture(int captureId)
{
auto itr = camerCaptureMap_.find(captureId); //根据captureId 在Map中查找对应的CameraCapture对象
RetCode rc = itr->second->Cancel(); //调用CameraCapture中Cancel方法结束数据捕获
auto itr = camerCaptureMap_.find(captureId); //
根据captureId 在Map中查找对应的CameraCapture对象
RetCode rc = itr->second->Cancel(); //
调用CameraCapture中Cancel方法结束数据捕获
std::unique_lock
<std::mutex>
lock(captureMutex_);
camerCaptureMap_.erase(itr); //擦除该CameraCapture对象
camerCaptureMap_.erase(itr); //
擦除该CameraCapture对象
return NO_ERROR;
}
```
...
...
@@ -459,14 +459,14 @@ Camera驱动的开发过程主要包含以下步骤:
```
CamRetCode StreamOperatorImpl::ReleaseStreams(const std::vector
<int>
& streamIds)
{
RetCode rc = DestroyStreamPipeline(streamIds); //销毁该streamIds 的pipeline
RetCode rc = DestroyStreamPipeline(streamIds); //
销毁该streamIds 的pipeline
rc = DestroyHostStreamMgr(streamIds);
rc = DestroyStreams(streamIds); //销毁该streamIds 的 Stream
rc = DestroyStreams(streamIds); //
销毁该streamIds 的 Stream
return NO_ERROR;
}
```
10.
**关闭Camera设备**
10.
关闭Camera设备
调用CameraDeviceImpl中的Close()来关闭CameraDevice,该接口调用deviceManager中的PowerDown()来给设备下电。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录