1/*
2	Copyright 1999, Be Incorporated.   All Rights Reserved.
3	This file may be used under the terms of the Be Sample Code License.
4*/
5
6#if !defined(_CM_PRIVATE_H)
7#define _CM_PRIVATE_H
8
9#if !defined(_CMEDIA_PCI_H)
10#include "cmedia_pci.h"
11#endif
12
13#if !defined(_PCI_H)
14#include <PCI.h>
15#endif
16
17#if !defined(DEBUG)
18#define DEBUG 0
19#endif
20
21
22#define NUM_CARDS 3
23#define DEVNAME 32
24
25
26#define EXPORT __declspec(dllexport)
27
28#if defined(__POWERPC__)
29#define EIEIO() __eieio()
30#else
31#define EIEIO()
32#endif
33
34#if DEBUG
35#define ddprintf(x) dprintf x
36#define KTRACE() kprintf("%s %d\n", __FILE__, __LINE__)
37#else
38#define ddprintf(x)
39#define KTRACE()
40#endif
41
42/* neither value may be larger than 65536 */
43#define PLAYBACK_BUF_SIZE 2048
44#define RECORD_BUF_SIZE PLAYBACK_BUF_SIZE
45/* always create this much, so larger buffers can be requested */
46#define MIN_MEMORY_SIZE 32768
47
48/* clock crystal frequency */
49#define F_REF 24576000
50/* data book says 80 MHz ... */
51#define MIN_FREQ 80000000
52/* tolerance for sample rate clock derivation - book has this at 0.005 */
53#define TOLERANCE 0.001
54
55/* there are five logical devices: midi, joystick, pcm, mux and mixer */
56
57typedef struct _midi_dev
58{
59	struct _cmedia_pci_dev *card;
60	void *		driver;
61	void *		cookie;
62	int32		count;
63	char		name[64];
64} midi_dev;
65
66typedef struct _joy_dev
67{
68	void *		driver;
69	char		name1[64];
70} joy_dev;
71
72typedef cmedia_pci_audio_format pcm_cfg;
73typedef cmedia_pci_audio_buf_header pcm_buf_hdr;
74
75enum
76{	/* these map to the mode enable bits in the CMX13 register */
77	kPlayback = 1,
78	kRecord = 2
79};
80
81typedef struct
82{
83	struct _cmedia_pci_dev * card;
84	char		name[DEVNAME];
85	char		oldname[DEVNAME];
86	sem_id		init_sem;
87	int32		open_count;
88	int32		open_mode;
89
90/* playback from a cyclic, small-ish buffer */
91
92	int32		wr_lock;
93	int			dma_a;
94	vuchar *	wr_1;
95	vuchar *	wr_2;
96	vuchar *	wr_cur;
97	size_t		wr_size;
98	int			wr_silence;
99	int32		write_waiting;
100	sem_id		write_sem;
101	size_t		was_written;
102	uint32		wr_skipped;
103	sem_id		wr_entry;
104	bigtime_t	wr_time;
105	uint64		wr_total;
106	sem_id		wr_time_sem;
107	int32		wr_time_wait;
108
109/* recording into a cyclic, somewhat larger buffer */
110
111	int32		rd_lock;
112	int			dma_c;
113	vuchar *	rd_1;
114	vuchar *	rd_2;
115	vuchar *	rd_cur;
116	size_t		rd_size;
117	int32		read_waiting;
118	sem_id		read_sem;
119	size_t		was_read;
120	bigtime_t	next_rd_time;
121	bigtime_t	rd_time;
122	uint32		rd_skipped;	/* count of misses */
123	sem_id		rd_entry;
124	uint64		rd_total;
125	sem_id		rd_time_sem;
126	int32		rd_time_wait;
127
128/* buffers are owned by the device record (because of allocation) */
129
130	pcm_cfg		config;
131
132	sem_id		old_cap_sem;
133	sem_id		old_play_sem;
134} pcm_dev;
135
136typedef struct
137{
138	struct _cmedia_pci_dev * card;
139	char		name[DEVNAME];
140	int32		open_count;
141} mux_dev;
142
143typedef struct
144{
145	struct _cmedia_pci_dev * card;
146	char		name[DEVNAME];
147	int32		open_count;
148} mixer_dev;
149
150typedef struct _cmedia_pci_dev
151{
152	char		name[DEVNAME];	/* used for resources */
153	int32		hardware;		/* spinlock */
154	int			enhanced;		/* offset to port */
155	int32		inth_count;
156	int			dma_base;
157	size_t		low_size;		/* size of low memory */
158	vuchar *	low_mem;
159	vuchar *	low_phys;		/* physical address */
160	area_id		map_low;		/* area pointing to low memory */
161	pci_info	info;
162	midi_dev	midi;
163	joy_dev		joy;
164	pcm_dev		pcm;
165	mux_dev		mux;
166	mixer_dev	mixer;
167} cmedia_pci_dev;
168
169
170extern int32 num_cards;
171extern cmedia_pci_dev cards[NUM_CARDS];
172
173
174extern void set_direct(cmedia_pci_dev *, int, uchar, uchar);
175extern uchar get_direct(cmedia_pci_dev *, int);
176extern void set_indirect(cmedia_pci_dev *, int, uchar, uchar);
177extern uchar get_indirect(cmedia_pci_dev *, int);
178extern void increment_interrupt_handler(cmedia_pci_dev *);
179extern void decrement_interrupt_handler(cmedia_pci_dev *);
180
181
182extern bool midi_interrupt(cmedia_pci_dev *);
183extern void midi_interrupt_op(int32 op, void * data);
184extern bool dma_a_interrupt(cmedia_pci_dev *);
185extern bool dma_c_interrupt(cmedia_pci_dev *);
186
187extern void PCI_IO_WR(int offset, uint8 val);
188extern uint8 PCI_IO_RD(int offset);
189extern uint32 PCI_IO_RD_32(int offset);
190
191extern generic_gameport_module * gameport;
192
193#endif	/*	_CM_PRIVATE_H	*/
194
195