#ifndef foomainloophfoo
#define foomainloophfoo

/***
  This file is part of PulseAudio.

  Copyright 2004-2006 Lennart Poettering
  Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB

  PulseAudio is free software; you can redistribute it and/or modify
  it under the terms of the GNU Lesser General Public License as published
  by the Free Software Foundation; either version 2.1 of the License,
  or (at your option) any later version.

  PulseAudio is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  General Public License for more details.

  You should have received a copy of the GNU Lesser General Public License
  along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
***/

#include <pulse/mainloop-api.h>
#include <pulse/cdecl.h>

PA_C_DECL_BEGIN

struct pollfd;

/** \page mainloop Main Loop
 *
 * \section overv_sec Overview
 *
 * The built-in main loop implementation is based on the poll() system call.
 * It supports the functions defined in the main loop abstraction and very
 * little else.
 *
 * The main loop is created using pa_mainloop_new() and destroyed using
 * pa_mainloop_free(). To get access to the main loop abstraction,
 * pa_mainloop_get_api() is used.
 *
 * \section iter_sec Iteration
 *
 * The main loop is designed around the concept of iterations. Each iteration
 * consists of three steps that repeat during the application's entire
 * lifetime:
 *
 * -# 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.
 *
 * When using the main loop, the application can either execute each
 * iteration, one at a time, using pa_mainloop_iterate(), or let the library
 * iterate automatically using pa_mainloop_run().
 *
 * \section thread_sec Threads
 *
 * The main loop functions are designed to be thread safe, but the objects
 * are not. What this means is that multiple main loops can be used, but only
 * one object per thread.
 *
 */

/** \file
 *
 * A minimal main loop implementation based on the C library's poll()
 * function. Using the routines defined herein you may create a simple
 * main loop supporting the generic main loop abstraction layer as
 * defined in \ref mainloop-api.h. This implementation is thread safe
 * as long as you access the main loop object from a single thread only.
 *
 * See also \subpage mainloop
 */

/** An opaque main loop object */
typedef struct pa_mainloop pa_mainloop;

/** Allocate a new main loop object. Free with pa_mainloop_free. */
pa_mainloop *pa_mainloop_new(void);

/** Free a main loop object */
void pa_mainloop_free(pa_mainloop* m);

/** Prepare for a single iteration of the main loop. Returns a negative value
on error or exit request. timeout specifies a maximum timeout for the subsequent
poll, or -1 for blocking behaviour. .*/
int pa_mainloop_prepare(pa_mainloop *m, int timeout);

/** Execute the previously prepared poll. Returns a negative value on error.*/
int pa_mainloop_poll(pa_mainloop *m);

/** Dispatch timeout, io and deferred events from the previously executed poll. Returns
a negative value on error. On success returns the number of source dispatched. */
int pa_mainloop_dispatch(pa_mainloop *m);

/** Return the return value as specified with the main loop's quit() routine. */
int pa_mainloop_get_retval(pa_mainloop *m);

/** Run a single iteration of the main loop. This is a convenience function
for pa_mainloop_prepare(), pa_mainloop_poll() and pa_mainloop_dispatch().
Returns a negative value on error or exit request. If block is nonzero,
block for events if none are queued. Optionally return the return value as
specified with the main loop's quit() routine in the integer variable retval points
to. On success returns the number of sources dispatched in this iteration. */
int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval);

/** Run unlimited iterations of the main loop object until the main loop's
quit() routine is called. Returns a negative value on error. Optionally return
the return value as specified with the main loop's quit() routine in the integer
variable retval points to. */
int pa_mainloop_run(pa_mainloop *m, int *retval);

/** Return the abstract main loop abstraction layer vtable for this
    main loop. No need to free the API as it is owned by the loop
    and is destroyed when the loop is freed. */
pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m);

/** Shutdown the main loop with the specified return value */
void pa_mainloop_quit(pa_mainloop *m, int retval);

/** Interrupt a running poll (for threaded systems) */
void pa_mainloop_wakeup(pa_mainloop *m);

/** Generic prototype of a poll() like function */
typedef int (*pa_poll_func)(struct pollfd *ufds, unsigned long nfds, int timeout, void*userdata);

/** Change the poll() implementation */
void pa_mainloop_set_poll_func(pa_mainloop *m, pa_poll_func poll_func, void *userdata);

PA_C_DECL_END

#endif
