|
|
1.1 ! root 1: ! 2: #import <servers/netname.h> ! 3: #import <libc.h> ! 4: ! 5: #include "../client/client.h" ! 6: ! 7: double snd_basetime; ! 8: port_t devPort; ! 9: ! 10: extern port_t task_self_; ! 11: #define task_self() task_self_ ! 12: ! 13: //======================================================================== ! 14: ! 15: #ifndef _ntsoundNTSound ! 16: #define _ntsoundNTSound ! 17: ! 18: /* Module NTSound */ ! 19: ! 20: #include <mach/kern_return.h> ! 21: #include <mach/port.h> ! 22: #include <mach/message.h> ! 23: ! 24: #ifndef mig_external ! 25: #define mig_external extern ! 26: #endif ! 27: ! 28: #include <mach/std_types.h> ! 29: #include <mach/mach_types.h> ! 30: typedef short *sound_data_t; ! 31: ! 32: #define NTSOUNDNAME "NEXTIME_Sound" ! 33: ! 34: /* Routine ntsoundAcquire */ ! 35: mig_external kern_return_t ntsoundAcquire ( ! 36: port_t kern_serv_port, ! 37: port_t owner_port, ! 38: vm_offset_t *dmaAddress, ! 39: int *dmaSize, ! 40: int *success); ! 41: ! 42: /* Routine ntsoundRelease */ ! 43: mig_external kern_return_t ntsoundRelease ( ! 44: port_t kern_serv_port, ! 45: port_t owner_port); ! 46: ! 47: /* Routine ntsoundStart */ ! 48: mig_external kern_return_t ntsoundStart ( ! 49: port_t kern_serv_port, ! 50: port_t owner_port); ! 51: ! 52: /* Routine ntsoundStop */ ! 53: mig_external kern_return_t ntsoundStop ( ! 54: port_t kern_serv_port, ! 55: port_t owner_port); ! 56: ! 57: /* Routine ntsoundConfig */ ! 58: mig_external kern_return_t ntsoundConfig ( ! 59: port_t kern_serv_port, ! 60: port_t owner_port, ! 61: int channelCount, ! 62: int samplingRate, ! 63: int encoding, ! 64: int useInterrupts); ! 65: ! 66: /* Routine ntsoundBytesProcessed */ ! 67: mig_external kern_return_t ntsoundBytesProcessed ( ! 68: port_t kern_serv_port, ! 69: port_t owner_port, ! 70: int *byte_count); ! 71: ! 72: /* Routine ntsoundDMACount */ ! 73: mig_external kern_return_t ntsoundDMACount ( ! 74: port_t kern_serv_port, ! 75: port_t owner_port, ! 76: int *dma_count); ! 77: ! 78: /* Routine ntsoundInterruptCount */ ! 79: mig_external kern_return_t ntsoundInterruptCount ( ! 80: port_t kern_serv_port, ! 81: port_t owner_port, ! 82: int *irq_count); ! 83: ! 84: /* Routine ntsoundWrite */ ! 85: mig_external kern_return_t ntsoundWrite ( ! 86: port_t kern_serv_port, ! 87: port_t owner_port, ! 88: sound_data_t data, ! 89: unsigned int dataCnt, ! 90: int *actual_count); ! 91: ! 92: /* Routine ntsoundSetVolume */ ! 93: mig_external kern_return_t ntsoundSetVolume ( ! 94: port_t kern_serv_port, ! 95: port_t owner_port, ! 96: int value); ! 97: ! 98: /* Routine ntsoundWireRange */ ! 99: mig_external kern_return_t ntsoundWireRange ( ! 100: port_t device_port, ! 101: port_t token, ! 102: port_t task, ! 103: vm_offset_t addr, ! 104: vm_size_t size, ! 105: boolean_t wire); ! 106: ! 107: #endif _ntsoundNTSound ! 108: ! 109: //======================================================================== ! 110: ! 111: extern port_t name_server_port; ! 112: ! 113: #define NX_SoundDeviceParameterKeyBase 0 ! 114: #define NX_SoundDeviceParameterValueBase 200 ! 115: #define NX_SoundStreamParameterKeyBase 400 ! 116: #define NX_SoundStreamParameterValueBase 600 ! 117: #define NX_SoundParameterTagMax 799 ! 118: ! 119: typedef enum _NXSoundParameterTag { ! 120: NX_SoundDeviceBufferSize = NX_SoundDeviceParameterKeyBase, ! 121: NX_SoundDeviceBufferCount, ! 122: NX_SoundDeviceDetectPeaks, ! 123: NX_SoundDeviceRampUp, ! 124: NX_SoundDeviceRampDown, ! 125: NX_SoundDeviceInsertZeros, ! 126: NX_SoundDeviceDeemphasize, ! 127: NX_SoundDeviceMuteSpeaker, ! 128: NX_SoundDeviceMuteHeadphone, ! 129: NX_SoundDeviceMuteLineOut, ! 130: NX_SoundDeviceOutputLoudness, ! 131: NX_SoundDeviceOutputAttenuationStereo, ! 132: NX_SoundDeviceOutputAttenuationLeft, ! 133: NX_SoundDeviceOutputAttenuationRight, ! 134: NX_SoundDeviceAnalogInputSource, ! 135: NX_SoundDeviceMonitorAttenuation, ! 136: NX_SoundDeviceInputGainStereo, ! 137: NX_SoundDeviceInputGainLeft, ! 138: NX_SoundDeviceInputGainRight, ! 139: ! 140: NX_SoundDeviceAnalogInputSource_Microphone ! 141: = NX_SoundDeviceParameterValueBase, ! 142: NX_SoundDeviceAnalogInputSource_LineIn, ! 143: ! 144: NX_SoundStreamDataEncoding = NX_SoundStreamParameterKeyBase, ! 145: NX_SoundStreamSamplingRate, ! 146: NX_SoundStreamChannelCount, ! 147: NX_SoundStreamHighWaterMark, ! 148: NX_SoundStreamLowWaterMark, ! 149: NX_SoundStreamSource, ! 150: NX_SoundStreamSink, ! 151: NX_SoundStreamDetectPeaks, ! 152: NX_SoundStreamGainStereo, ! 153: NX_SoundStreamGainLeft, ! 154: NX_SoundStreamGainRight, ! 155: ! 156: NX_SoundStreamDataEncoding_Linear16 = NX_SoundStreamParameterValueBase, ! 157: NX_SoundStreamDataEncoding_Linear8, ! 158: NX_SoundStreamDataEncoding_Mulaw8, ! 159: NX_SoundStreamDataEncoding_Alaw8, ! 160: NX_SoundStreamDataEncoding_AES, ! 161: NX_SoundStreamSource_Analog, ! 162: NX_SoundStreamSource_AES, ! 163: NX_SoundStreamSink_Analog, ! 164: NX_SoundStreamSink_AES ! 165: } NXSoundParameterTag; ! 166: ! 167: //======================================================================== ! 168: ! 169: //#include "NTSound.h" ! 170: #include <mach/mach_types.h> ! 171: #include <mach/message.h> ! 172: #include <mach/mig_errors.h> ! 173: #include <mach/msg_type.h> ! 174: #if !defined(KERNEL) && !defined(MIG_NO_STRINGS) ! 175: #include <strings.h> ! 176: #endif ! 177: /* LINTLIBRARY */ ! 178: ! 179: extern port_t mig_get_reply_port(); ! 180: extern void mig_dealloc_reply_port(); ! 181: ! 182: #ifndef mig_internal ! 183: #define mig_internal static ! 184: #endif ! 185: ! 186: #ifndef TypeCheck ! 187: #define TypeCheck 1 ! 188: #endif ! 189: ! 190: #ifndef UseExternRCSId ! 191: #ifdef hc ! 192: #define UseExternRCSId 1 ! 193: #endif ! 194: #endif ! 195: ! 196: #ifndef UseStaticMsgType ! 197: #if !defined(hc) || defined(__STDC__) ! 198: #define UseStaticMsgType 1 ! 199: #endif ! 200: #endif ! 201: ! 202: #define msg_request_port msg_remote_port ! 203: #define msg_reply_port msg_local_port ! 204: ! 205: ! 206: /* Routine Acquire */ ! 207: mig_external kern_return_t ntsoundAcquire ( ! 208: port_t kern_serv_port, ! 209: port_t owner_port, ! 210: vm_offset_t *dmaAddress, ! 211: int *dmaSize, ! 212: int *success) ! 213: { ! 214: typedef struct { ! 215: msg_header_t Head; ! 216: msg_type_t owner_portType; ! 217: port_t owner_port; ! 218: } Request; ! 219: ! 220: typedef struct { ! 221: msg_header_t Head; ! 222: msg_type_t RetCodeType; ! 223: kern_return_t RetCode; ! 224: msg_type_t dmaAddressType; ! 225: vm_offset_t dmaAddress; ! 226: msg_type_t dmaSizeType; ! 227: int dmaSize; ! 228: msg_type_t successType; ! 229: int success; ! 230: } Reply; ! 231: ! 232: union { ! 233: Request In; ! 234: Reply Out; ! 235: } Mess; ! 236: ! 237: register Request *InP = &Mess.In; ! 238: register Reply *OutP = &Mess.Out; ! 239: ! 240: msg_return_t msg_result; ! 241: ! 242: #if TypeCheck ! 243: boolean_t msg_simple; ! 244: #endif TypeCheck ! 245: ! 246: unsigned int msg_size = 32; ! 247: ! 248: #if UseStaticMsgType ! 249: static const msg_type_t owner_portType = { ! 250: /* msg_type_name = */ MSG_TYPE_PORT, ! 251: /* msg_type_size = */ 32, ! 252: /* msg_type_number = */ 1, ! 253: /* msg_type_inline = */ TRUE, ! 254: /* msg_type_longform = */ FALSE, ! 255: /* msg_type_deallocate = */ FALSE, ! 256: /* msg_type_unused = */ 0, ! 257: }; ! 258: #endif UseStaticMsgType ! 259: ! 260: #if UseStaticMsgType ! 261: static const msg_type_t RetCodeCheck = { ! 262: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 263: /* msg_type_size = */ 32, ! 264: /* msg_type_number = */ 1, ! 265: /* msg_type_inline = */ TRUE, ! 266: /* msg_type_longform = */ FALSE, ! 267: /* msg_type_deallocate = */ FALSE, ! 268: /* msg_type_unused = */ 0 ! 269: }; ! 270: #endif UseStaticMsgType ! 271: ! 272: #if UseStaticMsgType ! 273: static const msg_type_t dmaAddressCheck = { ! 274: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 275: /* msg_type_size = */ 32, ! 276: /* msg_type_number = */ 1, ! 277: /* msg_type_inline = */ TRUE, ! 278: /* msg_type_longform = */ FALSE, ! 279: /* msg_type_deallocate = */ FALSE, ! 280: /* msg_type_unused = */ 0 ! 281: }; ! 282: #endif UseStaticMsgType ! 283: ! 284: #if UseStaticMsgType ! 285: static const msg_type_t dmaSizeCheck = { ! 286: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 287: /* msg_type_size = */ 32, ! 288: /* msg_type_number = */ 1, ! 289: /* msg_type_inline = */ TRUE, ! 290: /* msg_type_longform = */ FALSE, ! 291: /* msg_type_deallocate = */ FALSE, ! 292: /* msg_type_unused = */ 0 ! 293: }; ! 294: #endif UseStaticMsgType ! 295: ! 296: #if UseStaticMsgType ! 297: static const msg_type_t successCheck = { ! 298: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 299: /* msg_type_size = */ 32, ! 300: /* msg_type_number = */ 1, ! 301: /* msg_type_inline = */ TRUE, ! 302: /* msg_type_longform = */ FALSE, ! 303: /* msg_type_deallocate = */ FALSE, ! 304: /* msg_type_unused = */ 0 ! 305: }; ! 306: #endif UseStaticMsgType ! 307: ! 308: #if UseStaticMsgType ! 309: InP->owner_portType = owner_portType; ! 310: #else UseStaticMsgType ! 311: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 312: InP->owner_portType.msg_type_size = 32; ! 313: InP->owner_portType.msg_type_number = 1; ! 314: InP->owner_portType.msg_type_inline = TRUE; ! 315: InP->owner_portType.msg_type_longform = FALSE; ! 316: InP->owner_portType.msg_type_deallocate = FALSE; ! 317: #endif UseStaticMsgType ! 318: ! 319: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 320: ! 321: InP->Head.msg_simple = FALSE; ! 322: InP->Head.msg_size = msg_size; ! 323: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 324: InP->Head.msg_request_port = kern_serv_port; ! 325: InP->Head.msg_reply_port = mig_get_reply_port(); ! 326: InP->Head.msg_id = 1008; ! 327: ! 328: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 329: if (msg_result != RPC_SUCCESS) { ! 330: if (msg_result == RCV_INVALID_PORT) ! 331: mig_dealloc_reply_port(); ! 332: return msg_result; ! 333: } ! 334: ! 335: #if TypeCheck ! 336: msg_size = OutP->Head.msg_size; ! 337: msg_simple = OutP->Head.msg_simple; ! 338: #endif TypeCheck ! 339: ! 340: if (OutP->Head.msg_id != 1108) ! 341: return MIG_REPLY_MISMATCH; ! 342: ! 343: #if TypeCheck ! 344: if (((msg_size != 56) || (msg_simple != TRUE)) && ! 345: ((msg_size != sizeof(death_pill_t)) || ! 346: (msg_simple != TRUE) || ! 347: (OutP->RetCode == KERN_SUCCESS))) ! 348: return MIG_TYPE_ERROR; ! 349: #endif TypeCheck ! 350: ! 351: #if TypeCheck ! 352: #if UseStaticMsgType ! 353: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 354: #else UseStaticMsgType ! 355: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 356: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 357: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 358: (OutP->RetCodeType.msg_type_number != 1) || ! 359: (OutP->RetCodeType.msg_type_size != 32)) ! 360: #endif UseStaticMsgType ! 361: return MIG_TYPE_ERROR; ! 362: #endif TypeCheck ! 363: ! 364: if (OutP->RetCode != KERN_SUCCESS) ! 365: return OutP->RetCode; ! 366: ! 367: #if TypeCheck ! 368: #if UseStaticMsgType ! 369: if (* (int *) &OutP->dmaAddressType != * (int *) &dmaAddressCheck) ! 370: #else UseStaticMsgType ! 371: if ((OutP->dmaAddressType.msg_type_inline != TRUE) || ! 372: (OutP->dmaAddressType.msg_type_longform != FALSE) || ! 373: (OutP->dmaAddressType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 374: (OutP->dmaAddressType.msg_type_number != 1) || ! 375: (OutP->dmaAddressType.msg_type_size != 32)) ! 376: #endif UseStaticMsgType ! 377: return MIG_TYPE_ERROR; ! 378: #endif TypeCheck ! 379: ! 380: *dmaAddress /* dmaAddress */ = /* *dmaAddress */ OutP->dmaAddress; ! 381: ! 382: #if TypeCheck ! 383: #if UseStaticMsgType ! 384: if (* (int *) &OutP->dmaSizeType != * (int *) &dmaSizeCheck) ! 385: #else UseStaticMsgType ! 386: if ((OutP->dmaSizeType.msg_type_inline != TRUE) || ! 387: (OutP->dmaSizeType.msg_type_longform != FALSE) || ! 388: (OutP->dmaSizeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 389: (OutP->dmaSizeType.msg_type_number != 1) || ! 390: (OutP->dmaSizeType.msg_type_size != 32)) ! 391: #endif UseStaticMsgType ! 392: return MIG_TYPE_ERROR; ! 393: #endif TypeCheck ! 394: ! 395: *dmaSize /* dmaSize */ = /* *dmaSize */ OutP->dmaSize; ! 396: ! 397: #if TypeCheck ! 398: #if UseStaticMsgType ! 399: if (* (int *) &OutP->successType != * (int *) &successCheck) ! 400: #else UseStaticMsgType ! 401: if ((OutP->successType.msg_type_inline != TRUE) || ! 402: (OutP->successType.msg_type_longform != FALSE) || ! 403: (OutP->successType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 404: (OutP->successType.msg_type_number != 1) || ! 405: (OutP->successType.msg_type_size != 32)) ! 406: #endif UseStaticMsgType ! 407: return MIG_TYPE_ERROR; ! 408: #endif TypeCheck ! 409: ! 410: *success /* success */ = /* *success */ OutP->success; ! 411: ! 412: return OutP->RetCode; ! 413: } ! 414: ! 415: /* Routine Release */ ! 416: mig_external kern_return_t ntsoundRelease ( ! 417: port_t kern_serv_port, ! 418: port_t owner_port) ! 419: { ! 420: typedef struct { ! 421: msg_header_t Head; ! 422: msg_type_t owner_portType; ! 423: port_t owner_port; ! 424: } Request; ! 425: ! 426: typedef struct { ! 427: msg_header_t Head; ! 428: msg_type_t RetCodeType; ! 429: kern_return_t RetCode; ! 430: } Reply; ! 431: ! 432: union { ! 433: Request In; ! 434: Reply Out; ! 435: } Mess; ! 436: ! 437: register Request *InP = &Mess.In; ! 438: register Reply *OutP = &Mess.Out; ! 439: ! 440: msg_return_t msg_result; ! 441: ! 442: #if TypeCheck ! 443: boolean_t msg_simple; ! 444: #endif TypeCheck ! 445: ! 446: unsigned int msg_size = 32; ! 447: ! 448: #if UseStaticMsgType ! 449: static const msg_type_t owner_portType = { ! 450: /* msg_type_name = */ MSG_TYPE_PORT, ! 451: /* msg_type_size = */ 32, ! 452: /* msg_type_number = */ 1, ! 453: /* msg_type_inline = */ TRUE, ! 454: /* msg_type_longform = */ FALSE, ! 455: /* msg_type_deallocate = */ FALSE, ! 456: /* msg_type_unused = */ 0, ! 457: }; ! 458: #endif UseStaticMsgType ! 459: ! 460: #if UseStaticMsgType ! 461: static const msg_type_t RetCodeCheck = { ! 462: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 463: /* msg_type_size = */ 32, ! 464: /* msg_type_number = */ 1, ! 465: /* msg_type_inline = */ TRUE, ! 466: /* msg_type_longform = */ FALSE, ! 467: /* msg_type_deallocate = */ FALSE, ! 468: /* msg_type_unused = */ 0 ! 469: }; ! 470: #endif UseStaticMsgType ! 471: ! 472: #if UseStaticMsgType ! 473: InP->owner_portType = owner_portType; ! 474: #else UseStaticMsgType ! 475: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 476: InP->owner_portType.msg_type_size = 32; ! 477: InP->owner_portType.msg_type_number = 1; ! 478: InP->owner_portType.msg_type_inline = TRUE; ! 479: InP->owner_portType.msg_type_longform = FALSE; ! 480: InP->owner_portType.msg_type_deallocate = FALSE; ! 481: #endif UseStaticMsgType ! 482: ! 483: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 484: ! 485: InP->Head.msg_simple = FALSE; ! 486: InP->Head.msg_size = msg_size; ! 487: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 488: InP->Head.msg_request_port = kern_serv_port; ! 489: InP->Head.msg_reply_port = mig_get_reply_port(); ! 490: InP->Head.msg_id = 1009; ! 491: ! 492: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 493: if (msg_result != RPC_SUCCESS) { ! 494: if (msg_result == RCV_INVALID_PORT) ! 495: mig_dealloc_reply_port(); ! 496: return msg_result; ! 497: } ! 498: ! 499: #if TypeCheck ! 500: msg_size = OutP->Head.msg_size; ! 501: msg_simple = OutP->Head.msg_simple; ! 502: #endif TypeCheck ! 503: ! 504: if (OutP->Head.msg_id != 1109) ! 505: return MIG_REPLY_MISMATCH; ! 506: ! 507: #if TypeCheck ! 508: if (((msg_size != 32) || (msg_simple != TRUE)) && ! 509: ((msg_size != sizeof(death_pill_t)) || ! 510: (msg_simple != TRUE) || ! 511: (OutP->RetCode == KERN_SUCCESS))) ! 512: return MIG_TYPE_ERROR; ! 513: #endif TypeCheck ! 514: ! 515: #if TypeCheck ! 516: #if UseStaticMsgType ! 517: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 518: #else UseStaticMsgType ! 519: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 520: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 521: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 522: (OutP->RetCodeType.msg_type_number != 1) || ! 523: (OutP->RetCodeType.msg_type_size != 32)) ! 524: #endif UseStaticMsgType ! 525: return MIG_TYPE_ERROR; ! 526: #endif TypeCheck ! 527: ! 528: if (OutP->RetCode != KERN_SUCCESS) ! 529: return OutP->RetCode; ! 530: ! 531: return OutP->RetCode; ! 532: } ! 533: ! 534: /* Routine Start */ ! 535: mig_external kern_return_t ntsoundStart ( ! 536: port_t kern_serv_port, ! 537: port_t owner_port) ! 538: { ! 539: typedef struct { ! 540: msg_header_t Head; ! 541: msg_type_t owner_portType; ! 542: port_t owner_port; ! 543: } Request; ! 544: ! 545: typedef struct { ! 546: msg_header_t Head; ! 547: msg_type_t RetCodeType; ! 548: kern_return_t RetCode; ! 549: } Reply; ! 550: ! 551: union { ! 552: Request In; ! 553: Reply Out; ! 554: } Mess; ! 555: ! 556: register Request *InP = &Mess.In; ! 557: register Reply *OutP = &Mess.Out; ! 558: ! 559: msg_return_t msg_result; ! 560: ! 561: #if TypeCheck ! 562: boolean_t msg_simple; ! 563: #endif TypeCheck ! 564: ! 565: unsigned int msg_size = 32; ! 566: ! 567: #if UseStaticMsgType ! 568: static const msg_type_t owner_portType = { ! 569: /* msg_type_name = */ MSG_TYPE_PORT, ! 570: /* msg_type_size = */ 32, ! 571: /* msg_type_number = */ 1, ! 572: /* msg_type_inline = */ TRUE, ! 573: /* msg_type_longform = */ FALSE, ! 574: /* msg_type_deallocate = */ FALSE, ! 575: /* msg_type_unused = */ 0, ! 576: }; ! 577: #endif UseStaticMsgType ! 578: ! 579: #if UseStaticMsgType ! 580: static const msg_type_t RetCodeCheck = { ! 581: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 582: /* msg_type_size = */ 32, ! 583: /* msg_type_number = */ 1, ! 584: /* msg_type_inline = */ TRUE, ! 585: /* msg_type_longform = */ FALSE, ! 586: /* msg_type_deallocate = */ FALSE, ! 587: /* msg_type_unused = */ 0 ! 588: }; ! 589: #endif UseStaticMsgType ! 590: ! 591: #if UseStaticMsgType ! 592: InP->owner_portType = owner_portType; ! 593: #else UseStaticMsgType ! 594: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 595: InP->owner_portType.msg_type_size = 32; ! 596: InP->owner_portType.msg_type_number = 1; ! 597: InP->owner_portType.msg_type_inline = TRUE; ! 598: InP->owner_portType.msg_type_longform = FALSE; ! 599: InP->owner_portType.msg_type_deallocate = FALSE; ! 600: #endif UseStaticMsgType ! 601: ! 602: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 603: ! 604: InP->Head.msg_simple = FALSE; ! 605: InP->Head.msg_size = msg_size; ! 606: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 607: InP->Head.msg_request_port = kern_serv_port; ! 608: InP->Head.msg_reply_port = mig_get_reply_port(); ! 609: InP->Head.msg_id = 1010; ! 610: ! 611: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 612: if (msg_result != RPC_SUCCESS) { ! 613: if (msg_result == RCV_INVALID_PORT) ! 614: mig_dealloc_reply_port(); ! 615: return msg_result; ! 616: } ! 617: ! 618: #if TypeCheck ! 619: msg_size = OutP->Head.msg_size; ! 620: msg_simple = OutP->Head.msg_simple; ! 621: #endif TypeCheck ! 622: ! 623: if (OutP->Head.msg_id != 1110) ! 624: return MIG_REPLY_MISMATCH; ! 625: ! 626: #if TypeCheck ! 627: if (((msg_size != 32) || (msg_simple != TRUE)) && ! 628: ((msg_size != sizeof(death_pill_t)) || ! 629: (msg_simple != TRUE) || ! 630: (OutP->RetCode == KERN_SUCCESS))) ! 631: return MIG_TYPE_ERROR; ! 632: #endif TypeCheck ! 633: ! 634: #if TypeCheck ! 635: #if UseStaticMsgType ! 636: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 637: #else UseStaticMsgType ! 638: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 639: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 640: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 641: (OutP->RetCodeType.msg_type_number != 1) || ! 642: (OutP->RetCodeType.msg_type_size != 32)) ! 643: #endif UseStaticMsgType ! 644: return MIG_TYPE_ERROR; ! 645: #endif TypeCheck ! 646: ! 647: if (OutP->RetCode != KERN_SUCCESS) ! 648: return OutP->RetCode; ! 649: ! 650: return OutP->RetCode; ! 651: } ! 652: ! 653: /* Routine Stop */ ! 654: mig_external kern_return_t ntsoundStop ( ! 655: port_t kern_serv_port, ! 656: port_t owner_port) ! 657: { ! 658: typedef struct { ! 659: msg_header_t Head; ! 660: msg_type_t owner_portType; ! 661: port_t owner_port; ! 662: } Request; ! 663: ! 664: typedef struct { ! 665: msg_header_t Head; ! 666: msg_type_t RetCodeType; ! 667: kern_return_t RetCode; ! 668: } Reply; ! 669: ! 670: union { ! 671: Request In; ! 672: Reply Out; ! 673: } Mess; ! 674: ! 675: register Request *InP = &Mess.In; ! 676: register Reply *OutP = &Mess.Out; ! 677: ! 678: msg_return_t msg_result; ! 679: ! 680: #if TypeCheck ! 681: boolean_t msg_simple; ! 682: #endif TypeCheck ! 683: ! 684: unsigned int msg_size = 32; ! 685: ! 686: #if UseStaticMsgType ! 687: static const msg_type_t owner_portType = { ! 688: /* msg_type_name = */ MSG_TYPE_PORT, ! 689: /* msg_type_size = */ 32, ! 690: /* msg_type_number = */ 1, ! 691: /* msg_type_inline = */ TRUE, ! 692: /* msg_type_longform = */ FALSE, ! 693: /* msg_type_deallocate = */ FALSE, ! 694: /* msg_type_unused = */ 0, ! 695: }; ! 696: #endif UseStaticMsgType ! 697: ! 698: #if UseStaticMsgType ! 699: static const msg_type_t RetCodeCheck = { ! 700: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 701: /* msg_type_size = */ 32, ! 702: /* msg_type_number = */ 1, ! 703: /* msg_type_inline = */ TRUE, ! 704: /* msg_type_longform = */ FALSE, ! 705: /* msg_type_deallocate = */ FALSE, ! 706: /* msg_type_unused = */ 0 ! 707: }; ! 708: #endif UseStaticMsgType ! 709: ! 710: #if UseStaticMsgType ! 711: InP->owner_portType = owner_portType; ! 712: #else UseStaticMsgType ! 713: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 714: InP->owner_portType.msg_type_size = 32; ! 715: InP->owner_portType.msg_type_number = 1; ! 716: InP->owner_portType.msg_type_inline = TRUE; ! 717: InP->owner_portType.msg_type_longform = FALSE; ! 718: InP->owner_portType.msg_type_deallocate = FALSE; ! 719: #endif UseStaticMsgType ! 720: ! 721: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 722: ! 723: InP->Head.msg_simple = FALSE; ! 724: InP->Head.msg_size = msg_size; ! 725: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 726: InP->Head.msg_request_port = kern_serv_port; ! 727: InP->Head.msg_reply_port = mig_get_reply_port(); ! 728: InP->Head.msg_id = 1011; ! 729: ! 730: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 731: if (msg_result != RPC_SUCCESS) { ! 732: if (msg_result == RCV_INVALID_PORT) ! 733: mig_dealloc_reply_port(); ! 734: return msg_result; ! 735: } ! 736: ! 737: #if TypeCheck ! 738: msg_size = OutP->Head.msg_size; ! 739: msg_simple = OutP->Head.msg_simple; ! 740: #endif TypeCheck ! 741: ! 742: if (OutP->Head.msg_id != 1111) ! 743: return MIG_REPLY_MISMATCH; ! 744: ! 745: #if TypeCheck ! 746: if (((msg_size != 32) || (msg_simple != TRUE)) && ! 747: ((msg_size != sizeof(death_pill_t)) || ! 748: (msg_simple != TRUE) || ! 749: (OutP->RetCode == KERN_SUCCESS))) ! 750: return MIG_TYPE_ERROR; ! 751: #endif TypeCheck ! 752: ! 753: #if TypeCheck ! 754: #if UseStaticMsgType ! 755: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 756: #else UseStaticMsgType ! 757: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 758: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 759: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 760: (OutP->RetCodeType.msg_type_number != 1) || ! 761: (OutP->RetCodeType.msg_type_size != 32)) ! 762: #endif UseStaticMsgType ! 763: return MIG_TYPE_ERROR; ! 764: #endif TypeCheck ! 765: ! 766: if (OutP->RetCode != KERN_SUCCESS) ! 767: return OutP->RetCode; ! 768: ! 769: return OutP->RetCode; ! 770: } ! 771: ! 772: /* Routine Config */ ! 773: mig_external kern_return_t ntsoundConfig ( ! 774: port_t kern_serv_port, ! 775: port_t owner_port, ! 776: int channelCount, ! 777: int samplingRate, ! 778: int encoding, ! 779: int useInterrupts) ! 780: { ! 781: typedef struct { ! 782: msg_header_t Head; ! 783: msg_type_t owner_portType; ! 784: port_t owner_port; ! 785: msg_type_t channelCountType; ! 786: int channelCount; ! 787: msg_type_t samplingRateType; ! 788: int samplingRate; ! 789: msg_type_t encodingType; ! 790: int encoding; ! 791: msg_type_t useInterruptsType; ! 792: int useInterrupts; ! 793: } Request; ! 794: ! 795: typedef struct { ! 796: msg_header_t Head; ! 797: msg_type_t RetCodeType; ! 798: kern_return_t RetCode; ! 799: } Reply; ! 800: ! 801: union { ! 802: Request In; ! 803: Reply Out; ! 804: } Mess; ! 805: ! 806: register Request *InP = &Mess.In; ! 807: register Reply *OutP = &Mess.Out; ! 808: ! 809: msg_return_t msg_result; ! 810: ! 811: #if TypeCheck ! 812: boolean_t msg_simple; ! 813: #endif TypeCheck ! 814: ! 815: unsigned int msg_size = 64; ! 816: ! 817: #if UseStaticMsgType ! 818: static const msg_type_t owner_portType = { ! 819: /* msg_type_name = */ MSG_TYPE_PORT, ! 820: /* msg_type_size = */ 32, ! 821: /* msg_type_number = */ 1, ! 822: /* msg_type_inline = */ TRUE, ! 823: /* msg_type_longform = */ FALSE, ! 824: /* msg_type_deallocate = */ FALSE, ! 825: /* msg_type_unused = */ 0, ! 826: }; ! 827: #endif UseStaticMsgType ! 828: ! 829: #if UseStaticMsgType ! 830: static const msg_type_t channelCountType = { ! 831: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 832: /* msg_type_size = */ 32, ! 833: /* msg_type_number = */ 1, ! 834: /* msg_type_inline = */ TRUE, ! 835: /* msg_type_longform = */ FALSE, ! 836: /* msg_type_deallocate = */ FALSE, ! 837: /* msg_type_unused = */ 0, ! 838: }; ! 839: #endif UseStaticMsgType ! 840: ! 841: #if UseStaticMsgType ! 842: static const msg_type_t samplingRateType = { ! 843: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 844: /* msg_type_size = */ 32, ! 845: /* msg_type_number = */ 1, ! 846: /* msg_type_inline = */ TRUE, ! 847: /* msg_type_longform = */ FALSE, ! 848: /* msg_type_deallocate = */ FALSE, ! 849: /* msg_type_unused = */ 0, ! 850: }; ! 851: #endif UseStaticMsgType ! 852: ! 853: #if UseStaticMsgType ! 854: static const msg_type_t encodingType = { ! 855: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 856: /* msg_type_size = */ 32, ! 857: /* msg_type_number = */ 1, ! 858: /* msg_type_inline = */ TRUE, ! 859: /* msg_type_longform = */ FALSE, ! 860: /* msg_type_deallocate = */ FALSE, ! 861: /* msg_type_unused = */ 0, ! 862: }; ! 863: #endif UseStaticMsgType ! 864: ! 865: #if UseStaticMsgType ! 866: static const msg_type_t useInterruptsType = { ! 867: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 868: /* msg_type_size = */ 32, ! 869: /* msg_type_number = */ 1, ! 870: /* msg_type_inline = */ TRUE, ! 871: /* msg_type_longform = */ FALSE, ! 872: /* msg_type_deallocate = */ FALSE, ! 873: /* msg_type_unused = */ 0, ! 874: }; ! 875: #endif UseStaticMsgType ! 876: ! 877: #if UseStaticMsgType ! 878: static const msg_type_t RetCodeCheck = { ! 879: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 880: /* msg_type_size = */ 32, ! 881: /* msg_type_number = */ 1, ! 882: /* msg_type_inline = */ TRUE, ! 883: /* msg_type_longform = */ FALSE, ! 884: /* msg_type_deallocate = */ FALSE, ! 885: /* msg_type_unused = */ 0 ! 886: }; ! 887: #endif UseStaticMsgType ! 888: ! 889: #if UseStaticMsgType ! 890: InP->owner_portType = owner_portType; ! 891: #else UseStaticMsgType ! 892: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 893: InP->owner_portType.msg_type_size = 32; ! 894: InP->owner_portType.msg_type_number = 1; ! 895: InP->owner_portType.msg_type_inline = TRUE; ! 896: InP->owner_portType.msg_type_longform = FALSE; ! 897: InP->owner_portType.msg_type_deallocate = FALSE; ! 898: #endif UseStaticMsgType ! 899: ! 900: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 901: ! 902: #if UseStaticMsgType ! 903: InP->channelCountType = channelCountType; ! 904: #else UseStaticMsgType ! 905: InP->channelCountType.msg_type_name = MSG_TYPE_INTEGER_32; ! 906: InP->channelCountType.msg_type_size = 32; ! 907: InP->channelCountType.msg_type_number = 1; ! 908: InP->channelCountType.msg_type_inline = TRUE; ! 909: InP->channelCountType.msg_type_longform = FALSE; ! 910: InP->channelCountType.msg_type_deallocate = FALSE; ! 911: #endif UseStaticMsgType ! 912: ! 913: InP->channelCount /* channelCount */ = /* channelCount */ channelCount; ! 914: ! 915: #if UseStaticMsgType ! 916: InP->samplingRateType = samplingRateType; ! 917: #else UseStaticMsgType ! 918: InP->samplingRateType.msg_type_name = MSG_TYPE_INTEGER_32; ! 919: InP->samplingRateType.msg_type_size = 32; ! 920: InP->samplingRateType.msg_type_number = 1; ! 921: InP->samplingRateType.msg_type_inline = TRUE; ! 922: InP->samplingRateType.msg_type_longform = FALSE; ! 923: InP->samplingRateType.msg_type_deallocate = FALSE; ! 924: #endif UseStaticMsgType ! 925: ! 926: InP->samplingRate /* samplingRate */ = /* samplingRate */ samplingRate; ! 927: ! 928: #if UseStaticMsgType ! 929: InP->encodingType = encodingType; ! 930: #else UseStaticMsgType ! 931: InP->encodingType.msg_type_name = MSG_TYPE_INTEGER_32; ! 932: InP->encodingType.msg_type_size = 32; ! 933: InP->encodingType.msg_type_number = 1; ! 934: InP->encodingType.msg_type_inline = TRUE; ! 935: InP->encodingType.msg_type_longform = FALSE; ! 936: InP->encodingType.msg_type_deallocate = FALSE; ! 937: #endif UseStaticMsgType ! 938: ! 939: InP->encoding /* encoding */ = /* encoding */ encoding; ! 940: ! 941: #if UseStaticMsgType ! 942: InP->useInterruptsType = useInterruptsType; ! 943: #else UseStaticMsgType ! 944: InP->useInterruptsType.msg_type_name = MSG_TYPE_INTEGER_32; ! 945: InP->useInterruptsType.msg_type_size = 32; ! 946: InP->useInterruptsType.msg_type_number = 1; ! 947: InP->useInterruptsType.msg_type_inline = TRUE; ! 948: InP->useInterruptsType.msg_type_longform = FALSE; ! 949: InP->useInterruptsType.msg_type_deallocate = FALSE; ! 950: #endif UseStaticMsgType ! 951: ! 952: InP->useInterrupts /* useInterrupts */ = /* useInterrupts */ useInterrupts; ! 953: ! 954: InP->Head.msg_simple = FALSE; ! 955: InP->Head.msg_size = msg_size; ! 956: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 957: InP->Head.msg_request_port = kern_serv_port; ! 958: InP->Head.msg_reply_port = mig_get_reply_port(); ! 959: InP->Head.msg_id = 1012; ! 960: ! 961: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 962: if (msg_result != RPC_SUCCESS) { ! 963: if (msg_result == RCV_INVALID_PORT) ! 964: mig_dealloc_reply_port(); ! 965: return msg_result; ! 966: } ! 967: ! 968: #if TypeCheck ! 969: msg_size = OutP->Head.msg_size; ! 970: msg_simple = OutP->Head.msg_simple; ! 971: #endif TypeCheck ! 972: ! 973: if (OutP->Head.msg_id != 1112) ! 974: return MIG_REPLY_MISMATCH; ! 975: ! 976: #if TypeCheck ! 977: if (((msg_size != 32) || (msg_simple != TRUE)) && ! 978: ((msg_size != sizeof(death_pill_t)) || ! 979: (msg_simple != TRUE) || ! 980: (OutP->RetCode == KERN_SUCCESS))) ! 981: return MIG_TYPE_ERROR; ! 982: #endif TypeCheck ! 983: ! 984: #if TypeCheck ! 985: #if UseStaticMsgType ! 986: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 987: #else UseStaticMsgType ! 988: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 989: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 990: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 991: (OutP->RetCodeType.msg_type_number != 1) || ! 992: (OutP->RetCodeType.msg_type_size != 32)) ! 993: #endif UseStaticMsgType ! 994: return MIG_TYPE_ERROR; ! 995: #endif TypeCheck ! 996: ! 997: if (OutP->RetCode != KERN_SUCCESS) ! 998: return OutP->RetCode; ! 999: ! 1000: return OutP->RetCode; ! 1001: } ! 1002: ! 1003: /* Routine BytesProcessed */ ! 1004: mig_external kern_return_t ntsoundBytesProcessed ( ! 1005: port_t kern_serv_port, ! 1006: port_t owner_port, ! 1007: int *byte_count) ! 1008: { ! 1009: typedef struct { ! 1010: msg_header_t Head; ! 1011: msg_type_t owner_portType; ! 1012: port_t owner_port; ! 1013: } Request; ! 1014: ! 1015: typedef struct { ! 1016: msg_header_t Head; ! 1017: msg_type_t RetCodeType; ! 1018: kern_return_t RetCode; ! 1019: msg_type_t byte_countType; ! 1020: int byte_count; ! 1021: } Reply; ! 1022: ! 1023: union { ! 1024: Request In; ! 1025: Reply Out; ! 1026: } Mess; ! 1027: ! 1028: register Request *InP = &Mess.In; ! 1029: register Reply *OutP = &Mess.Out; ! 1030: ! 1031: msg_return_t msg_result; ! 1032: ! 1033: #if TypeCheck ! 1034: boolean_t msg_simple; ! 1035: #endif TypeCheck ! 1036: ! 1037: unsigned int msg_size = 32; ! 1038: ! 1039: #if UseStaticMsgType ! 1040: static const msg_type_t owner_portType = { ! 1041: /* msg_type_name = */ MSG_TYPE_PORT, ! 1042: /* msg_type_size = */ 32, ! 1043: /* msg_type_number = */ 1, ! 1044: /* msg_type_inline = */ TRUE, ! 1045: /* msg_type_longform = */ FALSE, ! 1046: /* msg_type_deallocate = */ FALSE, ! 1047: /* msg_type_unused = */ 0, ! 1048: }; ! 1049: #endif UseStaticMsgType ! 1050: ! 1051: #if UseStaticMsgType ! 1052: static const msg_type_t RetCodeCheck = { ! 1053: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1054: /* msg_type_size = */ 32, ! 1055: /* msg_type_number = */ 1, ! 1056: /* msg_type_inline = */ TRUE, ! 1057: /* msg_type_longform = */ FALSE, ! 1058: /* msg_type_deallocate = */ FALSE, ! 1059: /* msg_type_unused = */ 0 ! 1060: }; ! 1061: #endif UseStaticMsgType ! 1062: ! 1063: #if UseStaticMsgType ! 1064: static const msg_type_t byte_countCheck = { ! 1065: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1066: /* msg_type_size = */ 32, ! 1067: /* msg_type_number = */ 1, ! 1068: /* msg_type_inline = */ TRUE, ! 1069: /* msg_type_longform = */ FALSE, ! 1070: /* msg_type_deallocate = */ FALSE, ! 1071: /* msg_type_unused = */ 0 ! 1072: }; ! 1073: #endif UseStaticMsgType ! 1074: ! 1075: #if UseStaticMsgType ! 1076: InP->owner_portType = owner_portType; ! 1077: #else UseStaticMsgType ! 1078: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 1079: InP->owner_portType.msg_type_size = 32; ! 1080: InP->owner_portType.msg_type_number = 1; ! 1081: InP->owner_portType.msg_type_inline = TRUE; ! 1082: InP->owner_portType.msg_type_longform = FALSE; ! 1083: InP->owner_portType.msg_type_deallocate = FALSE; ! 1084: #endif UseStaticMsgType ! 1085: ! 1086: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 1087: ! 1088: InP->Head.msg_simple = FALSE; ! 1089: InP->Head.msg_size = msg_size; ! 1090: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 1091: InP->Head.msg_request_port = kern_serv_port; ! 1092: InP->Head.msg_reply_port = mig_get_reply_port(); ! 1093: InP->Head.msg_id = 1013; ! 1094: ! 1095: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 1096: if (msg_result != RPC_SUCCESS) { ! 1097: if (msg_result == RCV_INVALID_PORT) ! 1098: mig_dealloc_reply_port(); ! 1099: return msg_result; ! 1100: } ! 1101: ! 1102: #if TypeCheck ! 1103: msg_size = OutP->Head.msg_size; ! 1104: msg_simple = OutP->Head.msg_simple; ! 1105: #endif TypeCheck ! 1106: ! 1107: if (OutP->Head.msg_id != 1113) ! 1108: return MIG_REPLY_MISMATCH; ! 1109: ! 1110: #if TypeCheck ! 1111: if (((msg_size != 40) || (msg_simple != TRUE)) && ! 1112: ((msg_size != sizeof(death_pill_t)) || ! 1113: (msg_simple != TRUE) || ! 1114: (OutP->RetCode == KERN_SUCCESS))) ! 1115: return MIG_TYPE_ERROR; ! 1116: #endif TypeCheck ! 1117: ! 1118: #if TypeCheck ! 1119: #if UseStaticMsgType ! 1120: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 1121: #else UseStaticMsgType ! 1122: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 1123: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 1124: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 1125: (OutP->RetCodeType.msg_type_number != 1) || ! 1126: (OutP->RetCodeType.msg_type_size != 32)) ! 1127: #endif UseStaticMsgType ! 1128: return MIG_TYPE_ERROR; ! 1129: #endif TypeCheck ! 1130: ! 1131: if (OutP->RetCode != KERN_SUCCESS) ! 1132: return OutP->RetCode; ! 1133: ! 1134: #if TypeCheck ! 1135: #if UseStaticMsgType ! 1136: if (* (int *) &OutP->byte_countType != * (int *) &byte_countCheck) ! 1137: #else UseStaticMsgType ! 1138: if ((OutP->byte_countType.msg_type_inline != TRUE) || ! 1139: (OutP->byte_countType.msg_type_longform != FALSE) || ! 1140: (OutP->byte_countType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 1141: (OutP->byte_countType.msg_type_number != 1) || ! 1142: (OutP->byte_countType.msg_type_size != 32)) ! 1143: #endif UseStaticMsgType ! 1144: return MIG_TYPE_ERROR; ! 1145: #endif TypeCheck ! 1146: ! 1147: *byte_count /* byte_count */ = /* *byte_count */ OutP->byte_count; ! 1148: ! 1149: return OutP->RetCode; ! 1150: } ! 1151: ! 1152: /* Routine DMACount */ ! 1153: mig_external kern_return_t ntsoundDMACount ( ! 1154: port_t kern_serv_port, ! 1155: port_t owner_port, ! 1156: int *dma_count) ! 1157: { ! 1158: typedef struct { ! 1159: msg_header_t Head; ! 1160: msg_type_t owner_portType; ! 1161: port_t owner_port; ! 1162: } Request; ! 1163: ! 1164: typedef struct { ! 1165: msg_header_t Head; ! 1166: msg_type_t RetCodeType; ! 1167: kern_return_t RetCode; ! 1168: msg_type_t dma_countType; ! 1169: int dma_count; ! 1170: } Reply; ! 1171: ! 1172: union { ! 1173: Request In; ! 1174: Reply Out; ! 1175: } Mess; ! 1176: ! 1177: register Request *InP = &Mess.In; ! 1178: register Reply *OutP = &Mess.Out; ! 1179: ! 1180: msg_return_t msg_result; ! 1181: ! 1182: #if TypeCheck ! 1183: boolean_t msg_simple; ! 1184: #endif TypeCheck ! 1185: ! 1186: unsigned int msg_size = 32; ! 1187: ! 1188: #if UseStaticMsgType ! 1189: static const msg_type_t owner_portType = { ! 1190: /* msg_type_name = */ MSG_TYPE_PORT, ! 1191: /* msg_type_size = */ 32, ! 1192: /* msg_type_number = */ 1, ! 1193: /* msg_type_inline = */ TRUE, ! 1194: /* msg_type_longform = */ FALSE, ! 1195: /* msg_type_deallocate = */ FALSE, ! 1196: /* msg_type_unused = */ 0, ! 1197: }; ! 1198: #endif UseStaticMsgType ! 1199: ! 1200: #if UseStaticMsgType ! 1201: static const msg_type_t RetCodeCheck = { ! 1202: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1203: /* msg_type_size = */ 32, ! 1204: /* msg_type_number = */ 1, ! 1205: /* msg_type_inline = */ TRUE, ! 1206: /* msg_type_longform = */ FALSE, ! 1207: /* msg_type_deallocate = */ FALSE, ! 1208: /* msg_type_unused = */ 0 ! 1209: }; ! 1210: #endif UseStaticMsgType ! 1211: ! 1212: #if UseStaticMsgType ! 1213: static const msg_type_t dma_countCheck = { ! 1214: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1215: /* msg_type_size = */ 32, ! 1216: /* msg_type_number = */ 1, ! 1217: /* msg_type_inline = */ TRUE, ! 1218: /* msg_type_longform = */ FALSE, ! 1219: /* msg_type_deallocate = */ FALSE, ! 1220: /* msg_type_unused = */ 0 ! 1221: }; ! 1222: #endif UseStaticMsgType ! 1223: ! 1224: #if UseStaticMsgType ! 1225: InP->owner_portType = owner_portType; ! 1226: #else UseStaticMsgType ! 1227: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 1228: InP->owner_portType.msg_type_size = 32; ! 1229: InP->owner_portType.msg_type_number = 1; ! 1230: InP->owner_portType.msg_type_inline = TRUE; ! 1231: InP->owner_portType.msg_type_longform = FALSE; ! 1232: InP->owner_portType.msg_type_deallocate = FALSE; ! 1233: #endif UseStaticMsgType ! 1234: ! 1235: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 1236: ! 1237: InP->Head.msg_simple = FALSE; ! 1238: InP->Head.msg_size = msg_size; ! 1239: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 1240: InP->Head.msg_request_port = kern_serv_port; ! 1241: InP->Head.msg_reply_port = mig_get_reply_port(); ! 1242: InP->Head.msg_id = 1014; ! 1243: ! 1244: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 1245: if (msg_result != RPC_SUCCESS) { ! 1246: if (msg_result == RCV_INVALID_PORT) ! 1247: mig_dealloc_reply_port(); ! 1248: return msg_result; ! 1249: } ! 1250: ! 1251: #if TypeCheck ! 1252: msg_size = OutP->Head.msg_size; ! 1253: msg_simple = OutP->Head.msg_simple; ! 1254: #endif TypeCheck ! 1255: ! 1256: if (OutP->Head.msg_id != 1114) ! 1257: return MIG_REPLY_MISMATCH; ! 1258: ! 1259: #if TypeCheck ! 1260: if (((msg_size != 40) || (msg_simple != TRUE)) && ! 1261: ((msg_size != sizeof(death_pill_t)) || ! 1262: (msg_simple != TRUE) || ! 1263: (OutP->RetCode == KERN_SUCCESS))) ! 1264: return MIG_TYPE_ERROR; ! 1265: #endif TypeCheck ! 1266: ! 1267: #if TypeCheck ! 1268: #if UseStaticMsgType ! 1269: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 1270: #else UseStaticMsgType ! 1271: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 1272: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 1273: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 1274: (OutP->RetCodeType.msg_type_number != 1) || ! 1275: (OutP->RetCodeType.msg_type_size != 32)) ! 1276: #endif UseStaticMsgType ! 1277: return MIG_TYPE_ERROR; ! 1278: #endif TypeCheck ! 1279: ! 1280: if (OutP->RetCode != KERN_SUCCESS) ! 1281: return OutP->RetCode; ! 1282: ! 1283: #if TypeCheck ! 1284: #if UseStaticMsgType ! 1285: if (* (int *) &OutP->dma_countType != * (int *) &dma_countCheck) ! 1286: #else UseStaticMsgType ! 1287: if ((OutP->dma_countType.msg_type_inline != TRUE) || ! 1288: (OutP->dma_countType.msg_type_longform != FALSE) || ! 1289: (OutP->dma_countType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 1290: (OutP->dma_countType.msg_type_number != 1) || ! 1291: (OutP->dma_countType.msg_type_size != 32)) ! 1292: #endif UseStaticMsgType ! 1293: return MIG_TYPE_ERROR; ! 1294: #endif TypeCheck ! 1295: ! 1296: *dma_count /* dma_count */ = /* *dma_count */ OutP->dma_count; ! 1297: ! 1298: return OutP->RetCode; ! 1299: } ! 1300: ! 1301: /* Routine InterruptCount */ ! 1302: mig_external kern_return_t ntsoundInterruptCount ( ! 1303: port_t kern_serv_port, ! 1304: port_t owner_port, ! 1305: int *irq_count) ! 1306: { ! 1307: typedef struct { ! 1308: msg_header_t Head; ! 1309: msg_type_t owner_portType; ! 1310: port_t owner_port; ! 1311: } Request; ! 1312: ! 1313: typedef struct { ! 1314: msg_header_t Head; ! 1315: msg_type_t RetCodeType; ! 1316: kern_return_t RetCode; ! 1317: msg_type_t irq_countType; ! 1318: int irq_count; ! 1319: } Reply; ! 1320: ! 1321: union { ! 1322: Request In; ! 1323: Reply Out; ! 1324: } Mess; ! 1325: ! 1326: register Request *InP = &Mess.In; ! 1327: register Reply *OutP = &Mess.Out; ! 1328: ! 1329: msg_return_t msg_result; ! 1330: ! 1331: #if TypeCheck ! 1332: boolean_t msg_simple; ! 1333: #endif TypeCheck ! 1334: ! 1335: unsigned int msg_size = 32; ! 1336: ! 1337: #if UseStaticMsgType ! 1338: static const msg_type_t owner_portType = { ! 1339: /* msg_type_name = */ MSG_TYPE_PORT, ! 1340: /* msg_type_size = */ 32, ! 1341: /* msg_type_number = */ 1, ! 1342: /* msg_type_inline = */ TRUE, ! 1343: /* msg_type_longform = */ FALSE, ! 1344: /* msg_type_deallocate = */ FALSE, ! 1345: /* msg_type_unused = */ 0, ! 1346: }; ! 1347: #endif UseStaticMsgType ! 1348: ! 1349: #if UseStaticMsgType ! 1350: static const msg_type_t RetCodeCheck = { ! 1351: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1352: /* msg_type_size = */ 32, ! 1353: /* msg_type_number = */ 1, ! 1354: /* msg_type_inline = */ TRUE, ! 1355: /* msg_type_longform = */ FALSE, ! 1356: /* msg_type_deallocate = */ FALSE, ! 1357: /* msg_type_unused = */ 0 ! 1358: }; ! 1359: #endif UseStaticMsgType ! 1360: ! 1361: #if UseStaticMsgType ! 1362: static const msg_type_t irq_countCheck = { ! 1363: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1364: /* msg_type_size = */ 32, ! 1365: /* msg_type_number = */ 1, ! 1366: /* msg_type_inline = */ TRUE, ! 1367: /* msg_type_longform = */ FALSE, ! 1368: /* msg_type_deallocate = */ FALSE, ! 1369: /* msg_type_unused = */ 0 ! 1370: }; ! 1371: #endif UseStaticMsgType ! 1372: ! 1373: #if UseStaticMsgType ! 1374: InP->owner_portType = owner_portType; ! 1375: #else UseStaticMsgType ! 1376: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 1377: InP->owner_portType.msg_type_size = 32; ! 1378: InP->owner_portType.msg_type_number = 1; ! 1379: InP->owner_portType.msg_type_inline = TRUE; ! 1380: InP->owner_portType.msg_type_longform = FALSE; ! 1381: InP->owner_portType.msg_type_deallocate = FALSE; ! 1382: #endif UseStaticMsgType ! 1383: ! 1384: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 1385: ! 1386: InP->Head.msg_simple = FALSE; ! 1387: InP->Head.msg_size = msg_size; ! 1388: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 1389: InP->Head.msg_request_port = kern_serv_port; ! 1390: InP->Head.msg_reply_port = mig_get_reply_port(); ! 1391: InP->Head.msg_id = 1015; ! 1392: ! 1393: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 1394: if (msg_result != RPC_SUCCESS) { ! 1395: if (msg_result == RCV_INVALID_PORT) ! 1396: mig_dealloc_reply_port(); ! 1397: return msg_result; ! 1398: } ! 1399: ! 1400: #if TypeCheck ! 1401: msg_size = OutP->Head.msg_size; ! 1402: msg_simple = OutP->Head.msg_simple; ! 1403: #endif TypeCheck ! 1404: ! 1405: if (OutP->Head.msg_id != 1115) ! 1406: return MIG_REPLY_MISMATCH; ! 1407: ! 1408: #if TypeCheck ! 1409: if (((msg_size != 40) || (msg_simple != TRUE)) && ! 1410: ((msg_size != sizeof(death_pill_t)) || ! 1411: (msg_simple != TRUE) || ! 1412: (OutP->RetCode == KERN_SUCCESS))) ! 1413: return MIG_TYPE_ERROR; ! 1414: #endif TypeCheck ! 1415: ! 1416: #if TypeCheck ! 1417: #if UseStaticMsgType ! 1418: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 1419: #else UseStaticMsgType ! 1420: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 1421: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 1422: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 1423: (OutP->RetCodeType.msg_type_number != 1) || ! 1424: (OutP->RetCodeType.msg_type_size != 32)) ! 1425: #endif UseStaticMsgType ! 1426: return MIG_TYPE_ERROR; ! 1427: #endif TypeCheck ! 1428: ! 1429: if (OutP->RetCode != KERN_SUCCESS) ! 1430: return OutP->RetCode; ! 1431: ! 1432: #if TypeCheck ! 1433: #if UseStaticMsgType ! 1434: if (* (int *) &OutP->irq_countType != * (int *) &irq_countCheck) ! 1435: #else UseStaticMsgType ! 1436: if ((OutP->irq_countType.msg_type_inline != TRUE) || ! 1437: (OutP->irq_countType.msg_type_longform != FALSE) || ! 1438: (OutP->irq_countType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 1439: (OutP->irq_countType.msg_type_number != 1) || ! 1440: (OutP->irq_countType.msg_type_size != 32)) ! 1441: #endif UseStaticMsgType ! 1442: return MIG_TYPE_ERROR; ! 1443: #endif TypeCheck ! 1444: ! 1445: *irq_count /* irq_count */ = /* *irq_count */ OutP->irq_count; ! 1446: ! 1447: return OutP->RetCode; ! 1448: } ! 1449: ! 1450: /* Routine Write */ ! 1451: mig_external kern_return_t ntsoundWrite ( ! 1452: port_t kern_serv_port, ! 1453: port_t owner_port, ! 1454: sound_data_t data, ! 1455: unsigned int dataCnt, ! 1456: int *actual_count) ! 1457: { ! 1458: typedef struct { ! 1459: msg_header_t Head; ! 1460: msg_type_t owner_portType; ! 1461: port_t owner_port; ! 1462: msg_type_long_t dataType; ! 1463: short data[7000]; ! 1464: } Request; ! 1465: ! 1466: typedef struct { ! 1467: msg_header_t Head; ! 1468: msg_type_t RetCodeType; ! 1469: kern_return_t RetCode; ! 1470: msg_type_t actual_countType; ! 1471: int actual_count; ! 1472: } Reply; ! 1473: ! 1474: union { ! 1475: Request In; ! 1476: Reply Out; ! 1477: } Mess; ! 1478: ! 1479: register Request *InP = &Mess.In; ! 1480: register Reply *OutP = &Mess.Out; ! 1481: ! 1482: msg_return_t msg_result; ! 1483: ! 1484: #if TypeCheck ! 1485: boolean_t msg_simple; ! 1486: #endif TypeCheck ! 1487: ! 1488: unsigned int msg_size = 44; ! 1489: /* Maximum request size 14044 */ ! 1490: unsigned int msg_size_delta; ! 1491: ! 1492: #if UseStaticMsgType ! 1493: static const msg_type_t owner_portType = { ! 1494: /* msg_type_name = */ MSG_TYPE_PORT, ! 1495: /* msg_type_size = */ 32, ! 1496: /* msg_type_number = */ 1, ! 1497: /* msg_type_inline = */ TRUE, ! 1498: /* msg_type_longform = */ FALSE, ! 1499: /* msg_type_deallocate = */ FALSE, ! 1500: /* msg_type_unused = */ 0, ! 1501: }; ! 1502: #endif UseStaticMsgType ! 1503: ! 1504: #if UseStaticMsgType ! 1505: static const msg_type_long_t dataType = { ! 1506: { ! 1507: /* msg_type_name = */ 0, ! 1508: /* msg_type_size = */ 0, ! 1509: /* msg_type_number = */ 0, ! 1510: /* msg_type_inline = */ TRUE, ! 1511: /* msg_type_longform = */ TRUE, ! 1512: /* msg_type_deallocate = */ FALSE, ! 1513: }, ! 1514: /* msg_type_long_name = */ MSG_TYPE_INTEGER_16, ! 1515: /* msg_type_long_size = */ 16, ! 1516: /* msg_type_long_number = */ 7000, ! 1517: }; ! 1518: #endif UseStaticMsgType ! 1519: ! 1520: #if UseStaticMsgType ! 1521: static const msg_type_t RetCodeCheck = { ! 1522: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1523: /* msg_type_size = */ 32, ! 1524: /* msg_type_number = */ 1, ! 1525: /* msg_type_inline = */ TRUE, ! 1526: /* msg_type_longform = */ FALSE, ! 1527: /* msg_type_deallocate = */ FALSE, ! 1528: /* msg_type_unused = */ 0 ! 1529: }; ! 1530: #endif UseStaticMsgType ! 1531: ! 1532: #if UseStaticMsgType ! 1533: static const msg_type_t actual_countCheck = { ! 1534: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1535: /* msg_type_size = */ 32, ! 1536: /* msg_type_number = */ 1, ! 1537: /* msg_type_inline = */ TRUE, ! 1538: /* msg_type_longform = */ FALSE, ! 1539: /* msg_type_deallocate = */ FALSE, ! 1540: /* msg_type_unused = */ 0 ! 1541: }; ! 1542: #endif UseStaticMsgType ! 1543: ! 1544: #if UseStaticMsgType ! 1545: InP->owner_portType = owner_portType; ! 1546: #else UseStaticMsgType ! 1547: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 1548: InP->owner_portType.msg_type_size = 32; ! 1549: InP->owner_portType.msg_type_number = 1; ! 1550: InP->owner_portType.msg_type_inline = TRUE; ! 1551: InP->owner_portType.msg_type_longform = FALSE; ! 1552: InP->owner_portType.msg_type_deallocate = FALSE; ! 1553: #endif UseStaticMsgType ! 1554: ! 1555: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 1556: ! 1557: #if UseStaticMsgType ! 1558: InP->dataType = dataType; ! 1559: #else UseStaticMsgType ! 1560: InP->dataType.msg_type_long_name = MSG_TYPE_INTEGER_16; ! 1561: InP->dataType.msg_type_long_size = 16; ! 1562: InP->dataType.msg_type_header.msg_type_inline = TRUE; ! 1563: InP->dataType.msg_type_header.msg_type_longform = TRUE; ! 1564: InP->dataType.msg_type_header.msg_type_deallocate = FALSE; ! 1565: #endif UseStaticMsgType ! 1566: ! 1567: if (dataCnt > 7000) ! 1568: return MIG_ARRAY_TOO_LARGE; ! 1569: bcopy((char *) data, (char *) InP->data, 2 * dataCnt); ! 1570: ! 1571: InP->dataType.msg_type_long_number /* dataCnt */ = /* dataType.msg_type_long_number */ dataCnt; ! 1572: ! 1573: msg_size_delta = (2 * dataCnt + 3) & ~3; ! 1574: msg_size += msg_size_delta; ! 1575: ! 1576: InP->Head.msg_simple = FALSE; ! 1577: InP->Head.msg_size = msg_size; ! 1578: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 1579: InP->Head.msg_request_port = kern_serv_port; ! 1580: InP->Head.msg_reply_port = mig_get_reply_port(); ! 1581: InP->Head.msg_id = 1016; ! 1582: ! 1583: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 1584: if (msg_result != RPC_SUCCESS) { ! 1585: if (msg_result == RCV_INVALID_PORT) ! 1586: mig_dealloc_reply_port(); ! 1587: return msg_result; ! 1588: } ! 1589: ! 1590: #if TypeCheck ! 1591: msg_size = OutP->Head.msg_size; ! 1592: msg_simple = OutP->Head.msg_simple; ! 1593: #endif TypeCheck ! 1594: ! 1595: if (OutP->Head.msg_id != 1116) ! 1596: return MIG_REPLY_MISMATCH; ! 1597: ! 1598: #if TypeCheck ! 1599: if (((msg_size != 40) || (msg_simple != TRUE)) && ! 1600: ((msg_size != sizeof(death_pill_t)) || ! 1601: (msg_simple != TRUE) || ! 1602: (OutP->RetCode == KERN_SUCCESS))) ! 1603: return MIG_TYPE_ERROR; ! 1604: #endif TypeCheck ! 1605: ! 1606: #if TypeCheck ! 1607: #if UseStaticMsgType ! 1608: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 1609: #else UseStaticMsgType ! 1610: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 1611: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 1612: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 1613: (OutP->RetCodeType.msg_type_number != 1) || ! 1614: (OutP->RetCodeType.msg_type_size != 32)) ! 1615: #endif UseStaticMsgType ! 1616: return MIG_TYPE_ERROR; ! 1617: #endif TypeCheck ! 1618: ! 1619: if (OutP->RetCode != KERN_SUCCESS) ! 1620: return OutP->RetCode; ! 1621: ! 1622: #if TypeCheck ! 1623: #if UseStaticMsgType ! 1624: if (* (int *) &OutP->actual_countType != * (int *) &actual_countCheck) ! 1625: #else UseStaticMsgType ! 1626: if ((OutP->actual_countType.msg_type_inline != TRUE) || ! 1627: (OutP->actual_countType.msg_type_longform != FALSE) || ! 1628: (OutP->actual_countType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 1629: (OutP->actual_countType.msg_type_number != 1) || ! 1630: (OutP->actual_countType.msg_type_size != 32)) ! 1631: #endif UseStaticMsgType ! 1632: return MIG_TYPE_ERROR; ! 1633: #endif TypeCheck ! 1634: ! 1635: *actual_count /* actual_count */ = /* *actual_count */ OutP->actual_count; ! 1636: ! 1637: return OutP->RetCode; ! 1638: } ! 1639: ! 1640: /* Routine SetVolume */ ! 1641: mig_external kern_return_t ntsoundSetVolume ( ! 1642: port_t kern_serv_port, ! 1643: port_t owner_port, ! 1644: int value) ! 1645: { ! 1646: typedef struct { ! 1647: msg_header_t Head; ! 1648: msg_type_t owner_portType; ! 1649: port_t owner_port; ! 1650: msg_type_t valueType; ! 1651: int value; ! 1652: } Request; ! 1653: ! 1654: typedef struct { ! 1655: msg_header_t Head; ! 1656: msg_type_t RetCodeType; ! 1657: kern_return_t RetCode; ! 1658: } Reply; ! 1659: ! 1660: union { ! 1661: Request In; ! 1662: Reply Out; ! 1663: } Mess; ! 1664: ! 1665: register Request *InP = &Mess.In; ! 1666: register Reply *OutP = &Mess.Out; ! 1667: ! 1668: msg_return_t msg_result; ! 1669: ! 1670: #if TypeCheck ! 1671: boolean_t msg_simple; ! 1672: #endif TypeCheck ! 1673: ! 1674: unsigned int msg_size = 40; ! 1675: ! 1676: #if UseStaticMsgType ! 1677: static const msg_type_t owner_portType = { ! 1678: /* msg_type_name = */ MSG_TYPE_PORT, ! 1679: /* msg_type_size = */ 32, ! 1680: /* msg_type_number = */ 1, ! 1681: /* msg_type_inline = */ TRUE, ! 1682: /* msg_type_longform = */ FALSE, ! 1683: /* msg_type_deallocate = */ FALSE, ! 1684: /* msg_type_unused = */ 0, ! 1685: }; ! 1686: #endif UseStaticMsgType ! 1687: ! 1688: #if UseStaticMsgType ! 1689: static const msg_type_t valueType = { ! 1690: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1691: /* msg_type_size = */ 32, ! 1692: /* msg_type_number = */ 1, ! 1693: /* msg_type_inline = */ TRUE, ! 1694: /* msg_type_longform = */ FALSE, ! 1695: /* msg_type_deallocate = */ FALSE, ! 1696: /* msg_type_unused = */ 0, ! 1697: }; ! 1698: #endif UseStaticMsgType ! 1699: ! 1700: #if UseStaticMsgType ! 1701: static const msg_type_t RetCodeCheck = { ! 1702: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1703: /* msg_type_size = */ 32, ! 1704: /* msg_type_number = */ 1, ! 1705: /* msg_type_inline = */ TRUE, ! 1706: /* msg_type_longform = */ FALSE, ! 1707: /* msg_type_deallocate = */ FALSE, ! 1708: /* msg_type_unused = */ 0 ! 1709: }; ! 1710: #endif UseStaticMsgType ! 1711: ! 1712: #if UseStaticMsgType ! 1713: InP->owner_portType = owner_portType; ! 1714: #else UseStaticMsgType ! 1715: InP->owner_portType.msg_type_name = MSG_TYPE_PORT; ! 1716: InP->owner_portType.msg_type_size = 32; ! 1717: InP->owner_portType.msg_type_number = 1; ! 1718: InP->owner_portType.msg_type_inline = TRUE; ! 1719: InP->owner_portType.msg_type_longform = FALSE; ! 1720: InP->owner_portType.msg_type_deallocate = FALSE; ! 1721: #endif UseStaticMsgType ! 1722: ! 1723: InP->owner_port /* owner_port */ = /* owner_port */ owner_port; ! 1724: ! 1725: #if UseStaticMsgType ! 1726: InP->valueType = valueType; ! 1727: #else UseStaticMsgType ! 1728: InP->valueType.msg_type_name = MSG_TYPE_INTEGER_32; ! 1729: InP->valueType.msg_type_size = 32; ! 1730: InP->valueType.msg_type_number = 1; ! 1731: InP->valueType.msg_type_inline = TRUE; ! 1732: InP->valueType.msg_type_longform = FALSE; ! 1733: InP->valueType.msg_type_deallocate = FALSE; ! 1734: #endif UseStaticMsgType ! 1735: ! 1736: InP->value /* value */ = /* value */ value; ! 1737: ! 1738: InP->Head.msg_simple = FALSE; ! 1739: InP->Head.msg_size = msg_size; ! 1740: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 1741: InP->Head.msg_request_port = kern_serv_port; ! 1742: InP->Head.msg_reply_port = mig_get_reply_port(); ! 1743: InP->Head.msg_id = 1017; ! 1744: ! 1745: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 1746: if (msg_result != RPC_SUCCESS) { ! 1747: if (msg_result == RCV_INVALID_PORT) ! 1748: mig_dealloc_reply_port(); ! 1749: return msg_result; ! 1750: } ! 1751: ! 1752: #if TypeCheck ! 1753: msg_size = OutP->Head.msg_size; ! 1754: msg_simple = OutP->Head.msg_simple; ! 1755: #endif TypeCheck ! 1756: ! 1757: if (OutP->Head.msg_id != 1117) ! 1758: return MIG_REPLY_MISMATCH; ! 1759: ! 1760: #if TypeCheck ! 1761: if (((msg_size != 32) || (msg_simple != TRUE)) && ! 1762: ((msg_size != sizeof(death_pill_t)) || ! 1763: (msg_simple != TRUE) || ! 1764: (OutP->RetCode == KERN_SUCCESS))) ! 1765: return MIG_TYPE_ERROR; ! 1766: #endif TypeCheck ! 1767: ! 1768: #if TypeCheck ! 1769: #if UseStaticMsgType ! 1770: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 1771: #else UseStaticMsgType ! 1772: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 1773: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 1774: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 1775: (OutP->RetCodeType.msg_type_number != 1) || ! 1776: (OutP->RetCodeType.msg_type_size != 32)) ! 1777: #endif UseStaticMsgType ! 1778: return MIG_TYPE_ERROR; ! 1779: #endif TypeCheck ! 1780: ! 1781: if (OutP->RetCode != KERN_SUCCESS) ! 1782: return OutP->RetCode; ! 1783: ! 1784: return OutP->RetCode; ! 1785: } ! 1786: ! 1787: /* Routine WireRange */ ! 1788: mig_external kern_return_t ntsoundWireRange ( ! 1789: port_t device_port, ! 1790: port_t token, ! 1791: port_t task, ! 1792: vm_offset_t addr, ! 1793: vm_size_t size, ! 1794: boolean_t wire) ! 1795: { ! 1796: typedef struct { ! 1797: msg_header_t Head; ! 1798: msg_type_t tokenType; ! 1799: port_t token; ! 1800: msg_type_t taskType; ! 1801: port_t task; ! 1802: msg_type_t addrType; ! 1803: vm_offset_t addr; ! 1804: msg_type_t sizeType; ! 1805: vm_size_t size; ! 1806: msg_type_t wireType; ! 1807: boolean_t wire; ! 1808: } Request; ! 1809: ! 1810: typedef struct { ! 1811: msg_header_t Head; ! 1812: msg_type_t RetCodeType; ! 1813: kern_return_t RetCode; ! 1814: } Reply; ! 1815: ! 1816: union { ! 1817: Request In; ! 1818: Reply Out; ! 1819: } Mess; ! 1820: ! 1821: register Request *InP = &Mess.In; ! 1822: register Reply *OutP = &Mess.Out; ! 1823: ! 1824: msg_return_t msg_result; ! 1825: ! 1826: #if TypeCheck ! 1827: boolean_t msg_simple; ! 1828: #endif TypeCheck ! 1829: ! 1830: unsigned int msg_size = 64; ! 1831: ! 1832: #if UseStaticMsgType ! 1833: static const msg_type_t tokenType = { ! 1834: /* msg_type_name = */ MSG_TYPE_PORT, ! 1835: /* msg_type_size = */ 32, ! 1836: /* msg_type_number = */ 1, ! 1837: /* msg_type_inline = */ TRUE, ! 1838: /* msg_type_longform = */ FALSE, ! 1839: /* msg_type_deallocate = */ FALSE, ! 1840: /* msg_type_unused = */ 0, ! 1841: }; ! 1842: #endif UseStaticMsgType ! 1843: ! 1844: #if UseStaticMsgType ! 1845: static const msg_type_t taskType = { ! 1846: /* msg_type_name = */ MSG_TYPE_PORT, ! 1847: /* msg_type_size = */ 32, ! 1848: /* msg_type_number = */ 1, ! 1849: /* msg_type_inline = */ TRUE, ! 1850: /* msg_type_longform = */ FALSE, ! 1851: /* msg_type_deallocate = */ FALSE, ! 1852: /* msg_type_unused = */ 0, ! 1853: }; ! 1854: #endif UseStaticMsgType ! 1855: ! 1856: #if UseStaticMsgType ! 1857: static const msg_type_t addrType = { ! 1858: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1859: /* msg_type_size = */ 32, ! 1860: /* msg_type_number = */ 1, ! 1861: /* msg_type_inline = */ TRUE, ! 1862: /* msg_type_longform = */ FALSE, ! 1863: /* msg_type_deallocate = */ FALSE, ! 1864: /* msg_type_unused = */ 0, ! 1865: }; ! 1866: #endif UseStaticMsgType ! 1867: ! 1868: #if UseStaticMsgType ! 1869: static const msg_type_t sizeType = { ! 1870: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1871: /* msg_type_size = */ 32, ! 1872: /* msg_type_number = */ 1, ! 1873: /* msg_type_inline = */ TRUE, ! 1874: /* msg_type_longform = */ FALSE, ! 1875: /* msg_type_deallocate = */ FALSE, ! 1876: /* msg_type_unused = */ 0, ! 1877: }; ! 1878: #endif UseStaticMsgType ! 1879: ! 1880: #if UseStaticMsgType ! 1881: static const msg_type_t wireType = { ! 1882: /* msg_type_name = */ MSG_TYPE_BOOLEAN, ! 1883: /* msg_type_size = */ 32, ! 1884: /* msg_type_number = */ 1, ! 1885: /* msg_type_inline = */ TRUE, ! 1886: /* msg_type_longform = */ FALSE, ! 1887: /* msg_type_deallocate = */ FALSE, ! 1888: /* msg_type_unused = */ 0, ! 1889: }; ! 1890: #endif UseStaticMsgType ! 1891: ! 1892: #if UseStaticMsgType ! 1893: static const msg_type_t RetCodeCheck = { ! 1894: /* msg_type_name = */ MSG_TYPE_INTEGER_32, ! 1895: /* msg_type_size = */ 32, ! 1896: /* msg_type_number = */ 1, ! 1897: /* msg_type_inline = */ TRUE, ! 1898: /* msg_type_longform = */ FALSE, ! 1899: /* msg_type_deallocate = */ FALSE, ! 1900: /* msg_type_unused = */ 0 ! 1901: }; ! 1902: #endif UseStaticMsgType ! 1903: ! 1904: #if UseStaticMsgType ! 1905: InP->tokenType = tokenType; ! 1906: #else UseStaticMsgType ! 1907: InP->tokenType.msg_type_name = MSG_TYPE_PORT; ! 1908: InP->tokenType.msg_type_size = 32; ! 1909: InP->tokenType.msg_type_number = 1; ! 1910: InP->tokenType.msg_type_inline = TRUE; ! 1911: InP->tokenType.msg_type_longform = FALSE; ! 1912: InP->tokenType.msg_type_deallocate = FALSE; ! 1913: #endif UseStaticMsgType ! 1914: ! 1915: InP->token /* token */ = /* token */ token; ! 1916: ! 1917: #if UseStaticMsgType ! 1918: InP->taskType = taskType; ! 1919: #else UseStaticMsgType ! 1920: InP->taskType.msg_type_name = MSG_TYPE_PORT; ! 1921: InP->taskType.msg_type_size = 32; ! 1922: InP->taskType.msg_type_number = 1; ! 1923: InP->taskType.msg_type_inline = TRUE; ! 1924: InP->taskType.msg_type_longform = FALSE; ! 1925: InP->taskType.msg_type_deallocate = FALSE; ! 1926: #endif UseStaticMsgType ! 1927: ! 1928: InP->task /* task */ = /* task */ task; ! 1929: ! 1930: #if UseStaticMsgType ! 1931: InP->addrType = addrType; ! 1932: #else UseStaticMsgType ! 1933: InP->addrType.msg_type_name = MSG_TYPE_INTEGER_32; ! 1934: InP->addrType.msg_type_size = 32; ! 1935: InP->addrType.msg_type_number = 1; ! 1936: InP->addrType.msg_type_inline = TRUE; ! 1937: InP->addrType.msg_type_longform = FALSE; ! 1938: InP->addrType.msg_type_deallocate = FALSE; ! 1939: #endif UseStaticMsgType ! 1940: ! 1941: InP->addr /* addr */ = /* addr */ addr; ! 1942: ! 1943: #if UseStaticMsgType ! 1944: InP->sizeType = sizeType; ! 1945: #else UseStaticMsgType ! 1946: InP->sizeType.msg_type_name = MSG_TYPE_INTEGER_32; ! 1947: InP->sizeType.msg_type_size = 32; ! 1948: InP->sizeType.msg_type_number = 1; ! 1949: InP->sizeType.msg_type_inline = TRUE; ! 1950: InP->sizeType.msg_type_longform = FALSE; ! 1951: InP->sizeType.msg_type_deallocate = FALSE; ! 1952: #endif UseStaticMsgType ! 1953: ! 1954: InP->size /* size */ = /* size */ size; ! 1955: ! 1956: #if UseStaticMsgType ! 1957: InP->wireType = wireType; ! 1958: #else UseStaticMsgType ! 1959: InP->wireType.msg_type_name = MSG_TYPE_BOOLEAN; ! 1960: InP->wireType.msg_type_size = 32; ! 1961: InP->wireType.msg_type_number = 1; ! 1962: InP->wireType.msg_type_inline = TRUE; ! 1963: InP->wireType.msg_type_longform = FALSE; ! 1964: InP->wireType.msg_type_deallocate = FALSE; ! 1965: #endif UseStaticMsgType ! 1966: ! 1967: InP->wire /* wire */ = /* wire */ wire; ! 1968: ! 1969: InP->Head.msg_simple = FALSE; ! 1970: InP->Head.msg_size = msg_size; ! 1971: InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC; ! 1972: InP->Head.msg_request_port = device_port; ! 1973: InP->Head.msg_reply_port = mig_get_reply_port(); ! 1974: InP->Head.msg_id = 1018; ! 1975: ! 1976: msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0); ! 1977: if (msg_result != RPC_SUCCESS) { ! 1978: if (msg_result == RCV_INVALID_PORT) ! 1979: mig_dealloc_reply_port(); ! 1980: return msg_result; ! 1981: } ! 1982: ! 1983: #if TypeCheck ! 1984: msg_size = OutP->Head.msg_size; ! 1985: msg_simple = OutP->Head.msg_simple; ! 1986: #endif TypeCheck ! 1987: ! 1988: if (OutP->Head.msg_id != 1118) ! 1989: return MIG_REPLY_MISMATCH; ! 1990: ! 1991: #if TypeCheck ! 1992: if (((msg_size != 32) || (msg_simple != TRUE)) && ! 1993: ((msg_size != sizeof(death_pill_t)) || ! 1994: (msg_simple != TRUE) || ! 1995: (OutP->RetCode == KERN_SUCCESS))) ! 1996: return MIG_TYPE_ERROR; ! 1997: #endif TypeCheck ! 1998: ! 1999: #if TypeCheck ! 2000: #if UseStaticMsgType ! 2001: if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck) ! 2002: #else UseStaticMsgType ! 2003: if ((OutP->RetCodeType.msg_type_inline != TRUE) || ! 2004: (OutP->RetCodeType.msg_type_longform != FALSE) || ! 2005: (OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) || ! 2006: (OutP->RetCodeType.msg_type_number != 1) || ! 2007: (OutP->RetCodeType.msg_type_size != 32)) ! 2008: #endif UseStaticMsgType ! 2009: return MIG_TYPE_ERROR; ! 2010: #endif TypeCheck ! 2011: ! 2012: if (OutP->RetCode != KERN_SUCCESS) ! 2013: return OutP->RetCode; ! 2014: ! 2015: return OutP->RetCode; ! 2016: } ! 2017: ! 2018: ! 2019: //======================================================================== ! 2020: ! 2021: /* ! 2022: ================== ! 2023: SNDDMA_Init ! 2024: ! 2025: Try to find a sound device to mix for. ! 2026: Returns false if nothing is found. ! 2027: ================== ! 2028: */ ! 2029: qboolean SNDDMA_Init(void) ! 2030: { ! 2031: int err; ! 2032: int i; ! 2033: byte *buf; ! 2034: int bufsize; ! 2035: int progress, oldprogress; ! 2036: ! 2037: shm = &sn; ! 2038: shm->channels = 2; ! 2039: shm->samplebits = 16; ! 2040: shm->speed = 11025; ! 2041: ! 2042: err = netname_look_up(name_server_port,"", NTSOUNDNAME,&devPort); ! 2043: if (err) ! 2044: { ! 2045: Com_Printf("SNDDMA_Init: Cannot access theater driver\n"); ! 2046: return false; ! 2047: } ! 2048: ! 2049: err = ntsoundAcquire(devPort,task_self(),(vm_offset_t *)&buf,&bufsize,&i); ! 2050: if (err || !i) ! 2051: { ! 2052: Com_Printf("SNDDMA_Init: Sound driver is busy or messed up\n"); ! 2053: return false; ! 2054: } ! 2055: ! 2056: err = ntsoundConfig(devPort,task_self(),shm->channels,(int)shm->speed, ! 2057: NX_SoundStreamDataEncoding_Linear16, 1); ! 2058: if (err) ! 2059: { ! 2060: Com_Printf("SNDDMA_Init: ntsoundConfig error: %d\n",err); ! 2061: return false; ! 2062: } ! 2063: else ! 2064: Com_Printf("SNDDMA_Init: Configured for %d Hz, %d channels\n" ! 2065: ,(int)shm->speed,shm->channels); ! 2066: // printf ("buf: 0x%x\n", buf); ! 2067: // printf ("bufsize: %d\n", bufsize); ! 2068: ! 2069: bzero(buf,bufsize); ! 2070: ! 2071: // ntsoundSetVolume(devPort,task_self(),5); ! 2072: ntsoundStart(devPort,task_self()); ! 2073: ! 2074: shm->soundalive = true; ! 2075: shm->splitbuffer = false; ! 2076: shm->samples = bufsize/(shm->samplebits/8); ! 2077: shm->samplepos = 0; ! 2078: shm->submission_chunk = 1; ! 2079: shm->buffer = buf; ! 2080: ! 2081: // ! 2082: // find a buffer crossing point for pos testing ! 2083: // ! 2084: ! 2085: ntsoundBytesProcessed(devPort,task_self(),&oldprogress); ! 2086: do ! 2087: { ! 2088: ntsoundBytesProcessed(devPort,task_self(),&progress); ! 2089: } while (progress == oldprogress); ! 2090: snd_basetime = Sys_DoubleTime() - progress/(11025*2); ! 2091: ! 2092: return true; ! 2093: } ! 2094: ! 2095: /* ! 2096: ============== ! 2097: SNDDMA_GetDMAPos ! 2098: ! 2099: return the current sample position (in mono samples read) ! 2100: inside the recirculating dma buffer, so the mixing code will know ! 2101: how many sample are required to fill it up. ! 2102: =============== ! 2103: */ ! 2104: int SNDDMA_GetDMAPos(void) ! 2105: { ! 2106: int progress; ! 2107: ! 2108: #if 0 ! 2109: ntsoundBytesProcessed(devPort,task_self(),&progress); ! 2110: // ntsoundDMACount(devPort,task_self(),&progress); ! 2111: ! 2112: //printf ("(%i / %f) ", progress, (float)(Sys_DoubleTime ())); ! 2113: progress += 2048; ! 2114: progress >>= 1; ! 2115: #else ! 2116: ! 2117: progress = (Sys_DoubleTime() - snd_basetime)*11025*2; ! 2118: progress += 8192; ! 2119: progress &= ~1; ! 2120: #endif ! 2121: ! 2122: progress &= (shm->samples-1); ! 2123: ! 2124: return progress; ! 2125: } ! 2126: ! 2127: ! 2128: /* ! 2129: ============== ! 2130: SNDDMA_Submit ! 2131: ! 2132: Reset the sound device for exiting ! 2133: =============== ! 2134: */ ! 2135: void SNDDMA_Submit(void) ! 2136: { ! 2137: } ! 2138: ! 2139: /* ! 2140: ============== ! 2141: SNDDMA_Shutdown ! 2142: ! 2143: Reset the sound device for exiting ! 2144: =============== ! 2145: */ ! 2146: void SNDDMA_Shutdown(void) ! 2147: { ! 2148: ntsoundStop(devPort,task_self()); ! 2149: ntsoundRelease(devPort,task_self()); ! 2150: } ! 2151:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.