Witam ponownie!
Próbowałem na różne sposoby zrobić to odtwarzanie i wyszło na to, że funkcja waveOutWrite() zbyt długo się wykonuje. Wypełniłem dwa bufory, bez żadnych ifów i kombinacji zostawiłem tylko wspomnianą funkcję w komunikacie i był przeskok.
HWAVEOUT outHandle;
WAVEHDR outBuffer, outBuffer2, outBuffer3;
fstream file;
short int outAudioBuf[1764000];
short int outAudioBuf2[1764000];
short int outAudioBuf3[1764000];
bool first = false;
HANDLE m_hAudioOut;
DWORD m_dwAudioOutId;
void PrepareNext(PVOID pvoid)
{
if (!first)
{
file.read((char*)&outAudioBuf2, 1764000);
outBuffer2.lpData = (LPSTR)(outAudioBuf2);
outBuffer2.dwBufferLength = (int)file.gcount();
outBuffer2.dwFlags = 0;
if (file.gcount() == 0)
return;
int err;
if (err = waveOutPrepareHeader(outHandle, &outBuffer2, sizeof(WAVEHDR)))
cout << "Błąd przygotowania struktury!" << endl;
first = true;
cout << "1" << endl;
}
else
{
file.read((char*)&outAudioBuf, 1764000);
outBuffer3.lpData = (LPSTR)(outAudioBuf);
outBuffer3.dwBufferLength = (int)file.gcount();
outBuffer3.dwFlags = 0;
if (file.gcount() == 0)
return;
int err;
if (err = waveOutPrepareHeader(outHandle, &outBuffer3, sizeof(WAVEHDR)))
cout << "Błąd przygotowania struktury!" << endl;
first = false;
cout << "2" << endl;
}
}
DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter)
{
MSG msg;
while(GetMessage(&msg,0,0,0))
{
switch(msg.message )
{
case WOM_OPEN:
cout << "Port otwarty!" << endl;
break;
case WOM_CLOSE:
cout << "Port zamkniety!" << endl;
break;
case WOM_DONE:
if (!first)
{
MMRESULT rezultat = waveOutWrite(outHandle, &outBuffer3, sizeof(WAVEHDR));
_beginthread(PrepareNext, 0, 0);
}
else
{
MMRESULT rezultat = waveOutWrite(outHandle, &outBuffer2, sizeof(WAVEHDR));
_beginthread(PrepareNext, 0, 0);
}
break;
}
}
return msg.wParam;
}
void LoadBuffer(PVOID pvoid)
{
file.read((char*)outAudioBuf, 1764000);
outBuffer.lpData = (LPSTR)(outAudioBuf);
outBuffer.dwBufferLength = (int)file.gcount();
outBuffer.dwFlags = 0;
if (file.gcount() == 0)
return;
int err;
if (err = waveOutPrepareHeader(outHandle, &outBuffer, sizeof(WAVEHDR)))
cout << "Błąd przygotowania struktury!" << endl;
_beginthread(PrepareNext, 0, 0);
MMRESULT rezultat = waveOutWrite(outHandle, &outBuffer, sizeof(WAVEHDR));
}
Na pierwszy ogień idzie wątek LoadBuffer, który jest wywoływany jeden jedyny raz, a reszta to już komunikaty i wątek zapełniający.
Nie wiem jak ogarnąć tą funkcję.
Proszę o pomoc.