xref: /titanic_50/usr/src/cmd/audio/include/Audio.h (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 1992-2002 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _MULTIMEDIA_AUDIO_H
28 #define	_MULTIMEDIA_AUDIO_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <AudioTypes.h>
33 #include <AudioError.h>
34 #include <AudioHdr.h>
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 // Error-handling function declaration
41 class Audio;
42 typedef Boolean	(*AudioErrfunc)(const Audio*, AudioError, AudioSeverity,
43 		    char *);
44 
45 
46 // Data transfer subcodes.
47 // Returned from ReadData(), WriteData(), AsyncCopy(), Copy() in err.sys
48 enum AudioCopyFlag {
49     AUDIO_COPY_SHORT_INPUT = 100,	// AUDIO_SUCCESS: input would block
50     AUDIO_COPY_ZERO_LIMIT = 101,	// AUDIO_SUCCESS: length was zero
51     AUDIO_COPY_SHORT_OUTPUT = 102,	// AUDIO_SUCCESS: only partial output
52     AUDIO_COPY_INPUT_EOF = 103,		// AUDIO_EOF: eof on input
53     AUDIO_COPY_OUTPUT_EOF = 104		// AUDIO_EOF: eof on output
54 };
55 
56 
57 
58 // This is the abstract base class from which all audio data types derive.
59 // It is invalid to create an object of type Audio.
60 
61 class Audio {
62 private:
63 	static int	idctr;			// id seed value
64 
65 	int		id;			// object id number
66 	int		refcnt;			// reference count
67 	char		*name;			// name
68 	Double		readpos;		// current read position ptr
69 	Double		writepos;		// current write position ptr
70 	AudioErrfunc	errorfunc;		// address of error function
71 
72 protected:
73 	void SetName(const char *str);		// Set name string
74 
75 	// Set position
76 	Double setpos(
77 	    Double& pos,			// position field to update
78 	    Double newpos,			// new position
79 	    Whence w = Absolute);		// Absolute || Relative
80 
81 // XXX - should these be protected?
82 public:
83 	int getid() const;			// Get id value
84 
85 	// Raise error code
86 	virtual AudioError RaiseError(
87 	    AudioError code,			// error code
88 	    AudioSeverity sev = Error,		// error severity
89 	    char *msg = '\0') const;		// error message
90 
91 	// Raise error msg
92 	virtual void PrintMsg(
93 	    char *msg,				// error code
94 	    AudioSeverity sev = Message) const;	// error severity
95 
96 public:
97 	Audio(const char *str = "");		// Constructor
98 	virtual ~Audio();			// Destructor
99 
100 	void Reference();			// Increment ref count
101 	void Dereference();			// Decrement ref count
102 	Boolean isReferenced() const;		// TRUE if referenced
103 
104 	virtual char *GetName() const;		// Get name string
105 
106 	// Set user error func
107 	virtual void SetErrorFunction(
108 	    AudioErrfunc func);			// return TRUE if non-fatal
109 
110 	virtual Double ReadPosition() const;	// Get read position
111 	virtual Double WritePosition() const;	// Get write position
112 
113 	// Set read position
114 	virtual Double SetReadPosition(
115 	    Double pos,				// new position
116 	    Whence w = Absolute);		// Absolute || Relative
117 
118 	// Set write position
119 	virtual Double SetWritePosition(
120 	    Double pos,				// new position
121 	    Whence w = Absolute);		// Absolute || Relative
122 
123 	// Read from current pos
124 	virtual AudioError Read(
125 	    void* buf,				// buffer to fill
126 	    size_t& len);			// buffer length (updated)
127 
128 	// Write to current pos
129 	virtual AudioError Write(
130 	    void* buf,				// buffer to copy
131 	    size_t& len);			// buffer length (updated)
132 
133 	// XXX - no Append() method for now because of name clashes
134 
135 	// methods specialized by inherited classes
136 	virtual AudioHdr GetHeader() = 0;	// Get header
137 	virtual AudioHdr GetDHeader(Double);	// Get header at pos
138 	virtual Double GetLength() const = 0;	// Get length, in secs
139 
140 	// Read from position
141 	virtual AudioError ReadData(
142 	    void* buf,				// buffer to fill
143 	    size_t& len,			// buffer length (updated)
144 	    Double& pos) = 0;			// start position (updated)
145 
146 	// Write at position
147 	virtual AudioError WriteData(
148 	    void* buf,				// buffer to copy
149 	    size_t& len,			// buffer length (updated)
150 	    Double& pos) = 0;			// start position (updated)
151 
152 	// Write and extend
153 	virtual AudioError AppendData(
154 	    void* buf,				// buffer to copy
155 	    size_t& len,			// buffer length (updated)
156 	    Double& pos);			// start position (updated)
157 
158 	// copy to another audio obj.
159 	virtual AudioError Copy(
160 	    Audio* ap);				// dest audio object
161 
162 	// copy to another audio obj.
163 	virtual AudioError Copy(
164 	    Audio* ap,				// dest audio object
165 	    Double& frompos,
166 	    Double& topos,
167 	    Double& limit);
168 
169 	// copy to another audio obj.
170 	virtual AudioError AsyncCopy(
171 	    Audio* ap,				// dest audio object
172 	    Double& frompos,
173 	    Double& topos,
174 	    Double& limit);
175 
176 	// Define default classification routines
177 	// The appropriate routine should be specialized by each leaf class.
isFile()178 	virtual Boolean isFile() const { return (FALSE); }
isDevice()179 	virtual Boolean isDevice() const { return (FALSE); }
isDevicectl()180 	virtual Boolean isDevicectl() const { return (FALSE); }
isPipe()181 	virtual Boolean isPipe() const { return (FALSE); }
isBuffer()182 	virtual Boolean isBuffer() const { return (FALSE); }
isExtent()183 	virtual Boolean isExtent() const { return (FALSE); }
isList()184 	virtual Boolean isList() const { return (FALSE); }
185 };
186 
187 #include <Audio_inline.h>
188 
189 #ifdef __cplusplus
190 }
191 #endif
192 
193 #endif /* !_MULTIMEDIA_AUDIO_H */
194