#if ! defined(PROG_DISABLE_AUDIO)
struct a_par_r {
	void *s;								/* Track playback buffer */

	int c;									/* Track buffer channels */
	int d;									/* Track buffer speed */

	size_t t;								/* Track buffer size */
	size_t u;								/* Track buffer sample size */

	unsigned int be;							/* Track buffer is bigendian or not */
	unsigned int us;							/* Track buffer is signed or not */

	unsigned long n;							/* Track mixing time consumed in microseconds */
};

struct a_par {
	D_HANDLE h;								/* Sample internal handle */

	unsigned int state;							/* Sample state (MIXER_SAMPLE_STATE_*) */
	unsigned int mode;							/* Sample mode (MIXER_SAMPLE_MODE_*) */

	float pan;								/* Sample pan between channels */
	float vol;								/* Sample master volume */

	float ch_vol[AUDIO_MIXER_CHANNELS];					/* Sample volume per channel */

	size_t t;								/* Sample data size in samples */

	float *ch_dat[AUDIO_MIXER_CHANNELS];					/* Sample data per channel */

	struct a_par_r track;
};

struct audio_ctx {
	void (*ca_track_play)(struct a_par *, struct d_par *);			/* Audio callback functions */
	void (*ca_track_mode)(struct a_par *, struct d_par *);
	void (*ca_track_finish)(struct a_par *, struct d_par *);
	void (*ca_track_restart)(struct a_par *, struct d_par *);
	void (*ca_track_cancel)(struct a_par *, struct d_par *);
	void (*ca_track_pan)(struct a_par *, struct d_par *);
	void (*ca_track_vol)(struct a_par *, struct d_par *);
	void (*ca_master_vol)(struct a_par *, struct d_par *);
	void (*ca_buffer_start)(struct a_par *, struct d_par *);
	void (*ca_buffer_done)(struct a_par *, struct d_par *);

	struct d_par par_track_play;						/* Audio callback subroutine parameters */
	struct d_par par_track_mode;
	struct d_par par_track_finish;
	struct d_par par_track_restart;
	struct d_par par_track_cancel;
	struct d_par par_track_pan;
	struct d_par par_track_vol;
	struct d_par par_master_vol;
	struct d_par par_buffer_start;
	struct d_par par_buffer_done;
};
#endif

#if ! defined(PROG_DISABLE_GUI) && ! defined(PROG_DISABLE_BOB)
struct w_bob {
	int x, y;								/* Bob position in pixels */

	unsigned int width, height;						/* Bob dimensions in pixels */
	unsigned int opaque;							/* Bob is opaque or translucent */

	D_HANDLE hnd;								/* Bob window handle */

	struct pixel_rgba_8 *frame;						/* Bob current frame data */
};
#endif

#if ! defined(PROG_DISABLE_HOTPLUG)
struct hotplug_ctx {
	void (*cb_attach)(struct d_par *);					/* Hotplug callback functions */
	void (*cb_detach)(struct d_par *);
	void (*cb_notify)(struct d_par *);

	struct d_par par_attach;						/* Hotplug callback subroutine parameters */
	struct d_par par_detach;
	struct d_par par_notify;
};
#endif

#if ! defined(PROG_DISABLE_INOTIFY) && defined(HAVE_INOTIFY_INIT)
struct inotify_ctx {
	void (*cb_notify)(struct d_par *);					/* Inotify callback functions */

	struct d_par par_notify;						/* Inotify callback subroutine parameters */
};
#endif
