我正试图使用xbox开发工具包sdk库XAudio2 通过xbox 360应用程序播放声音
我找到了一些教程,并阅读了关于如何通过PC播放音频wav文件的Xbox XDK帮助指南,我正在尝试播放";。xma";文件通过xbox360
到目前为止,有效的代码是
IXAudio2* pXAudio2 = nullptr;
if (SUCCEEDED( XAudio2Create( &pXAudio2, 0,XboxThread5 ) ) )
{
IXAudio2MasteringVoice* pXMaster = nullptr;
pXAudio2->CreateMasteringVoice(&pXMaster,XAUDIO2_DEFAULT_CHANNELS,XAUDIO2_DEFAULT_SAMPLERATE,0,0,NULL);
WAVEFORMATEXTENSIBLE wfx = { 0 };
XAUDIO2_BUFFER buffer = { 0 };
char* strFileName = "HDD:\s1.xma";
}
当我到达时
pXAudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx,0, XAUDIO2_DEFAULT_FREQ_RATIO, NULL, NULL, NULL );
xbox崩溃
CreateSourceVoice的语法为
C++
HRESULT CreateSourceVoice(
IXAudio2SourceVoice **ppSourceVoice,
const WAVEFORMATEX *pSourceFormat,
UINT32 Flags = 0,
float MaxFrequencyRatio = XAUDIO2_DEFAULT_FREQ_RATIO,
IXAudio2VoiceCallback *pCallback = NULL,
const XAUDIO2_VOICE_SENDS *pSendList = NULL,
const XAUDIO2_EFFECT_CHAIN *pEffectChain = NULL
)
xbox开发工具包提供了一个关于在PC到WAV文件上执行此操作的简短教程。。但似乎在xbox 上不起作用
这是另一个类似教程的链接https://blog.katastros.com/a?ID=00700-419e2519-52d7-45c5-91f6-776778eb3eda
#ifdef _XBOX //Big-Endian
#define fourccRIFF 'RIFF'
#define fourccDATA 'data'
#define fourccFMT 'fmt '
#define fourccWAVE 'WAVE'
#define fourccXWMA 'XWMA'
#define fourccDPDS 'dpds'
#endif
#ifndef _XBOX //Little-Endian
#define fourccRIFF 'FFIR'
#define fourccDATA 'atad'
#define fourccFMT ' tmf'
#define fourccWAVE 'EVAW'
#define fourccXWMA 'AMWX'
#define fourccDPDS 'sdpd'
#endif
HRESULT FindChunk(HANDLE hFile, DWORD fourcc, DWORD & dwChunkSize, DWORD & dwChunkDataPosition)
{
HRESULT hr = S_OK;
if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, 0, NULL, FILE_BEGIN ) )
return HRESULT_FROM_WIN32( GetLastError() );
DWORD dwChunkType;
DWORD dwChunkDataSize;
DWORD dwRIFFDataSize = 0;
DWORD dwFileType;
DWORD bytesRead = 0;
DWORD dwOffset = 0;
while (hr == S_OK)
{
DWORD dwRead;
if( 0 == ReadFile( hFile, &dwChunkType, sizeof(DWORD), &dwRead, NULL ) )
hr = HRESULT_FROM_WIN32( GetLastError() );
if( 0 == ReadFile( hFile, &dwChunkDataSize, sizeof(DWORD), &dwRead, NULL ) )
hr = HRESULT_FROM_WIN32( GetLastError() );
switch (dwChunkType)
{
case fourccRIFF:
dwRIFFDataSize = dwChunkDataSize;
dwChunkDataSize = 4;
if( 0 == ReadFile( hFile, &dwFileType, sizeof(DWORD), &dwRead, NULL ) )
hr = HRESULT_FROM_WIN32( GetLastError() );
break;
default:
if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, dwChunkDataSize, NULL, FILE_CURRENT ) )
return HRESULT_FROM_WIN32( GetLastError() );
}
dwOffset += sizeof(DWORD) * 2;
if (dwChunkType == fourcc)
{
dwChunkSize = dwChunkDataSize;
dwChunkDataPosition = dwOffset;
return S_OK;
}
dwOffset += dwChunkDataSize;
if (bytesRead >= dwRIFFDataSize) return S_FALSE;
}
return S_OK;
}
在找到数据块后读取数据块中的数据。
一旦找到所需的块,就可以通过将文件指针调整到块的数据段的开头来读取其数据。一个一旦发现数据块就从中读取数据的函数可能是这样的。
HRESULT ReadChunkData(HANDLE hFile, void * buffer, DWORD buffersize, DWORD bufferoffset)
{
HRESULT hr = S_OK;
if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, bufferoffset, NULL, FILE_BEGIN ) )
return HRESULT_FROM_WIN32( GetLastError() );
DWORD dwRead;
if( 0 == ReadFile( hFile, buffer, buffersize, &dwRead, NULL ) )
hr = HRESULT_FROM_WIN32( GetLastError() );
return hr;
}
Xbox 360开发者计划现在和过去都是保密的,所以我不能在这个论坛上发表太多评论。
XAudio2仅支持Xbox 360、Xbox One和Xbox Series X|S上的XMA2。XMA2将标头打包为基于WAVEFORMATEX
的格式——XMA的情况并非如此。有关详细信息,请参阅Xbox 360 XDK的机密示例。
要获得强大的WAV格式读取功能,请参阅DirectX音频工具包。
IIRC,Xbox 360的音频文件有时包含big-endian标头,但Xbox 360和Xbox One+的音频数据相同。