|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24: /*
25: * audio_snd_reply.c
26: *
27: * Copyright (c) 1991, NeXT Computer, Inc. All rights reserved.
28: *
29: * Snd reply message routines.
30: *
31: * HISTORY
32: * 08/07/92/mtm Original coding from m68k snd_reply.c.
33: */
34:
35: #import "snd_reply.h"
36: #import <bsd/dev/snd_msgs.h>
37:
38: /*
39: * Interface routines for composing messages to send in response to
40: * sound facility services.
41: */
42:
43: static msg_type_long_t snd_type_ool_template = {
44: {
45: 0, /* msg_type_name */
46: 0, /* msg_type_size */
47: 0, /* msg_type_number */
48: FALSE, /* msg_type_inline */
49: TRUE, /* msg_type_longform */
50: TRUE /* msg_type_deallocate */
51: },
52: MSG_TYPE_INTEGER_8, /* msg_type_long_name */
53: 8, /* msg_type_long_size */
54: 0, /* msg_type_long_number */
55: };
56:
57: static msg_type_t snd_type_int_template = {
58: MSG_TYPE_INTEGER_32, /* msg_type_name */
59: 32, /* msg_type_size */
60: 1, /* msg_type_number */
61: TRUE, /* msg_type_inline */
62: FALSE, /* msg_type_longform */
63: FALSE /* msg_type_deallocate */
64: };
65:
66: /*
67: * Generic replies
68: */
69: /*
70: * Message to return the device port.
71: */
72: void audio_snd_reply_ret_device(msg_header_t *msg,
73: port_name_t remote_port,
74: port_name_t device_port)
75: {
76: msg->msg_id = SND_MSG_RET_DEVICE;
77: msg->msg_local_port = device_port;
78: msg->msg_remote_port = remote_port;
79: }
80:
81: /*
82: * Message to return a stream port.
83: */
84: void audio_snd_reply_ret_stream(msg_header_t *msg,
85: port_name_t remote_port,
86: port_name_t stream_port)
87: {
88: msg->msg_id = SND_MSG_RET_STREAM;
89: msg->msg_local_port = stream_port;
90: msg->msg_remote_port = remote_port;
91: }
92:
93: static void snd_reply_with_tag(msg_header_t *msg, port_name_t port,
94: int tag, int msg_id)
95: {
96: snd_taged_reply_t *smsg = (snd_taged_reply_t *)msg;
97:
98: msg->msg_id = msg_id;
99: msg->msg_size = sizeof(snd_taged_reply_t);
100: msg->msg_remote_port = port;
101: smsg->data_tagType = snd_type_int_template;
102: smsg->data_tag = tag;
103: }
104:
105: /*
106: * Message return on illegal message.
107: */
108: void audio_snd_reply_illegal_msg(msg_header_t *msg,
109: port_name_t local_port,
110: port_name_t remote_port,
111: int msg_id,
112: int error)
113: {
114: snd_illegal_msg_t *smsg = (snd_illegal_msg_t *)msg;
115:
116: msg->msg_id = SND_MSG_ILLEGAL_MSG;
117: msg->msg_size = sizeof(snd_illegal_msg_t);
118: msg->msg_local_port = local_port;
119: msg->msg_remote_port = remote_port;
120:
121: smsg->dataType = snd_type_int_template;
122: smsg->dataType.msg_type_number = 2;
123: smsg->ill_msgid = msg_id;
124: smsg->ill_error = error;
125: }
126:
127: /*
128: * Replies specific to streaming soundout/soundin
129: */
130: /*
131: * Message returning recorded data.
132: */
133: void audio_snd_reply_recorded_data(msg_header_t *msg,
134: port_name_t remote_port,
135: int data_tag,
136: pointer_t data,
137: int nbytes)
138: {
139: snd_recorded_data_t *smsg = (snd_recorded_data_t *)msg;
140:
141: msg->msg_simple = FALSE;
142: msg->msg_size = sizeof(snd_recorded_data_t);
143: msg->msg_type = MSG_TYPE_NORMAL;
144: msg->msg_remote_port = remote_port;
145: msg->msg_local_port = PORT_NULL;
146: msg->msg_id = SND_MSG_RECORDED_DATA;
147:
148: smsg->data_tagType = snd_type_int_template;
149: smsg->data_tag = data_tag;
150: smsg->dataType = snd_type_ool_template;
151: smsg->dataType.msg_type_long_number = nbytes;
152: smsg->recorded_data = data;
153: }
154:
155: /*
156: * Message to return a timeout indication.
157: */
158: void audio_snd_reply_timed_out(msg_header_t *msg,
159: port_name_t remote_port,
160: int data_tag)
161: {
162: return snd_reply_with_tag(msg, remote_port, data_tag,
163: SND_MSG_TIMED_OUT);
164: }
165:
166: /*
167: * Message to return an integer count of number samples played/recorded.
168: */
169: void audio_snd_reply_ret_samples(msg_header_t *msg,
170: port_name_t remote_port,
171: int nsamples, int timeStamp)
172: {
173: snd_ret_samples_t *smsg = (snd_ret_samples_t *)msg;
174:
175: msg->msg_size = sizeof(snd_ret_samples_t);
176: msg->msg_id = SND_MSG_RET_SAMPLES;
177: msg->msg_remote_port = remote_port;
178:
179: smsg->dataType = snd_type_int_template;
180: smsg->nsamples = nsamples;
181: smsg->timeStamp = timeStamp;
182: }
183:
184: /*
185: * Message to return an overflow indication.
186: */
187: void audio_snd_reply_overflow(msg_header_t *msg,
188: port_name_t remote_port,
189: int data_tag)
190: {
191: return snd_reply_with_tag(msg, remote_port, data_tag,
192: SND_MSG_OVERFLOW);
193: }
194:
195: /*
196: * Message to return a region started indication.
197: */
198: void audio_snd_reply_started(msg_header_t *msg,
199: port_name_t remote_port,
200: int data_tag)
201: {
202: return snd_reply_with_tag(msg, remote_port, data_tag,
203: SND_MSG_STARTED);
204: }
205:
206: /*
207: * Message to return region completed indication.
208: */
209: void audio_snd_reply_completed(msg_header_t *msg,
210: port_name_t remote_port,
211: int data_tag)
212: {
213: return snd_reply_with_tag(msg, remote_port, data_tag,
214: SND_MSG_COMPLETED);
215: }
216:
217: /*
218: * Message to return region aborted indication.
219: */
220: void audio_snd_reply_aborted(msg_header_t *msg,
221: port_name_t remote_port,
222: int data_tag)
223: {
224: return snd_reply_with_tag(msg, remote_port, data_tag,
225: SND_MSG_ABORTED);
226: }
227:
228: /*
229: * Message to return region paused indication.
230: */
231: void audio_snd_reply_paused(msg_header_t *msg,
232: port_name_t remote_port,
233: int data_tag)
234: {
235: return snd_reply_with_tag(msg, remote_port, data_tag,
236: SND_MSG_PAUSED);
237: }
238:
239: /*
240: * Message to return region resumed indication.
241: */
242: void audio_snd_reply_resumed(msg_header_t *msg,
243: port_name_t remote_port,
244: int data_tag)
245: {
246: return snd_reply_with_tag(msg, remote_port, data_tag,
247: SND_MSG_RESUMED);
248: }
249:
250: /*
251: * Replies specific to the sound device.
252: */
253: /*
254: * Message to return the set of parameters.
255: */
256: void audio_snd_reply_ret_parms(msg_header_t *msg,
257: port_name_t remote_port,
258: u_int parms)
259: {
260: snd_ret_parms_t *smsg = (snd_ret_parms_t *)msg;
261:
262: msg->msg_id = SND_MSG_RET_PARMS;
263: msg->msg_size = sizeof(snd_ret_parms_t);
264: msg->msg_remote_port = remote_port;
265:
266: smsg->dataType = snd_type_int_template;
267: smsg->parms = parms;
268: }
269:
270: /*
271: * Message to return the volume.
272: */
273: void audio_snd_reply_ret_volume(msg_header_t *msg,
274: port_name_t remote_port,
275: u_int volume)
276: {
277: snd_ret_volume_t *smsg = (snd_ret_volume_t *)msg;
278:
279: msg->msg_id = SND_MSG_RET_VOLUME;
280: msg->msg_size = sizeof(snd_ret_volume_t);
281: msg->msg_remote_port = remote_port;
282:
283: smsg->dataType = snd_type_int_template;
284: smsg->volume = volume;
285: }
286:
287: /*
288: * Message to return supported data formats.
289: */
290: void audio_snd_reply_ret_formats(msg_header_t *msg,
291: port_name_t remote_port,
292: u_int rates, u_int low, u_int high,
293: u_int encodings, u_int chans)
294: {
295: snd_ret_stream_formats_t *smsg = (snd_ret_stream_formats_t *)msg;
296:
297: msg->msg_id = SND_MSG_RET_STREAM_FORMATS;
298: msg->msg_size = sizeof(snd_ret_stream_formats_t);
299: msg->msg_remote_port = remote_port;
300:
301: smsg->Type = snd_type_int_template;
302: smsg->Type.msg_type_number = 5;
303: smsg->rate = rates;
304: smsg->low_rate = low;
305: smsg->high_rate = high;
306: smsg->encoding = encodings;
307: smsg->chan_count = chans;
308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.