00001 #ifndef __MK__MachMessages_H___
00002 #define __MK__MachMessages_H___
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #import <mach/mach_types.h>
00025 #import <mach/message.h>
00026
00027
00028
00029
00030 typedef struct {
00031 msg_type_t typeType;
00032 unsigned int type;
00033 #define SND_MT_PLAY_DATA 0 // data to be played (with size)
00034 #define SND_MT_RECORD_DATA 1 // number of bytes to record
00035 #define SND_MT_OPTIONS 2 // high/low water and dma size options
00036 #define SND_MT_CONTROL 3 // await/abort/pause/continue
00037 #define SND_MT_NDMA 4 // number of dma descs in stream.
00038 } snd_msg_type_t;
00039
00040
00041
00042
00043
00044
00045
00046
00047 typedef struct {
00048 msg_header_t header;
00049 msg_type_t data_tagType;
00050 int data_tag;
00051 msg_type_long_t dataType;
00052 pointer_t recorded_data;
00053 } snd_recorded_data_t;
00054
00055 typedef struct {
00056 msg_header_t header;
00057 msg_type_t data_tagType;
00058 int data_tag;
00059 } snd_taged_reply_t;
00060
00061 typedef struct {
00062 msg_header_t header;
00063 msg_type_t dataType;
00064 int nsamples;
00065 } snd_ret_samples_t;
00066
00067 typedef struct {
00068 msg_header_t header;
00069 msg_type_t dataType;
00070 unsigned int parms;
00071 #define SND_PARM_LOWPASS 0x1
00072 #define SND_PARM_SPEAKER 0x2
00073 #define SND_PARM_ZEROFILL 0x4
00074 } snd_ret_parms_t;
00075
00076 typedef struct {
00077 msg_header_t header;
00078 msg_type_t dataType;
00079 unsigned int volume;
00080 #define SND_VOLUME_RCHAN_MASK 0xff
00081 #define SND_VOLUME_RCHAN_SHIFT 0
00082 #define SND_VOLUME_LCHAN_MASK 0xff00
00083 #define SND_VOLUME_LCHAN_SHIFT 8
00084 } snd_ret_volume_t;
00085
00086 typedef struct {
00087 msg_header_t header;
00088 msg_type_t dataType;
00089 int dsp_regs;
00090 } snd_ret_dsp_regs_t;
00091
00092 typedef struct {
00093 msg_header_t header;
00094 msg_type_t dataType;
00095 unsigned int ill_msgid;
00096 unsigned int ill_error;
00097 #define SND_NO_ERROR 100 // non-error ack.
00098 #define SND_BAD_PORT 101 // message sent to wrong port
00099 #define SND_BAD_MSG 102 // unknown message id
00100 #define SND_BAD_PARM 103 // bad parameter list in message
00101 #define SND_NO_MEMORY 104 // can't allocate memory (record)
00102 #define SND_PORT_BUSY 105 // access req'd to existing excl access port
00103 #define SND_NOT_OWNER 106 // must be owner to do this
00104 #define SND_BAD_CHAN 107 // dsp channel hasn't been inited
00105 #define SND_SEARCH 108 // couldn't find requested resource
00106 #define SND_NODATA 109 // can't send data commands to dsp in this mode
00107 #define SND_NOPAGER 110 // can't allocate from external pager (record).
00108 #define SND_NOTALIGNED 111 // bad data alignment.
00109 #define SND_BAD_HOST_PRIV 112 // bad host privilege port passed.
00110 #define SND_BAD_PROTO 113 // can't do requested operation given protocol
00111 } snd_illegal_msg_t;
00112
00113 typedef struct {msg_header_t header;} snd_ret_mach_port_t;
00114
00115 typedef struct {
00116 msg_header_t header;
00117 msg_type_t dataType;
00118 unsigned int mask;
00119 unsigned int flags;
00120 unsigned int value;
00121 } snd_dsp_cond_true_t;
00122
00123
00124
00125
00126 typedef struct {
00127 msg_header_t header;
00128 msg_type_t Type;
00129 unsigned int stream;
00130 msg_type_t ownerType;
00131 mach_port_t owner;
00132 } snd_get_stream_t;
00133
00134 #define SND_GD_CHAN_MASK 0x7f
00135 #define SND_GD_CHAN_SHIFT 0
00136 #define SND_GD_DEVICE_MASK 0x80
00137 #define SND_GD_DEVICE_SHIFT 7
00138
00139 #define snd_gd_bitmap(chan, device) \
00140 (((chan)<<SND_GD_CHAN_SHIFT) | ((device)<<SND_GD_DEVICE_SHIFT))
00141
00142 #define snd_gd_isdevice(bitmap) ((bitmap)&SND_GD_DEVICE_MASK)
00143 #define snd_gd_chan(bitmap) ((bitmap)&SND_GD_CHAN_MASK)
00144
00145 #define SND_GD_SOUT_44 snd_gd_bitmap(0, TRUE)
00146 #define SND_GD_SOUT_22 snd_gd_bitmap(1, TRUE)
00147 #define SND_GD_SIN snd_gd_bitmap(2, TRUE)
00148 #define SND_GD_DSP_OUT snd_gd_bitmap(DSP_SO_CHAN, FALSE) // sound out from dsp
00149 #define SND_GD_DSP_IN snd_gd_bitmap(DSP_SI_CHAN, FALSE) // sound in to dsp
00150
00151 typedef struct {
00152 msg_header_t header;
00153 msg_type_t Type;
00154 unsigned int parms;
00155 } snd_set_parms_t;
00156
00157 typedef struct {
00158 msg_header_t header;
00159 msg_type_t Type;
00160 unsigned int volume;
00161 } snd_set_volume_t;
00162
00163 typedef struct {
00164 msg_header_t header;
00165 msg_type_t Type;
00166 unsigned int proto;
00167 msg_type_t ownerType;
00168 mach_port_t owner;
00169 } snd_dsp_proto_t;
00170
00171 #define SND_DSP_PROTO_DSPERR 0x1 // DSP error messages enabled
00172 #define SND_DSP_PROTO_C_DMA 0x2 // complex dma mode
00173 #define SND_DSP_PROTO_S_DMA 0x4 // simple dma mode
00174 #define SND_DSP_PROTO_LINKOUT 0x8 // link directly to sound out
00175 #define SND_DSP_PROTO_LINKIN 0x10 // link directly to sound out
00176 #define SND_DSP_PROTO_SOUNDDATA 0x20 // all data to dsp is sound samples
00177 #define SND_DSP_PROTO_HIGH 0x40 // 44khz sound out
00178 #define SND_DSP_PROTO_HFABORT 0x80 // DSP abort indicated by HF2 & HF3
00179 #define SND_DSP_PROTO_DSPMSG 0x100 // DSP messages enabled
00180 #define SND_DSP_PROTO_RAW 0x200 // DSP messages enabled
00181 #define SND_DSP_PROTO_TXD 0x400 // DSP txd interrupt enable (040 only)
00182
00183 typedef msg_header_t snd_get_parms_t;
00184 typedef msg_header_t snd_get_volume_t;
00185
00186 typedef struct {
00187 msg_header_t header;
00188 msg_type_t ownerType;
00189 mach_port_t owner;
00190 } snd_get_dsp_cmd_mach_port_t;
00191
00192 typedef struct {
00193 msg_header_t header;
00194 msg_type_t negType;
00195 mach_port_t negotiation;
00196 msg_type_t ownerType;
00197 mach_port_t owner;
00198 } snd_set_owner_t;
00199
00200 typedef struct {
00201 msg_header_t header;
00202 msg_type_t old_ownerType;
00203 mach_port_t old_owner;
00204 msg_type_t new_ownerType;
00205 mach_port_t new_owner;
00206 msg_type_t new_negotiationType;
00207 mach_port_t new_negotiation;
00208 } snd_reset_owner_t;
00209
00210 typedef struct {
00211 msg_header_t header;
00212 msg_type_t privType;
00213 mach_port_t priv;
00214 } snd_new_device_t;
00215
00216 typedef struct {
00217 msg_header_t header;
00218 msg_type_long_t dataType;
00219 #define DSP_DEF_BUFSIZE 512 // default #words in each buf
00220 unsigned int data[DSP_DEF_BUFSIZE];
00221 } snd_dsp_msg_t;
00222
00223 typedef struct {
00224 msg_header_t header;
00225 msg_type_long_t dataType;
00226 #define DSP_DEF_EBUFSIZE 32 // default #words in each buf
00227 unsigned int data[DSP_DEF_EBUFSIZE];
00228 } snd_dsp_err_t;
00229
00230
00231
00232
00233
00234
00235 typedef struct snd_stream_msg {
00236 msg_header_t header;
00237 msg_type_t data_tagType;
00238 int data_tag;
00239 } snd_stream_msg_t;
00240
00241 typedef struct {
00242 snd_msg_type_t msgtype;
00243 msg_type_t optionsType;
00244 unsigned int options;
00245 #define SND_DM_STARTED_MSG 0x01
00246 #define SND_DM_COMPLETED_MSG 0x02
00247 #define SND_DM_ABORTED_MSG 0x04
00248 #define SND_DM_PAUSED_MSG 0x08
00249 #define SND_DM_RESUMED_MSG 0x10
00250 #define SND_DM_OVERFLOW_MSG 0x20
00251 #define SND_DM_PREEMPT 0x40
00252 msg_type_t reg_portType;
00253 mach_port_t reg_port;
00254 msg_type_long_t dataType;
00255 pointer_t data;
00256 } snd_stream_play_data_t;
00257
00258 typedef struct {
00259 snd_msg_type_t msgtype;
00260 msg_type_t optionsType;
00261 unsigned int options;
00262 int nbytes;
00263 msg_type_t reg_portType;
00264 mach_port_t reg_port;
00265 msg_type_t filenameType;
00266 } snd_stream_record_data_t;
00267
00268 typedef struct {
00269 snd_msg_type_t msgtype;
00270 msg_type_t controlType;
00271 unsigned int snd_control;
00272 #define SND_DC_AWAIT 0x1
00273 #define SND_DC_ABORT 0x2
00274 #define SND_DC_PAUSE 0x4
00275 #define SND_DC_RESUME 0x8
00276 } snd_stream_control_t;
00277
00278 typedef struct {
00279 snd_msg_type_t msg_type;
00280 msg_type_t optionsType;
00281 unsigned int high_water;
00282 unsigned int low_water;
00283 unsigned int dma_size;
00284 } snd_stream_options_t;
00285
00286
00287
00288
00289 typedef struct {
00290 snd_msg_type_t msg_type;
00291 msg_type_t ndmaType;
00292 unsigned int ndma;
00293 } snd_stream_ndma_t;
00294
00295
00296
00297
00298 typedef struct {
00299 msg_header_t header;
00300 } snd_stream_nsamples_t;
00301
00302
00303
00304
00305 typedef struct {
00306 msg_header_t header;
00307 msg_type_t reg_maskType;
00308 unsigned int mask;
00309 unsigned int flags;
00310 msg_type_t ret_portType;
00311 mach_port_t ret_port;
00312 msg_type_long_t ret_msgType;
00313
00314
00315
00316
00317 msg_header_t ret_msg;
00318 } snd_dspcmd_event_t;
00319
00320 typedef struct {
00321 msg_header_t header;
00322 msg_type_t dataType;
00323 int addr;
00324 int size;
00325 int skip;
00326 #define DSP_SKIP_0 1
00327 #define DSP_SKIP_CONTIG DSP_SKIP_0
00328 #define DSP_SKIP_1 2
00329 #define DSP_SKIP_2 3
00330 #define DSP_SKIP_3 4
00331 #define DSP_SKIP_4 5
00332 int space;
00333 #define DSP_SPACE_X 1
00334 #define DSP_SPACE_Y 2
00335 #define DSP_SPACE_L 3
00336 #define DSP_SPACE_P 4
00337 int mode;
00338 #define DSP_MODE8 1
00339 #define DSP_MODE16 2
00340 #define DSP_MODE24 3
00341 #define DSP_MODE32 4
00342 #define DSP_MODE2416 5
00343 #define SND_MODE_MIN 1
00344 #define SND_MODE_MAX 5
00345 int chan;
00346 #define DSP_USER_REQ_CHAN 0 // for user-requested dma's
00347 #define DSP_SO_CHAN 1 // for sound-out dma's.
00348 #define DSP_SI_CHAN 2 // for sound-in dma's
00349 #define DSP_USER_CHAN 3 // first user chan
00350
00351 #define DSP_N_USER_CHAN 16 // 0..15 for user dma.
00352 } snd_dspcmd_chandata_t;
00353
00354 typedef struct {
00355 msg_header_t header;
00356 msg_type_t chandataType;
00357 int addr;
00358 int size;
00359 int skip;
00360 int space;
00361 int mode;
00362 msg_type_long_t dataType;
00363 pointer_t data;
00364 } snd_dspcmd_dma_t;
00365
00366 typedef msg_header_t snd_dspcmd_abortdma_t;
00367 typedef msg_header_t snd_dspcmd_req_err_t;
00368 typedef msg_header_t snd_dspcmd_req_msg_t;
00369
00370
00371
00372
00373
00374
00375
00376 typedef struct {
00377 msg_type_t typeType;
00378 unsigned int type;
00379 #define SND_DSP_MT_DATA 1 // 1, 2, or 4 byte data
00380 #define SND_DSP_MT_HOST_COMMAND 2 // host command
00381 #define SND_DSP_MT_HOST_FLAG 3 // host flag(s) to set
00382 #define SND_DSP_MT_RET_MSG 4 // (simple) message to send
00383 #define SND_DSP_MT_RESET 5 // hard reset the DSP
00384 #define SND_DSP_MT_GET_REGS 6 // return DSP host I/F registers
00385 #define SND_DSP_MT_CONDITION 7 // wait for condition (return msg)
00386 #define SND_DSP_MT_RDATA 8 // read 1, 2, or 4 byte data
00387 #define SND_DSP_MT_PROTO 9 // DSP protocol
00388 } snd_dsp_type_t;
00389
00390 typedef struct {
00391 msg_header_t header;
00392 msg_type_t priType;
00393 int pri;
00394 #define DSP_MSG_HIGH 0
00395 #define DSP_MSG_MED 1
00396 #define DSP_MSG_LOW 2
00397 boolean_t atomic;
00398 } snd_dspcmd_msg_t;
00399
00400 typedef struct {
00401 snd_dsp_type_t msgtype;
00402 msg_type_t conditionType;
00403 unsigned int mask;
00404 unsigned int flags;
00405 msg_type_t reply_portType;
00406 mach_port_t reply_port;
00407 } snd_dsp_condition_t;
00408
00409 typedef struct {
00410 snd_dsp_type_t msgtype;
00411 msg_type_long_t dataType;
00412 pointer_t data;
00413 } snd_dsp_data_t;
00414
00415 typedef struct {
00416 snd_dsp_type_t msgtype;
00417 msg_type_t hcType;
00418 unsigned int hc;
00419 } snd_dsp_host_command_t;
00420
00421 typedef struct {
00422 snd_dsp_type_t msgtype;
00423 msg_type_t protoType;
00424 unsigned int proto;
00425 } snd_dsp_mt_proto_t;
00426
00427 typedef struct {
00428 snd_dsp_type_t msgtype;
00429 msg_type_t hfType;
00430 unsigned int mask;
00431 unsigned int flags;
00432 } snd_dsp_host_flag_t;
00433
00434 typedef struct {
00435 snd_dsp_type_t msgtype;
00436 msg_type_t ret_portType;
00437 mach_port_t ret_port;
00438 msg_type_long_t ret_msgType;
00439
00440
00441
00442
00443 msg_header_t ret_msg;
00444 } snd_dsp_ret_msg_t;
00445
00446 typedef struct {
00447 snd_dsp_type_t msgtype;
00448 } snd_dsp_reset_t, snd_dsp_get_regs_t;
00449
00450
00451
00452
00453 #define SND_MSG_BASE 0
00454
00455
00456
00457
00458 #define SND_MSG_STREAM_BASE SND_MSG_BASE+0
00459 #define SND_MSG_STREAM_MSG SND_MSG_STREAM_BASE+0
00460 #define SND_MSG_STREAM_NSAMPLES SND_MSG_STREAM_BASE+1
00461
00462
00463
00464
00465 #define SND_MSG_DEVICE_BASE SND_MSG_BASE+100
00466 #define SND_MSG_GET_STREAM SND_MSG_DEVICE_BASE+0
00467 #define SND_MSG_SET_PARMS SND_MSG_DEVICE_BASE+1
00468 #define SND_MSG_GET_PARMS SND_MSG_DEVICE_BASE+2
00469 #define SND_MSG_SET_VOLUME SND_MSG_DEVICE_BASE+3
00470 #define SND_MSG_GET_VOLUME SND_MSG_DEVICE_BASE+4
00471 #define SND_MSG_SET_DSPOWNER SND_MSG_DEVICE_BASE+5
00472 #define SND_MSG_SET_SNDINOWNER SND_MSG_DEVICE_BASE+6
00473 #define SND_MSG_SET_SNDOUTOWNER SND_MSG_DEVICE_BASE+7
00474 #define SND_MSG_DSP_PROTO SND_MSG_DEVICE_BASE+8
00475 #define SND_MSG_GET_DSP_CMD_PORT SND_MSG_DEVICE_BASE+9
00476 #define SND_MSG_NEW_DEVICE_PORT SND_MSG_DEVICE_BASE+10
00477 #define SND_MSG_RESET_DSPOWNER SND_MSG_DEVICE_BASE+11
00478 #define SND_MSG_RESET_SNDINOWNER SND_MSG_DEVICE_BASE+12
00479 #define SND_MSG_RESET_SNDOUTOWNER SND_MSG_DEVICE_BASE+13
00480 #define SND_MSG_SET_RAMP SND_MSG_DEVICE_BASE+14
00481
00482
00483
00484 #define SND_PARM_RAMPUP 0x1
00485 #define SND_PARM_RAMPDOWN 0x2
00486
00487
00488
00489
00490 #define SND_MSG_DSP_BASE SND_MSG_BASE+200
00491 #define SND_MSG_DSP_MSG SND_MSG_DSP_BASE+0
00492 #define SND_MSG_DSP_EVENT SND_MSG_DSP_BASE+1
00493 #define SND_MSG_DSP_CHANDATA SND_MSG_DSP_BASE+2
00494 #define SND_MSG_DSP_DMAOUT SND_MSG_DSP_BASE+3
00495 #define SND_MSG_DSP_DMAIN SND_MSG_DSP_BASE+4
00496 #define SND_MSG_DSP_ABORTDMA SND_MSG_DSP_BASE+5
00497 #define SND_MSG_DSP_REQ_MSG SND_MSG_DSP_BASE+6
00498 #define SND_MSG_DSP_REQ_ERR SND_MSG_DSP_BASE+7
00499
00500
00501
00502
00503 #define SND_MSG_KERN_BASE SND_MSG_BASE+300
00504 #define SND_MSG_RECORDED_DATA SND_MSG_KERN_BASE+0
00505 #define SND_MSG_TIMED_OUT SND_MSG_KERN_BASE+1
00506 #define SND_MSG_RET_SAMPLES SND_MSG_KERN_BASE+2
00507 #define SND_MSG_RET_DEVICE SND_MSG_KERN_BASE+3
00508 #define SND_MSG_RET_STREAM SND_MSG_KERN_BASE+4
00509 #define SND_MSG_RET_PARMS SND_MSG_KERN_BASE+5
00510 #define SND_MSG_RET_VOLUME SND_MSG_KERN_BASE+6
00511 #define SND_MSG_OVERFLOW SND_MSG_KERN_BASE+7
00512 #define SND_MSG_STARTED SND_MSG_KERN_BASE+9
00513 #define SND_MSG_COMPLETED SND_MSG_KERN_BASE+10
00514 #define SND_MSG_ABORTED SND_MSG_KERN_BASE+11
00515 #define SND_MSG_PAUSED SND_MSG_KERN_BASE+12
00516 #define SND_MSG_RESUMED SND_MSG_KERN_BASE+13
00517 #define SND_MSG_ILLEGAL_MSG SND_MSG_KERN_BASE+14
00518 #define SND_MSG_RET_DSP_ERR SND_MSG_KERN_BASE+15
00519 #define SND_MSG_RET_DSP_MSG SND_MSG_KERN_BASE+16
00520 #define SND_MSG_RET_CMD SND_MSG_KERN_BASE+17
00521 #define SND_MSG_DSP_REGS SND_MSG_KERN_BASE+18
00522 #define SND_MSG_DSP_COND_TRUE SND_MSG_KERN_BASE+19
00523
00524
00525
00526
00527 #ifdef _IO
00528 #define SOUNDIOCDEVPORT _IO('A', 8)
00529 #endif _IO
00530
00531
00532
00533
00534 #if KERNEL
00535 kern_return_t snd_reply_recorded_data (
00536 mach_port_t remote_port,
00537 int data_tag,
00538 pointer_t data,
00539 int nbytes,
00540 int in_line);
00541 kern_return_t snd_reply_timed_out (
00542 mach_port_t remote_port,
00543 int data_tag);
00544 kern_return_t snd_reply_ret_samples (
00545 mach_port_t remote_port,
00546 int nsamples);
00547 kern_return_t snd_reply_ret_device (
00548 mach_port_t remote_port,
00549 mach_port_t device_port);
00550 kern_return_t snd_reply_ret_stream (
00551 mach_port_t remote_port,
00552 mach_port_t stream_port);
00553 kern_return_t snd_reply_ret_parms (
00554 mach_port_t remote_port,
00555 unsigned int parms);
00556 kern_return_t snd_reply_ret_volume (
00557 mach_port_t remote_port,
00558 unsigned int volume);
00559 kern_return_t snd_reply_overflow (
00560 mach_port_t remote_port,
00561 int data_tag);
00562 kern_return_t snd_reply_started (
00563 mach_port_t remote_port,
00564 int data_tag);
00565 kern_return_t snd_reply_completed (
00566 mach_port_t remote_port,
00567 int data_tag);
00568 kern_return_t snd_reply_aborted (
00569 mach_port_t remote_port,
00570 int data_tag);
00571 kern_return_t snd_reply_paused (
00572 mach_port_t remote_port,
00573 int data_tag);
00574 kern_return_t snd_reply_resumed (
00575 mach_port_t remote_port,
00576 int data_tag);
00577 kern_return_t snd_reply_illegal_msg (
00578 mach_port_t local_port,
00579 mach_port_t remote_port,
00580 int msg_id,
00581 int error);
00582 kern_return_t snd_reply_dsp_err (
00583 mach_port_t remote_port);
00584 kern_return_t snd_reply_dsp_msg (
00585 mach_port_t remote_port);
00586 kern_return_t snd_reply_dsp_cmd_port(
00587 mach_port_t cmd_port,
00588 mach_port_t remote_port);
00589 kern_return_t snd_reply_dsp_regs (
00590 int regs);
00591 kern_return_t snd_reply_dsp_cond_true (
00592 vm_address_t ret_cond);
00593 #endif KERNEL
00594
00595 #endif