Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
20bdaa46
D
Docs
项目概览
OpenHarmony
/
Docs
接近 2 年 前同步成功
通知
159
Star
292
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看板
未验证
提交
20bdaa46
编写于
6月 09, 2023
作者:
O
openharmony_ci
提交者:
Gitee
6月 09, 2023
浏览文件
操作
浏览文件
下载
差异文件
!19194 Audio指导文档整改
Merge pull request !19194 from 陈海帆/master
上级
d3555e04
61ffa271
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
60 addition
and
53 deletion
+60
-53
zh-cn/device-dev/driver/driver-peripherals-audio-des.md
zh-cn/device-dev/driver/driver-peripherals-audio-des.md
+60
-53
zh-cn/device-dev/driver/figures/HAL流程图.png
zh-cn/device-dev/driver/figures/HAL流程图.png
+0
-0
未找到文件。
zh-cn/device-dev/driver/driver-peripherals-audio-des.md
浏览文件 @
20bdaa46
...
@@ -1171,7 +1171,7 @@ obj-$(CONFIG_DRIVERS_HDF_AUDIO_HI3516CODEC) += \
...
@@ -1171,7 +1171,7 @@ obj-$(CONFIG_DRIVERS_HDF_AUDIO_HI3516CODEC) += \
soc/src/hi3516_dma_adapter.o
soc/src/hi3516_dma_adapter.o
```
```
小型系统(liteOS):drivers/adapter/khdf/liteos/model/audio/Makefile
小型系统(liteOS):drivers/
hdf_core/
adapter/khdf/liteos/model/audio/Makefile
```
makefile
```
makefile
LOCAL_SRCS
+=
\
LOCAL_SRCS
+=
\
...
@@ -1272,54 +1272,58 @@ HAL(Hardware Abstraction Layer)的核心功能说明如下:
...
@@ -1272,54 +1272,58 @@ HAL(Hardware Abstraction Layer)的核心功能说明如下:
1.
提供Audio HDI接口供北向音频服务调用,实现音频服务的基本功能。
1.
提供Audio HDI接口供北向音频服务调用,实现音频服务的基本功能。
2.
作为标准南向接口,保证南向OEM产商实现HDI-adapter的规范性,保证生态良性演进。
2.
作为标准南向接口,保证南向OEM产商实现HDI-adapter的规范性,保证生态良性演进。
代码路径:drivers
/peripheral/audio/hal
代码路径:drivers
_interface/audio/v1_0
### HAL模块使用步骤
### HAL模块使用步骤


1.
使用入口函数
GetAudioManagerFuncs
()获取函数方法。
1.
使用入口函数
IAudioManagerGet
()获取函数方法。
2.
获取所支持的声卡信息GetAllAdapters(),加载对应的声卡LoadAdapter()
。
2.
使用GetAllAdapters()获取所支持的声卡信息,调用LoadAdapter()加载对应的声卡
。
3.
创建播放类CreateRender()或者录音类,下发音频文件音频相关属性。
3.
创建播放类CreateRender()或者录音类,下发音频文件音频相关属性。
4.
调用创建好的播放类中挂载的方法
调用render->control.Start()、render->RenderFrame()进行下发开始命令,音频数据循环下发
。
4.
调用创建好的播放类中挂载的方法
,例如开始播放时调用render->Start(),音频数据循环下发时调用render->RenderFrame()
。
5.
播放过程中可调用其他控制命令对播放业务进行控制操作,例如调节音量
、暂停、静音等render->control.Pause()、render->control.Resume()、render->volume.SetVolume()
。
5.
播放过程中可调用其他控制命令对播放业务进行控制操作,例如调节音量
render->SetVolume()、暂停render->Pause()、恢复render->Resume()等
。
6.
播放业务完成后,下发停止命令
、销毁播放类、卸载声卡
。
6.
播放业务完成后,下发停止命令
render->Stop()、销毁播放类adapter->DestroyRender()、卸载声卡audioManagerIns->UnloadAdapter()
。
1. render->control.Stop();
### HAL使用示例
2. adapter->DestroyRender();
3. manager->UnloadAdapter();
### HAL使用实例
```
c
```
c
#include <string.h>
#include <string.h>
#include <stdio.h>
#include <stdio.h>
#include "audio_types.h"
#include <pthread.h>
#include <pthread.h>
#include "audio_manager.h"
#include "v1_0/audio_types.h"
#include "v1_0/iaudio_manager.h"
/* so动态库引用打开 */
char
*
soPathHdi
=
"/system/lib/libhdi_audio.z.so"
;
struct
IAudioRender
*
g_render
=
NULL
;
void
*
g_handle
=
dlopen
(
soPathHdi
,
1
);
struct
IAudioAdapter
*
g_adapter
=
NULL
;
struct
AudioDeviceDescriptor
g_devDesc
;
int32_t
FrameStart
(
void
*
param
)
struct
AudioSampleAttributes
g_attrs
;
struct
AudioHeadInfo
g_wavHeadInfo
;
bool
g_isDirect
=
false
;
//IPC Loading
uint32_t
g_renderId
=
0
;
static
int32_t
FrameStart
(
const
struct
StrPara
*
param
)
{
{
...
...
/* 初始化参数 */
char
*
frame
=
param
->
frame
;
int32_t
bufferSize
=
param
->
bufferSize
;
size_t
remainingDataSize
=
g_wavHeadInfo
.
riffSize
;
/* 循环进行下发音频数据 */
/* 循环进行下发音频数据 */
do
{
do
{
readSize
=
(
remainingDataSize
>
bufferSize
)
?
bufferSize
:
remainingDataSize
;
uint64_t
replyBytes
=
0
;
size_t
readSize
=
(
remainingDataSize
>
bufferSize
)
?
(
size_t
)
bufferSize
:
remainingDataSize
;
numRead
=
fread
(
frame
,
1
,
readSize
,
g_file
);
numRead
=
fread
(
frame
,
1
,
readSize
,
g_file
);
if
(
numRead
>
0
)
{
if
(
numRead
>
0
)
{
ret
=
render
->
RenderFrame
(
render
,
frame
,
numRead
,
&
replyBytes
);
int32_t
ret
=
render
->
RenderFrame
(
render
,
(
int8_t
*
)
frame
,
numRead
,
&
replyBytes
);
if
(
ret
==
HDF_ERR_INVALID_OBJECT
)
{
if
(
ret
==
HDF_ERR_INVALID_OBJECT
)
{
LOG_FUN_ERR
(
"Render already stop!"
);
AUDIO_FUNC_LOGE
(
"Render already stop!"
);
break
;
break
;
}
}
remainingDataSize
-=
numRead
;
remainingDataSize
-=
numRead
;
...
@@ -1336,49 +1340,52 @@ int32_t FrameStart(void *param)
...
@@ -1336,49 +1340,52 @@ int32_t FrameStart(void *param)
static
void
*
hal_main
()
static
void
*
hal_main
()
{
{
/* 映射入口函数及调用 */
int32_t
adapterIndex
=
0
;
struct
AudioManager
*
(
*
getAudioManager
)()
=
struct
AudioPort
*
renderPort
;
(
struct
AudioManager
*
(
*
)())(
dlsym
(
g_handle
,
"GetAudioManagerFuncs"
));
struct
AudioManager
*
manager
=
getAudioManager
();
/* 通过IAudioManagerGet()获取入口函数 */
struct
IAudioManager
*
audioManagerIns
=
IAudioManagerGet
(
g_isDirect
);
if
(
audioManagerIns
==
NULL
)
{
AUDIO_FUNC_LOGE
(
"Get Audio Manager Fail"
);
return
HDF_FAILURE
;
}
/* 获取声卡列表 */
/* 获取声卡列表 */
struct
AudioAdapterDescriptor
*
descs
=
NULL
;
struct
AudioAdapterDescriptor
*
descs
=
(
struct
AudioAdapterDescriptor
*
)
OsalMemCalloc
(
int32_t
size
=
0
;
sizeof
(
struct
AudioAdapterDescriptor
)
*
(
MAX_AUDIO_ADAPTER_DESC
));
int32_t
ret
=
manager
->
GetAllAdapters
(
manager
,
&
descs
,
&
size
);
uint32_t
adapterNum
=
MAX_AUDIO_ADAPTER_DESC
;
int32_t
ret
=
audioManagerIns
->
GetAllAdapters
(
audioManagerIns
,
descs
,
&
adapterNum
);
/* 根据用户指定的声卡名称和端口描述进行匹配声卡及端口 */
/* 根据用户指定的声卡名称和端口描述进行匹配声卡及端口 */
enum
AudioPortDirection
port
=
PORT_OUT
;
// 端口类型为OUT,放音
SelectAudioCard
(
descs
,
adapterNum
,
&
adapterIndex
);
struct
AudioPort
renderPort
;
strcpy_s
(
g_adapterName
,
PATH_LEN
,
descs
[
adapterIndex
-
1
].
adapterName
);
char
*
adapterNameCase
=
"primary"
;
SwitchAudioPort
(
&
descs
[
adapterIndex
-
1
],
PORT_OUT
,
renderPort
);
// 端口类型为OUT,放音
int32_t
index
=
SwitchAdapter
(
descs
,
adapterNameCase
,
port
,
&
renderPort
,
size
);
/* 根据匹配到的声卡信息进行加载声卡 */
/* 根据匹配到的声卡信息进行加载声卡 */
struct
AudioAdapter
*
adapter
=
NULL
;
audioManagerIns
->
LoadAdapter
(
audioManagerIns
,
&
descs
[
adapterIndex
-
1
],
&
g_adapter
);
// 加载声卡,获取声卡方法实例
struct
AudioAdapterDescriptor
*
desc
=
&
descs
[
index
];
// 根据匹配到的声卡信息获取对应设备
manager
->
LoadAdapter
(
manager
,
desc
,
&
adapter
);
// 加载声卡,获取声卡方法实例
/* 创建播放类 */
/* 创建播放类 */
struct
AudioRender
*
render
;
uint32_t
portId
=
renderPort
->
portId
;
struct
AudioDeviceDescriptor
devDesc
;
InitDevDesc
(
&
g_devDesc
,
portId
);
// 初始化设置设备参数
struct
AudioSampleAttributes
attrs
;
InitAttrs
(
&
g_attrs
);
// 初始化音频属性参数
InitDevDesc
(
&
devDesc
,
renderPort
.
portId
);
// 初始化设置设备参数
CheckWavFileHeader
(
g_file
,
&
g_wavHeadInfo
,
&
g_attrs
);
// 解析音频文件及设置Attributes
WavHeadAnalysis
(
g_file
,
&
attrs
);
// 解析音频文件设置Attributes
g_adapter
->
CreateRender
(
g_adapter
,
&
g_devDesc
,
&
g_attrs
,
&
g_render
,
&
g_renderId
);
adapter
->
CreateRender
(
adapter
,
&
devDesc
,
&
attrs
,
&
render
);
/* 下发音频数播放 */
/* 下发音频数播放 */
render
->
control
.
Start
((
AudioHandle
)
render
);
// 下发控制命令start,准备动作
g_render
->
Start
((
void
*
)
g_render
);
// 下发控制命令start,准备动作
pthread_create
(
&
g_tids
,
NULL
,
(
void
*
)(
&
FrameStart
),
&
g_str
);
// 拉起线程进行播放
pthread_create
(
&
g_tids
,
&
tidsAttr
,
(
void
*
)(
&
FrameStart
),
&
g_str
);
// 拉起线程进行播放
/* 控制命令 */
/* 控制命令 */
render
->
control
.
Pause
((
AudioHandle
)
render
);
// 下发暂停操作
g_render
->
Pause
((
void
*
)
g_render
);
// 下发暂停操作
render
->
control
.
Resume
((
AudioHandle
)
render
);
// 下发恢复操作
g_render
->
Resume
((
void
*
)
g_render
);
// 下发恢复操作
render
->
volume
.
SetVolume
((
AudioHandle
)
render
,
0
.
5
);
// 设置音量
g_render
->
SetVolume
((
void
*
)
g_render
,
0
.
5
);
// 设置音量
/* 停止播放,销毁播放类 */
/* 停止播放,销毁播放类 */
render
->
control
.
Stop
((
AudioHandle
)
render
);
g_render
->
Stop
((
void
*
)
g_
render
);
adapter
->
DestroyRender
(
adapter
,
render
);
g_adapter
->
DestroyRender
(
g_adapter
,
g_renderId
);
/* 卸载声卡 */
/* 卸载声卡 */
manager
->
UnloadAdapter
(
manager
,
adapter
);
audioManagerIns
->
UnloadAdapter
(
audioManagerIns
,
g_adapterName
);
}
}
```
```
...
...
zh-cn/device-dev/driver/figures/HAL流程图.png
查看替换文件 @
d3555e04
浏览文件 @
20bdaa46
52.0 KB
|
W:
|
H:
46.8 KB
|
W:
|
H:
2-up
Swipe
Onion skin
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录