• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 音频工作组管理
2<!--Kit: Audio Kit-->
3<!--Subsystem: Multimedia-->
4<!--Owner: @songshenke-->
5<!--Designer: @caixuejiang; @hao-liangfei; @zhanganxiang-->
6<!--Tester: @Filger-->
7<!--Adviser: @zengyawen-->
8
9音频工作组是一套通过标记来帮助系统识别应用内音频关键线程的接口,系统通过应用提供的关键音频线程以及工作组运行信息可以让音频线程的运行状态更加健康。
10
11## 使用说明
12
13对于播放音频类应用,开发者需要先创建音频工作组,再将工作组运行信息的周期性告知系统。当工作结束后,需要对音频工作组进行清理。
14
15### 创建音频工作组示例
16
17开发者在使用OH_AudioWorkgroup的API前,需要先用[OH_AudioManager_GetAudioResourceManager](../../reference/apis-audio-kit/capi-native-audio-resource-manager-h.md#oh_audiomanager_getaudioresourcemanager)获取OH_AudioResourceManager实例。
18
19  ```cpp
20  #include <ohaudio/native_audio_resource_manager.h>
21
22  OH_AudioResourceManager *resMgr;
23  OH_AudioManager_GetAudioResourceManager(&resMgr);
24  ```
25
26### 创建音频工作组并将关键线程加入音频工作组
27
28开发者先使用[OH_AudioResourceManager_CreateWorkgroup](../../reference/apis-audio-kit/capi-native-audio-resource-manager-h.md#oh_audioresourcemanager_createworkgroup)创建一个新的音频工作组,再使用[OH_AudioWorkgroup_AddCurrentThread](../../reference/apis-audio-kit/capi-native-audio-resource-manager-h.md#oh_audioworkgroup_addcurrentthread)将关键线程加入音频工作组。
29
30  ```cpp
31  #include <chrono>
32
33  int32_t tokenId;
34  OH_AudioWorkgroup *grp = nullptr;
35
36  OH_AudioResourceManager_CreateWorkgroup(resMgr, "workgroup", &grp);
37  OH_AudioWorkgroup_AddCurrentThread(grp, &tokenId);
38  ```
39
40### 通知系统音频工作组的开始与结束
41
42在当音频工作组开始进行一个周期的工作时,开发者可以通知系统任务开始时间和任务预期完成的时间,并在音频工作组结束当前周期内的工作时,通知系统任务已结束。
43
44  ```cpp
45  constexpr static uint64_t intervalMs = 20;
46  bool threadShouldRun = true;
47
48  while (threadShouldRun) {
49    auto now = std::chrono::system_clock::now().time_since_epoch();
50    auto startTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(now).count();
51
52    OH_AudioWorkgroup_Start(grp, startTimeMs, startTimeMs + intervalMs);
53
54    // 应用音频数据处理。
55
56    OH_AudioWorkgroup_Stop(grp);
57  }
58  ```
59
60### 工作组任务结束后进行清理
61
62  ```cpp
63  // 当线程已经不需要接入分组时,将其从工作组中移除。
64  OH_AudioWorkgroup_RemoveThread(grp, tokenId);
65
66  OH_AudioResourceManager_ReleaseWorkgroup(resMgr, grp);
67  grp = nullptr;
68  ```