> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Uso de XAudio2 para reproducir un sonido

> Uso de XAudio2 para reproducir un sonido

Use `XAudio2` para cargar y reproducir un archivo .wav en XBOX One.

En las secciones siguientes se describe cómo usar `XAudio2` para cargar y reproducir un sonido en el Development Kit de XBOX One.

* [Tipos de datos importantes de XAudio2](#ID4ELB)
* [Inicialización de XAudio2](#ID4EXC)
* [Carga de un archivo .wav](#ID4E1D)
* [Establecimiento de una ruta de acceso a un archivo .wav](#ID4E2H)
* [Reproducción de un archivo .wav](#ID4EAF)
* [Finalización de un archivo .wav](#ID4E2F)

Para obtener un ejemplo funcional de `XAudio2`, descargue el ejemplo SimplePlaySound de los ejemplos del Microsoft Game Development Kit (GDK).

<a id="ID4ELB" />

## Tipos de datos importantes de XAudio2

`XAudio2` proporciona varios tipos de datos para ayudarle a reproducir efectos de sonido en XBOX One. Para reproducir un archivo .wav, necesita al menos los siguientes tipos de datos.

* `IXAudio2`: esta es la interfaz del objeto `XAudio2` que administra todos los estados del motor de audio, el subproceso de procesamiento de audio, el grafo de voces y mucho más.

* `IXAudio2SourceVoice`: use una voz de origen para enviar datos de audio a la canalización de procesamiento de `XAudio2`. Para que se oigan, los datos de voz deben enviarse a una voz de masterización.

* `IXAudio2MasteringVoice`: use este tipo de datos para representar el dispositivo de salida de audio. Los búferes de datos no se pueden enviar directamente a las voces de masterización. Sin embargo, para que se oigan, los datos enviados a otros tipos de voces deben dirigirse a una voz de masterización.

Además, es posible que los siguientes tipos de datos le resulten útiles.

* `PlaySoundVoiceContext`: use este tipo de datos para liberar el búfer de audio después del procesamiento.

* `IXAudio2VoiceCallback`: este tipo de datos contiene métodos que notifican al cliente cuando se producen determinados eventos en una `IXAudio2SourceVoice` específica.

<a id="ID4EXC" />

## Inicialización de XAudio2

`CoInitializeEx()` inicializa el modelo de objetos componentes (COM) para su uso por parte del subproceso actual. Establezca el primer parámetro en `NULL`. Establezca el segundo parámetro en `COINIT_MULTITHREADED`.

`XAudio2Create()` crea un nuevo objeto `XAudio2` y devuelve un puntero a su interfaz `IXAudio2`. Asegúrese de que `XAUDIO2_PROCESSOR` esté establecido en un valor válido. Se recomienda el valor `XAUDIO2_USE_DEFAULT_PROCESSOR` para permitir que el sistema operativo elija el procesador ideal según la plataforma de hardware.

`IXAudio2::CreateMasteringVoice()` crea y configura una voz de masterización y apunta a ella con el puntero proporcionado por el usuario.

#### C++

```cpp theme={null}
CoInitializeEx( NULL, COINIT_MULTITHREADED );

// Create an XAudio2 device.
DX::ThrowIfFailed( XAudio2Create( &m_pXAudio2, 0, XAUDIO2_USE_DEFAULT_PROCESSOR, NULL ) );

// Create an XAudio2 mastering voice, and store the result.
DX::ThrowIfFailed( m_pXAudio2->CreateMasteringVoice( &m_pMasteringVoice ) );  
```

<a id="ID4E1D" />

## Carga de un archivo .wav

Para acceder al archivo de audio, use una instancia de la clase `WaveFile`.

\* Para abrir un archivo .wav y recuperar información almacenada en el encabezado del archivo, llame a `WaveFile::Open(LPCWSTR strFileName)`.

* Para determinar el formato del archivo .wav, llame a `WaveFile::GetFormat()`.
* Para determinar el número de bytes y muestras del archivo .wav, llame a `WaveFile::GetDuration()`.
* Para leer los datos de muestra en memoria, llame a `WaveFile::ReadSample()`.

#### C++

```cpp theme={null}
// Read the .wav file.
WaveFile WaveFile;

// Append the file name and location to the end of the installation location.
WCHAR FilenameAndLocation[ 1024 ];
_snwprintf_s( FilenameAndLocation, _countof( FilenameAndLocation ), _TRUNCATE, L"%s%s", g_strCommonFileRoot, szFilename );

DX::ThrowIfFailed( WaveFile.Open( FilenameAndLocation ) );

// Read the format header.
BYTE header[64];
WAVEFORMATEX* pbWfx = reinterpret_cast<WAVEFORMATEX*>(header);

DX::ThrowIfFailed( WaveFile.GetFormat( pbWfx, sizeof(header) ) );

// Calculate the number of bytes and samples in the .wav file. 
DWORD cbWaveSize = WaveFile.GetDuration();

// Read the sample data into memory.
BYTE* pbWaveData = new BYTE[ cbWaveSize ];
DX::ThrowIfFailed( WaveFile.ReadSample( 0, pbWaveData, cbWaveSize, &cbWaveSize ) );  
```

<a id="ID4E2H" />

## Establecimiento de una ruta de acceso a un archivo .wav

Para cargar y usar archivos de audio, use el código siguiente para encontrar la ubicación de instalación de su proyecto en el dispositivo local. Almacene la ubicación de instalación en una cadena. Anexe la ubicación del archivo de audio al final de la cadena de la ubicación de instalación.

#### C++

```cpp theme={null}
std::wstring installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation->Path->Data();  
```

<a id="ID4EAF" />

## Reproducción de un archivo .wav

Cree una clase `IXAudio2::CreateSourceVoice()` y, a continuación, úsela para enviar datos de audio a la canalización de procesamiento de `XAudio2`. Para que los datos de voz se oigan, debe enviarlos a una voz de masterización directamente o a través de voces de submezcla intermedias. Para almacenar los detalles del archivo de audio, cree un `XAUDIO2_BUFFER`.

Después de crear e inicializar el búfer de `XAudio2` y la voz de origen, llame a `IXAudio2SourceVoice::SubmitSourceBuffer()` para agregar el búfer de audio a la cola de entrada de la voz. Tenga en cuenta que los datos de audio a los que apunta `XAUDIO2_BUFFER::pAudioData` deben seguir siendo válidos hasta que `XAudio2` haya terminado de reproducir el contenido del búfer.

Una vez rellenada la cola de entrada de la voz, llame a `IXAudio2SourceVoice::Start()` para reproducir el siguiente sonido de la cola.

#### C++

```cpp theme={null}
// Play the .wav file by using a new XAudio2SourceVoice.
// Create the source voice.
DX::ThrowIfFailed( pXaudio2->CreateSourceVoice( &m_pSourceVoice, pbWfx, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &m_VoiceContext ) );

// Submit the .wav sample data by using an XAUDIO2_BUFFER structure.
XAUDIO2_BUFFER buffer = {0};
buffer.pAudioData     = pbWaveData;
buffer.Flags          = XAUDIO2_END_OF_STREAM;
buffer.AudioBytes     = cbWaveSize;
buffer.pContext       = pbWaveData;

// Add the audio buffer to the voice input queue.
DX::ThrowIfFailed( m_pSourceVoice->SubmitSourceBuffer( &buffer ) );

// Play the next audio buffer in the queue.
DX::ThrowIfFailed( m_pSourceVoice->Start( 0 ) );  
```

<a id="ID4E2F" />

## Finalización de un archivo .wav

Para determinar si un archivo .wav se ha reproducido por completo, necesitará el estado actual de la voz de origen. Cree una estructura `XAUDIO2_VOICE_STATE` y, a continuación, llame a `IXAudio2SourceVoice::GetState()`. Si el audio se ha reproducido por completo, llame a `IXAudio2SourceVoice::DestroyVoice()`.

#### C++

```cpp theme={null}
// Determine whether the sound effect has been played to completion, and handle an appropriate termination.
XAUDIO2_VOICE_STATE state;
m_pSourceVoice->GetState( &state, XAUDIO2_VOICE_NOSAMPLESPLAYED );
if( state.BuffersQueued == 0 )
{
  // Destroy the current sound effect.
  m_pSourceVoice->DestroyVoice();
}  
```

## Consulte también

[Información general sobre XAudio2](/build/console-features/audio/overviews/xaudio2-overview)
[Información general sobre ADPCM](/build/console-features/audio/overviews/adpcm-overview)
[Codificador de línea de comandos ADPCM](/build/console-features/audio/tools/adpcmencoder-tools)


## Related topics

- [Codificador de línea de comandos ADPCM](/es/build/console-features/audio/tools/adpcmencoder-tools.md)
- [Información general sobre ADPCM](/es/build/console-features/audio/overviews/adpcm-overview.md)
- [Información general de xWMA](/es/build/console-features/audio/overviews/xwma-overview.md)
- [XAudio2CreateWithSharedContexts](/es/reference/audio/xaudio2xbox/functions/xaudio2createwithsharedcontexts.md)
- [Información general](/es/build/console-features/audio/overviews/index.md)
