Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Het belangrijkste werk van de synthesizer wordt in twee stappen uitgevoerd:
MIDI-berichten ophalen
De gerenderde noten mixen tot de golf-audiostream.
In deze sectie wordt over het algemeen beschreven hoe dit wordt gedaan in de gebruikersmodus, hoewel de concepten in wezen hetzelfde zijn in de kernelmodus. Zie DDI voor hardwareversnelling in de kernelmodus voor specifieke informatie over hoe u hetzelfde doet met een minipoortstuurprogramma in de kernelmodus.
In de gebruikersmodus roept de toepassing IDirectMusicSynth::PlayBuffer op wanneer MIDI-berichten klaar zijn om af te spelen. De toepassing is verantwoordelijk voor het tijdig aanroepen van PlayBuffer en voor het correct stempelen van de buffer, rekening houdend met de synthesizerlatentie . Uw implementatie van deze methode haalt de wachtende berichten op en slaat deze op in een interne indeling, die wordt gestempeld met een tijd die is gebaseerd op de referentietijd die wordt doorgegeven met de buffer.
De golfsink roept IDirectMusicSynth::Render aan wanneer deze klaar is om gegevens te ontvangen. Als de bestemming voor de weergegeven gegevens bijvoorbeeld een secundaire DirectSound-buffer is, kan uw implementatie van IDirectMusicSynthSink::Activate een thread instellen die wacht op een DirectSound PlayBuffer-melding . Wanneer de DirectSound-buffer gegevens vereist, meldt DirectSound de thread, die op zijn beurt Render aanroept, een aanwijzer door te geven aan het IDirectSoundBuffer-object (beschreven in de Microsoft Windows SDK-documentatie) en het aantal en de positie van de samples die moeten worden weergegeven.
De DirectSound-buffer is cirkelvormig. Omdat wraparound aan het einde van de buffer plaatsvindt, moet rekening worden gehouden met de mogelijkheid dat een vrijwel aaneengesloten regio in twee delen wordt gesplitst. De golfsink verwerkt doorgaans de splitsing door Render tweemaal aan te roepen, eenmaal voor elk deel van het vergrendelde gedeelte van de DirectSound-buffer, zodat de Render-methode alleen te maken heeft met aaneengesloten blokken geheugen. De golfsink roept IDirectSoundBuffer::Lock aan op een DirectSound-buffer om schrijfrechten te vragen voor een regio binnen de buffer. Als de golfsink bijvoorbeeld Lock aanroept op 2 kilobytes aan gegevens, beginnend 1 kilobyte van het einde van de buffer, vergrendelt de oproep de laatste 1 kilobyte tot het einde van de buffer en nog eens 1 kilobyte vanaf het begin van de buffer. In dit geval retourneert Lock eigenlijk twee aanwijzers en bijbehorende lengten, die samen de regio beschrijven van de buffer die is vergrendeld. Elke aanwijzer verwijst gegarandeerd naar een aaneengesloten blok geheugen.
Uw implementatie van de Render-methode is verantwoordelijk voor het bepalen wat er moet gebeuren als reactie op de MIDI-berichten die worden opgehaald in PlayBuffer. Vanuit de dwLength-parameterwaarden van opeenvolgende aanroepen naar Render kan de methode de voorbeeldtijd bijhouden en reageren op berichten die geldig zijn voor de huidige renderingsperiode. Wanneer een note-on bericht wordt verwerkt, kan de noot intern worden opgeslagen en opnieuw worden weergegeven bij elke uitvoering van de methode totdat een corresponderend note-off bericht wordt ontvangen.