Advertisement
Guest User

Untitled

a guest
Mar 27th, 2019
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.84 KB | None | 0 0
  1. #include <unordered_map>
  2. #include <string>
  3.  
  4. #pragma comment(lib,"ole32.lib")
  5.  
  6. #include <xaudio2.h>
  7. #pragma comment(lib, "xaudio2_8.lib")
  8.  
  9. #ifdef _XBOX //Big-Endian If on XBOX
  10. #define fourccRIFF 'RIFF'
  11. #define fourccDATA 'data'
  12. #define fourccFMT 'fmt '
  13. #define fourccWAVE 'WAVE'
  14. #define fourccXWMA 'XWMA'
  15. #define fourccDPDS 'dpds'
  16. #endif
  17.  
  18. #ifndef _XBOX //Little-Endian if on Windows
  19. #define fourccRIFF 'FFIR'
  20. #define fourccDATA 'atad'
  21. #define fourccFMT ' tmf'
  22. #define fourccWAVE 'EVAW'
  23. #define fourccXWMA 'AMWX'
  24. #define fourccDPDS 'sdpd'
  25. #endif
  26.  
  27. struct win32_audio
  28. {
  29.     XAUDIO2_BUFFER Buffer;
  30.     IXAudio2SourceVoice *SourceVoice;
  31. };
  32.  
  33. static std::unordered_map<std::string, win32_audio> SoundBuffers;
  34. struct win32_xaudio
  35. {
  36.     IXAudio2 *XAudio;
  37.     IXAudio2MasteringVoice *MasterVoice;
  38. };
  39.  
  40. static win32_xaudio StaticXAudio;
  41. void InitXAudio()
  42. {
  43.     bool XAudioInitFailure = FAILED(XAudio2Create(&StaticXAudio.XAudio, 0, XAUDIO2_DEFAULT_PROCESSOR));
  44.     if(XAudioInitFailure)
  45.     {
  46.         // TODO(Bill): Logging
  47.     }
  48.  
  49.     XAudioInitFailure = FAILED(StaticXAudio.XAudio->CreateMasteringVoice(&StaticXAudio.MasterVoice));
  50.     if (XAudioInitFailure)
  51.     {
  52.         // TODO(Bill): Logging
  53.     }
  54. }
  55.  
  56. HRESULT FindChunk(HANDLE hFile, DWORD fourcc, DWORD & dwChunkSize, DWORD & dwChunkDataPosition)
  57. {
  58.     HRESULT hr = S_OK;
  59.     if(INVALID_SET_FILE_POINTER == SetFilePointer(hFile, 0, NULL, FILE_BEGIN))
  60.     {
  61.         return HRESULT_FROM_WIN32(GetLastError());
  62.     }
  63.  
  64.     DWORD dwChunkType;
  65.     DWORD dwChunkDataSize;
  66.     DWORD dwRIFFDataSize = 0;
  67.     DWORD dwFileType;
  68.     DWORD bytesRead = 0;
  69.     DWORD dwOffset = 0;
  70.  
  71.     while (hr == S_OK)
  72.     {
  73.         DWORD dwRead;
  74.         if( 0 == ReadFile( hFile, &dwChunkType, sizeof(DWORD), &dwRead, NULL ) )
  75.             hr = HRESULT_FROM_WIN32( GetLastError() );
  76.  
  77.         if( 0 == ReadFile( hFile, &dwChunkDataSize, sizeof(DWORD), &dwRead, NULL ) )
  78.             hr = HRESULT_FROM_WIN32( GetLastError() );
  79.  
  80.         switch (dwChunkType)
  81.         {
  82.             case fourccRIFF:
  83.                 dwRIFFDataSize = dwChunkDataSize;
  84.                 dwChunkDataSize = 4;
  85.                 if( 0 == ReadFile( hFile, &dwFileType, sizeof(DWORD), &dwRead, NULL ) )
  86.                     hr = HRESULT_FROM_WIN32( GetLastError() );
  87.                 break;
  88.  
  89.             default:
  90.                 if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, dwChunkDataSize, NULL, FILE_CURRENT ) )
  91.                     return HRESULT_FROM_WIN32( GetLastError() );            
  92.         }
  93.  
  94.         dwOffset += sizeof(DWORD) * 2;
  95.  
  96.         if (dwChunkType == fourcc)
  97.         {
  98.             dwChunkSize = dwChunkDataSize;
  99.             dwChunkDataPosition = dwOffset;
  100.             return S_OK;
  101.         }
  102.  
  103.         dwOffset += dwChunkDataSize;
  104.  
  105.         if (bytesRead >= dwRIFFDataSize) return S_FALSE;
  106.  
  107.     }
  108.  
  109.     return S_OK;
  110. }
  111.  
  112. HRESULT ReadChunkData(HANDLE hFile, void * buffer, DWORD buffersize, DWORD bufferoffset)
  113. {
  114.     HRESULT hr = S_OK;
  115.     if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, bufferoffset, NULL, FILE_BEGIN ) )
  116.         return HRESULT_FROM_WIN32( GetLastError() );
  117.     DWORD dwRead;
  118.     if( 0 == ReadFile( hFile, buffer, buffersize, &dwRead, NULL ) )
  119.         hr = HRESULT_FROM_WIN32( GetLastError() );
  120.     return hr;
  121. }
  122.  
  123. // TCHAR * strFileName = _TEXT("media\\MusicMono.wav");
  124. IXAudio2SourceVoice *InitSound(char *FileName, bool loop)
  125. {
  126.     WAVEFORMATEXTENSIBLE wfx = {0};
  127.     XAUDIO2_BUFFER buffer = {0};
  128.    
  129.     HANDLE hFile = CreateFileA(FileName,
  130.                               GENERIC_READ,
  131.                               FILE_SHARE_READ,
  132.                               NULL,
  133.                               OPEN_EXISTING,
  134.                               0,
  135.                               NULL );
  136.     if( INVALID_HANDLE_VALUE == hFile )
  137.         return NULL;
  138.  
  139.     if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, 0, NULL, FILE_BEGIN ) )
  140.         return NULL;
  141.  
  142.     DWORD dwChunkSize;
  143.     DWORD dwChunkPosition;
  144.  
  145.     // check the file type, should be fourccWAVE or 'XWMA'
  146.     FindChunk(hFile,fourccRIFF,dwChunkSize, dwChunkPosition );
  147.     DWORD filetype;
  148.     ReadChunkData(hFile,&filetype,sizeof(DWORD),dwChunkPosition);
  149.     if (filetype != fourccWAVE)
  150.         return NULL;
  151.  
  152.     FindChunk(hFile,fourccFMT, dwChunkSize, dwChunkPosition );
  153.     ReadChunkData(hFile, &wfx, dwChunkSize, dwChunkPosition );
  154.  
  155.     //fill out the audio data buffer with the contents of the fourccDATA chunk
  156.     FindChunk(hFile,fourccDATA,dwChunkSize, dwChunkPosition );
  157.     BYTE * pDataBuffer = new BYTE[dwChunkSize];
  158.     ReadChunkData(hFile, pDataBuffer, dwChunkSize, dwChunkPosition);
  159.  
  160.     buffer.AudioBytes = dwChunkSize;  //buffer containing audio data
  161.     buffer.pAudioData = pDataBuffer;  //size of the audio buffer in bytes
  162.     buffer.Flags = XAUDIO2_END_OF_STREAM; // tell the source voice not to expect any data after this buffer
  163.  
  164.     IXAudio2SourceVoice* pSourceVoice;
  165.     StaticXAudio.XAudio->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx);
  166.     if(loop)
  167.     {
  168.         buffer.LoopCount = XAUDIO2_LOOP_INFINITE;
  169.     }
  170.  
  171.     win32_audio Audio;
  172.     Audio.SourceVoice = pSourceVoice;
  173.     Audio.Buffer = buffer;
  174.     SoundBuffers.insert(std::make_pair(std::string(FileName), Audio));
  175.     return pSourceVoice;
  176. }
  177.    
  178. void PlaySound(std::string name)
  179. {
  180.     win32_audio Audio = SoundBuffers[name];
  181.     IXAudio2SourceVoice *pSourceVoice = Audio.SourceVoice;
  182.     pSourceVoice->SubmitSourceBuffer(&Audio.Buffer);
  183.     pSourceVoice->Start( 0 );
  184. }
  185.  
  186. int main()
  187. {
  188.     HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
  189.  
  190.     InitXAudio();
  191.     InitSound("fire.wav", false);
  192.     InitSound("bg.wav", true);
  193.  
  194.     PlaySound("bg.wav");    
  195.     while(true)
  196.     {
  197.         PlaySound("fire.wav");    
  198.         Sleep(1);
  199.     }
  200.  
  201.     CoUninitialize();
  202.  
  203.     return(0);
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement