/*
	File:		DVFamilyPriv.h

	Contains:	xxx put contents here xxx

	Version:	xxx put version here xxx

	Written by:	Steve Smith

	Copyright:	© 1996-1999 by Apple Computer, Inc., all rights reserved.

	File Ownership:

		DRI:				xxx put dri here xxx

		Other Contact:		xxx put other contact here xxx

		Technology:			xxx put technology here xxx

	Writers:

		(KW)	Kevin Williams
		(jkl)	Jay Lloyd
		(CP)	Collin Pieper
		(CLP)	Collin Pieper
		(SS)	Steve Smith

	Change History (most recent first):

		<16>	 6/17/99	jkl		Added fwClientID to DVGetLocalFWReferenceID call to make the
									fwClientID part of the device info so IDH can execute
									getDeviceStandard by itself.
		<15>	  6/8/99	KW		Added a __cplusplus extern c ifdef.
		<14>	  1/4/99	GDW		Changed DVFamily names.
		<13>	 12/9/98	SS		Changed clock component instance field to clock component in
									DVDriverData struct.
		<12>	11/19/98	SS		Added fields to family struct to support queuing of DV events.
		<11>	11/16/98	SS		Added AVCisEnabled & enabled count to per-device struct. Changed
									internal notification structs for PB queuing.
		<10>	11/16/98	SS		Added enum and param struct for setting the deviceID in the
									driver (for notification purposes).
		 <9>	11/12/98	SS		Added localID & clockInstance to per-device data struct. Changed
									kDVGetID enum & param struct to kDVGetDeviceUniqueID. Added
									kDVGetLocalFWReferenceID enum and param struct.
		 <8>	10/28/98	SS		Added read/write enabled flags and reader count to the device
									structure.
		 <7>	10/22/98	jkl		Nothing. Just removed outdated System7 def.
		 <6>	 9/17/98	SS		Added generic dv event notification support. Removed AppleEvent
									support.
		 <5>	 3/12/98	SS		Added a few "driverID"-based declarations to this file that were
									originally in DVFamily.h. This is so we can move towards
									deviceIDs and refNums externally, but maintain the use of
									driverIDs internally, at least for now.
		 <4>	  2/4/98	CP		Remove unnecessary dependencies
		 <3>	 1/19/98	CP		Moved structures that were public ans shouldn't have been here
									for safe harbour...
		 <2>	 1/12/98	SS		Checked in Collin's changes: modified data structures and added
									AppleEvent support.
		 <1>	 8/18/97	CLP		first checked in
		 <4>	 2/19/97	SS		Updated to 1.0a2 FSL
		 <3>	 2/12/97	AW		Updated to 1.0d18 FSL
		 <2>	10/31/96	SS		Misc changes to the isoch and buffering data structures.
									Changes to support Blaze d16 API.

*/

//
//	DVFamilyPriv.h
//

#ifndef	__DVFAMILYPRIV__
#define __DVFAMILYPRIV__


#include <Types.h>
#include <NameRegistry.h>
#include <DriverServices.h>
#include <AppleEvents.h>
#include <Components.h>

#include "GenericDriverFamily.h"
#include "FireWire.h"
#include "DVFamily.h"

#ifdef __cplusplus
extern "C" {
#endif

///////////////////////////////////////////////////////////////////////
//
// types
//
///////////////////////////////////////////////////////////////////////

// holds our driver identification...
// NOTE: for this implementation, DVDriverID, DVDeviceID, 
// and DVDeviceRefNum are synonymous.
typedef UInt32 DVDriverID;

enum
{
	kInvalidDVDriverID		= 0,
	kMaxQueuedDVEvents		= 32
};

// one for each driver...

typedef struct DVDriverDataStruct DVDriverData, *DVDriverDataPtr;
								
struct DVDriverDataStruct
{
	DVDriverDataPtr				pNextDVDriverData;		// Pointer to next driver in driver list.

	DVDriverID					dvDriverID;				// ID referencing this data record.
	DriverRefNum				driverRefNum;			// Device Manager driver ref num.
	RegEntryID					deviceRegistryID;		// Name registry ID of DV device
	CSRNodeUniqueID				uniqueID;				// unique device ID
	FWReferenceID				localID;				// local FW reference ID
	FWReferenceID				fwClientID;				// camera's reference ID
	Component					clock;					// this device's clock component
	
	Str255						name;					// DV device name
	
	Boolean						writeEnabled;			// true if device is enabled for writing
	Boolean						readEnabled;			// true if device is enabled for reading
	UInt32						numReaders;				// Number of readers connected to device
	Boolean						AVCEnabled;				// true if device is enabled for AVC transactions
	UInt32						numControllers;			// Number of controllers connected to device
	
	Boolean						driverOpened;			// True if we've opened the driver.
	UInt32						numConnections;			// Number of connections to this driver.
	Boolean						deviceDisconnected;		// True if device was disconnected.
};

// notification stuff
typedef struct DVNotificationEntryStruct {
	QElemPtr							qLink;			// next queue element
//	DVEventRecord						eventRec;
	DVCDeviceID							deviceID;
	UInt32								wantedEvents;
	DVCNotifyProc						notifyProc;
	void								*userRefCon;
} DVNotificationEntry, *DVNotificationEntryPtr;

typedef struct DVEventEntryStruct {
	QElemPtr							qLink;			// next queue element
	DVCNotifyProc						notifyProc;
	void								*userRefCon;
	DVCEventRecord						eventRec;
} DVEventEntry, *DVEventEntryPtr;	

// the main family structure...

typedef struct DVFamilyDataStruct
{
	UInt32					useCount;
	DVDriverDataPtr			pDVDriverList;
	UInt32					numDVDrivers;
	QHdrPtr					notificationQueue;
	
	DVEventEntry			events[ kMaxQueuedDVEvents ];
	QHdrPtr					availableDVEvents;
	QHdrPtr					receivedDVEvents;
	NMRec					dvNMRec;
	UInt32					nmIsInstalled;			// for compare and swap
} DVFamilyData, * DVFamilyDataPtr;


///////////////////////////////////////////////////////////////////////
//
// external prototypes
//
///////////////////////////////////////////////////////////////////////


// for the expert...
OSStatus 	DVHandleDeviceAdded( GDFDeviceEventDataPtr pGDFDeviceEventData );
OSStatus 	DVHandleDeviceRemoved( GDFDeviceEventDataPtr pGDFDeviceEventData );

OSErr 		DVCPostEvent( DVCEventRecordPtr	pEvent );



//////////////////////////////////////////////////////////////////////
//
// structures for communicating with the driver
//
//////////////////////////////////////////////////////////////////////

// for sending commands with no data to driver
typedef struct DVBasicCmdParamsStruct 
{
	UInt32					interfaceSelector;
} DVBasicCmdParams, *DVBasicCmdParamsPtr;



// for getting buffers and sizes
// used by DVGetEmptyFrame & DVReadFrame
 
typedef struct DVGetBufferParamsStruct
{
	UInt32					interfaceSelector;
	Ptr						*ppBuffer;
	UInt32					*pBufferSize;
} DVGetBufferParams, *DVGetBufferParamsPtr;



// for handing buffers back to the driver
// used by DVWriteFrame & DVReleaseFrame

typedef struct DVPassBufferParamsStruct 
{
	UInt32					interfaceSelector;
	Ptr						pBuffer;
} DVPassBufferParams, *DVPassBufferParamsPtr;



// for getting a unique camera id from the driver

typedef struct DVGetDeviceUniqueIDParamsStruct 
{
	UInt32					interfaceSelector;
	CSRNodeUniqueID			id;
} DVGetDeviceUniqueIDParams, *DVGetDeviceUniqueIDParamsPtr;


// for getting the local FW Ref id from the driver

typedef struct DVGetLocalFWReferenceIDParamsStruct 
{
	UInt32					interfaceSelector;
	FWReferenceID			id;
	FWReferenceID			fwClientID;
} DVGetLocalFWReferenceIDParams, *DVGetLocalFWReferenceIDParamsPtr;


// for setting the family's deviceID for the driver

typedef struct DVSetFamilyDeviceIDParamsStruct 
{
	UInt32					interfaceSelector;
	DVCDeviceID				id;
	DVCDeviceID				fwClientID;
} DVSetFamilyDeviceIDParams, *DVSetFamilyDeviceIDParamsPtr;


// for sending AVC commands
typedef struct DVAVCTransactionParamsStruct {
	UInt32					interfaceSelector;
	Ptr						commandBufferPtr;
	UInt32					commandLength;
	Ptr						responseBufferPtr;
	UInt32					responseBufferSize;
	FCPResponseHandlerPtr	responseHandler;
} DVAVCTransactionParams, *DVAVCTransactionParamsPtr;

/////////////////////////////////////////////////////////
//
// driver interface selectors
//

enum {
	kAVCInitialize				= 1,
	kAVCTerminate				= 2,
	kAVCDoTransaction			= 3,
	
	kDVCEnableIsochRead			= 0x10,
	kDVCDisableIsochRead		= 0x11,
	kDVCReadIsochData			= 0x12,
	kDVCReleaseReadBuffer		= 0x13,

	kDVCEnableIsochWrite		= 0x20,
	kDVCDisableIsochWrite		= 0x21,
	kDVCGetEmptyFrame			= 0x22,
	kDVCWriteFrame				= 0x23,
	
	kDVCEnableDVCGrab			= 0x100,
	kDVCDisableDVCGrab			= 0x101,
	kDVCGrabOneDVCFrame			= 0x102,
	kDVCReleaseDVCFrame			= 0x103,
	
	kDVGetDeviceUniqueID		= 0x30,
	kDVGetLocalFWReferenceID	= 0x31,
	kDVSetDeviceFamilyID		= 0x32
};

enum {
	kServiceTypeAVCServices	= 'avc '
};


#ifdef __cplusplus
}
#endif


#endif __DVFAMILYPRIV__
