/*
    GDAM - Geoff & Dave's Audio Mixer
    Copyright (C) 1999    Dave Benson, Geoff Matters.

    This library 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 of the License, or (at your option) any later version.

    This library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA

    Contact:
        daveb@ffem.org <Dave Benson>
        geoff@ugcs.caltech.edu <Geoff Matters>
*/
#ifndef __GDAM_INPUT_DEVICE_FILE_H_
#define __GDAM_INPUT_DEVICE_FILE_H_


typedef struct _GdamInputDeviceFile GdamInputDeviceFile;
typedef struct _GdamInputDeviceFileClass GdamInputDeviceFileClass;

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include "gdaminputdevice.h"

GtkType gdam_input_device_file_get_type();
#define GDAM_TYPE_INPUT_DEVICE_FILE			(gdam_input_device_file_get_type ())
#define GDAM_INPUT_DEVICE_FILE(obj)              (GTK_CHECK_CAST ((obj), GDAM_TYPE_INPUT_DEVICE_FILE, GdamInputDeviceFile))
#define GDAM_INPUT_DEVICE_FILE_CLASS(klass)      (GTK_CHECK_CLASS_CAST ((klass), GDAM_TYPE_INPUT_DEVICE_FILE, GdamInputDeviceFileClass))
#define GDAM_IS_INPUT_DEVICE_FILE(obj)           (GTK_CHECK_TYPE ((obj), GDAM_TYPE_INPUT_DEVICE_FILE))
#define GDAM_IS_INPUT_DEVICE_FILE_CLASS(klass)   (GTK_CHECK_CLASS_TYPE ((klass), GDAM_TYPE_INPUT_DEVICE_FILE))
#define GDAM_INPUT_DEVICE_FILE_GET_CLASS(obj)   (GDAM_INPUT_DEVICE_FILE_CLASS (GTK_OBJECT (obj)->klass))

/* This is a base class for input devices which read their data from a
 * file pointer.  It attaches a GIOChannel to monitor the pipe, and calls
 * the deriver's 'process' function to handle incoming data.  Devices which
 * can't use standard pipe semantics can overwrite 'open_fd', 'read_fd' and
 * 'close_fd'
 */

struct _GdamInputDeviceFileClass {
	GdamInputDeviceClass	input_device_class;
        gboolean                (*process)    (GdamInputDeviceFile *device,
	    				       guint8              *buf,
					       int		    length);
        GIOError                (*read_fd)    (GdamInputDeviceFile *device,
                                               char                *buf,
					       guint		    max_read,
					       guint               *num_read);
        int                     (*open_fd)    (GdamInputDeviceFile *device);
        void                    (*close_fd)   (GdamInputDeviceFile *device,
	    				       int		    fd);
};
struct _GdamInputDeviceFile {
	GdamInputDevice		input_device;

	/* A io channel opened to the device. */
	GIOChannel*		io_channel;
};


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif
