Advertisement
Guest User

Untitled

a guest
Apr 18th, 2014
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 KB | None | 0 0
  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3. TCHAR * strFileName = _TEXT("Chimes.wav");
  4. //Creating a instance od XAufio2 Engine
  5. IXAudio2* pXAudio2;
  6. IXAudio2MasteringVoice* pMasteringVoice;
  7. IXAudio2SourceVoice* pSourceVoice;
  8. HRESULT hr;
  9.  
  10. if ( FAILED( hr = XAudio2Create( &pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR ) ) ){
  11. cout << "XAudio2Create Failed!n";
  12. }
  13.  
  14. WAVEFORMATEXTENSIBLE wfx = { 0 };
  15. XAUDIO2_BUFFER buffer = { 0 };
  16.  
  17. //Open the audio file with CreateFile
  18.  
  19. HANDLE hFile = CreateFile(
  20. strFileName,
  21. GENERIC_READ,
  22. FILE_SHARE_READ,
  23. NULL,
  24. OPEN_EXISTING,
  25. 0,
  26. NULL
  27. );
  28.  
  29. DWORD dwChunkPosition = 0;
  30. DWORD dwChunkSize;
  31.  
  32.  
  33. if (INVALID_HANDLE_VALUE == hFile)
  34. cout << "INVALID HANDLE VALUE!n";
  35. //return HRESULT_FROM_WIN32(GetLastError());
  36. if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, 0, NULL, FILE_BEGIN))
  37. {
  38. cout << "INVALID SET FILE POINTER!n";
  39. //return HRESULT_FROM_WIN32(GetLastError());
  40. }
  41.  
  42. cout << "Locating a 'RIFF' and whole data sizen";
  43. FindChunk(hFile, fourccRIFF, dwChunkSize, dwChunkPosition);
  44.  
  45. cout << "Checking a filetypen";
  46. DWORD filetype;
  47. ReadChunkData(hFile, &filetype, sizeof(DWORD), dwChunkPosition);
  48.  
  49. if (filetype != fourccWAVE)
  50. cout << "This isn't WAVE file!n";
  51. else cout << "WAVE format!n";
  52.  
  53. cout << "Locating a fmt and filling out WAVEFORMATEXTENSIBLE structuren";
  54. FindChunk(hFile, fourccFMT, dwChunkSize, dwChunkPosition);
  55. ReadChunkData(hFile, &wfx, dwChunkSize, dwChunkPosition);
  56.  
  57. cout << "Locating a DATAn";
  58. FindChunk(hFile, fourccDATA, dwChunkSize, dwChunkPosition);
  59.  
  60. cout << "Reading a soundn";
  61. BYTE * pDataBuffer = new BYTE[dwChunkSize];
  62. ReadChunkData(hFile, pDataBuffer, dwChunkSize, dwChunkPosition);
  63. buffer.AudioBytes = dwChunkSize;
  64. buffer.pAudioData = pDataBuffer;
  65. buffer.Flags = XAUDIO2_END_OF_STREAM;
  66.  
  67. //Plaing preloaded sound;
  68. if (FAILED(hr = pXAudio2->CreateSourceVoice(&pSourceVoice, (WAVEFORMATEX*)&wfx)))
  69. cout << "Playing sound Failed!n";
  70.  
  71. system("PAUSE");
  72. return 0;
  73. }
  74.  
  75. HRESULT FindChunk(HANDLE hFile, DWORD fourcc, DWORD & dwChunkSize, DWORD & dwChunkDataPosition)
  76. {
  77. HRESULT hr = S_OK;
  78. if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, 0, NULL, FILE_BEGIN))
  79. return HRESULT_FROM_WIN32(GetLastError());
  80.  
  81. DWORD dwChunkType;
  82. DWORD dwChunkDataSize;
  83. DWORD dwRIFFDataSize = 0;
  84. DWORD dwFileType;
  85. DWORD bytesRead = 0;
  86. DWORD dwOffset = 0;
  87.  
  88. while (hr == S_OK)
  89. {
  90. DWORD dwRead;
  91. if (0 == ReadFile(hFile, &dwChunkType, sizeof(DWORD), &dwRead, NULL))
  92. hr = HRESULT_FROM_WIN32(GetLastError());
  93.  
  94. if (0 == ReadFile(hFile, &dwChunkDataSize, sizeof(DWORD), &dwRead, NULL))
  95. hr = HRESULT_FROM_WIN32(GetLastError());
  96.  
  97. switch (dwChunkType)
  98. {
  99. case fourccRIFF:
  100. dwRIFFDataSize = dwChunkDataSize;
  101. dwChunkDataSize = 4;
  102. if (0 == ReadFile(hFile, &dwFileType, sizeof(DWORD), &dwRead, NULL))
  103. hr = HRESULT_FROM_WIN32(GetLastError());
  104. break;
  105.  
  106. default:
  107. if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, dwChunkDataSize, NULL, FILE_CURRENT))
  108. return HRESULT_FROM_WIN32(GetLastError());
  109. }
  110.  
  111. dwOffset += sizeof(DWORD)* 2;
  112.  
  113. if (dwChunkType == fourcc)
  114. {
  115. dwChunkSize = dwChunkDataSize;
  116. dwChunkDataPosition = dwOffset;
  117. return S_OK;
  118. }
  119.  
  120. dwOffset += dwChunkDataSize;
  121.  
  122. if (bytesRead >= dwRIFFDataSize) return S_FALSE;
  123.  
  124. }
  125.  
  126. return S_OK;
  127.  
  128. }
  129.  
  130. HRESULT ReadChunkData(HANDLE hFile, void * buffer, DWORD buffersize, DWORD bufferoffset)
  131. {
  132. HRESULT hr = S_OK;
  133. if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, bufferoffset, NULL, FILE_BEGIN))
  134. return HRESULT_FROM_WIN32(GetLastError());
  135. DWORD dwRead;
  136. if (0 == ReadFile(hFile, buffer, buffersize, &dwRead, NULL))
  137. hr = HRESULT_FROM_WIN32(GetLastError());
  138. return hr;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement