Procédure : intégrer X3DAudio avec XAudio2

Cette rubrique montre comment intégrer X3DAudio à XAudio2. Vous pouvez utiliser X3DAudio pour fournir les valeurs de volume et de hauteur pour les voix XAudio2 et les paramètres de l’effet de réverbération intégré XAudio2. Cette rubrique suppose que vous avez créé un graphique audio, comme décrit dans Guide pratique pour créer un graphique de traitement audio de base. Si vous n’avez pas encore créé de graphique audio, X3DAudioInitialize échoue.

Pour initialiser X3DAudio

  1. Initialisez X3DAudio en appelant X3DAudioInitialize.

    La fonction X3DAudioInitialize prend des indicateurs indiquant la configuration du haut-parleur, la vitesse du son dans les unités universelles définies par l’utilisateur par seconde et une poignée pour retourner une instance du moteur X3DAudio. Appelez IXAudio2MasteringVoice::GetChannelMask pour obtenir le masque de canal du format de sortie.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. Créez des instances des structures X3DAUDIO_LISTENER et X3DAUDIO_EMITTER .

    La structure X3DAUDIO_LISTENER représente la position de tout ce qui entend le son. En règle générale, il s’agit de la position de la caméra ou d’une position proche de celle-ci. La structure X3DAUDIO_EMITTER représente la position de la chose qui fait le son. Il y aura une structure X3DAUDIO_EMITTER pour chaque son qui est suivi.

    Les membres des structures qui ne seront pas mises à jour dans une boucle de jeu doivent être initialisés ici. La plupart des membres des structures peuvent simplement être initialisés à zéro. Toutefois, certains membres de X3DAUDIO_EMITTER doivent être définis pour être initialisés sur des valeurs autres que zéro. Le membre ChannelCount de l’X3DAUDIO_EMITTER doit être initialisé au nombre de canaux dans la voix que l’émetteur représente. En outre, le membre CurveDistanceScaler de X3DAUDIO_EMITTER doit être dans la plage FLT_MIN à FLT_MAX.

    X3DAUDIO_LISTENER Listener = {};
    
    X3DAUDIO_EMITTER Emitter = {};
    Emitter.ChannelCount = 1;
    Emitter.CurveDistanceScaler = Emitter.DopplerScaler = 1.0f;
    

Le ChannelCount part du principe que nous jouons un son mono-canal, qui est l’easist à configurer. Pour les sources sonores avec plus d’un canal, vous devez également définir l’émetteur ChannelRadius et les pChannelAzimuths valeurs.

  1. Créez un instance de la structure X3DAUDIO_DSP_SETTINGS.

    La structure X3DAUDIO_DSP_SETTINGS est utilisée pour retourner des résultats calculés par X3DAudioCalculate. La fonction X3DAudioCalculate n’alloue de mémoire à aucun de ses paramètres. Cela signifie que vous devez allouer des tableaux pour les membres pMatrixCoefficients et pDelayTimes de la structure X3DAUDIO_DSP_SETTINGS si vous envisagez de les utiliser. En outre, vous devez définir les membres SrcChannelCount et DstChannelCount sur le nombre de canaux dans les voix source et de destination de l’émetteur.

    X3DAUDIO_DSP_SETTINGS DSPSettings = {};
    FLOAT32 * matrix = new FLOAT32[deviceDetails.OutputFormat.Format.nChannels];
    DSPSettings.SrcChannelCount = 1;
    DSPSettings.DstChannelCount = deviceDetails.OutputFormat.Format.nChannels;
    DSPSettings.pMatrixCoefficients = matrix;
    

    Notes

    Utilisez IXAudio2Voice::GetVoiceDetails sur la voix de mastering pour obtenir le nombre de InputChannels pour nChannels. Pour les versions du Kit de développement logiciel (SDK) DirectX de XAUDIO2 antérieures à Windows 8, utilisez IXAudio2::GetDeviceDetails.

     

Effectuez ces étapes une fois toutes les deux à trois images pour calculer les nouveaux paramètres et les appliquer. Dans cet exemple, une voix source envoie directement à la voix de mastering et à une voix de sous-mixage avec un effet de réverbération appliqué.

Pour utiliser X3DAudio pour calculer et appliquer de nouveaux paramètres audio 3D

  1. Mettez à jour les structures X3DAUDIO_LISTENER et X3DAUDIO_EMITTER avec leur position, leur vélocité et leur orientation actuelles.

    Emitter.OrientFront = EmitterOrientFront;
    Emitter.OrientTop = EmitterOrientTop;
    Emitter.Position = EmitterPosition;
    Emitter.Velocity = EmitterVelocity;
    Listener.OrientFront = ListenerOrientFront;
    Listener.OrientTop = ListenerOrientTop;
    Listener.Position = ListenerPosition;
    Listener.Velocity = ListenerVelocity;
    
  2. Appelez X3DAudioCalculate pour calculer de nouveaux paramètres pour les voix.

    Les paramètres de X3DAudioCalculate sont les structures X3DAUDIO_LISTENER et X3DAUDIO_EMITTER mises à jour. Les indicateurs indiquent quelles valeurs X3DAudioCalculate doit calculer et quelle structure X3DAUDIO_DSP_SETTINGS contiendra les résultats des calculs effectués.

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter,
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB,
        &DSPSettings );
    
  3. Utilisez IXAudio2Voice::SetOutputMatrix et IXAudio2SourceVoice::SetFrequencyRatio pour appliquer les valeurs de volume et de hauteur à la voix source.

    pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ;
    pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
    
  4. Utilisez IXAudio2Voice::SetOutputMatrix pour appliquer le niveau de réverbération calculé à la voix de sous-mixage.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. Utilisez IXAudio2Voice::SetFilterParameters pour appliquer le coefficient direct de filtre de passage faible calculé à la voix source.

    XAUDIO2_FILTER_PARAMETERS FilterParameters = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * DSPSettings.LPFDirectCoefficient), 1.0f };
    pSFXSourceVoice->SetFilterParameters(&FilterParameters);
    

X3DAudio

Vue d’ensemble de X3DAudio

Guide de programmation XAudio2

Contrôle de volume et de tangage XAudio2