> ## 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.

# XAudio2로 사운드 재생

> XAudio2로 사운드 재생

XBOX One에서 .wav 파일을 로드하고 재생하려면 `XAudio2`를 사용하십시오.

다음 섹션에서는 XBOX One 개발 키트에서 `XAudio2`를 사용하여 사운드를 로드하고 재생하는 방법을 설명합니다.

* [중요한 XAudio2 데이터 형식](#ID4ELB)
* [XAudio2 초기화](#ID4EXC)
* [.wav 파일 로드](#ID4E1D)
* [.wav 파일 경로 설정](#ID4E2H)
* [.wav 파일 재생](#ID4EAF)
* [.wav 파일 종료](#ID4E2F)

동작하는 `XAudio2` 샘플의 경우 Microsoft Game Development Kit(GDK) 샘플에서 SimplePlaySound 샘플을 다운로드하십시오.

<a id="ID4ELB" />

## 중요한 XAudio2 데이터 형식

`XAudio2`는 XBOX One에서 사운드 효과를 재생하는 데 도움이 되는 여러 데이터 형식을 제공합니다. .wav 파일을 재생하려면 최소한 다음 데이터 형식이 필요합니다.

* `IXAudio2`: 이는 모든 오디오 엔진 상태, 오디오 처리 스레드, 보이스 그래프 등을 관리하는 `XAudio2` 오브젝트의 인터페이스입니다.

* `IXAudio2SourceVoice`: 소스 보이스를 사용하여 `XAudio2` 처리 파이프라인에 오디오 데이터를 제출합니다. 들리려면 보이스 데이터를 마스터링 보이스로 보내야 합니다.

* `IXAudio2MasteringVoice`: 이 데이터 형식을 사용하여 오디오 출력 장치를 나타냅니다. 데이터 버퍼는 마스터링 보이스에 직접 제출할 수 없습니다. 그러나 들리려면 다른 유형의 보이스에 제출된 데이터가 마스터링 보이스로 향해야 합니다.

또한 다음 데이터 형식이 유용할 수 있습니다.

* `PlaySoundVoiceContext`: 이 데이터 형식을 사용하여 처리 후 오디오 버퍼를 해제합니다.

* `IXAudio2VoiceCallback`: 이 데이터 형식은 특정 `IXAudio2SourceVoice`에서 특정 이벤트가 발생할 때 클라이언트에 알림을 제공하는 메서드를 포함합니다.

<a id="ID4EXC" />

## XAudio2 초기화

`CoInitializeEx()`는 현재 스레드에서 사용하기 위한 Component Object Model(COM)을 초기화합니다. 첫 번째 매개변수를 `NULL`로 설정하십시오. 두 번째 매개변수를 `COINIT_MULTITHREADED`로 설정하십시오.

`XAudio2Create()`는 새 `XAudio2` 오브젝트를 생성하고 그 `IXAudio2` 인터페이스에 대한 포인터를 반환합니다. `XAUDIO2_PROCESSOR`가 유효한 값으로 설정되어 있는지 확인하십시오. OS가 하드웨어 플랫폼에 따라 이상적인 프로세서를 선택하도록 하려면 `XAUDIO2_USE_DEFAULT_PROCESSOR` 값을 권장합니다.

`IXAudio2::CreateMasteringVoice()`는 마스터링 보이스를 생성하고 구성하며, 사용자가 제공한 포인터로 이를 가리킵니다.

#### 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" />

## .wav 파일 로드

오디오 파일에 액세스하려면 `WaveFile` 클래스의 인스턴스를 사용하십시오.

* .wav 파일을 열고 파일 헤더에 저장된 일부 정보를 검색하려면 `WaveFile::Open(LPCWSTR strFileName)`을 호출하십시오.
* .wav 파일의 형식을 결정하려면 `WaveFile::GetFormat()`을 호출하십시오.
* .wav 파일의 바이트 및 샘플 수를 결정하려면 `WaveFile::GetDuration()`을 호출하십시오.
* 샘플 데이터를 메모리로 읽으려면 `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" />

## .wav 파일 경로 설정

오디오 파일을 로드하고 사용하려면 다음 코드를 사용하여 로컬 장치에서 프로젝트의 설치 위치를 찾으십시오. 설치 위치를 문자열에 저장하십시오. 오디오 파일의 위치를 설치 위치 문자열의 끝에 추가하십시오.

#### C++

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

<a id="ID4EAF" />

## .wav 파일 재생

`IXAudio2::CreateSourceVoice()` 클래스를 생성한 다음, 이를 사용하여 `XAudio2` 처리 파이프라인에 오디오 데이터를 제출하십시오. 보이스 데이터가 들리려면 마스터링 보이스로 직접 또는 중간 서브믹스 보이스를 통해 전송해야 합니다. 오디오 파일의 세부사항을 저장하려면 `XAUDIO2_BUFFER`를 생성하십시오.

`XAudio2` 버퍼와 소스 보이스를 생성하고 초기화한 후, `IXAudio2SourceVoice::SubmitSourceBuffer()`를 호출하여 오디오 버퍼를 보이스 입력 큐에 추가합니다. `XAUDIO2_BUFFER::pAudioData`가 가리키는 오디오 데이터는 `XAudio2`가 버퍼의 내용 재생을 완료할 때까지 유효한 상태로 유지되어야 합니다.

보이스 입력 큐가 채워진 후, `IXAudio2SourceVoice::Start()`를 호출하여 큐의 다음 사운드를 재생합니다.

#### 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" />

## .wav 파일 종료

.wav 파일이 완료까지 재생되었는지 확인하려면 소스 보이스의 현재 상태가 필요합니다. `XAUDIO2_VOICE_STATE` struct를 생성한 다음 `IXAudio2SourceVoice::GetState()`를 호출하십시오. 오디오가 완료까지 재생되었다면 `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();
}  
```

## 함께 보기

[XAudio2 개요](/build/console-features/audio/overviews/xaudio2-overview)
[ADPCM 개요](/build/console-features/audio/overviews/adpcm-overview)
[ADPCM 명령줄 인코더](/build/console-features/audio/tools/adpcmencoder-tools)


## Related topics

- [ADPCM 개요](/ko/build/console-features/audio/overviews/adpcm-overview.md)
- [ADPCM 명령줄 인코더](/ko/build/console-features/audio/tools/adpcmencoder-tools.md)
- [개요](/ko/build/console-features/audio/overviews/index.md)
- [xWMA 개요](/ko/build/console-features/audio/overviews/xwma-overview.md)
- [XAudio2 Helper APIs](/ko/reference/audio/atoc-xaudio2helperapis-reference.md)
