#ifndef BCHANNELJOBS_H
#define BCHANNELJOBS_H
/*
**
**	$Id: bchanneljobs.h,v 1.2 1995/10/07 02:52:39 chris Exp $
**	$Revision: 1.2 $
**
**	$Filename: developer/bchanneljobs.h $
**	$Author: chris $
**	$Date: 1995/10/07 02:52:39 $ 
**	$Portability: ANSI $
**
**	B-Kanal Lese/Schreibjobs
**
**	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF RELOG AG.
**
**	COPYRIGHT (C) 1992-1995 BY RELOG AG, ZUERICH. ALL RIGHTS RESERVED.
**	NO PART OF THIS SOFTWARE MAY BE COPIED, REPRODUCED, OR TRANSMITTED
**	IN ANY FORM OR BY ANY MEANS,  WITHOUT THE PRIOR WRITTEN PERMISSION
**	OF RELOG AG.
**
*/

#include <stdio.h>

#include "os.h"


#define B_BLOCKSIZE		2048		/* CAPI block size */
#define B_BUFFERSIZE	32768		/* Read chunk size, must be a multiple of B_BLOCKSIZE!! */

#define B_VOLUME_MAX	32768		/* Maximale Lautstärke */
#define B_VOLUME_SHIFT	15			/* LOG2(B_VOLUME_MAX) */


/*
**	Struktur eines Datenpuffers
*/
struct Buffer
{
	U8		*Position;				/* Zeiger auf aktuelle Position in den Daten */
	U16		ActLength;				/* Länge der daten im Puffer */
	U16		TotalLength;			/* Totale Grösse des Datenpuffers */
	BOOL	EndOfFile;				/* TRUE wenn End of File */
	U8		Data[2];				/* Die Daten, variable Länge! */
};


/*
**	Struktur eines B-Kanals
*/
struct BChannel
{
	IC_NODE			Node;

	U32				NCCI;				/* NCCI des Kanals */

	IC_LIST			JobList;			/* Liste der aktuellen Jobs */
	U32				IOProcess;			/* I/O-Prozess */

	struct Buffer	*WriteBuffer;		/* Zeiger auf zu manipulierende Daten */
	struct Buffer	*PlayBuffer;		/* Zeiger auf Daten, die gesendet wurden */

	struct Buffer	Buf1;				/* Die beiden Puffer */
	U8				BD1[B_BLOCKSIZE];

	struct Buffer	Buf2;
	U8				BD2[B_BLOCKSIZE];
};


/*
**	Struktur eines Lese- oder Schreibjobs
*/
struct BChannel_Job
{
	IC_NODE	Node;						/* Verkettung */

	U16		Flags;						/* JOBF_... */
	U8		State;						/* JOBSTATE_... */
	U8		pad;

	FILE	*File;						/* File handle */

	U32		SigProc;					/* Für Signalling des Job-Endes */

	U16		ActVolume;					/* Aktuelle Lautstärke */
	U16		EndVolume;					/* Ziel-Lautstärke */

	struct BChannel	*BChannel;			/* Zugehöriger B-Channel */

	struct Buffer	*WriteBuffer;		/* Zeiger auf zu manipulierende Daten */
	struct Buffer	*PlayBuffer;		/* Zeiger auf Daten, die gesendet wurden */

	struct Buffer	Buf1;				/* Die beiden Puffer */
	U8				BD1[B_BUFFERSIZE];

	struct Buffer	Buf2;
	U8				BD2[B_BUFFERSIZE];
};


#define JOBF_READ			0x01
#define JOBF_WRITE			0x02

#define JOBF_LOOP			0x10
#define JOBF_AUTOFREE		0x20		/* Job freigeben wenn fertig */

#define JOBSTATE_IDLE		0
#define JOBSTATE_RUNNING	1
#define JOBSTATE_TERMINATED	2


/*
**	Variable
*/
#ifdef _BCHANNELJOBS

NEW_LIST( bchannellist );	/* Liste der aktiven B-Kanäle */

#else

extern IC_LIST		bchannellist;

#endif


/*
**	Prototypes
*/

struct BChannel *
BChannel_New( U32 );

VOID
BChannel_Free( struct BChannel * );

struct BChannel *
BChannel_Find( U32 );

struct BChannel_Job *
BChannel_AddJob( struct BChannel *, U8 *, U16, U16, U32 );

VOID
BChannel_FreeJob( struct BChannel_Job * );

VOID
BChannel_DataB3Ind( U32, U8 *, U16 );

VOID
BChannel_DataB3Conf( U32 );

#endif
