未验证 提交 20bdaa46 编写于 作者: O openharmony_ci 提交者: Gitee

!19194 Audio指导文档整改

Merge pull request !19194 from 陈海帆/master
...@@ -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模块使用步骤
![](figures/HAL流程图.png) ![](figures/HAL流程图.png)
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);
} }
``` ```
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册