mirror of
https://git.code.sf.net/p/quake/quake2forge
synced 2024-11-10 07:12:01 +00:00
2151 lines
67 KiB
Objective-C
2151 lines
67 KiB
Objective-C
|
|
#import <servers/netname.h>
|
|
#import <libc.h>
|
|
|
|
#include "../client/client.h"
|
|
|
|
double snd_basetime;
|
|
port_t devPort;
|
|
|
|
extern port_t task_self_;
|
|
#define task_self() task_self_
|
|
|
|
//========================================================================
|
|
|
|
#ifndef _ntsoundNTSound
|
|
#define _ntsoundNTSound
|
|
|
|
/* Module NTSound */
|
|
|
|
#include <mach/kern_return.h>
|
|
#include <mach/port.h>
|
|
#include <mach/message.h>
|
|
|
|
#ifndef mig_external
|
|
#define mig_external extern
|
|
#endif
|
|
|
|
#include <mach/std_types.h>
|
|
#include <mach/mach_types.h>
|
|
typedef short *sound_data_t;
|
|
|
|
#define NTSOUNDNAME "NEXTIME_Sound"
|
|
|
|
/* Routine ntsoundAcquire */
|
|
mig_external kern_return_t ntsoundAcquire (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
vm_offset_t *dmaAddress,
|
|
int *dmaSize,
|
|
int *success);
|
|
|
|
/* Routine ntsoundRelease */
|
|
mig_external kern_return_t ntsoundRelease (
|
|
port_t kern_serv_port,
|
|
port_t owner_port);
|
|
|
|
/* Routine ntsoundStart */
|
|
mig_external kern_return_t ntsoundStart (
|
|
port_t kern_serv_port,
|
|
port_t owner_port);
|
|
|
|
/* Routine ntsoundStop */
|
|
mig_external kern_return_t ntsoundStop (
|
|
port_t kern_serv_port,
|
|
port_t owner_port);
|
|
|
|
/* Routine ntsoundConfig */
|
|
mig_external kern_return_t ntsoundConfig (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int channelCount,
|
|
int samplingRate,
|
|
int encoding,
|
|
int useInterrupts);
|
|
|
|
/* Routine ntsoundBytesProcessed */
|
|
mig_external kern_return_t ntsoundBytesProcessed (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int *byte_count);
|
|
|
|
/* Routine ntsoundDMACount */
|
|
mig_external kern_return_t ntsoundDMACount (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int *dma_count);
|
|
|
|
/* Routine ntsoundInterruptCount */
|
|
mig_external kern_return_t ntsoundInterruptCount (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int *irq_count);
|
|
|
|
/* Routine ntsoundWrite */
|
|
mig_external kern_return_t ntsoundWrite (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
sound_data_t data,
|
|
unsigned int dataCnt,
|
|
int *actual_count);
|
|
|
|
/* Routine ntsoundSetVolume */
|
|
mig_external kern_return_t ntsoundSetVolume (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int value);
|
|
|
|
/* Routine ntsoundWireRange */
|
|
mig_external kern_return_t ntsoundWireRange (
|
|
port_t device_port,
|
|
port_t token,
|
|
port_t task,
|
|
vm_offset_t addr,
|
|
vm_size_t size,
|
|
boolean_t wire);
|
|
|
|
#endif _ntsoundNTSound
|
|
|
|
//========================================================================
|
|
|
|
extern port_t name_server_port;
|
|
|
|
#define NX_SoundDeviceParameterKeyBase 0
|
|
#define NX_SoundDeviceParameterValueBase 200
|
|
#define NX_SoundStreamParameterKeyBase 400
|
|
#define NX_SoundStreamParameterValueBase 600
|
|
#define NX_SoundParameterTagMax 799
|
|
|
|
typedef enum _NXSoundParameterTag {
|
|
NX_SoundDeviceBufferSize = NX_SoundDeviceParameterKeyBase,
|
|
NX_SoundDeviceBufferCount,
|
|
NX_SoundDeviceDetectPeaks,
|
|
NX_SoundDeviceRampUp,
|
|
NX_SoundDeviceRampDown,
|
|
NX_SoundDeviceInsertZeros,
|
|
NX_SoundDeviceDeemphasize,
|
|
NX_SoundDeviceMuteSpeaker,
|
|
NX_SoundDeviceMuteHeadphone,
|
|
NX_SoundDeviceMuteLineOut,
|
|
NX_SoundDeviceOutputLoudness,
|
|
NX_SoundDeviceOutputAttenuationStereo,
|
|
NX_SoundDeviceOutputAttenuationLeft,
|
|
NX_SoundDeviceOutputAttenuationRight,
|
|
NX_SoundDeviceAnalogInputSource,
|
|
NX_SoundDeviceMonitorAttenuation,
|
|
NX_SoundDeviceInputGainStereo,
|
|
NX_SoundDeviceInputGainLeft,
|
|
NX_SoundDeviceInputGainRight,
|
|
|
|
NX_SoundDeviceAnalogInputSource_Microphone
|
|
= NX_SoundDeviceParameterValueBase,
|
|
NX_SoundDeviceAnalogInputSource_LineIn,
|
|
|
|
NX_SoundStreamDataEncoding = NX_SoundStreamParameterKeyBase,
|
|
NX_SoundStreamSamplingRate,
|
|
NX_SoundStreamChannelCount,
|
|
NX_SoundStreamHighWaterMark,
|
|
NX_SoundStreamLowWaterMark,
|
|
NX_SoundStreamSource,
|
|
NX_SoundStreamSink,
|
|
NX_SoundStreamDetectPeaks,
|
|
NX_SoundStreamGainStereo,
|
|
NX_SoundStreamGainLeft,
|
|
NX_SoundStreamGainRight,
|
|
|
|
NX_SoundStreamDataEncoding_Linear16 = NX_SoundStreamParameterValueBase,
|
|
NX_SoundStreamDataEncoding_Linear8,
|
|
NX_SoundStreamDataEncoding_Mulaw8,
|
|
NX_SoundStreamDataEncoding_Alaw8,
|
|
NX_SoundStreamDataEncoding_AES,
|
|
NX_SoundStreamSource_Analog,
|
|
NX_SoundStreamSource_AES,
|
|
NX_SoundStreamSink_Analog,
|
|
NX_SoundStreamSink_AES
|
|
} NXSoundParameterTag;
|
|
|
|
//========================================================================
|
|
|
|
//#include "NTSound.h"
|
|
#include <mach/mach_types.h>
|
|
#include <mach/message.h>
|
|
#include <mach/mig_errors.h>
|
|
#include <mach/msg_type.h>
|
|
#if !defined(KERNEL) && !defined(MIG_NO_STRINGS)
|
|
#include <strings.h>
|
|
#endif
|
|
/* LINTLIBRARY */
|
|
|
|
extern port_t mig_get_reply_port();
|
|
extern void mig_dealloc_reply_port();
|
|
|
|
#ifndef mig_internal
|
|
#define mig_internal static
|
|
#endif
|
|
|
|
#ifndef TypeCheck
|
|
#define TypeCheck 1
|
|
#endif
|
|
|
|
#ifndef UseExternRCSId
|
|
#ifdef hc
|
|
#define UseExternRCSId 1
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef UseStaticMsgType
|
|
#if !defined(hc) || defined(__STDC__)
|
|
#define UseStaticMsgType 1
|
|
#endif
|
|
#endif
|
|
|
|
#define msg_request_port msg_remote_port
|
|
#define msg_reply_port msg_local_port
|
|
|
|
|
|
/* Routine Acquire */
|
|
mig_external kern_return_t ntsoundAcquire (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
vm_offset_t *dmaAddress,
|
|
int *dmaSize,
|
|
int *success)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
msg_type_t dmaAddressType;
|
|
vm_offset_t dmaAddress;
|
|
msg_type_t dmaSizeType;
|
|
int dmaSize;
|
|
msg_type_t successType;
|
|
int success;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 32;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t dmaAddressCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t dmaSizeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t successCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1008;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1108)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 56) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->dmaAddressType != * (int *) &dmaAddressCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->dmaAddressType.msg_type_inline != TRUE) ||
|
|
(OutP->dmaAddressType.msg_type_longform != FALSE) ||
|
|
(OutP->dmaAddressType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->dmaAddressType.msg_type_number != 1) ||
|
|
(OutP->dmaAddressType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
*dmaAddress /* dmaAddress */ = /* *dmaAddress */ OutP->dmaAddress;
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->dmaSizeType != * (int *) &dmaSizeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->dmaSizeType.msg_type_inline != TRUE) ||
|
|
(OutP->dmaSizeType.msg_type_longform != FALSE) ||
|
|
(OutP->dmaSizeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->dmaSizeType.msg_type_number != 1) ||
|
|
(OutP->dmaSizeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
*dmaSize /* dmaSize */ = /* *dmaSize */ OutP->dmaSize;
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->successType != * (int *) &successCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->successType.msg_type_inline != TRUE) ||
|
|
(OutP->successType.msg_type_longform != FALSE) ||
|
|
(OutP->successType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->successType.msg_type_number != 1) ||
|
|
(OutP->successType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
*success /* success */ = /* *success */ OutP->success;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine Release */
|
|
mig_external kern_return_t ntsoundRelease (
|
|
port_t kern_serv_port,
|
|
port_t owner_port)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 32;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1009;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1109)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 32) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine Start */
|
|
mig_external kern_return_t ntsoundStart (
|
|
port_t kern_serv_port,
|
|
port_t owner_port)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 32;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1010;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1110)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 32) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine Stop */
|
|
mig_external kern_return_t ntsoundStop (
|
|
port_t kern_serv_port,
|
|
port_t owner_port)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 32;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1011;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1111)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 32) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine Config */
|
|
mig_external kern_return_t ntsoundConfig (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int channelCount,
|
|
int samplingRate,
|
|
int encoding,
|
|
int useInterrupts)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
msg_type_t channelCountType;
|
|
int channelCount;
|
|
msg_type_t samplingRateType;
|
|
int samplingRate;
|
|
msg_type_t encodingType;
|
|
int encoding;
|
|
msg_type_t useInterruptsType;
|
|
int useInterrupts;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 64;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t channelCountType = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t samplingRateType = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t encodingType = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t useInterruptsType = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
#if UseStaticMsgType
|
|
InP->channelCountType = channelCountType;
|
|
#else UseStaticMsgType
|
|
InP->channelCountType.msg_type_name = MSG_TYPE_INTEGER_32;
|
|
InP->channelCountType.msg_type_size = 32;
|
|
InP->channelCountType.msg_type_number = 1;
|
|
InP->channelCountType.msg_type_inline = TRUE;
|
|
InP->channelCountType.msg_type_longform = FALSE;
|
|
InP->channelCountType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->channelCount /* channelCount */ = /* channelCount */ channelCount;
|
|
|
|
#if UseStaticMsgType
|
|
InP->samplingRateType = samplingRateType;
|
|
#else UseStaticMsgType
|
|
InP->samplingRateType.msg_type_name = MSG_TYPE_INTEGER_32;
|
|
InP->samplingRateType.msg_type_size = 32;
|
|
InP->samplingRateType.msg_type_number = 1;
|
|
InP->samplingRateType.msg_type_inline = TRUE;
|
|
InP->samplingRateType.msg_type_longform = FALSE;
|
|
InP->samplingRateType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->samplingRate /* samplingRate */ = /* samplingRate */ samplingRate;
|
|
|
|
#if UseStaticMsgType
|
|
InP->encodingType = encodingType;
|
|
#else UseStaticMsgType
|
|
InP->encodingType.msg_type_name = MSG_TYPE_INTEGER_32;
|
|
InP->encodingType.msg_type_size = 32;
|
|
InP->encodingType.msg_type_number = 1;
|
|
InP->encodingType.msg_type_inline = TRUE;
|
|
InP->encodingType.msg_type_longform = FALSE;
|
|
InP->encodingType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->encoding /* encoding */ = /* encoding */ encoding;
|
|
|
|
#if UseStaticMsgType
|
|
InP->useInterruptsType = useInterruptsType;
|
|
#else UseStaticMsgType
|
|
InP->useInterruptsType.msg_type_name = MSG_TYPE_INTEGER_32;
|
|
InP->useInterruptsType.msg_type_size = 32;
|
|
InP->useInterruptsType.msg_type_number = 1;
|
|
InP->useInterruptsType.msg_type_inline = TRUE;
|
|
InP->useInterruptsType.msg_type_longform = FALSE;
|
|
InP->useInterruptsType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->useInterrupts /* useInterrupts */ = /* useInterrupts */ useInterrupts;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1012;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1112)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 32) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine BytesProcessed */
|
|
mig_external kern_return_t ntsoundBytesProcessed (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int *byte_count)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
msg_type_t byte_countType;
|
|
int byte_count;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 32;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t byte_countCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1013;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1113)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 40) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->byte_countType != * (int *) &byte_countCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->byte_countType.msg_type_inline != TRUE) ||
|
|
(OutP->byte_countType.msg_type_longform != FALSE) ||
|
|
(OutP->byte_countType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->byte_countType.msg_type_number != 1) ||
|
|
(OutP->byte_countType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
*byte_count /* byte_count */ = /* *byte_count */ OutP->byte_count;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine DMACount */
|
|
mig_external kern_return_t ntsoundDMACount (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int *dma_count)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
msg_type_t dma_countType;
|
|
int dma_count;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 32;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t dma_countCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1014;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1114)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 40) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->dma_countType != * (int *) &dma_countCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->dma_countType.msg_type_inline != TRUE) ||
|
|
(OutP->dma_countType.msg_type_longform != FALSE) ||
|
|
(OutP->dma_countType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->dma_countType.msg_type_number != 1) ||
|
|
(OutP->dma_countType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
*dma_count /* dma_count */ = /* *dma_count */ OutP->dma_count;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine InterruptCount */
|
|
mig_external kern_return_t ntsoundInterruptCount (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int *irq_count)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
msg_type_t irq_countType;
|
|
int irq_count;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 32;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t irq_countCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1015;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1115)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 40) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->irq_countType != * (int *) &irq_countCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->irq_countType.msg_type_inline != TRUE) ||
|
|
(OutP->irq_countType.msg_type_longform != FALSE) ||
|
|
(OutP->irq_countType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->irq_countType.msg_type_number != 1) ||
|
|
(OutP->irq_countType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
*irq_count /* irq_count */ = /* *irq_count */ OutP->irq_count;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine Write */
|
|
mig_external kern_return_t ntsoundWrite (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
sound_data_t data,
|
|
unsigned int dataCnt,
|
|
int *actual_count)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
msg_type_long_t dataType;
|
|
short data[7000];
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
msg_type_t actual_countType;
|
|
int actual_count;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 44;
|
|
/* Maximum request size 14044 */
|
|
unsigned int msg_size_delta;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_long_t dataType = {
|
|
{
|
|
/* msg_type_name = */ 0,
|
|
/* msg_type_size = */ 0,
|
|
/* msg_type_number = */ 0,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ TRUE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
},
|
|
/* msg_type_long_name = */ MSG_TYPE_INTEGER_16,
|
|
/* msg_type_long_size = */ 16,
|
|
/* msg_type_long_number = */ 7000,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t actual_countCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
#if UseStaticMsgType
|
|
InP->dataType = dataType;
|
|
#else UseStaticMsgType
|
|
InP->dataType.msg_type_long_name = MSG_TYPE_INTEGER_16;
|
|
InP->dataType.msg_type_long_size = 16;
|
|
InP->dataType.msg_type_header.msg_type_inline = TRUE;
|
|
InP->dataType.msg_type_header.msg_type_longform = TRUE;
|
|
InP->dataType.msg_type_header.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
if (dataCnt > 7000)
|
|
return MIG_ARRAY_TOO_LARGE;
|
|
bcopy((char *) data, (char *) InP->data, 2 * dataCnt);
|
|
|
|
InP->dataType.msg_type_long_number /* dataCnt */ = /* dataType.msg_type_long_number */ dataCnt;
|
|
|
|
msg_size_delta = (2 * dataCnt + 3) & ~3;
|
|
msg_size += msg_size_delta;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1016;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1116)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 40) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->actual_countType != * (int *) &actual_countCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->actual_countType.msg_type_inline != TRUE) ||
|
|
(OutP->actual_countType.msg_type_longform != FALSE) ||
|
|
(OutP->actual_countType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->actual_countType.msg_type_number != 1) ||
|
|
(OutP->actual_countType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
*actual_count /* actual_count */ = /* *actual_count */ OutP->actual_count;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine SetVolume */
|
|
mig_external kern_return_t ntsoundSetVolume (
|
|
port_t kern_serv_port,
|
|
port_t owner_port,
|
|
int value)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t owner_portType;
|
|
port_t owner_port;
|
|
msg_type_t valueType;
|
|
int value;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 40;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t owner_portType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t valueType = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->owner_portType = owner_portType;
|
|
#else UseStaticMsgType
|
|
InP->owner_portType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->owner_portType.msg_type_size = 32;
|
|
InP->owner_portType.msg_type_number = 1;
|
|
InP->owner_portType.msg_type_inline = TRUE;
|
|
InP->owner_portType.msg_type_longform = FALSE;
|
|
InP->owner_portType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->owner_port /* owner_port */ = /* owner_port */ owner_port;
|
|
|
|
#if UseStaticMsgType
|
|
InP->valueType = valueType;
|
|
#else UseStaticMsgType
|
|
InP->valueType.msg_type_name = MSG_TYPE_INTEGER_32;
|
|
InP->valueType.msg_type_size = 32;
|
|
InP->valueType.msg_type_number = 1;
|
|
InP->valueType.msg_type_inline = TRUE;
|
|
InP->valueType.msg_type_longform = FALSE;
|
|
InP->valueType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->value /* value */ = /* value */ value;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = kern_serv_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1017;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1117)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 32) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
/* Routine WireRange */
|
|
mig_external kern_return_t ntsoundWireRange (
|
|
port_t device_port,
|
|
port_t token,
|
|
port_t task,
|
|
vm_offset_t addr,
|
|
vm_size_t size,
|
|
boolean_t wire)
|
|
{
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t tokenType;
|
|
port_t token;
|
|
msg_type_t taskType;
|
|
port_t task;
|
|
msg_type_t addrType;
|
|
vm_offset_t addr;
|
|
msg_type_t sizeType;
|
|
vm_size_t size;
|
|
msg_type_t wireType;
|
|
boolean_t wire;
|
|
} Request;
|
|
|
|
typedef struct {
|
|
msg_header_t Head;
|
|
msg_type_t RetCodeType;
|
|
kern_return_t RetCode;
|
|
} Reply;
|
|
|
|
union {
|
|
Request In;
|
|
Reply Out;
|
|
} Mess;
|
|
|
|
register Request *InP = &Mess.In;
|
|
register Reply *OutP = &Mess.Out;
|
|
|
|
msg_return_t msg_result;
|
|
|
|
#if TypeCheck
|
|
boolean_t msg_simple;
|
|
#endif TypeCheck
|
|
|
|
unsigned int msg_size = 64;
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t tokenType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t taskType = {
|
|
/* msg_type_name = */ MSG_TYPE_PORT,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t addrType = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t sizeType = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t wireType = {
|
|
/* msg_type_name = */ MSG_TYPE_BOOLEAN,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0,
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
static const msg_type_t RetCodeCheck = {
|
|
/* msg_type_name = */ MSG_TYPE_INTEGER_32,
|
|
/* msg_type_size = */ 32,
|
|
/* msg_type_number = */ 1,
|
|
/* msg_type_inline = */ TRUE,
|
|
/* msg_type_longform = */ FALSE,
|
|
/* msg_type_deallocate = */ FALSE,
|
|
/* msg_type_unused = */ 0
|
|
};
|
|
#endif UseStaticMsgType
|
|
|
|
#if UseStaticMsgType
|
|
InP->tokenType = tokenType;
|
|
#else UseStaticMsgType
|
|
InP->tokenType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->tokenType.msg_type_size = 32;
|
|
InP->tokenType.msg_type_number = 1;
|
|
InP->tokenType.msg_type_inline = TRUE;
|
|
InP->tokenType.msg_type_longform = FALSE;
|
|
InP->tokenType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->token /* token */ = /* token */ token;
|
|
|
|
#if UseStaticMsgType
|
|
InP->taskType = taskType;
|
|
#else UseStaticMsgType
|
|
InP->taskType.msg_type_name = MSG_TYPE_PORT;
|
|
InP->taskType.msg_type_size = 32;
|
|
InP->taskType.msg_type_number = 1;
|
|
InP->taskType.msg_type_inline = TRUE;
|
|
InP->taskType.msg_type_longform = FALSE;
|
|
InP->taskType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->task /* task */ = /* task */ task;
|
|
|
|
#if UseStaticMsgType
|
|
InP->addrType = addrType;
|
|
#else UseStaticMsgType
|
|
InP->addrType.msg_type_name = MSG_TYPE_INTEGER_32;
|
|
InP->addrType.msg_type_size = 32;
|
|
InP->addrType.msg_type_number = 1;
|
|
InP->addrType.msg_type_inline = TRUE;
|
|
InP->addrType.msg_type_longform = FALSE;
|
|
InP->addrType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->addr /* addr */ = /* addr */ addr;
|
|
|
|
#if UseStaticMsgType
|
|
InP->sizeType = sizeType;
|
|
#else UseStaticMsgType
|
|
InP->sizeType.msg_type_name = MSG_TYPE_INTEGER_32;
|
|
InP->sizeType.msg_type_size = 32;
|
|
InP->sizeType.msg_type_number = 1;
|
|
InP->sizeType.msg_type_inline = TRUE;
|
|
InP->sizeType.msg_type_longform = FALSE;
|
|
InP->sizeType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->size /* size */ = /* size */ size;
|
|
|
|
#if UseStaticMsgType
|
|
InP->wireType = wireType;
|
|
#else UseStaticMsgType
|
|
InP->wireType.msg_type_name = MSG_TYPE_BOOLEAN;
|
|
InP->wireType.msg_type_size = 32;
|
|
InP->wireType.msg_type_number = 1;
|
|
InP->wireType.msg_type_inline = TRUE;
|
|
InP->wireType.msg_type_longform = FALSE;
|
|
InP->wireType.msg_type_deallocate = FALSE;
|
|
#endif UseStaticMsgType
|
|
|
|
InP->wire /* wire */ = /* wire */ wire;
|
|
|
|
InP->Head.msg_simple = FALSE;
|
|
InP->Head.msg_size = msg_size;
|
|
InP->Head.msg_type = MSG_TYPE_NORMAL | MSG_TYPE_RPC;
|
|
InP->Head.msg_request_port = device_port;
|
|
InP->Head.msg_reply_port = mig_get_reply_port();
|
|
InP->Head.msg_id = 1018;
|
|
|
|
msg_result = msg_rpc(&InP->Head, MSG_OPTION_NONE, sizeof(Reply), 0, 0);
|
|
if (msg_result != RPC_SUCCESS) {
|
|
if (msg_result == RCV_INVALID_PORT)
|
|
mig_dealloc_reply_port();
|
|
return msg_result;
|
|
}
|
|
|
|
#if TypeCheck
|
|
msg_size = OutP->Head.msg_size;
|
|
msg_simple = OutP->Head.msg_simple;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->Head.msg_id != 1118)
|
|
return MIG_REPLY_MISMATCH;
|
|
|
|
#if TypeCheck
|
|
if (((msg_size != 32) || (msg_simple != TRUE)) &&
|
|
((msg_size != sizeof(death_pill_t)) ||
|
|
(msg_simple != TRUE) ||
|
|
(OutP->RetCode == KERN_SUCCESS)))
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
#if TypeCheck
|
|
#if UseStaticMsgType
|
|
if (* (int *) &OutP->RetCodeType != * (int *) &RetCodeCheck)
|
|
#else UseStaticMsgType
|
|
if ((OutP->RetCodeType.msg_type_inline != TRUE) ||
|
|
(OutP->RetCodeType.msg_type_longform != FALSE) ||
|
|
(OutP->RetCodeType.msg_type_name != MSG_TYPE_INTEGER_32) ||
|
|
(OutP->RetCodeType.msg_type_number != 1) ||
|
|
(OutP->RetCodeType.msg_type_size != 32))
|
|
#endif UseStaticMsgType
|
|
return MIG_TYPE_ERROR;
|
|
#endif TypeCheck
|
|
|
|
if (OutP->RetCode != KERN_SUCCESS)
|
|
return OutP->RetCode;
|
|
|
|
return OutP->RetCode;
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
/*
|
|
==================
|
|
SNDDMA_Init
|
|
|
|
Try to find a sound device to mix for.
|
|
Returns false if nothing is found.
|
|
==================
|
|
*/
|
|
qboolean SNDDMA_Init(void)
|
|
{
|
|
int err;
|
|
int i;
|
|
byte *buf;
|
|
int bufsize;
|
|
int progress, oldprogress;
|
|
|
|
shm = &sn;
|
|
shm->channels = 2;
|
|
shm->samplebits = 16;
|
|
shm->speed = 11025;
|
|
|
|
err = netname_look_up(name_server_port,"", NTSOUNDNAME,&devPort);
|
|
if (err)
|
|
{
|
|
Com_Printf("SNDDMA_Init: Cannot access theater driver\n");
|
|
return false;
|
|
}
|
|
|
|
err = ntsoundAcquire(devPort,task_self(),(vm_offset_t *)&buf,&bufsize,&i);
|
|
if (err || !i)
|
|
{
|
|
Com_Printf("SNDDMA_Init: Sound driver is busy or messed up\n");
|
|
return false;
|
|
}
|
|
|
|
err = ntsoundConfig(devPort,task_self(),shm->channels,(int)shm->speed,
|
|
NX_SoundStreamDataEncoding_Linear16, 1);
|
|
if (err)
|
|
{
|
|
Com_Printf("SNDDMA_Init: ntsoundConfig error: %d\n",err);
|
|
return false;
|
|
}
|
|
else
|
|
Com_Printf("SNDDMA_Init: Configured for %d Hz, %d channels\n"
|
|
,(int)shm->speed,shm->channels);
|
|
// printf ("buf: 0x%x\n", buf);
|
|
// printf ("bufsize: %d\n", bufsize);
|
|
|
|
bzero(buf,bufsize);
|
|
|
|
// ntsoundSetVolume(devPort,task_self(),5);
|
|
ntsoundStart(devPort,task_self());
|
|
|
|
shm->soundalive = true;
|
|
shm->splitbuffer = false;
|
|
shm->samples = bufsize/(shm->samplebits/8);
|
|
shm->samplepos = 0;
|
|
shm->submission_chunk = 1;
|
|
shm->buffer = buf;
|
|
|
|
//
|
|
// find a buffer crossing point for pos testing
|
|
//
|
|
|
|
ntsoundBytesProcessed(devPort,task_self(),&oldprogress);
|
|
do
|
|
{
|
|
ntsoundBytesProcessed(devPort,task_self(),&progress);
|
|
} while (progress == oldprogress);
|
|
snd_basetime = Sys_DoubleTime() - progress/(11025*2);
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
==============
|
|
SNDDMA_GetDMAPos
|
|
|
|
return the current sample position (in mono samples read)
|
|
inside the recirculating dma buffer, so the mixing code will know
|
|
how many sample are required to fill it up.
|
|
===============
|
|
*/
|
|
int SNDDMA_GetDMAPos(void)
|
|
{
|
|
int progress;
|
|
|
|
#if 0
|
|
ntsoundBytesProcessed(devPort,task_self(),&progress);
|
|
// ntsoundDMACount(devPort,task_self(),&progress);
|
|
|
|
//printf ("(%i / %f) ", progress, (float)(Sys_DoubleTime ()));
|
|
progress += 2048;
|
|
progress >>= 1;
|
|
#else
|
|
|
|
progress = (Sys_DoubleTime() - snd_basetime)*11025*2;
|
|
progress += 8192;
|
|
progress &= ~1;
|
|
#endif
|
|
|
|
progress &= (shm->samples-1);
|
|
|
|
return progress;
|
|
}
|
|
|
|
|
|
/*
|
|
==============
|
|
SNDDMA_Submit
|
|
|
|
Reset the sound device for exiting
|
|
===============
|
|
*/
|
|
void SNDDMA_Submit(void)
|
|
{
|
|
}
|
|
|
|
/*
|
|
==============
|
|
SNDDMA_Shutdown
|
|
|
|
Reset the sound device for exiting
|
|
===============
|
|
*/
|
|
void SNDDMA_Shutdown(void)
|
|
{
|
|
ntsoundStop(devPort,task_self());
|
|
ntsoundRelease(devPort,task_self());
|
|
}
|
|
|