mainloop应该说是pulseaudio的控制核心,pulseaudio的任何工作是离不开mainloop的,看过wiki上的文档,知道pulseaudio提供给client使用的api分为简单方式和异步方式(相对的也叫复杂方式吧)。
但是,无论什么方式,都少不了mainloop,对于简单方式,或许从api上,无需关心mainloop, 但是,这些简单的api同样使用了mainloop, 可以参考simple.c, 可以发现在pa_simple_new的实现中,使用了pa_threaded_mainloop_new来建立mainloop.
mainloop他有自己的工作模式,他围绕下面三个事件展开工作
- Deferred events - Events that will trigger as soon as possible. Note that some implementations may block all other events when a deferred event is active.
- I/O events - Events that trigger on file descriptor activities.
- Times events - Events that trigger after a fixed ammount of time.
在pulseaudio系统中,如果有这三种事件产生,这些事件对象会被加入到各自的链表中
也就是说,mainlopp就是在不停查询这些链表,找到需要处理的事件,然后通过回调函数处理事件,或者通过回调函数将事件分发给对应的线程。
mainloop的工作过程
- Prepare - Build a list of file descriptors that need to be monitored and calculate the next timeout.
- Poll - Execute the actual poll() system call.
- Dispatch - Dispatch any events that have fired.
step 3 的分发工作也就是调用相应的函数分发上述的三种事件。这些函数将遍历对应的链表,处理各自事件。