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);
		}
	}
Esempio n. 2
0
void Mixer::doMix()
{
    if (m_sampleBuffer)
    {
        renderSamples();
    }
    else
    {
        renderSilence();
    }
}
Esempio n. 3
0
void Mixer::event()
{
    if (m_chips.size())
    {
        if (m_sampleBuffer)
        {
            renderSamples();
        }
        else
        {
            renderSilence();
        }
    }
    event_context.schedule(*this, MIXER_EVENT_RATE);
}