> ## 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 で `XAudio2` を使用して .wav ファイルを読み込んで再生します。

以下のセクションでは、XBOX One Development Kit で `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` に設定します。2 番目のパラメーターを `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` 構造体を作成し、`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 コマンド ライン エンコーダー](/ja-jp/build/console-features/audio/tools/adpcmencoder-tools.md)
- [ADPCM の概要](/ja-jp/build/console-features/audio/overviews/adpcm-overview.md)
- [xWMA の概要](/ja-jp/build/console-features/audio/overviews/xwma-overview.md)
- [XAudio2CreateWithSharedContexts](/ja-jp/reference/audio/xaudio2xbox/functions/xaudio2createwithsharedcontexts.md)
- [Microsoft Store API を使用してサービスを認証する](/ja-jp/publishing/xstore-commerce/xstore-authenticating-service.md)
