DWORD WINAPI Win32DirectSoundAudioDriver::threadProc(LPVOID lpParameter) { auto driver = (Win32DirectSoundAudioDriver *)lpParameter; while (true) { driver->mutex->Lock(); int playCursorPos; driver->buffer->GetCurrentPosition((LPDWORD)&playCursorPos, 0); int bytesToRender = playCursorPos - driver->oldPlayCursorPos; if (bytesToRender) { if (bytesToRender < 0) bytesToRender += driver->bufferSizeBytes; short *p1, *p2; int b1, b2; driver->buffer->Lock(driver->oldPlayCursorPos, bytesToRender, (LPVOID *)&p1, (LPDWORD)&b1, (LPVOID *)&p2, (LPDWORD)&b2, 0); driver->renderSamples(p1, b1 / sizeof(short)); if (b2) driver->renderSamples(p2, b2 / sizeof(short)); driver->buffer->Unlock(p1, b1, p2, b2); driver->oldPlayCursorPos = playCursorPos; } driver->mutex->Unlock(); Sleep(3); } }
void Mixer::doMix() { if (m_sampleBuffer) { renderSamples(); } else { renderSilence(); } }
void Mixer::event() { if (m_chips.size()) { if (m_sampleBuffer) { renderSamples(); } else { renderSilence(); } } event_context.schedule(*this, MIXER_EVENT_RATE); }