1//------------------------------------------------------------------------------
2//	EchoGals/Echo24 BeOS Driver for Echo audio cards
3//
4//  Copyright (c) 2003, J��r��me Duval
5//
6//	Permission is hereby granted, free of charge, to any person obtaining a
7//	copy of this software and associated documentation files (the "Software"),
8//	to deal in the Software without restriction, including without limitation
9//	the rights to use, copy, modify, merge, publish, distribute, sublicense,
10//	and/or sell copies of the Software, and to permit persons to whom the
11//	Software is furnished to do so, subject to the following conditions:
12//
13//	The above copyright notice and this permission notice shall be included in
14//	all copies or substantial portions of the Software.
15//
16//	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17//	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18//	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19//	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20//	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21//	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22//	DEALINGS IN THE SOFTWARE.
23
24#ifndef _ECHO_H_
25#define _ECHO_H_
26
27#ifdef CARDBUS
28#include <pcmcia/cb_enabler.h>
29#else
30#include <PCI.h>
31#endif
32#include "OsSupportBeOS.h"
33#include "CEchoGals.h"
34#include "hmulti_audio.h"
35#include "multi.h"
36#include "queue.h"
37
38#define AUTHOR "J��r��me Duval"
39#define DEVNAME 32
40#define NUM_CARDS 3
41
42/*
43 * Echo midi
44 */
45
46typedef struct _midi_dev {
47	int32		count;
48	char		name[64];
49	sem_id 		midi_ready_sem;
50	ECHOGALS_MIDI_IN_CONTEXT	context;
51} midi_dev;
52
53#define	ECHO_USE_PLAY		(1 << 0)
54#define	ECHO_USE_RECORD	(1 << 1)
55#define ECHO_STATE_STARTED	(1 << 0)
56
57/*
58 * Streams
59 */
60
61typedef struct _echo_stream {
62	struct _echo_dev 	*card;
63	uint8        		use;
64	uint8        		state;
65	uint8        		bitsPerSample;
66	uint32       		sample_rate;
67	uint8				channels;
68	uint32 				bufframes;
69	uint8 				bufcount;
70
71	WORD				pipe;
72	PDWORD				position;
73
74	LIST_ENTRY(_echo_stream)	next;
75
76	void            	(*inth) (void *);
77	void           		*inthparam;
78
79	echo_mem 	*buffer;
80	uint16       blksize;	/* in samples */
81	uint16       trigblk;	/* blk on which to trigger inth */
82	uint16       blkmod;	/* Modulo value to wrap trigblk */
83
84	/* multi_audio */
85	volatile int64	frames_count;	// for play or record
86	volatile bigtime_t real_time;	// for play or record
87	volatile int32	buffer_cycle;	// for play or record
88	int32 first_channel;
89	bool update_needed;
90} echo_stream;
91
92
93typedef struct _echo_dev {
94	char		name[DEVNAME];	/* used for resources */
95	pci_info	info;
96
97	uint32	bmbar;
98	void *	log_bmbar;
99	area_id area_bmbar;
100	uint32	irq;
101	uint16	type;
102
103	PCEchoGals	pEG;
104	ECHOGALS_CAPS	caps;
105	NUINT		mixer;
106	PCOsSupport pOSS;
107
108	void	*ptb_log_base;
109	phys_addr_t	ptb_phy_base;
110	area_id ptb_area;
111
112	sem_id buffer_ready_sem;
113
114	LIST_HEAD(, _echo_stream) streams;
115	LIST_HEAD(, _echo_mem) mems;
116
117	echo_stream		*pstream;
118	echo_stream		*rstream;
119
120	/* multi_audio */
121	multi_dev	multi;
122#ifdef MIDI_SUPPORT
123	midi_dev 	midi;
124#endif
125#ifdef CARDBUS
126	bool				plugged;					// Device plugged
127	bool				opened;						// Device opened
128	int32				index;
129	LIST_ENTRY(_echo_dev)	next;
130#endif
131} echo_dev;
132
133extern int32 num_cards;
134#ifdef CARDBUS
135LIST_HEAD(_echodevs, _echo_dev);
136extern struct _echodevs	devices;
137#else
138extern echo_dev cards[NUM_CARDS];
139#endif
140
141#ifdef __cplusplus
142extern "C" {
143#endif
144
145status_t echo_stream_set_audioparms(echo_stream *stream, uint8 channels,
146			     uint8 bitsPerSample, uint32 sample_ratei, uint8 index);
147status_t echo_stream_get_nth_buffer(echo_stream *stream, uint8 chan, uint8 buf,
148					char** buffer, size_t *stride);
149void echo_stream_start(echo_stream *stream, void (*inth) (void *), void *inthparam);
150void echo_stream_halt(echo_stream *stream);
151echo_stream *echo_stream_new(echo_dev *card, uint8 use, uint32 bufframes, uint8 bufcount);
152void echo_stream_delete(echo_stream *stream);
153
154#ifdef __cplusplus
155}
156#endif
157
158
159#endif /* _ECHO_H_ */
160