Bagikan melalui


Cara: Mengintegrasikan X3DAudio dengan XAudio2

Topik ini menunjukkan cara mengintegrasikan X3DAudio dengan XAudio2. Anda dapat menggunakan X3DAudio untuk menyediakan nilai volume dan nada untuk suara XAudio2 dan parameter untuk efek gaung bawaan XAudio2. Topik ini mengasumsikan bahwa Anda telah membuat grafik audio seperti yang dijelaskan dalam Cara: Membangun Grafik Pemrosesan Audio Dasar. Jika Anda belum membuat grafik audio, X3DAudioInitialize akan gagal.

Untuk menginisialisasi X3DAudio

  1. Inisialisasi X3DAudio dengan memanggil X3DAudioInitialize.

    Fungsi X3DAudioInitialize mengambil bendera yang menunjukkan pengaturan speaker, kecepatan suara dalam unit dunia yang ditentukan pengguna per detik, dan handel untuk mengembalikan instans mesin X3DAudio. Panggil IXAudio2MasteringVoice::GetChannelMask untuk mendapatkan masker saluran format output.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. Buat instans struktur X3DAUDIO_LISTENER dan X3DAUDIO_EMITTER .

    Struktur X3DAUDIO_LISTENER mewakili posisi apa pun yang mendengar suara. Umumnya, ini adalah posisi kamera atau posisi yang dekat dengannya. Struktur X3DAUDIO_EMITTER mewakili posisi benda yang membuat suara. Akan ada satu struktur X3DAUDIO_EMITTER untuk setiap suara yang sedang dilacak.

    Anggota struktur yang tidak akan diperbarui dalam perulangan permainan harus diinisialisasi di sini. Sebagian besar anggota struktur hanya dapat diinisialisasi menjadi nol. Namun, beberapa anggota X3DAUDIO_EMITTER perlu diatur untuk diinisialisasi ke nilai bukan nol. Anggota ChannelCount dari X3DAUDIO_EMITTER perlu diinisialisasi ke jumlah saluran dalam suara yang diwakili pemancar. Selain itu, anggota CurveDistanceScaler dari X3DAUDIO_EMITTER harus berada dalam rentang FLT_MIN hingga FLT_MAX.

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

ChannelCount di sini mengasumsikan kita memainkan suara mono-channel yang paling mudah diatur. Untuk sumber suara dengan lebih dari 1 saluran, Anda juga harus mengatur emiter ChannelRadius dan pChannelAzimuths nilai.

  1. Buat instans struktur X3DAUDIO_DSP_SETTINGS .

    Struktur X3DAUDIO_DSP_SETTINGS digunakan untuk mengembalikan hasil yang dihitung oleh X3DAudioCalculate. Fungsi X3DAudioCalculate tidak mengalokasikan memori untuk salah satu parameternya. Ini berarti Anda perlu mengalokasikan array untuk anggota pMatrixCoefficients dan pDelayTimes struktur X3DAUDIO_DSP_SETTINGS jika Anda ingin menggunakannya. Selain itu, Anda perlu mengatur anggota SrcChannelCount dan DstChannelCount ke jumlah saluran di suara sumber dan tujuan pemancar.

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

    Catatan

    Gunakan IXAudio2Voice::GetVoiceDetails pada suara mastering untuk mendapatkan jumlah InputChannels untuk nChannels. Untuk versi DirectX SDK XAUDIO2 sebelum Windows 8, gunakan IXAudio2::GetDeviceDetails.

     

Lakukan langkah-langkah ini sekali setiap dua hingga tiga bingkai untuk menghitung pengaturan baru dan menerapkannya. Dalam contoh ini, suara sumber dikirim langsung ke suara penguasaan dan ke suara submix dengan efek gaung yang diterapkan padanya.

Untuk menggunakan X3DAudio untuk menghitung dan menerapkan pengaturan audio 3D baru

  1. Perbarui struktur X3DAUDIO_LISTENER dan X3DAUDIO_EMITTER dengan posisi, kecepatan, dan orientasinya saat ini.

    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. Panggil X3DAudioCalculate untuk menghitung pengaturan baru untuk suara.

    Parameter untuk X3DAudioCalculate akan menjadi struktur X3DAUDIO_LISTENER dan X3DAUDIO_EMITTER yang diperbarui. Bendera akan menunjukkan nilai apa yang harus dihitung X3DAudioCalculate , dan struktur X3DAUDIO_DSP_SETTINGS mana yang akan menyimpan hasil perhitungan yang dilakukan.

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter,
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB,
        &DSPSettings );
    
  3. Gunakan IXAudio2Voice::SetOutputMatrix dan IXAudio2SourceVoice::SetFrequencyRatio untuk menerapkan nilai volume dan pitch ke suara sumber.

    pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ;
    pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
    
  4. Gunakan IXAudio2Voice::SetOutputMatrix untuk menerapkan tingkat gaung terhitung ke suara submix.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. Gunakan IXAudio2Voice::SetFilterParameters untuk menerapkan koefisien langsung filter low pass terhitung ke suara sumber.

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

X3DAudio

Gambaran Umum X3DAudio

Panduan Pemrograman XAudio2

Kontrol Volume dan Pitch XAudio2