音频工作组管理
=======

音频工作组是一套通过标记来帮助系统识别应用内音频关键线程的接口，系统通过应用提供的关键音频线程以及工作组运行信息可以让音频线程的运行状态更加健康。

以下各步骤示例为片段代码，可通过示例代码右下方链接获取[完整示例](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/Media/Audio/AudioRendererSampleC)。

#### 使用说明

对于播放音频类应用，开发者需要先创建音频工作组，再将工作组运行信息的周期性告知系统。当工作结束后，需要对音频工作组进行清理。

#### \[h2\]创建音频工作组示例

开发者在使用OH\_AudioWorkgroup的API前，需要先用[OH\_AudioManager\_GetAudioResourceManager](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-audio-resource-manager-h#oh_audiomanager_getaudioresourcemanager)获取OH\_AudioResourceManager实例。

#include <ohaudio/native\_audio\_resource\_manager.h>
// ...
OH\_AudioResourceManager \*resMgr;
// ...
    OH\_AudioManager\_GetAudioResourceManager(&resMgr);

#### \[h2\]创建音频工作组并将关键线程加入音频工作组

开发者先使用[OH\_AudioResourceManager\_CreateWorkgroup](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-audio-resource-manager-h#oh_audioresourcemanager_createworkgroup)创建一个新的音频工作组，再使用[OH\_AudioWorkgroup\_AddCurrentThread](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-audio-resource-manager-h#oh_audioworkgroup_addcurrentthread)将关键线程加入音频工作组。

#include <chrono>
// ...
int32\_t g\_tokenId;
OH\_AudioWorkgroup \*grp = nullptr;
// ...
    OH\_AudioResourceManager\_CreateWorkgroup(resMgr, "workgroup", &grp);
    OH\_AudioWorkgroup\_AddCurrentThread(grp, &g\_tokenId);

#### \[h2\]通知系统音频工作组的开始与结束

当音频工作组开始一个工作周期时，开发者可以通知系统任务的开始时间和预期完成时间。在音频工作组完成当前周期内的工作时，开发者应再次通知系统任务已结束。

constexpr static uint64\_t intervalMs = 20;
bool threadShouldRun = true;

while (threadShouldRun) {
    auto now = std::chrono::system\_clock::now().time\_since\_epoch();
    auto startTimeMs = std::chrono::duration\_cast<std::chrono::milliseconds>(now).count();
    OH\_AudioWorkgroup\_Start(grp, startTimeMs, startTimeMs + intervalMs);
    threadShouldRun = false;
    // 应用音频数据处理。
    OH\_AudioWorkgroup\_Stop(grp);
}

#### \[h2\]工作组任务结束后进行清理

// 当线程已经不需要接入分组时，将其从工作组中移除。
OH\_AudioWorkgroup\_RemoveThread(grp, g\_tokenId);

OH\_AudioResourceManager\_ReleaseWorkgroup(resMgr, grp);
grp = nullptr;