Compartilhar via


Como: Reproduzir um som com XAudio2

Este tópico descreve as etapas mínimas necessárias para reproduzir dados de áudio carregados anteriormente no XAudio2.

Depois de inicializar o XAudio2 (consulte Como: Inicializar o XAudio2) e carregar os dados de áudio (consulte Como: Como carregar arquivos de dados de áudio no XAudio2), você pode reproduzir um som criando uma voz de origem e passando dados de áudio para ela .

Para reproduzir um som

  1. Primeiro inicialize o XAudio2 para reprodução de áudio seguindo as etapas descritas em Como: Inicializar o XAudio2.

  2. Em seguida, preencha uma estrutura WAVEFORMATEX e uma estrutura XAUDIO2_BUFFER seguindo as etapas descritas em Como: Carregar arquivos de dados de áudio no XAudio2.

    Observação

    Dependendo do formato dos dados de áudio, pode ser necessário usar uma estrutura de dados maior (uma que contenha uma estrutura WAVEFORMATEX) no lugar de uma WAVEFORMATEX. Para mais informações, consulte o tópico WAVEFORMATEX.

  3. Em seguida, para criar o que é conhecido como voz de origem, chame o método IXAudio2::CreateSourceVoice. Isso lhe dará um ponteiro para uma interface IXAudio2SourceVoice. O formato da voz é especificado pelos valores definidos na estrutura WAVEFORMATEX.

    IXAudio2SourceVoice* m_pXAudio2SourceVoice{};
    ...
    winrt::check_hresult(m_xAudio2->CreateSourceVoice(&m_pXAudio2SourceVoice, (WAVEFORMATEX*)&wfx)));    
    
  4. Envie um XAUDIO2_BUFFER para a voz de origem chamando o método IXAudio2SourceVoice::SubmitSourceBuffer.

    winrt::check_hresult(m_pXAudio2SourceVoice->SubmitSourceBuffer(&xAudio2Buffer));
    

    Observação

    Os dados de amostra de áudio apontados pelo parâmetro pBuffer de SubmitSourceBuffer ainda pertencem ao aplicativo e devem permanecer alocados e acessíveis até que o som pare de ser reproduzido.

  5. Para iniciar a voz de origem, chame o método IXAudio2SourceVoice::Start. Como todas as vozes XAudio2 enviam sua saída para a voz masterizada por padrão, o áudio da voz de origem segue automaticamente para o dispositivo de áudio que foi criado/selecionado na inicialização. Em um gráfico de áudio mais complicado, a voz de origem precisaria especificar para qual voz sua saída deve ser enviada.

    winrt::check_hresult(m_pXAudio2SourceVoice->Start(0));
    

Ponteiros inteligentes

Por segurança e conveniência, você pode usar um ponteiro inteligente para a interface IXAudio2. Mas as interfaces de voz (como IXAudio2MasteringVoice) não possuem um método Liberar, então você verá um erro de compilação se tentar usar um ponteiro inteligente para elas. Nestes trechos de código usamos um ponteiro inteligente sempre que possível e um ponteiro bruto quando necessário.