LMMS has a class for audio rendering, named AudioEngine. AudioEngine::renderNextBuffer contains the main functionality of AudionEngine. Major works that the function does:
Remove all finished PlayHandles
Call Song::processNextBuffer to play songs and add PlayHandles
Queue jobs for AudioEngineWorkerThread and wait for worker threads (PlayHandle, effects in instrument tracks/sample tracks, FX mixing)
Call runChangesInModel to process pending non-automated changes
Mixer worker threads
AudioEngineWorkerThread processes ThreadableJobs queued in AudioEngine::renderNextBuffer. There are three kinds of jobs that AudioEngineWorkerThread runs.
AudioPort: Processes intermediate audio signals(Currently used for audio effects for tracks)