CRI ADX  Last Updated: 2024-07-17 10:48 p
从多个设备输出

示例目录

/cri/pc/samples/criatomex/multi_device

示例描述

为多个音频设备分配音频并输出的示例。
与select_device示例的不同之处是可从多个设备同时输出音频。
播放音频时,需要为每个设备准备独立的混音器,因此添加创建ASR Rack作为混音器。
在本示例中,创建4个ASRRack(预设ASR和3个添加的ASR),将各ASRRack的输出分配给不同的设备。
具体处理流程如下。
  1. 使用::criAtom_EnumAudioEndpoints_WASAPI函数枚举设备。
  2. 使用::criAtom_SetDeviceId_WASAPI按顺序将找到的设备分配给CRIATOM_SOUND_RENDERER_HW1~4。
  3. 初始化Atom运行库,将预设ASR Rack的输出设置为CRIATOM_SOUND_RENDERER_HW1。
  4. 创建3个添加的ASR Rack,将各ASR Rack的输出设置为CRIATOM_SOUND_RENDERER_HW2~4。
  5. 音频播放开始时,使用::criAtomExPlayer_SetAsrRackId函数指定输出目标ASR Rack。
具体处理代码的示例如下。
/* 最大设备数量 */
#define MAX_DEVICES -4
/* 实际找到的设备数量 */
static CriSint32 num_devices = 0;
/* 为每个设备分配的硬件声音渲染器类型 */
static const CriAtomSoundRendererType sound_renderer_table[MAX_DEVICES] = {
};
/* 主要处理 */
main()
{
/* 枚举音频设备 */
criAtom_EnumAudioEndpoints_WASAPI(user_endpoint_callback, NULL);
/* 初始化程序库(使用CRIATOM_SOUND_RENDERER_HW1) */
lib_config.asr.sound_renderer_type = CRIATOM_SOUND_RENDERER_HW1;
criAtomEx_Initialize_WASAPI(&lib_config, NULL, 0);
/* 为添加设备创建ASR Rack(使用CRIATOM_SOUND_RENDERER_HW2~4) */
for (i = 1; i < MAX_DEVICES; i++) {
asr_rack_config.sound_renderer_type = sound_renderer_table[i];
app_obj->asr_rack_id[i] = criAtomExAsrRack_Create(&asr_rack_config, NULL, 0);
}
/* 指定输出目标ASR Rack ID */
criAtomExPlayer_SetAsrRackId(app_obj->player, app_obj->selected_device);
/* 开始播放 */
/* Start playback */
app_obj->playback_id = criAtomExPlayer_Start(app_obj->player);
}
/* 检测设备时调用的回调 */
static void CRIAPI user_endpoint_callback(void *object, IMMDevice *device)
{
/* 获取设备ID */
device->GetId(&device_id);
/* 关联声音渲染器和硬件 */
criAtom_SetDeviceId_WASAPI(sound_renderer_table[num_devices], device_id);
/* 释放设备ID区域 */
CoTaskMemFree(device_id);
}
#define criAtomExAsrRack_SetDefaultConfig(p_config)
Setting default parameters for CriAtomAsrConfig
Definition: cri_le_atom_asr.h:2119
CriAtomExAsrRackId criAtomExAsrRack_Create(const CriAtomExAsrRackConfig *config, void *work, CriSint32 work_size)
Creating the ASR rack
CriAtomExPlaybackId criAtomExPlayer_Start(CriAtomExPlayerHn player)
Start the playback
void criAtomExPlayer_SetAsrRackId(CriAtomExPlayerHn player, CriSint32 rack_id)
Specifying the ASR Rack ID
enum CriAtomSoundRendererTypeTag CriAtomSoundRendererType
Sound renderer type
@ CRIATOM_SOUND_RENDERER_HW1
Definition: cri_le_atom.h:817
@ CRIATOM_SOUND_RENDERER_HW3
Definition: cri_le_atom.h:819
@ CRIATOM_SOUND_RENDERER_HW2
Definition: cri_le_atom.h:818
@ CRIATOM_SOUND_RENDERER_HW4
Definition: cri_le_atom.h:820
void criAtomEx_Initialize_WASAPI(const CriAtomExConfig_WASAPI *config, void *work, CriSint32 work_size)
Library initialization
CriSint32 criAtom_EnumAudioEndpoints_WASAPI(CriAtomAudioEndpointCbFunc_WASAPI callback, void *object)
Enumerate audio endpoints
void criAtom_SetDeviceId_WASAPI(CriAtomSoundRendererType type, LPCWSTR device_id)
Set sound device
#define criAtomEx_SetDefaultConfig_WASAPI(p_config)
Assign the default values to the configuration structure used for the library's initialization.
Definition: cri_le_atom_wasapi.h:75
注意
CRIATOM_SOUND_RENDERER_HW1和CRIATOM_SOUND_RENDERER_NATIVE指向相同的声音渲染器。
因此,为CRIATOM_SOUND_RENDERER_HW1分配设备后,如果也为CRIATOM_SOUND_RENDERER_NATIVE 分配设备,则对于CRIATOM_SOUND_RENDERER_HW1的设置将被覆盖。
(应用程序中只使用其中一个。)