День добрый,
Есть вопрос - взялся воспроизводить звук под WinCE на основе книжки "Программирование звука в Windows" Олег Гордеев. Сама прога компилиться отлично, единственная проблема не проигрывается звук, почему-то не срабатывает WaitForSingleObject(). Данные из файла читаются, все хэндлы тоже выглядят правильно.
| Код | #include <windows.h> #include <mmsystem.h> #include <string.h> #include "winwav.h"
//=============================================================================
char msg[300] = {0}; HANDLE hFile = 0; HANDLE hData = 0; WAVEFORMATEX wfx = {0}; char *soundData = 0; __int64 DataSize = 0; __int64 DataOffset = 0; __int64 FileSize = 0;
//=============================================================================
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { hFile = CreateFile(lpCmdLine, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
LoadFile(); PlayFile();
CloseHandle(hData); CloseHandle(hFile);
return 0; }
//=============================================================================
void LoadFile() { __int8 ID[8]; FileSize = GetFileSize(hFile, 0); SetFilePointer(hFile, 8, 0, FILE_BEGIN);
DWORD BytesReaded = 0; ReadFile(hFile, (void*)ID, 8, &BytesReaded, 0); if (strncmp(ID, "WAVEfmt ", 8) != 0) return;
DWORD Size = 0; ReadFile(hFile, &Size, sizeof(Size), &BytesReaded, 0); if (Size > sizeof(wfx)) return;
memset(&wfx, 0, sizeof(wfx)); ReadFile(hFile, &wfx, Size, &BytesReaded, 0); if (wfx.wFormatTag != WAVE_FORMAT_PCM) return;
wfx.cbSize = 0; ReadFile(hFile, ID, 8, &BytesReaded, 0); if (strncmp(ID, "data", 4) != 0) return;
DataSize = *((DWORD*)(void*)(ID + 4)); soundData = new char[DataSize]; ReadFile(hFile, soundData, DataSize, &BytesReaded, 0); }
//=============================================================================
void PlayFile() { int BlockSize = 64 * 1024; HANDLE hEvent = CreateEvent(0, FALSE, FALSE, 0); int WaitTime = BlockSize * 2000 / (wfx.nAvgBytesPerSec);
SYSTEM_INFO si = {0}; GetSystemInfo(&si);
WAVEHDR Header[2] = {0};
UINT player = waveOutGetNumDevs(); WAVEOUTCAPS *caps = new WAVEOUTCAPS[player]; for (int i = 0; i < player; i++) waveOutGetDevCaps(player, &caps[i], sizeof(caps[0]));
HWAVEOUT hPlay; waveOutOpen(&hPlay, WAVE_MAPPER, &wfx, (DWORD) hEvent, 0, CALLBACK_EVENT);
__try { Header[0].dwBufferLength = BlockSize; Header[0].lpData = new char[Header[0].dwBufferLength]; Header[1].dwBufferLength = BlockSize; Header[1].lpData = new char[Header[1].dwBufferLength];
waveOutPrepareHeader(hPlay, &Header[0], sizeof(WAVEHDR)); waveOutPrepareHeader(hPlay, &Header[1], sizeof(WAVEHDR));
if (DataSize <= BlockSize) ResetEvent(hEvent);
int ii = 0; for(__int64 PlayPosition = 0; PlayPosition < DataSize; PlayPosition += BlockSize) { if (PlayPosition < DataSize) { WAVEHDR *curhdr = &Header[(ii++) & 1];
if (BlockSize > DataSize - PlayPosition) BlockSize = int(DataSize - PlayPosition);
curhdr -> dwBufferLength = (DWORD)BlockSize; curhdr -> lpData = &soundData[PlayPosition];
waveOutWrite(hPlay, curhdr, sizeof(WAVEHDR)); }
if (WAIT_TIMEOUT == WaitForSingleObject(hEvent, WaitTime)) throw "Не удаётся воспроизвести данные - вышел лимит времени"; } } __finally { waveOutUnprepareHeader(hPlay, Header, sizeof(WAVEHDR)); waveOutUnprepareHeader(hPlay, Header + 1, sizeof(WAVEHDR));
if (Header[0].lpData) VirtualFree((void*)Header[0].lpData, 0, MEM_RELEASE);
waveOutClose(hPlay); }
waveOutUnprepareHeader(hPlay, Header, sizeof(WAVEHDR)); waveOutUnprepareHeader(hPlay, Header + 1, sizeof(WAVEHDR));
waveOutClose(hPlay); delete [] soundData; }
|
Как я понимаю все библиотеки еть в наличии, существует другой плеер который проигрывает этот же не сжатый wav на этом же девайсе. Мало того эта прога скомпилёная под WinXP отлично проигрывает. На девайсе не хочет и все - срабатывает exception
| Код | if (WAIT_TIMEOUT == WaitForSingleObject(hEvent, WaitTime)) throw "Не удаётся воспроизвести данные - вышел лимит времени";
|
Может кто подскажет в чём тонкость |