XAudio2 C

#include <Windows.h>
#include <xaudio2.h>

IXAudio2* pXAudio2 = nullptr;
IXAudio2MasteringVoice* pMasterVoice = nullptr;

int main() {
    // Step 1: Initialize XAudio2
    CoInitializeEx(nullptr, COINIT_MULTITHREADED);
    if (FAILED(XAudio2Create(&pXAudio2)))
        return -1;

    // Step 2: Create a mastering voice
    if (FAILED(pXAudio2->CreateMasteringVoice(&pMasterVoice)))
        return -1;

    // Step 3: Load and play an audio file
    // Replace "path/to/your/audio/file.wav" with the actual file path
    WAVEFORMATEX waveFormat;
    XAUDIO2_BUFFER buffer = { 0 };
    LPCWSTR audioFilePath = L"path/to/your/audio/file.wav";

    if (FAILED(XAudio2CreateSoundSource(&pSourceVoice, audioFilePath, 0, &waveFormat)))
        return -1;

    buffer.AudioBytes = waveFormat.nAvgBytesPerSec * 10; // 10 seconds of audio
    buffer.pAudioData = new BYTE[buffer.AudioBytes];

    // Load audio data into buffer (replace LoadAudioData function with your implementation)
    LoadAudioData(buffer.pAudioData, buffer.AudioBytes, audioFilePath);

    if (FAILED(pXAudio2->CreateSourceVoice(&pSourceVoice, &waveFormat)))
        return -1;

    if (FAILED(pSourceVoice->SubmitSourceBuffer(&buffer)))
        return -1;

    pSourceVoice->Start(0);

    // Step 4: Wait for the audio to finish playing
    XAUDIO2_VOICE_STATE state;
    pSourceVoice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED);

    while (state.BuffersQueued > 0) {
        Sleep(100);
        pSourceVoice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED);
    }

    // Step 5: Cleanup
    pSourceVoice->Stop();
    pSourceVoice->DestroyVoice();
    pXAudio2->Release();
    CoUninitialize();

    return 0;
}