C++Xbox360应用程序XAudio2播放xma声音



我正试图使用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+的音频数据相同。

最新更新