複数デバイスからの出力

サンプルのディレクトリ

/cri/pc/samples/criatomex/multi_device

サンプルの解説

複数のサウンドデバイスに音声を割り振って出力するサンプルです。
複数のデバイスから音声が同時に出力される点が、 select_device サンプルと異なります。
音声を再生する際、デバイスごとに独立したミキサーを用意する必要があるため、ミキサーとなるASRラックを追加で作成します。
このサンプルでは、4つのASRラック(デフォルトASRと3つの追加ASR)を作成し、各ASRラックの出力を異なるデバイスに割り振っています。
具体的な処理の流れは以下のとおりです。
  1. criAtom_EnumAudioEndpoints_WASAPI 関数でデバイスを列挙する。
  2. 見つかったデバイスを criAtom_SetDeviceId_WASAPI で順に CRIATOM_SOUND_RENDERER_HW1〜4 に割り当てる。
  3. Atomライブラリを初期化し、デフォルトASRラックの出力を CRIATOM_SOUND_RENDERER_HW1 に設定する。
  4. 追加のASRラックを3つ作成し、各ASRラックの出力を CRIATOM_SOUND_RENDERER_HW2〜4 に設定する。
  5. 音声再生開始時に、 criAtomExPlayer_SetAsrRackId 関数で出力先ASRラックを指定する。
具体的な処理コードの一例を以下に示します。
/* 最大デバイス数 */
#define MAX_DEVICES                     (4)

/* 実際に見つかったデバイスの数 */
static CriSint32 num_devices = 0;

/* デバイスごとに割り当てるハードウェアサウンドレンダラの種別 */
static const CriAtomSoundRendererType sound_renderer_table[MAX_DEVICES] = {
    CRIATOM_SOUND_RENDERER_HW1,
    CRIATOM_SOUND_RENDERER_HW2,
    CRIATOM_SOUND_RENDERER_HW3,
    CRIATOM_SOUND_RENDERER_HW4
};

/* メイン処理 */
main()
{
        :
    /* オーディオデバイスの列挙 */
    criAtom_EnumAudioEndpoints_WASAPI(user_endpoint_callback, NULL);
        :

        :
    /* ライブラリを初期化(CRIATOM_SOUND_RENDERER_HW1を使用) */
    criAtomEx_SetDefaultConfig_WASAPI(&lib_config);
    lib_config.asr.sound_renderer_type = CRIATOM_SOUND_RENDERER_HW1;
    criAtomEx_Initialize_WASAPI(&lib_config, NULL, 0);

    /* 追加デバイス用にASRラックを作成(CRIATOM_SOUND_RENDERER_HW2〜4を使用) */
    for (i = 1; i < MAX_DEVICES; i++) {
        criAtomExAsrRack_SetDefaultConfig(&asr_rack_config);
        asr_rack_config.sound_renderer_type = sound_renderer_table[i];
        app_obj->asr_rack_id[i] = criAtomExAsrRack_Create(&asr_rack_config, NULL, 0);
    }
        :

        :
    /* 出力先ASRラック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);
        :
}

注意:
CRIATOM_SOUND_RENDERER_HW1 と CRIATOM_SOUND_RENDERER_NATIVE は同じサウンドレンダラを指します。
そのため、 CRIATOM_SOUND_RENDERER_HW1 にデバイスをアサインした後、 CRIATOM_SOUND_RENDERER_NATIVE にもデバイスをアサインすると、 CRIATOM_SOUND_RENDERER_HW1 に対する設定が上書きされます。
(アプリケーション中ではどちらか一方のみを使用してください。)

CRI Middleware logo Copyright (c) 2006-2018 CRI Middleware Co., Ltd.