/***********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI or Corporation for National Research Initiatives or
CNRI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

While CWI is the initial source for this software, a modified version
is made available by the Corporation for National Research Initiatives
(CNRI) at the Internet address ftp://ftp.python.org.

STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

******************************************************************/

/* Sad objects */

#include "allobjects.h"
#include "modsupport.h"
#include "structmember.h"

#ifdef HAVE_SYS_AUDIOIO_H
#define SOLARIS
#endif

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif

#include <stropts.h>
#include <sys/ioctl.h>
#ifdef SOLARIS
#include <sys/audioio.h>
#else
#include <sun/audioio.h>
#endif

/* #define offsetof(str,mem) ((int)(((str *)0)->mem)) */

typedef struct {
	OB_HEAD
	int	x_fd;		/* The open file */
	int	x_icount;	/* # samples read */
	int	x_ocount;	/* # samples written */
	int	x_isctl;	/* True if control device */
	
} sadobject;

typedef struct {
	OB_HEAD
	audio_info_t ai;
} sadstatusobject;

staticforward typeobject Sadtype;
staticforward typeobject Sadstatustype;
static sadstatusobject *sads_alloc();	/* Forward */

static object *SunAudioError;

#define is_sadobject(v)		((v)->ob_type == &Sadtype)
#define is_sadstatusobject(v)	((v)->ob_type == &Sadstatustype)

static sadobject *
newsadobject(arg)
	object *arg;
{
	sadobject *xp;
	int fd;
	char *mode;
	int imode;

	/* Check arg for r/w/rw */
	if ( !getargs(arg, "s", &mode) )
	  return 0;
	if ( strcmp(mode, "r") == 0 )
	  imode = 0;
	else if ( strcmp(mode, "w") == 0 )
	  imode = 1;
	else if ( strcmp(mode, "rw") == 0 )
	  imode = 2;
	else if ( strcmp(mode, "control") == 0 )
	  imode = -1;
	else {
	    err_setstr(SunAudioError,
		       "Mode should be one of 'r', 'w', 'rw' or 'control'");
	    return 0;
	}
	
	/* Open the correct device */
	if ( imode < 0 )
	  fd = open("/dev/audioctl", 2); /* XXXX Chaeck that this works */
	else
	  fd = open("/dev/audio", imode);
	if ( fd < 0 ) {
	    err_errno(SunAudioError);
	    return NULL;
	}

	/* Create and initialize the object */
	xp = NEWOBJ(sadobject, &Sadtype);
	if (xp == NULL)
		return NULL;
	xp->x_fd = fd;
	xp->x_icount = xp->x_ocount = 0;
	xp->x_isctl = (imode < 0);
	
	return xp;
}

/* Sad methods */

static void
sad_dealloc(xp)
	sadobject *xp;
{
        close(xp->x_fd);
	DEL(xp);
}

static object *
sad_read(self, args)
        sadobject *self;
        object *args;
{
        int size, count;
	char *cp;
	object *rv;
	
        if ( !getargs(args, "i", &size) )
	  return 0;
	rv = newsizedstringobject(NULL, size);
	if ( rv == NULL )
	  return 0;

	cp = getstringvalue(rv);

	count = read(self->x_fd, cp, size);
	if ( count < 0 ) {
	    DECREF(rv);
	    err_errno(SunAudioError);
	    return NULL;
	}
	if ( count != size )
	  printf("sunaudio: funny read rv %d wtd %d\n", count, size);
	self->x_icount += count;
	return rv;
}

static object *
sad_write(self, args)
        sadobject *self;
        object *args;
{
        char *cp;
	int count, size;
	
        if ( !getargs(args, "s#", &cp, &size) )
	  return 0;

	count = write(self->x_fd, cp, size);
	if ( count < 0 ) {
	    err_errno(SunAudioError);
	    return NULL;
	}
	if ( count != size )
	  printf("sunaudio: funny write rv %d wanted %d\n", count, size);
	self->x_ocount += count;
	
	INCREF(None);
	return None;
}

static object *
sad_getinfo(self, args)
    sadobject *self;
    object *args;
{
	sadstatusobject *rv;

	if ( !getargs(args, "") )
	  return NULL;
	rv = sads_alloc();
	if ( ioctl(self->x_fd, AUDIO_GETINFO, &rv->ai) < 0 ) {
		err_errno(SunAudioError);
		DECREF(rv);
		return NULL;
	}
	return (object *)rv;
}

static object *
sad_setinfo(self, arg)
    sadobject *self;
    sadstatusobject *arg;
{
	if ( !is_sadstatusobject(arg) ) {
		err_setstr(TypeError, "Must be sun audio status object");
		return NULL;
	}
	if ( ioctl(self->x_fd, AUDIO_SETINFO, &arg->ai) < 0 ) {
		err_errno(SunAudioError);
		return NULL;
	}
	INCREF(None);
	return None;
}

static object *
sad_ibufcount(self, args)
    sadobject *self;
    object *args;
{
    audio_info_t ai;
    object *rv;
    
    if ( !getargs(args, "") )
      return 0;
    if ( ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0 ) {
	err_errno(SunAudioError);
	return NULL;
    }
    rv = newintobject(ai.record.samples - self->x_icount);
    return rv;
}

static object *
sad_obufcount(self, args)
    sadobject *self;
    object *args;
{
    audio_info_t ai;
    object *rv;
    
    if ( !getargs(args, "") )
      return 0;
    if ( ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0 ) {
	err_errno(SunAudioError);
	return NULL;
    }
    rv = newintobject(self->x_ocount - ai.play.samples);
    return rv;
}

static object *
sad_drain(self, args)
    sadobject *self;
    object *args;
{
    
    if ( !getargs(args, "") )
      return 0;
    if ( ioctl(self->x_fd, AUDIO_DRAIN, 0) < 0 ) {
	err_errno(SunAudioError);
	return NULL;
    }
    INCREF(None);
    return None;
}

#ifdef SOLARIS
static object *
sad_getdev(self, args)
    sadobject *self;
    object *args;
{
    struct audio_device ad;

    if ( !getargs(args, "") )
	return 0;
    if ( ioctl(self->x_fd, AUDIO_GETDEV, &ad) < 0 ) {
	err_errno(SunAudioError);
	return NULL;
    }
    return mkvalue("(sss)", ad.name, ad.version, ad.config);
}
#endif

static object *
sad_flush(self, args)
    sadobject *self;
    object *args;
{
    
    if ( !getargs(args, "") )
      return 0;
    if ( ioctl(self->x_fd, I_FLUSH, FLUSHW) < 0 ) {
	err_errno(SunAudioError);
	return NULL;
    }
    INCREF(None);
    return None;
}

static object *
sad_close(self, args)
    sadobject *self;
    object *args;
{
    
    if ( !getargs(args, "") )
      return 0;
    if ( self->x_fd >= 0 ) {
	close(self->x_fd);
	self->x_fd = -1;
    }
    INCREF(None);
    return None;
}

static struct methodlist sad_methods[] = {
        { "read",	(method)sad_read },
        { "write",	(method)sad_write },
        { "ibufcount",	(method)sad_ibufcount },
        { "obufcount",	(method)sad_obufcount },
#define CTL_METHODS 4
        { "getinfo",	(method)sad_getinfo },
        { "setinfo",	(method)sad_setinfo },
        { "drain",	(method)sad_drain },
        { "flush",	(method)sad_flush },
#ifdef SOLARIS
	{ "getdev",	(method)sad_getdev },
#endif
        { "close",	(method)sad_close },
	{NULL,		NULL}		/* sentinel */
};

static object *
sad_getattr(xp, name)
	sadobject *xp;
	char *name;
{
	if ( xp->x_isctl )
	  return findmethod(sad_methods+CTL_METHODS, (object *)xp, name);
	else
	  return findmethod(sad_methods, (object *)xp, name);
}

/* ----------------------------------------------------------------- */

static sadstatusobject *
sads_alloc() {
	sadstatusobject *rv;

	rv = NEWOBJ(sadstatusobject, &Sadstatustype);
	return rv;
}

static void
sads_dealloc(xp)
    sadstatusobject *xp;
{
	DEL(xp);
}

#define OFF(x) offsetof(audio_info_t,x)
static struct memberlist sads_ml[] = {
	{ "i_sample_rate",	T_UINT,		OFF(record.sample_rate) },
	{ "i_channels",		T_UINT,		OFF(record.channels) },
	{ "i_precision",	T_UINT,		OFF(record.precision) },
	{ "i_encoding",		T_UINT,		OFF(record.encoding) },
	{ "i_gain",		T_UINT,		OFF(record.gain) },
	{ "i_port",		T_UINT,		OFF(record.port) },
	{ "i_samples",		T_UINT,		OFF(record.samples) },
	{ "i_eof",		T_UINT,		OFF(record.eof) },
	{ "i_pause",		T_UBYTE,	OFF(record.pause) },
	{ "i_error",		T_UBYTE,	OFF(record.error) },
	{ "i_waiting",		T_UBYTE,	OFF(record.waiting) },
	{ "i_open",		T_UBYTE,	OFF(record.open) ,	 RO},
	{ "i_active",		T_UBYTE,	OFF(record.active) ,	 RO},
#ifdef SOLARIS
	{ "i_buffer_size",	T_UINT,		OFF(record.buffer_size) },
	{ "i_balance",		T_UBYTE,	OFF(record.balance) },
	{ "i_avail_ports",	T_UINT,		OFF(record.avail_ports) },
#endif

	{ "o_sample_rate",	T_UINT,		OFF(play.sample_rate) },
	{ "o_channels",		T_UINT,		OFF(play.channels) },
	{ "o_precision",	T_UINT,		OFF(play.precision) },
	{ "o_encoding",		T_UINT,		OFF(play.encoding) },
	{ "o_gain",		T_UINT,		OFF(play.gain) },
	{ "o_port",		T_UINT,		OFF(play.port) },
	{ "o_samples",		T_UINT,		OFF(play.samples) },
	{ "o_eof",		T_UINT,		OFF(play.eof) },
	{ "o_pause",		T_UBYTE,	OFF(play.pause) },
	{ "o_error",		T_UBYTE,	OFF(play.error) },
	{ "o_waiting",		T_UBYTE,	OFF(play.waiting) },
	{ "o_open",		T_UBYTE,	OFF(play.open) ,	 RO},
	{ "o_active",		T_UBYTE,	OFF(play.active) ,	 RO},
#ifdef SOLARIS
	{ "o_buffer_size",	T_UINT,		OFF(play.buffer_size) },
	{ "o_balance",		T_UBYTE,	OFF(play.balance) },
	{ "o_avail_ports",	T_UINT,		OFF(play.avail_ports) },
#endif

	{ "monitor_gain",	T_UINT,		OFF(monitor_gain) },
        { NULL,                 0,              0},
};

static object *
sads_getattr(xp, name)
    sadstatusobject *xp;
    char *name;
{
	return getmember((char *)&xp->ai, sads_ml, name);
}

static int
sads_setattr(xp, name, v)
    sadstatusobject *xp;
    char *name;
    object *v;
{

	if (v == NULL) {
		err_setstr(TypeError,
			   "can't delete sun audio status attributes");
		return -1;
	}
	return setmember((char *)&xp->ai, sads_ml, name, v);
}

/* ------------------------------------------------------------------- */


static typeobject Sadtype = {
	OB_HEAD_INIT(&Typetype)
	0,				/*ob_size*/
	"sun_audio_device",		/*tp_name*/
	sizeof(sadobject),		/*tp_size*/
	0,				/*tp_itemsize*/
	/* methods */
	(destructor)sad_dealloc,	/*tp_dealloc*/
	0,				/*tp_print*/
	(getattrfunc)sad_getattr,	/*tp_getattr*/
	0,				/*tp_setattr*/
	0,				/*tp_compare*/
	0,				/*tp_repr*/
};

static typeobject Sadstatustype = {
	OB_HEAD_INIT(&Typetype)
	0,				/*ob_size*/
	"sun_audio_device_status",	/*tp_name*/
	sizeof(sadstatusobject),	/*tp_size*/
	0,				/*tp_itemsize*/
	/* methods */
	(destructor)sads_dealloc,	/*tp_dealloc*/
	0,				/*tp_print*/
	(getattrfunc)sads_getattr,	/*tp_getattr*/
	(setattrfunc)sads_setattr,	/*tp_setattr*/
	0,				/*tp_compare*/
	0,				/*tp_repr*/
};
/* ------------------------------------------------------------------- */

static object *
sadopen(self, args)
    object *self;
    object *args;
{
    object *rv;
    
    rv = (object *)newsadobject(args);
    return rv;
}
    
static struct methodlist sunaudiodev_methods[] = {
    { "open", sadopen },
    { 0, 0 },
};

void
initsunaudiodev() {
    object *m, *d;

    m = initmodule("sunaudiodev", sunaudiodev_methods);
    d = getmoduledict(m);
    SunAudioError = newstringobject("sunaudiodev.error");
    if ( SunAudioError == NULL || dictinsert(d, "error", SunAudioError) )
      fatal("can't define sunaudiodev.error");
}
