1. For a system that comprises a main memory storing data for one or more devices, each device having one or more associated channels, and a direct memory access (DMA) engine with a data reservoir for transferring data between the one or more devices and the main memory, a computer program product comprising one or more computer readable media with computer executable instructions that implement a method of arbitrating access to main memory through the DMA engine, the method comprising the acts of: providing a device interface to transfer data between the DMA engine and the one or more devices by performing acts of: selecting at least one of the one or more devices as being eligible to request data from the DMA engine during a particular DMA cycle; and allowing the at least one eligible device to make a data request to the DMA engine during the particular DMA cycle; and providing a memory interface to transfer data between the DMA engine and main memory by performing acts of: defining a circular list having a plurality of entries, each entry corresponding to one of the one or more channels for each device; evaluating an entry in the circular list to determine whether the channel corresponding to the entry requires service by performing acts of: determining an entry time that represents how long until the channel will be evaluated again, based at least on how many entries are in the circular list and how much time is needed to service each entry; determining a latency that represents how long the main memory will take to respond to a request from the DMA engine; determining a buffer time that represents how long data stored in the data reservoir for the channel will last; and determining that the channel requires service if the buffer time is less than the entry time and the latency; and servicing the channel by requesting channel data from the main memory to replenish the data reservoir if the channel requires service.