/*
     File:       Sound.h
 
     Contains:   Sound Manager Interfaces.
 
     Version:    Technology: Sound Manager 3.6.7
                 Release:    QuickTime 6.0.2
 
     Copyright:  (c) 1986-2001 by Apple Computer, Inc., all rights reserved
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __SOUND__
#define __SOUND__

#ifndef __MACTYPES__
#include "MacTypes.h"
#endif

#ifndef __DIALOGS__
#include "Dialogs.h"
#endif

#ifndef __COMPONENTS__
#include "Components.h"
#endif

#ifndef __MIXEDMODE__
#include "MixedMode.h"
#endif


/* For TimeRecord et al.  Once we're using the latest MacTypes.i, we should no longer need this.*/
#ifndef __MOVIES__
#include "Movies.h"
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

/*
                        * * *  N O T E  * * *

    This file has been updated to include Sound Manager 3.3 interfaces.

    Some of the Sound Manager 3.0 interfaces were not put into the InterfaceLib
    that originally shipped with the PowerMacs. These missing functions and the
    new 3.3 interfaces have been released in the SoundLib library for PowerPC
    developers to link with. The runtime library for these functions are
    installed by the Sound Manager. The following functions are found in SoundLib.

        GetCompressionInfo(), GetSoundPreference(), SetSoundPreference(),
        UnsignedFixedMulDiv(), SndGetInfo(), SndSetInfo(), GetSoundOutputInfo(),
        SetSoundOutputInfo(), GetCompressionName(), SoundConverterOpen(),
        SoundConverterClose(), SoundConverterGetBufferSizes(), SoundConverterBeginConversion(),
        SoundConverterConvertBuffer(), SoundConverterEndConversion(),
        AudioGetBass(), AudioGetInfo(), AudioGetMute(), AudioGetOutputDevice(),
        AudioGetTreble(), AudioGetVolume(), AudioMuteOnEvent(), AudioSetBass(),
        AudioSetMute(), AudioSetToDefaults(), AudioSetTreble(), AudioSetVolume(),
        OpenMixerSoundComponent(), CloseMixerSoundComponent(), SoundComponentAddSource(),
        SoundComponentGetInfo(), SoundComponentGetSource(), SoundComponentGetSourceData(),
        SoundComponentInitOutputDevice(), SoundComponentPauseSource(),
        SoundComponentPlaySourceBuffer(), SoundComponentRemoveSource(),
        SoundComponentSetInfo(), SoundComponentSetOutput(), SoundComponentSetSource(),
        SoundComponentStartSource(), SoundComponentStopSource(),
        ParseAIFFHeader(), ParseSndHeader(), SoundConverterGetInfo(), SoundConverterSetInfo()
*/
/*
    Interfaces for Sound Driver, !!! OBSOLETE and NOT SUPPORTED !!!

    These items are no longer defined, but appear here so that someone
    searching the interfaces might find them. If you are using one of these
    items, you must change your code to support the Sound Manager.

        swMode, ftMode, ffMode
        FreeWave, FFSynthRec, Tone, SWSynthRec, Wave, FTSoundRec
        SndCompletionProcPtr
        StartSound, StopSound, SoundDone
        SetSoundVol, GetSoundVol
*/
/*
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   constants
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
#define twelfthRootTwo 1.05946309435

enum {
    soundListRsrc               = FOUR_CHAR_CODE('snd '),       /*Resource type used by Sound Manager*/
    kSoundCodecInfoResourceType = FOUR_CHAR_CODE('snfo')        /*Resource type holding codec information (optional public component resource)*/
};

enum {
    kSimpleBeepID               = 1                             /*reserved resource ID for Simple Beep*/
};

enum {
    rate48khz                   = (long)0xBB800000,             /*48000.00000 in fixed-point*/
    rate44khz                   = (long)0xAC440000,             /*44100.00000 in fixed-point*/
    rate32khz                   = 0x7D000000,                   /*32000.00000 in fixed-point*/
    rate22050hz                 = 0x56220000,                   /*22050.00000 in fixed-point*/
    rate22khz                   = 0x56EE8BA3,                   /*22254.54545 in fixed-point*/
    rate16khz                   = 0x3E800000,                   /*16000.00000 in fixed-point*/
    rate11khz                   = 0x2B7745D1,                   /*11127.27273 in fixed-point*/
    rate11025hz                 = 0x2B110000,                   /*11025.00000 in fixed-point*/
    rate8khz                    = 0x1F400000                    /* 8000.00000 in fixed-point*/
};

/*synthesizer numbers for SndNewChannel*/
enum {
    sampledSynth                = 5                             /*sampled sound synthesizer*/
};

#if CALL_NOT_IN_CARBON
enum {
    squareWaveSynth             = 1,                            /*square wave synthesizer*/
    waveTableSynth              = 3,                            /*wave table synthesizer*/
                                                                /*old Sound Manager MACE synthesizer numbers*/
    MACE3snthID                 = 11,
    MACE6snthID                 = 13
};

#endif  /* CALL_NOT_IN_CARBON */

enum {
    kMiddleC                    = 60                            /*MIDI note value for middle C*/
};

enum {
    kNoVolume                   = 0,                            /*setting for no sound volume*/
    kFullVolume                 = 0x0100                        /*1.0, setting for full hardware output volume*/
};

enum {
    stdQLength                  = 128
};

enum {
    dataOffsetFlag              = 0x8000
};

enum {
    kUseOptionalOutputDevice    = -1                            /*only for Sound Manager 3.0 or later*/
};

enum {
    notCompressed               = 0,                            /*compression ID's*/
    fixedCompression            = -1,                           /*compression ID for fixed-sized compression*/
    variableCompression         = -2                            /*compression ID for variable-sized compression*/
};

enum {
    twoToOne                    = 1,
    eightToThree                = 2,
    threeToOne                  = 3,
    sixToOne                    = 4,
    sixToOnePacketSize          = 8,
    threeToOnePacketSize        = 16
};

enum {
    stateBlockSize              = 64,
    leftOverBlockSize           = 32
};

enum {
    firstSoundFormat            = 0x0001,                       /*general sound format*/
    secondSoundFormat           = 0x0002                        /*special sampled sound format (HyperCard)*/
};

#if CALL_NOT_IN_CARBON
enum {
    dbBufferReady               = 0x00000001,                   /*double buffer is filled*/
    dbLastBuffer                = 0x00000004                    /*last double buffer to play*/
};

#endif  /* CALL_NOT_IN_CARBON */

enum {
    sysBeepDisable              = 0x0000,                       /*SysBeep() enable flags*/
    sysBeepEnable               = (1 << 0),
    sysBeepSynchronous          = (1 << 1)                      /*if bit set, make alert sounds synchronous*/
};

enum {
    unitTypeNoSelection         = 0xFFFF,                       /*unitTypes for AudioSelection.unitType*/
    unitTypeSeconds             = 0x0000
};

enum {
    stdSH                       = 0x00,                         /*Standard sound header encode value*/
    extSH                       = 0xFF,                         /*Extended sound header encode value*/
    cmpSH                       = 0xFE                          /*Compressed sound header encode value*/
};

/*command numbers for SndDoCommand and SndDoImmediate*/
enum {
    nullCmd                     = 0,
    quietCmd                    = 3,
    flushCmd                    = 4,
    reInitCmd                   = 5,
    waitCmd                     = 10,
    pauseCmd                    = 11,
    resumeCmd                   = 12,
    callBackCmd                 = 13,
    syncCmd                     = 14,
    availableCmd                = 24,
    versionCmd                  = 25,
    volumeCmd                   = 46,                           /*sound manager 3.0 or later only*/
    getVolumeCmd                = 47,                           /*sound manager 3.0 or later only*/
    clockComponentCmd           = 50,                           /*sound manager 3.2.1 or later only*/
    getClockComponentCmd        = 51,                           /*sound manager 3.2.1 or later only*/
    scheduledSoundCmd           = 52,                           /*sound manager 3.3 or later only*/
    linkSoundComponentsCmd      = 53,                           /*sound manager 3.3 or later only*/
    soundCmd                    = 80,
    bufferCmd                   = 81,
    rateMultiplierCmd           = 86,
    getRateMultiplierCmd        = 87
};

#if CALL_NOT_IN_CARBON
/*command numbers for SndDoCommand and SndDoImmediate that are not available for use in Carbon */
enum {
    initCmd                     = 1,
    freeCmd                     = 2,
    totalLoadCmd                = 26,
    loadCmd                     = 27,
    freqDurationCmd             = 40,
    restCmd                     = 41,
    freqCmd                     = 42,
    ampCmd                      = 43,
    timbreCmd                   = 44,
    getAmpCmd                   = 45,
    waveTableCmd                = 60,
    phaseCmd                    = 61,
    rateCmd                     = 82,
    continueCmd                 = 83,
    doubleBufferCmd             = 84,
    getRateCmd                  = 85,
    sizeCmd                     = 90,                           /*obsolete command*/
    convertCmd                  = 91                            /*obsolete MACE command*/
};

#endif  /* CALL_NOT_IN_CARBON */

#if OLDROUTINENAMES
/*channel initialization parameters*/
enum {
    waveInitChannelMask         = 0x07,
    waveInitChannel0            = 0x04,                         /*wave table only, Sound Manager 2.0 and earlier*/
    waveInitChannel1            = 0x05,                         /*wave table only, Sound Manager 2.0 and earlier*/
    waveInitChannel2            = 0x06,                         /*wave table only, Sound Manager 2.0 and earlier*/
    waveInitChannel3            = 0x07,                         /*wave table only, Sound Manager 2.0 and earlier*/
    initChan0                   = waveInitChannel0,             /*obsolete spelling*/
    initChan1                   = waveInitChannel1,             /*obsolete spelling*/
    initChan2                   = waveInitChannel2,             /*obsolete spelling*/
    initChan3                   = waveInitChannel3              /*obsolete spelling*/
};

enum {
    outsideCmpSH                = 0,                            /*obsolete MACE constant*/
    insideCmpSH                 = 1,                            /*obsolete MACE constant*/
    aceSuccess                  = 0,                            /*obsolete MACE constant*/
    aceMemFull                  = 1,                            /*obsolete MACE constant*/
    aceNilBlock                 = 2,                            /*obsolete MACE constant*/
    aceBadComp                  = 3,                            /*obsolete MACE constant*/
    aceBadEncode                = 4,                            /*obsolete MACE constant*/
    aceBadDest                  = 5,                            /*obsolete MACE constant*/
    aceBadCmd                   = 6                             /*obsolete MACE constant*/
};

#endif  /* OLDROUTINENAMES */

enum {
    initChanLeft                = 0x0002,                       /*left stereo channel*/
    initChanRight               = 0x0003,                       /*right stereo channel*/
    initNoInterp                = 0x0004,                       /*no linear interpolation*/
    initNoDrop                  = 0x0008,                       /*no drop-sample conversion*/
    initMono                    = 0x0080,                       /*monophonic channel*/
    initStereo                  = 0x00C0,                       /*stereo channel*/
    initMACE3                   = 0x0300,                       /*MACE 3:1*/
    initMACE6                   = 0x0400,                       /*MACE 6:1*/
    initPanMask                 = 0x0003,                       /*mask for right/left pan values*/
    initSRateMask               = 0x0030,                       /*mask for sample rate values*/
    initStereoMask              = 0x00C0,                       /*mask for mono/stereo values*/
    initCompMask                = 0xFF00                        /*mask for compression IDs*/
};

/*Get&Set Sound Information Selectors*/
enum {
    siActiveChannels            = FOUR_CHAR_CODE('chac'),       /*active channels*/
    siActiveLevels              = FOUR_CHAR_CODE('lmac'),       /*active meter levels*/
    siAGCOnOff                  = FOUR_CHAR_CODE('agc '),       /*automatic gain control state*/
    siAsync                     = FOUR_CHAR_CODE('asyn'),       /*asynchronous capability*/
    siAVDisplayBehavior         = FOUR_CHAR_CODE('avdb'),
    siChannelAvailable          = FOUR_CHAR_CODE('chav'),       /*number of channels available*/
    siCompressionAvailable      = FOUR_CHAR_CODE('cmav'),       /*compression types available*/
    siCompressionFactor         = FOUR_CHAR_CODE('cmfa'),       /*current compression factor*/
    siCompressionHeader         = FOUR_CHAR_CODE('cmhd'),       /*return compression header*/
    siCompressionNames          = FOUR_CHAR_CODE('cnam'),       /*compression type names available*/
    siCompressionParams         = FOUR_CHAR_CODE('evaw'),       /*compression parameters*/
    siCompressionSampleRate     = FOUR_CHAR_CODE('cprt'),       /* SetInfo only: compressor's sample rate*/
    siCompressionChannels       = FOUR_CHAR_CODE('cpct'),       /* SetInfo only: compressor's number of channels*/
    siCompressionOutputSampleRate = FOUR_CHAR_CODE('cort'),     /* GetInfo only: only implemented by compressors that have differing in and out rates */
    siCompressionInputRateList  = FOUR_CHAR_CODE('crtl'),       /* GetInfo only: only implemented by compressors that only take certain input rates */
    siCompressionType           = FOUR_CHAR_CODE('comp'),       /*current compression type*/
    siCompressionConfiguration  = FOUR_CHAR_CODE('ccfg'),       /*compression extensions*/
    siContinuous                = FOUR_CHAR_CODE('cont'),       /*continous recording*/
    siDecompressionParams       = FOUR_CHAR_CODE('wave'),       /*decompression parameters*/
    siDecompressionConfiguration = FOUR_CHAR_CODE('dcfg'),      /*decompression extensions*/
    siDeviceBufferInfo          = FOUR_CHAR_CODE('dbin'),       /*size of interrupt buffer*/
    siDeviceConnected           = FOUR_CHAR_CODE('dcon'),       /*input device connection status*/
    siDeviceIcon                = FOUR_CHAR_CODE('icon'),       /*input device icon*/
    siDeviceName                = FOUR_CHAR_CODE('name'),       /*input device name*/
    siEQSpectrumBands           = FOUR_CHAR_CODE('eqsb'),       /* number of spectrum bands*/
    siEQSpectrumLevels          = FOUR_CHAR_CODE('eqlv'),       /* gets spectum meter levels*/
    siEQSpectrumOnOff           = FOUR_CHAR_CODE('eqlo'),       /* turn on/off spectum meter levels*/
    siEQSpectrumResolution      = FOUR_CHAR_CODE('eqrs'),       /* set the resolution of the FFT, 0 = low res (<=16 bands), 1 = high res (16-64 bands)*/
    siEQToneControlGain         = FOUR_CHAR_CODE('eqtg'),       /* set the bass and treble gain*/
    siEQToneControlOnOff        = FOUR_CHAR_CODE('eqtc'),       /* turn on equalizer attenuation*/
    siHardwareBalance           = FOUR_CHAR_CODE('hbal'),
    siHardwareBalanceSteps      = FOUR_CHAR_CODE('hbls'),
    siHardwareBass              = FOUR_CHAR_CODE('hbas'),
    siHardwareBassSteps         = FOUR_CHAR_CODE('hbst'),
    siHardwareBusy              = FOUR_CHAR_CODE('hwbs'),       /*sound hardware is in use*/
    siHardwareFormat            = FOUR_CHAR_CODE('hwfm'),       /*get hardware format*/
    siHardwareMute              = FOUR_CHAR_CODE('hmut'),       /*mute state of all hardware*/
    siHardwareMuteNoPrefs       = FOUR_CHAR_CODE('hmnp'),       /*mute state of all hardware, but don't store in prefs */
    siHardwareTreble            = FOUR_CHAR_CODE('htrb'),
    siHardwareTrebleSteps       = FOUR_CHAR_CODE('hwts'),
    siHardwareVolume            = FOUR_CHAR_CODE('hvol'),       /*volume level of all hardware*/
    siHardwareVolumeSteps       = FOUR_CHAR_CODE('hstp'),       /*number of volume steps for hardware*/
    siHeadphoneMute             = FOUR_CHAR_CODE('pmut'),       /*mute state of headphones*/
    siHeadphoneVolume           = FOUR_CHAR_CODE('pvol'),       /*volume level of headphones*/
    siHeadphoneVolumeSteps      = FOUR_CHAR_CODE('hdst'),       /*number of volume steps for headphones*/
    siInputAvailable            = FOUR_CHAR_CODE('inav'),       /*input sources available*/
    siInputGain                 = FOUR_CHAR_CODE('gain'),       /*input gain*/
    siInputSource               = FOUR_CHAR_CODE('sour'),       /*input source selector*/
    siInputSourceNames          = FOUR_CHAR_CODE('snam'),       /*input source names*/
    siLevelMeterOnOff           = FOUR_CHAR_CODE('lmet'),       /*level meter state*/
    siModemGain                 = FOUR_CHAR_CODE('mgai'),       /*modem input gain*/
    siMonitorAvailable          = FOUR_CHAR_CODE('mnav'),
    siMonitorSource             = FOUR_CHAR_CODE('mons'),
    siNumberChannels            = FOUR_CHAR_CODE('chan'),       /*current number of channels*/
    siOptionsDialog             = FOUR_CHAR_CODE('optd'),       /*display options dialog*/
    siOSTypeInputSource         = FOUR_CHAR_CODE('inpt'),       /*input source by OSType*/
    siOSTypeInputAvailable      = FOUR_CHAR_CODE('inav'),       /*list of available input source OSTypes*/
    siOutputDeviceName          = FOUR_CHAR_CODE('onam'),       /*output device name*/
    siPlayThruOnOff             = FOUR_CHAR_CODE('plth'),       /*playthrough state*/
    siPostMixerSoundComponent   = FOUR_CHAR_CODE('psmx'),       /*install post-mixer effect*/
    siPreMixerSoundComponent    = FOUR_CHAR_CODE('prmx'),       /*install pre-mixer effect*/
    siQuality                   = FOUR_CHAR_CODE('qual'),       /*quality setting*/
    siRateMultiplier            = FOUR_CHAR_CODE('rmul'),       /*throttle rate setting*/
    siRecordingQuality          = FOUR_CHAR_CODE('qual'),       /*recording quality*/
    siSampleRate                = FOUR_CHAR_CODE('srat'),       /*current sample rate*/
    siSampleRateAvailable       = FOUR_CHAR_CODE('srav'),       /*sample rates available*/
    siSampleSize                = FOUR_CHAR_CODE('ssiz'),       /*current sample size*/
    siSampleSizeAvailable       = FOUR_CHAR_CODE('ssav'),       /*sample sizes available*/
    siSetupCDAudio              = FOUR_CHAR_CODE('sucd'),       /*setup sound hardware for CD audio*/
    siSetupModemAudio           = FOUR_CHAR_CODE('sumd'),       /*setup sound hardware for modem audio*/
    siSlopeAndIntercept         = FOUR_CHAR_CODE('flap'),       /*floating point variables for conversion*/
    siSoundClock                = FOUR_CHAR_CODE('sclk'),
    siUseThisSoundClock         = FOUR_CHAR_CODE('sclc'),       /*sdev uses this to tell the mixer to use his sound clock*/
    siSpeakerMute               = FOUR_CHAR_CODE('smut'),       /*mute state of all built-in speaker*/
    siSpeakerVolume             = FOUR_CHAR_CODE('svol'),       /*volume level of built-in speaker*/
    siSSpCPULoadLimit           = FOUR_CHAR_CODE('3dll'),
    siSSpLocalization           = FOUR_CHAR_CODE('3dif'),
    siSSpSpeakerSetup           = FOUR_CHAR_CODE('3dst'),
    siStereoInputGain           = FOUR_CHAR_CODE('sgai'),       /*stereo input gain*/
    siSubwooferMute             = FOUR_CHAR_CODE('bmut'),       /*mute state of sub-woofer*/
    siTerminalType              = FOUR_CHAR_CODE('ttyp'),       /* usb terminal type */
    siTwosComplementOnOff       = FOUR_CHAR_CODE('twos'),       /*two's complement state*/
    siVendorProduct             = FOUR_CHAR_CODE('vpro'),       /* vendor and product ID */
    siVolume                    = FOUR_CHAR_CODE('volu'),       /*volume level of source*/
    siVoxRecordInfo             = FOUR_CHAR_CODE('voxr'),       /*VOX record parameters*/
    siVoxStopInfo               = FOUR_CHAR_CODE('voxs'),       /*VOX stop parameters*/
    siWideStereo                = FOUR_CHAR_CODE('wide'),       /*wide stereo setting*/
    siSupportedExtendedFlags    = FOUR_CHAR_CODE('exfl'),       /*which flags are supported in Extended sound data structures*/
    siRateConverterRollOffSlope = FOUR_CHAR_CODE('rcdb'),       /*the roll-off slope for the rate converter's filter, in whole dB as a long this value is a long whose range is from 20 (worst quality/fastest performance) to 90 (best quality/slowest performance)*/
    siOutputLatency             = FOUR_CHAR_CODE('olte'),       /*latency of sound output component*/
    siHALAudioDeviceID          = FOUR_CHAR_CODE('hlid'),       /*audio device id*/
    siClientAcceptsVBR          = FOUR_CHAR_CODE('cvbr'),       /*client handles VBR*/
    siSourceIsExhausted         = FOUR_CHAR_CODE('srcx'),       /*the ultimate source of data has run out (keep asking, but when you get nothing, that's it)*/
    siMediaContextID            = FOUR_CHAR_CODE('uuid'),       /*media context id -- UUID */
    siCompressionMaxPacketSize  = FOUR_CHAR_CODE('cmxp')        /*maximum compressed packet size for current configuration -- unsigned long */
};

enum {
    siCloseDriver               = FOUR_CHAR_CODE('clos'),       /*reserved for internal use only*/
    siInitializeDriver          = FOUR_CHAR_CODE('init'),       /*reserved for internal use only*/
    siPauseRecording            = FOUR_CHAR_CODE('paus'),       /*reserved for internal use only*/
    siUserInterruptProc         = FOUR_CHAR_CODE('user')        /*reserved for internal use only*/
};

/* input source Types*/
enum {
    kInvalidSource              = (long)0xFFFFFFFF,             /*this source may be returned from GetInfo if no other source is the monitored source*/
    kNoSource                   = FOUR_CHAR_CODE('none'),       /*no source selection*/
    kCDSource                   = FOUR_CHAR_CODE('cd  '),       /*internal CD player input*/
    kExtMicSource               = FOUR_CHAR_CODE('emic'),       /*external mic input*/
    kSoundInSource              = FOUR_CHAR_CODE('sinj'),       /*sound input jack*/
    kRCAInSource                = FOUR_CHAR_CODE('irca'),       /*RCA jack input*/
    kTVFMTunerSource            = FOUR_CHAR_CODE('tvfm'),
    kDAVInSource                = FOUR_CHAR_CODE('idav'),       /*DAV analog input*/
    kIntMicSource               = FOUR_CHAR_CODE('imic'),       /*internal mic input*/
    kMediaBaySource             = FOUR_CHAR_CODE('mbay'),       /*media bay input*/
    kModemSource                = FOUR_CHAR_CODE('modm'),       /*modem input (internal modem on desktops, PCI input on PowerBooks)*/
    kPCCardSource               = FOUR_CHAR_CODE('pcm '),       /*PC Card pwm input*/
    kZoomVideoSource            = FOUR_CHAR_CODE('zvpc'),       /*zoom video input*/
    kDVDSource                  = FOUR_CHAR_CODE('dvda'),       /* DVD audio input*/
    kMicrophoneArray            = FOUR_CHAR_CODE('mica')        /* microphone array*/
};

/*Sound Component Types and Subtypes*/
enum {
    kNoSoundComponentType       = FOUR_CHAR_CODE('****'),
    kSoundComponentType         = FOUR_CHAR_CODE('sift'),       /*component type*/
    kSoundComponentPPCType      = FOUR_CHAR_CODE('nift'),       /*component type for PowerPC code*/
    kRate8SubType               = FOUR_CHAR_CODE('ratb'),       /*8-bit rate converter*/
    kRate16SubType              = FOUR_CHAR_CODE('ratw'),       /*16-bit rate converter*/
    kConverterSubType           = FOUR_CHAR_CODE('conv'),       /*sample format converter*/
    kSndSourceSubType           = FOUR_CHAR_CODE('sour'),       /*generic source component*/
    kMixerType                  = FOUR_CHAR_CODE('mixr'),
    kMixer8SubType              = FOUR_CHAR_CODE('mixb'),       /*8-bit mixer*/
    kMixer16SubType             = FOUR_CHAR_CODE('mixw'),       /*16-bit mixer*/
    kSoundInputDeviceType       = FOUR_CHAR_CODE('sinp'),       /*sound input component*/
    kWaveInSubType              = FOUR_CHAR_CODE('wavi'),       /*Windows waveIn*/
    kWaveInSnifferSubType       = FOUR_CHAR_CODE('wisn'),       /*Windows waveIn sniffer*/
    kSoundOutputDeviceType      = FOUR_CHAR_CODE('sdev'),       /*sound output component*/
    kClassicSubType             = FOUR_CHAR_CODE('clas'),       /*classic hardware, i.e. Mac Plus*/
    kASCSubType                 = FOUR_CHAR_CODE('asc '),       /*Apple Sound Chip device*/
    kDSPSubType                 = FOUR_CHAR_CODE('dsp '),       /*DSP device*/
    kAwacsSubType               = FOUR_CHAR_CODE('awac'),       /*Another of Will's Audio Chips device*/
    kGCAwacsSubType             = FOUR_CHAR_CODE('awgc'),       /*Awacs audio with Grand Central DMA*/
    kSingerSubType              = FOUR_CHAR_CODE('sing'),       /*Singer (via Whitney) based sound*/
    kSinger2SubType             = FOUR_CHAR_CODE('sng2'),       /*Singer 2 (via Whitney) for Acme*/
    kWhitSubType                = FOUR_CHAR_CODE('whit'),       /*Whit sound component for PrimeTime 3*/
    kSoundBlasterSubType        = FOUR_CHAR_CODE('sbls'),       /*Sound Blaster for CHRP*/
    kWaveOutSubType             = FOUR_CHAR_CODE('wavo'),       /*Windows waveOut*/
    kWaveOutSnifferSubType      = FOUR_CHAR_CODE('wosn'),       /*Windows waveOut sniffer*/
    kDirectSoundSubType         = FOUR_CHAR_CODE('dsnd'),       /*Windows DirectSound*/
    kDirectSoundSnifferSubType  = FOUR_CHAR_CODE('dssn'),       /*Windows DirectSound sniffer*/
    kUNIXsdevSubType            = FOUR_CHAR_CODE('un1x'),       /*UNIX base sdev*/
    kUSBSubType                 = FOUR_CHAR_CODE('usb '),       /*USB device*/
    kBlueBoxSubType             = FOUR_CHAR_CODE('bsnd'),       /*Blue Box sound component*/
    kSoundCompressor            = FOUR_CHAR_CODE('scom'),
    kSoundDecompressor          = FOUR_CHAR_CODE('sdec'),
    kAudioComponentType         = FOUR_CHAR_CODE('adio'),       /*Audio components and sub-types*/
    kAwacsPhoneSubType          = FOUR_CHAR_CODE('hphn'),
    kAudioVisionSpeakerSubType  = FOUR_CHAR_CODE('telc'),
    kAudioVisionHeadphoneSubType = FOUR_CHAR_CODE('telh'),
    kPhilipsFaderSubType        = FOUR_CHAR_CODE('tvav'),
    kSGSToneSubType             = FOUR_CHAR_CODE('sgs0'),
    kSoundEffectsType           = FOUR_CHAR_CODE('snfx'),       /*sound effects type*/
    kEqualizerSubType           = FOUR_CHAR_CODE('eqal'),       /*frequency equalizer*/
    kSSpLocalizationSubType     = FOUR_CHAR_CODE('snd3')
};

/*Format Types*/
enum {
    kSoundNotCompressed         = FOUR_CHAR_CODE('NONE'),       /*sound is not compressed*/
    k8BitOffsetBinaryFormat     = FOUR_CHAR_CODE('raw '),       /*8-bit offset binary*/
    k16BitBigEndianFormat       = FOUR_CHAR_CODE('twos'),       /*16-bit big endian*/
    k16BitLittleEndianFormat    = FOUR_CHAR_CODE('sowt'),       /*16-bit little endian*/
    kFloat32Format              = FOUR_CHAR_CODE('fl32'),       /*32-bit floating point*/
    kFloat64Format              = FOUR_CHAR_CODE('fl64'),       /*64-bit floating point*/
    k24BitFormat                = FOUR_CHAR_CODE('in24'),       /*24-bit integer*/
    k32BitFormat                = FOUR_CHAR_CODE('in32'),       /*32-bit integer*/
    k32BitLittleEndianFormat    = FOUR_CHAR_CODE('23ni'),       /*32-bit little endian integer */
    kMACE3Compression           = FOUR_CHAR_CODE('MAC3'),       /*MACE 3:1*/
    kMACE6Compression           = FOUR_CHAR_CODE('MAC6'),       /*MACE 6:1*/
    kCDXA4Compression           = FOUR_CHAR_CODE('cdx4'),       /*CD/XA 4:1*/
    kCDXA2Compression           = FOUR_CHAR_CODE('cdx2'),       /*CD/XA 2:1*/
    kIMACompression             = FOUR_CHAR_CODE('ima4'),       /*IMA 4:1*/
    kULawCompression            = FOUR_CHAR_CODE('ulaw'),       /*.Law 2:1*/
    kALawCompression            = FOUR_CHAR_CODE('alaw'),       /*aLaw 2:1*/
    kMicrosoftADPCMFormat       = 0x6D730002,                   /*Microsoft ADPCM - ACM code 2*/
    kDVIIntelIMAFormat          = 0x6D730011,                   /*DVI/Intel IMA ADPCM - ACM code 17*/
    kDVAudioFormat              = FOUR_CHAR_CODE('dvca'),       /*DV Audio*/
    kQDesignCompression         = FOUR_CHAR_CODE('QDMC'),       /*QDesign music*/
    kQDesign2Compression        = FOUR_CHAR_CODE('QDM2'),       /*QDesign2 music*/
    kQUALCOMMCompression        = FOUR_CHAR_CODE('Qclp'),       /*QUALCOMM PureVoice*/
    kOffsetBinary               = k8BitOffsetBinaryFormat,      /*for compatibility*/
    kTwosComplement             = k16BitBigEndianFormat,        /*for compatibility*/
    kLittleEndianFormat         = k16BitLittleEndianFormat,     /*for compatibility*/
    kMPEGLayer3Format           = 0x6D730055,                   /*MPEG Layer 3, CBR only (pre QT4.1)*/
    kFullMPEGLay3Format         = FOUR_CHAR_CODE('.mp3')        /*MPEG Layer 3, CBR & VBR (QT4.1 and later)*/
};

#if TARGET_RT_LITTLE_ENDIAN
enum {
    k16BitNativeEndianFormat    = k16BitLittleEndianFormat,
    k16BitNonNativeEndianFormat = k16BitBigEndianFormat
};

#else
enum {
    k16BitNativeEndianFormat    = k16BitBigEndianFormat,
    k16BitNonNativeEndianFormat = k16BitLittleEndianFormat
};

#endif  /* TARGET_RT_LITTLE_ENDIAN */

/*Features Flags*/
enum {
    k8BitRawIn                  = (1 << 0),                     /*data description*/
    k8BitTwosIn                 = (1 << 1),
    k16BitIn                    = (1 << 2),
    kStereoIn                   = (1 << 3),
    k8BitRawOut                 = (1 << 8),
    k8BitTwosOut                = (1 << 9),
    k16BitOut                   = (1 << 10),
    kStereoOut                  = (1 << 11),
    kReverse                    = (1L << 16),                   /*  function description*/
    kRateConvert                = (1L << 17),
    kCreateSoundSource          = (1L << 18),
    kVMAwareness                = (1L << 21),                   /* component will hold its memory*/
    kHighQuality                = (1L << 22),                   /*  performance description*/
    kNonRealTime                = (1L << 23)
};

/*'snfo' Resource Feature Flags*/
enum {
    kSoundCodecInfoFixedCompression = (1L << 0),                /* has fixed compression format*/
    kSoundCodecInfoVariableCompression = (1L << 1),             /* has variable compression format*/
    kSoundCodecInfoHasRestrictedInputRates = (1L << 2),         /* compressor has restricted set of input sample rates*/
    kSoundCodecInfoCanChangeOutputRate = (1L << 3),             /* compressor may output a different sample rate than it receives*/
    kSoundCodecInfoRequiresExternalFraming = (1L << 4)          /* format requires external framing information during decode/encode*/
};

/*SoundComponentPlaySourceBuffer action flags*/
enum {
    kSourcePaused               = (1 << 0),
    kPassThrough                = (1L << 16),
    kNoSoundComponentChain      = (1L << 17)
};

/*SoundParamBlock flags, usefull for OpenMixerSoundComponent*/
enum {
    kNoMixing                   = (1 << 0),                     /*don't mix source*/
    kNoSampleRateConversion     = (1 << 1),                     /*don't convert sample rate (i.e. 11 kHz -> 22 kHz)*/
    kNoSampleSizeConversion     = (1 << 2),                     /*don't convert sample size (i.e. 16 -> 8)*/
    kNoSampleFormatConversion   = (1 << 3),                     /*don't convert sample format (i.e. 'twos' -> 'raw ')*/
    kNoChannelConversion        = (1 << 4),                     /*don't convert stereo/mono*/
    kNoDecompression            = (1 << 5),                     /*don't decompress (i.e. 'MAC3' -> 'raw ')*/
    kNoVolumeConversion         = (1 << 6),                     /*don't apply volume*/
    kNoRealtimeProcessing       = (1 << 7),                     /*won't run at interrupt time*/
    kScheduledSource            = (1 << 8),                     /*source is scheduled*/
    kNonInterleavedBuffer       = (1 << 9),                     /*buffer is not interleaved samples*/
    kNonPagingMixer             = (1 << 10),                    /*if VM is on, use the non-paging mixer*/
    kSoundConverterMixer        = (1 << 11),                    /*the mixer is to be used by the SoundConverter*/
    kPagingMixer                = (1 << 12),                    /*the mixer is to be used as a paging mixer when VM is on*/
    kVMAwareMixer               = (1 << 13),                    /*passed to the output device when the SM is going to deal with VM safety*/
    kExtendedSoundData          = (1 << 14)                     /*SoundComponentData record is actually an ExtendedSoundComponentData*/
};

/*SoundParamBlock quality settings*/
enum {
    kBestQuality                = (1 << 0)                      /*use interpolation in rate conversion*/
};

/*useful bit masks*/
enum {
    kInputMask                  = 0x000000FF,                   /*masks off input bits*/
    kOutputMask                 = 0x0000FF00,                   /*masks off output bits*/
    kOutputShift                = 8,                            /*amount output bits are shifted*/
    kActionMask                 = 0x00FF0000,                   /*masks off action bits*/
    kSoundComponentBits         = 0x00FFFFFF
};

/*audio atom types*/
enum {
    kAudioFormatAtomType        = FOUR_CHAR_CODE('frma'),
    kAudioEndianAtomType        = FOUR_CHAR_CODE('enda'),
    kAudioVBRAtomType           = FOUR_CHAR_CODE('vbra'),
    kAudioTerminatorAtomType    = 0
};

/*siAVDisplayBehavior types*/
enum {
    kAVDisplayHeadphoneRemove   = 0,                            /* monitor does not have a headphone attached*/
    kAVDisplayHeadphoneInsert   = 1,                            /* monitor has a headphone attached*/
    kAVDisplayPlainTalkRemove   = 2,                            /* monitor either sending no input through CPU input port or unable to tell if input is coming in*/
    kAVDisplayPlainTalkInsert   = 3                             /* monitor sending PlainTalk level microphone source input through sound input port*/
};

/*Audio Component constants*/
enum {
                                                                /*Values for whichChannel parameter*/
    audioAllChannels            = 0,                            /*All channels (usually interpreted as both left and right)*/
    audioLeftChannel            = 1,                            /*Left channel*/
    audioRightChannel           = 2,                            /*Right channel*/
                                                                /*Values for mute parameter*/
    audioUnmuted                = 0,                            /*Device is unmuted*/
    audioMuted                  = 1,                            /*Device is muted*/
                                                                /*Capabilities flags definitions*/
    audioDoesMono               = (1L << 0),                    /*Device supports mono output*/
    audioDoesStereo             = (1L << 1),                    /*Device supports stereo output*/
    audioDoesIndependentChannels = (1L << 2)                    /*Device supports independent software control of each channel*/
};

/*Sound Input Qualities*/
enum {
    siCDQuality                 = FOUR_CHAR_CODE('cd  '),       /*44.1kHz, stereo, 16 bit*/
    siBestQuality               = FOUR_CHAR_CODE('best'),       /*22kHz, mono, 8 bit*/
    siBetterQuality             = FOUR_CHAR_CODE('betr'),       /*22kHz, mono, MACE 3:1*/
    siGoodQuality               = FOUR_CHAR_CODE('good'),       /*22kHz, mono, MACE 6:1*/
    siNoneQuality               = FOUR_CHAR_CODE('none')        /*settings don't match any quality for a get call*/
};

enum {
    siDeviceIsConnected         = 1,                            /*input device is connected and ready for input*/
    siDeviceNotConnected        = 0,                            /*input device is not connected*/
    siDontKnowIfConnected       = -1,                           /*can't tell if input device is connected*/
    siReadPermission            = 0,                            /*permission passed to SPBOpenDevice*/
    siWritePermission           = 1                             /*permission passed to SPBOpenDevice*/
};

/*flags that SoundConverterFillBuffer will return*/
enum {
    kSoundConverterDidntFillBuffer = (1 << 0),                  /*set if the converter couldn't completely satisfy a SoundConverterFillBuffer request*/
    kSoundConverterHasLeftOverData = (1 << 1)                   /*set if the converter had left over data after completely satisfying a SoundConverterFillBuffer call*/
};

/* flags for extendedFlags fields of ExtendedSoundComponentData, ExtendedSoundParamBlock, and ExtendedScheduledSoundHeader*/
enum {
    kExtendedSoundSampleCountNotValid = 1L << 0,                /* set if sampleCount of SoundComponentData isn't meaningful; use buffer size instead*/
    kExtendedSoundBufferSizeValid = 1L << 1,                    /* set if bufferSize field is valid*/
    kExtendedSoundFrameSizesValid = 1L << 2,                    /* set if frameSizesArray is valid (will be nil if all sizes are common and kExtendedSoundCommonFrameSizeValid is set*/
    kExtendedSoundCommonFrameSizeValid = 1L << 3,               /* set if all audio frames have the same size and the commonFrameSize field is valid*/
    kExtendedSoundExtensionsValid = 1L << 4,                    /* set if pointer to extensions array is valid*/
    kExtendedSoundBufferFlagsValid = 1L << 5                    /* set if buffer flags field is valid*/
};

/* flags passed in bufferFlags/bufferFlagsMask extended fields if kExtendedSoundBufferFlagsValid extended flag is set*/
enum {
    kExtendedSoundBufferIsDiscontinuous = 1L << 0,              /* buffer is discontinuous with previous buffer*/
    kExtendedSoundBufferIsFirstBuffer = 1L << 1                 /* buffer is first buffer*/
};

/*
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   typedefs
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/


struct SndCommand {
    unsigned short                  cmd;
    short                           param1;
    long                            param2;
};
typedef struct SndCommand               SndCommand;
typedef struct SndChannel               SndChannel;

typedef SndChannel *                    SndChannelPtr;
typedef CALLBACK_API( void , SndCallBackProcPtr )(SndChannelPtr chan, SndCommand *cmd);
typedef STACK_UPP_TYPE(SndCallBackProcPtr)                      SndCallBackUPP;

struct SndChannel {
    SndChannelPtr                   nextChan;
    Ptr                             firstMod;                   /* reserved for the Sound Manager */
    SndCallBackUPP                  callBack;
    long                            userInfo;
    long                            wait;                       /* The following is for internal Sound Manager use only.*/
    SndCommand                      cmdInProgress;
    short                           flags;
    short                           qLength;
    short                           qHead;
    short                           qTail;
    SndCommand                      queue[128];
};

#if OPAQUE_UPP_TYPES
    EXTERN_API(SndCallBackUPP)
    NewSndCallBackUPP              (SndCallBackProcPtr      userRoutine);

    EXTERN_API(void)
    DisposeSndCallBackUPP          (SndCallBackUPP          userUPP);

    EXTERN_API(void)
    InvokeSndCallBackUPP           (SndChannelPtr           chan,
                                    SndCommand *            cmd,
                                    SndCallBackUPP          userUPP);

#else
    enum { uppSndCallBackProcInfo = 0x000003C0 };                   /* pascal no_return_value Func(4_bytes, 4_bytes) */
    #define NewSndCallBackUPP(userRoutine)                          (SndCallBackUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppSndCallBackProcInfo, GetCurrentArchitecture())
    #define DisposeSndCallBackUPP(userUPP)                          DisposeRoutineDescriptor(userUPP)
    #define InvokeSndCallBackUPP(chan, cmd, userUPP)                CALL_TWO_PARAMETER_UPP((userUPP), uppSndCallBackProcInfo, (chan), (cmd))
#endif
/* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
#define NewSndCallBackProc(userRoutine)                         NewSndCallBackUPP(userRoutine)
#define CallSndCallBackProc(userRoutine, chan, cmd)             InvokeSndCallBackUPP(chan, cmd, userRoutine)
/*MACE structures*/

struct StateBlock {
    short                           stateVar[64];
};
typedef struct StateBlock               StateBlock;
typedef StateBlock *                    StateBlockPtr;

struct LeftOverBlock {
    unsigned long                   count;
    SInt8                           sampleArea[32];
};
typedef struct LeftOverBlock            LeftOverBlock;
typedef LeftOverBlock *                 LeftOverBlockPtr;

struct ModRef {
    unsigned short                  modNumber;
    long                            modInit;
};
typedef struct ModRef                   ModRef;

struct SndListResource {
    short                           format;
    short                           numModifiers;
    ModRef                          modifierPart[1];
    short                           numCommands;
    SndCommand                      commandPart[1];
    UInt8                           dataPart[1];
};
typedef struct SndListResource          SndListResource;

typedef SndListResource *               SndListPtr;
typedef SndListPtr *                    SndListHandle;
typedef SndListHandle                   SndListHndl;
/*HyperCard sound resource format*/

struct Snd2ListResource {
    short                           format;
    short                           refCount;
    short                           numCommands;
    SndCommand                      commandPart[1];
    UInt8                           dataPart[1];
};
typedef struct Snd2ListResource         Snd2ListResource;

typedef Snd2ListResource *              Snd2ListPtr;
typedef Snd2ListPtr *                   Snd2ListHandle;
typedef Snd2ListHandle                  Snd2ListHndl;

struct SoundHeader {
    Ptr                             samplePtr;                  /*if NIL then samples are in sampleArea*/
    unsigned long                   length;                     /*length of sound in bytes*/
    UnsignedFixed                   sampleRate;                 /*sample rate for this sound*/
    unsigned long                   loopStart;                  /*start of looping portion*/
    unsigned long                   loopEnd;                    /*end of looping portion*/
    UInt8                           encode;                     /*header encoding*/
    UInt8                           baseFrequency;              /*baseFrequency value*/
    UInt8                           sampleArea[1];              /*space for when samples follow directly*/
};
typedef struct SoundHeader              SoundHeader;
typedef SoundHeader *                   SoundHeaderPtr;

struct CmpSoundHeader {
    Ptr                             samplePtr;                  /*if nil then samples are in sample area*/
    unsigned long                   numChannels;                /*number of channels i.e. mono = 1*/
    UnsignedFixed                   sampleRate;                 /*sample rate in Apples Fixed point representation*/
    unsigned long                   loopStart;                  /*loopStart of sound before compression*/
    unsigned long                   loopEnd;                    /*loopEnd of sound before compression*/
    UInt8                           encode;                     /*data structure used , stdSH, extSH, or cmpSH*/
    UInt8                           baseFrequency;              /*same meaning as regular SoundHeader*/
    unsigned long                   numFrames;                  /*length in frames ( packetFrames or sampleFrames )*/
    extended80                      AIFFSampleRate;             /*IEEE sample rate*/
    Ptr                             markerChunk;                /*sync track*/
    OSType                          format;                     /*data format type, was futureUse1*/
    unsigned long                   futureUse2;                 /*reserved by Apple*/
    StateBlockPtr                   stateVars;                  /*pointer to State Block*/
    LeftOverBlockPtr                leftOverSamples;            /*used to save truncated samples between compression calls*/
    short                           compressionID;              /*0 means no compression, non zero means compressionID*/
    unsigned short                  packetSize;                 /*number of bits in compressed sample packet*/
    unsigned short                  snthID;                     /*resource ID of Sound Manager snth that contains NRT C/E*/
    unsigned short                  sampleSize;                 /*number of bits in non-compressed sample*/
    UInt8                           sampleArea[1];              /*space for when samples follow directly*/
};
typedef struct CmpSoundHeader           CmpSoundHeader;
typedef CmpSoundHeader *                CmpSoundHeaderPtr;

struct ExtSoundHeader {
    Ptr                             samplePtr;                  /*if nil then samples are in sample area*/
    unsigned long                   numChannels;                /*number of channels,  ie mono = 1*/
    UnsignedFixed                   sampleRate;                 /*sample rate in Apples Fixed point representation*/
    unsigned long                   loopStart;                  /*same meaning as regular SoundHeader*/
    unsigned long                   loopEnd;                    /*same meaning as regular SoundHeader*/
    UInt8                           encode;                     /*data structure used , stdSH, extSH, or cmpSH*/
    UInt8                           baseFrequency;              /*same meaning as regular SoundHeader*/
    unsigned long                   numFrames;                  /*length in total number of frames*/
    extended80                      AIFFSampleRate;             /*IEEE sample rate*/
    Ptr                             markerChunk;                /*sync track*/
    Ptr                             instrumentChunks;           /*AIFF instrument chunks*/
    Ptr                             AESRecording;
    unsigned short                  sampleSize;                 /*number of bits in sample*/
    unsigned short                  futureUse1;                 /*reserved by Apple*/
    unsigned long                   futureUse2;                 /*reserved by Apple*/
    unsigned long                   futureUse3;                 /*reserved by Apple*/
    unsigned long                   futureUse4;                 /*reserved by Apple*/
    UInt8                           sampleArea[1];              /*space for when samples follow directly*/
};
typedef struct ExtSoundHeader           ExtSoundHeader;
typedef ExtSoundHeader *                ExtSoundHeaderPtr;

union SoundHeaderUnion {
    SoundHeader                     stdHeader;
    CmpSoundHeader                  cmpHeader;
    ExtSoundHeader                  extHeader;
};
typedef union SoundHeaderUnion          SoundHeaderUnion;

struct ConversionBlock {
    short                           destination;
    short                           unused;
    CmpSoundHeaderPtr               inputPtr;
    CmpSoundHeaderPtr               outputPtr;
};
typedef struct ConversionBlock          ConversionBlock;
typedef ConversionBlock *               ConversionBlockPtr;
/* ScheduledSoundHeader flags*/
enum {
    kScheduledSoundDoScheduled  = 1 << 0,
    kScheduledSoundDoCallBack   = 1 << 1,
    kScheduledSoundExtendedHdr  = 1 << 2
};


struct ScheduledSoundHeader {
    SoundHeaderUnion                u;
    long                            flags;
    short                           reserved;
    short                           callBackParam1;
    long                            callBackParam2;
    TimeRecord                      startTime;
};
typedef struct ScheduledSoundHeader     ScheduledSoundHeader;
typedef ScheduledSoundHeader *          ScheduledSoundHeaderPtr;

struct ExtendedScheduledSoundHeader {
    SoundHeaderUnion                u;
    long                            flags;
    short                           reserved;
    short                           callBackParam1;
    long                            callBackParam2;
    TimeRecord                      startTime;
    long                            recordSize;
    long                            extendedFlags;
    long                            bufferSize;
    long                            frameCount;                 /* number of audio frames*/
    long *                          frameSizesArray;            /* pointer to array of longs with frame sizes in bytes*/
    long                            commonFrameSize;            /* size of each frame if common*/
    void *                          extensionsPtr;              /*pointer to set of classic atoms (size,type,data,...)*/
    long                            extensionsSize;             /*size of extensions data (extensionsPtr)*/
    unsigned long                   bufferFlags;                /*set or cleared flags*/
    unsigned long                   bufferFlagsMask;            /*which flags are valid*/
};
typedef struct ExtendedScheduledSoundHeader ExtendedScheduledSoundHeader;
typedef ExtendedScheduledSoundHeader *  ExtendedScheduledSoundHeaderPtr;

struct SMStatus {
    short                           smMaxCPULoad;
    short                           smNumChannels;
    short                           smCurCPULoad;
};
typedef struct SMStatus                 SMStatus;
typedef SMStatus *                      SMStatusPtr;

struct SCStatus {
    UnsignedFixed                   scStartTime;
    UnsignedFixed                   scEndTime;
    UnsignedFixed                   scCurrentTime;
    Boolean                         scChannelBusy;
    Boolean                         scChannelDisposed;
    Boolean                         scChannelPaused;
    Boolean                         scUnused;
    unsigned long                   scChannelAttributes;
    long                            scCPULoad;
};
typedef struct SCStatus                 SCStatus;
typedef SCStatus *                      SCStatusPtr;

struct AudioSelection {
    long                            unitType;
    UnsignedFixed                   selStart;
    UnsignedFixed                   selEnd;
};
typedef struct AudioSelection           AudioSelection;
typedef AudioSelection *                AudioSelectionPtr;
#if CALL_NOT_IN_CARBON

struct SndDoubleBuffer {
    long                            dbNumFrames;
    long                            dbFlags;
    long                            dbUserInfo[2];
    SInt8                           dbSoundData[1];
};
typedef struct SndDoubleBuffer          SndDoubleBuffer;
typedef SndDoubleBuffer *               SndDoubleBufferPtr;


typedef CALLBACK_API( void , SndDoubleBackProcPtr )(SndChannelPtr channel, SndDoubleBufferPtr doubleBufferPtr);
typedef STACK_UPP_TYPE(SndDoubleBackProcPtr)                    SndDoubleBackUPP;
#if OPAQUE_UPP_TYPES
    EXTERN_API(SndDoubleBackUPP)
    NewSndDoubleBackUPP            (SndDoubleBackProcPtr    userRoutine);

    EXTERN_API(void)
    DisposeSndDoubleBackUPP        (SndDoubleBackUPP        userUPP);

    EXTERN_API(void)
    InvokeSndDoubleBackUPP         (SndChannelPtr           channel,
                                    SndDoubleBufferPtr      doubleBufferPtr,
                                    SndDoubleBackUPP        userUPP);

#else
    enum { uppSndDoubleBackProcInfo = 0x000003C0 };                 /* pascal no_return_value Func(4_bytes, 4_bytes) */
    #define NewSndDoubleBackUPP(userRoutine)                        (SndDoubleBackUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppSndDoubleBackProcInfo, GetCurrentArchitecture())
    #define DisposeSndDoubleBackUPP(userUPP)                        DisposeRoutineDescriptor(userUPP)
    #define InvokeSndDoubleBackUPP(channel, doubleBufferPtr, userUPP)  CALL_TWO_PARAMETER_UPP((userUPP), uppSndDoubleBackProcInfo, (channel), (doubleBufferPtr))
#endif
/* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
#define NewSndDoubleBackProc(userRoutine)                       NewSndDoubleBackUPP(userRoutine)
#define CallSndDoubleBackProc(userRoutine, channel, doubleBufferPtr) InvokeSndDoubleBackUPP(channel, doubleBufferPtr, userRoutine)

struct SndDoubleBufferHeader {
    short                           dbhNumChannels;
    short                           dbhSampleSize;
    short                           dbhCompressionID;
    short                           dbhPacketSize;
    UnsignedFixed                   dbhSampleRate;
    SndDoubleBufferPtr              dbhBufferPtr[2];
    SndDoubleBackUPP                dbhDoubleBack;
};
typedef struct SndDoubleBufferHeader    SndDoubleBufferHeader;
typedef SndDoubleBufferHeader *         SndDoubleBufferHeaderPtr;

struct SndDoubleBufferHeader2 {
    short                           dbhNumChannels;
    short                           dbhSampleSize;
    short                           dbhCompressionID;
    short                           dbhPacketSize;
    UnsignedFixed                   dbhSampleRate;
    SndDoubleBufferPtr              dbhBufferPtr[2];
    SndDoubleBackUPP                dbhDoubleBack;
    OSType                          dbhFormat;
};
typedef struct SndDoubleBufferHeader2   SndDoubleBufferHeader2;
typedef SndDoubleBufferHeader2 *        SndDoubleBufferHeader2Ptr;
#endif  /* CALL_NOT_IN_CARBON */


struct SoundInfoList {
    short                           count;
    Handle                          infoHandle;
};
typedef struct SoundInfoList            SoundInfoList;
typedef SoundInfoList *                 SoundInfoListPtr;

struct SoundComponentData {
    long                            flags;
    OSType                          format;
    short                           numChannels;
    short                           sampleSize;
    UnsignedFixed                   sampleRate;
    long                            sampleCount;
    Byte *                          buffer;
    long                            reserved;
};
typedef struct SoundComponentData       SoundComponentData;
typedef SoundComponentData *            SoundComponentDataPtr;

struct ExtendedSoundComponentData {
    SoundComponentData              desc;                       /*description of sound buffer*/
    long                            recordSize;                 /*size of this record in bytes*/
    long                            extendedFlags;              /*flags for extended record*/
    long                            bufferSize;                 /*size of buffer in bytes*/
    long                            frameCount;                 /*number of audio frames*/
    long *                          frameSizesArray;            /*pointer to array of longs with frame sizes in bytes*/
    long                            commonFrameSize;            /*size of each frame if common*/
    void *                          extensionsPtr;              /*pointer to set of classic atoms (size,type,data,...)*/
    long                            extensionsSize;             /*size of extensions data (extensionsPtr)*/
    unsigned long                   bufferFlags;                /*set or cleared flags*/
    unsigned long                   bufferFlagsMask;            /*which flags are valid*/
};
typedef struct ExtendedSoundComponentData ExtendedSoundComponentData;
typedef ExtendedSoundComponentData *    ExtendedSoundComponentDataPtr;
typedef struct SoundParamBlock          SoundParamBlock;

typedef SoundParamBlock *               SoundParamBlockPtr;
typedef CALLBACK_API( Boolean , SoundParamProcPtr )(SoundParamBlockPtr *pb);
typedef STACK_UPP_TYPE(SoundParamProcPtr)                       SoundParamUPP;

struct SoundParamBlock {
    long                            recordSize;                 /*size of this record in bytes*/
    SoundComponentData              desc;                       /*description of sound buffer*/
    UnsignedFixed                   rateMultiplier;             /*rate multiplier to apply to sound*/
    short                           leftVolume;                 /*volumes to apply to sound*/
    short                           rightVolume;
    long                            quality;                    /*quality to apply to sound*/
    ComponentInstance               filter;                     /*filter to apply to sound*/
    SoundParamUPP                   moreRtn;                    /*routine to call to get more data*/
    SoundParamUPP                   completionRtn;              /*routine to call when buffer is complete*/
    long                            refCon;                     /*user refcon*/
    short                           result;                     /*result*/
};


struct ExtendedSoundParamBlock {
    SoundParamBlock                 pb;                         /*classic SoundParamBlock except recordSize == sizeof(ExtendedSoundParamBlock)*/
    short                           reserved;
    long                            extendedFlags;              /*flags*/
    long                            bufferSize;                 /*size of buffer in bytes*/
    long                            frameCount;                 /*number of audio frames*/
    long *                          frameSizesArray;            /*pointer to array of longs with frame sizes in bytes*/
    long                            commonFrameSize;            /*size of each frame if common*/
    void *                          extensionsPtr;              /*pointer to set of classic atoms (size,type,data,...)*/
    long                            extensionsSize;             /*size of extensions data (extensionsPtr)*/
    unsigned long                   bufferFlags;                /*set or cleared flags*/
    unsigned long                   bufferFlagsMask;            /*which flags are valid*/
};
typedef struct ExtendedSoundParamBlock  ExtendedSoundParamBlock;
typedef ExtendedSoundParamBlock *       ExtendedSoundParamBlockPtr;

struct CompressionInfo {
    long                            recordSize;
    OSType                          format;
    short                           compressionID;
    unsigned short                  samplesPerPacket;
    unsigned short                  bytesPerPacket;
    unsigned short                  bytesPerFrame;
    unsigned short                  bytesPerSample;
    unsigned short                  futureUse1;
};
typedef struct CompressionInfo          CompressionInfo;
typedef CompressionInfo *               CompressionInfoPtr;
typedef CompressionInfoPtr *            CompressionInfoHandle;
/*variables for floating point conversion*/

struct SoundSlopeAndInterceptRecord {
    Float64                         slope;
    Float64                         intercept;
    Float64                         minClip;
    Float64                         maxClip;
};
typedef struct SoundSlopeAndInterceptRecord SoundSlopeAndInterceptRecord;

typedef SoundSlopeAndInterceptRecord *  SoundSlopeAndInterceptPtr;
/*private thing to use as a reference to a Sound Converter*/
typedef struct OpaqueSoundConverter*    SoundConverter;
/*callback routine to provide data to the Sound Converter*/
typedef CALLBACK_API( Boolean , SoundConverterFillBufferDataProcPtr )(SoundComponentDataPtr *data, void *refCon);
typedef STACK_UPP_TYPE(SoundConverterFillBufferDataProcPtr)     SoundConverterFillBufferDataUPP;
/*private thing to use as a reference to a Sound Source*/
typedef struct OpaqueSoundSource*       SoundSource;
typedef SoundSource *                   SoundSourcePtr;



struct SoundComponentLink {
    ComponentDescription            description;                /*Describes the sound component*/
    SoundSource                     mixerID;                    /*Reserved by Apple*/
    SoundSource *                   linkID;                     /*Reserved by Apple*/
};
typedef struct SoundComponentLink       SoundComponentLink;
typedef SoundComponentLink *            SoundComponentLinkPtr;

struct AudioInfo {
    long                            capabilitiesFlags;          /*Describes device capabilities*/
    long                            reserved;                   /*Reserved by Apple*/
    unsigned short                  numVolumeSteps;             /*Number of significant increments between min and max volume*/
};
typedef struct AudioInfo                AudioInfo;
typedef AudioInfo *                     AudioInfoPtr;

struct AudioFormatAtom {
    long                            size;                       /* = sizeof(AudioFormatAtom)*/
    OSType                          atomType;                   /* = kAudioFormatAtomType*/
    OSType                          format;
};
typedef struct AudioFormatAtom          AudioFormatAtom;
typedef AudioFormatAtom *               AudioFormatAtomPtr;

struct AudioEndianAtom {
    long                            size;                       /* = sizeof(AudioEndianAtom)*/
    OSType                          atomType;                   /* = kAudioEndianAtomType*/
    short                           littleEndian;
};
typedef struct AudioEndianAtom          AudioEndianAtom;
typedef AudioEndianAtom *               AudioEndianAtomPtr;

struct AudioTerminatorAtom {
    long                            size;                       /* = sizeof(AudioTerminatorAtom)*/
    OSType                          atomType;                   /* = kAudioTerminatorAtomType*/
};
typedef struct AudioTerminatorAtom      AudioTerminatorAtom;
typedef AudioTerminatorAtom *           AudioTerminatorAtomPtr;

struct LevelMeterInfo {
    short                           numChannels;                /* mono or stereo source*/
    UInt8                           leftMeter;                  /* 0-255 range*/
    UInt8                           rightMeter;                 /* 0-255 range*/
};
typedef struct LevelMeterInfo           LevelMeterInfo;
typedef LevelMeterInfo *                LevelMeterInfoPtr;

struct EQSpectrumBandsRecord {
    short                           count;
    UnsignedFixedPtr                frequency;                  /* pointer to array of frequencies*/
};
typedef struct EQSpectrumBandsRecord    EQSpectrumBandsRecord;
typedef EQSpectrumBandsRecord *         EQSpectrumBandsRecordPtr;


/* Sound Input Structures*/
typedef struct SPB                      SPB;

typedef SPB *                           SPBPtr;


/*user procedures called by sound input routines*/
typedef CALLBACK_API( void , SIInterruptProcPtr )(SPBPtr inParamPtr, Ptr dataBuffer, short peakAmplitude, long sampleSize);
/*
    WARNING: SIInterruptProcPtr uses register based parameters under classic 68k
             and cannot be written in a high-level language without 
             the help of mixed mode or assembly glue.
*/
typedef CALLBACK_API( void , SICompletionProcPtr )(SPBPtr inParamPtr);
typedef REGISTER_UPP_TYPE(SIInterruptProcPtr)                   SIInterruptUPP;
typedef STACK_UPP_TYPE(SICompletionProcPtr)                     SICompletionUPP;


/*Sound Input Parameter Block*/

struct SPB {
    long                            inRefNum;                   /*reference number of sound input device*/
    unsigned long                   count;                      /*number of bytes to record*/
    unsigned long                   milliseconds;               /*number of milliseconds to record*/
    unsigned long                   bufferLength;               /*length of buffer in bytes*/
    Ptr                             bufferPtr;                  /*buffer to store sound data in*/
    SICompletionUPP                 completionRoutine;          /*completion routine*/
    SIInterruptUPP                  interruptRoutine;           /*interrupt routine*/
    long                            userLong;                   /*user-defined field*/
    OSErr                           error;                      /*error*/
    long                            unused1;                    /*reserved - must be zero*/
};

#if OPAQUE_UPP_TYPES
    EXTERN_API(SoundParamUPP)
    NewSoundParamUPP               (SoundParamProcPtr       userRoutine);

    EXTERN_API(SoundConverterFillBufferDataUPP)
    NewSoundConverterFillBufferDataUPP    (SoundConverterFillBufferDataProcPtr userRoutine);

    EXTERN_API(SIInterruptUPP)
    NewSIInterruptUPP              (SIInterruptProcPtr      userRoutine);

    EXTERN_API(SICompletionUPP)
    NewSICompletionUPP             (SICompletionProcPtr     userRoutine);

    EXTERN_API(void)
    DisposeSoundParamUPP           (SoundParamUPP           userUPP);

    EXTERN_API(void)
    DisposeSoundConverterFillBufferDataUPP    (SoundConverterFillBufferDataUPP userUPP);

    EXTERN_API(void)
    DisposeSIInterruptUPP          (SIInterruptUPP          userUPP);

    EXTERN_API(void)
    DisposeSICompletionUPP         (SICompletionUPP         userUPP);

    EXTERN_API(Boolean)
    InvokeSoundParamUPP            (SoundParamBlockPtr *    pb,
                                    SoundParamUPP           userUPP);

    EXTERN_API(Boolean)
    InvokeSoundConverterFillBufferDataUPP    (SoundComponentDataPtr * data,
                                    void *                  refCon,
                                    SoundConverterFillBufferDataUPP userUPP);

    EXTERN_API(void)
    InvokeSIInterruptUPP           (SPBPtr                  inParamPtr,
                                    Ptr                     dataBuffer,
                                    short                   peakAmplitude,
                                    long                    sampleSize,
                                    SIInterruptUPP          userUPP);

    EXTERN_API(void)
    InvokeSICompletionUPP          (SPBPtr                  inParamPtr,
                                    SICompletionUPP         userUPP);

#else
    enum { uppSoundParamProcInfo = 0x000000D0 };                    /* pascal 1_byte Func(4_bytes) */
    enum { uppSoundConverterFillBufferDataProcInfo = 0x000003D0 };  /* pascal 1_byte Func(4_bytes, 4_bytes) */
    enum { uppSIInterruptProcInfo = 0x1C579802 };                   /* register no_return_value Func(4_bytes:A0, 4_bytes:A1, 2_bytes:D0, 4_bytes:D1) */
    enum { uppSICompletionProcInfo = 0x000000C0 };                  /* pascal no_return_value Func(4_bytes) */
    #define NewSoundParamUPP(userRoutine)                           (SoundParamUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppSoundParamProcInfo, GetCurrentArchitecture())
    #define NewSoundConverterFillBufferDataUPP(userRoutine)         (SoundConverterFillBufferDataUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppSoundConverterFillBufferDataProcInfo, GetCurrentArchitecture())
    #define NewSIInterruptUPP(userRoutine)                          (SIInterruptUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppSIInterruptProcInfo, GetCurrentArchitecture())
    #define NewSICompletionUPP(userRoutine)                         (SICompletionUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppSICompletionProcInfo, GetCurrentArchitecture())
    #define DisposeSoundParamUPP(userUPP)                           DisposeRoutineDescriptor(userUPP)
    #define DisposeSoundConverterFillBufferDataUPP(userUPP)         DisposeRoutineDescriptor(userUPP)
    #define DisposeSIInterruptUPP(userUPP)                          DisposeRoutineDescriptor(userUPP)
    #define DisposeSICompletionUPP(userUPP)                         DisposeRoutineDescriptor(userUPP)
    #define InvokeSoundParamUPP(pb, userUPP)                        (Boolean)CALL_ONE_PARAMETER_UPP((userUPP), uppSoundParamProcInfo, (pb))
    #define InvokeSoundConverterFillBufferDataUPP(data, refCon, userUPP)  (Boolean)CALL_TWO_PARAMETER_UPP((userUPP), uppSoundConverterFillBufferDataProcInfo, (data), (refCon))
    #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
    /* InvokeSIInterruptUPP can't be called from classic 68k without glue code */
    #else
        #define InvokeSIInterruptUPP(inParamPtr, dataBuffer, peakAmplitude, sampleSize, userUPP)  CALL_FOUR_PARAMETER_UPP((userUPP), uppSIInterruptProcInfo, (inParamPtr), (dataBuffer), (peakAmplitude), (sampleSize))
    #endif
    #define InvokeSICompletionUPP(inParamPtr, userUPP)              CALL_ONE_PARAMETER_UPP((userUPP), uppSICompletionProcInfo, (inParamPtr))
#endif
/* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
#define NewSoundParamProc(userRoutine)                          NewSoundParamUPP(userRoutine)
#define NewSoundConverterFillBufferDataProc(userRoutine)        NewSoundConverterFillBufferDataUPP(userRoutine)
#define NewSIInterruptProc(userRoutine)                         NewSIInterruptUPP(userRoutine)
#define NewSICompletionProc(userRoutine)                        NewSICompletionUPP(userRoutine)
#define CallSoundParamProc(userRoutine, pb)                     InvokeSoundParamUPP(pb, userRoutine)
#define CallSoundConverterFillBufferDataProc(userRoutine, data, refCon) InvokeSoundConverterFillBufferDataUPP(data, refCon, userRoutine)
#define CallSIInterruptProc(userRoutine, inParamPtr, dataBuffer, peakAmplitude, sampleSize) InvokeSIInterruptUPP(inParamPtr, dataBuffer, peakAmplitude, sampleSize, userRoutine)
#define CallSICompletionProc(userRoutine, inParamPtr)           InvokeSICompletionUPP(inParamPtr, userRoutine)
typedef CALLBACK_API( void , FilePlayCompletionProcPtr )(SndChannelPtr chan);
typedef STACK_UPP_TYPE(FilePlayCompletionProcPtr)               FilePlayCompletionUPP;
#if OPAQUE_UPP_TYPES
    EXTERN_API(FilePlayCompletionUPP)
    NewFilePlayCompletionUPP       (FilePlayCompletionProcPtr userRoutine);

    EXTERN_API(void)
    DisposeFilePlayCompletionUPP    (FilePlayCompletionUPP  userUPP);

    EXTERN_API(void)
    InvokeFilePlayCompletionUPP    (SndChannelPtr           chan,
                                    FilePlayCompletionUPP   userUPP);

#else
    enum { uppFilePlayCompletionProcInfo = 0x000000C0 };            /* pascal no_return_value Func(4_bytes) */
    #define NewFilePlayCompletionUPP(userRoutine)                   (FilePlayCompletionUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppFilePlayCompletionProcInfo, GetCurrentArchitecture())
    #define DisposeFilePlayCompletionUPP(userUPP)                   DisposeRoutineDescriptor(userUPP)
    #define InvokeFilePlayCompletionUPP(chan, userUPP)              CALL_ONE_PARAMETER_UPP((userUPP), uppFilePlayCompletionProcInfo, (chan))
#endif
/* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
#define NewFilePlayCompletionProc(userRoutine)                  NewFilePlayCompletionUPP(userRoutine)
#define CallFilePlayCompletionProc(userRoutine, chan)           InvokeFilePlayCompletionUPP(chan, userRoutine)
/*
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   prototypes
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/


/* Sound Manager routines */
EXTERN_API( void )
SysBeep                         (short                  duration)                           ONEWORDINLINE(0xA9C8);

EXTERN_API( OSErr )
SndDoCommand                    (SndChannelPtr          chan,
                                 const SndCommand *     cmd,
                                 Boolean                noWait)                             ONEWORDINLINE(0xA803);

EXTERN_API( OSErr )
SndDoImmediate                  (SndChannelPtr          chan,
                                 const SndCommand *     cmd)                                ONEWORDINLINE(0xA804);

EXTERN_API( OSErr )
SndNewChannel                   (SndChannelPtr *        chan,
                                 short                  synth,
                                 long                   init,
                                 SndCallBackUPP         userRoutine)                        ONEWORDINLINE(0xA807);

EXTERN_API( OSErr )
SndDisposeChannel               (SndChannelPtr          chan,
                                 Boolean                quietNow)                           ONEWORDINLINE(0xA801);

EXTERN_API( OSErr )
SndPlay                         (SndChannelPtr          chan,
                                 SndListHandle          sndHandle,
                                 Boolean                async)                              ONEWORDINLINE(0xA805);

#if OLDROUTINENAMES
EXTERN_API( OSErr )
SndAddModifier                  (SndChannelPtr          chan,
                                 Ptr                    modifier,
                                 short                  id,
                                 long                   init)                               ONEWORDINLINE(0xA802);

#endif  /* OLDROUTINENAMES */

EXTERN_API( OSErr )
SndControl                      (short                  id,
                                 SndCommand *           cmd)                                ONEWORDINLINE(0xA806);

/* Sound Manager 2.0 and later, uses _SoundDispatch */
EXTERN_API( NumVersion )
SndSoundManagerVersion          (void)                                                      FOURWORDINLINE(0x203C, 0x000C, 0x0008, 0xA800);

EXTERN_API( OSErr )
SndStartFilePlay                (SndChannelPtr          chan,
                                 short                  fRefNum,
                                 short                  resNum,
                                 long                   bufferSize,
                                 void *                 theBuffer,
                                 AudioSelectionPtr      theSelection,
                                 FilePlayCompletionUPP  theCompletion,
                                 Boolean                async)                              FOURWORDINLINE(0x203C, 0x0D00, 0x0008, 0xA800);

EXTERN_API( OSErr )
SndPauseFilePlay                (SndChannelPtr          chan)                               FOURWORDINLINE(0x203C, 0x0204, 0x0008, 0xA800);

EXTERN_API( OSErr )
SndStopFilePlay                 (SndChannelPtr          chan,
                                 Boolean                quietNow)                           FOURWORDINLINE(0x203C, 0x0308, 0x0008, 0xA800);

EXTERN_API( OSErr )
SndChannelStatus                (SndChannelPtr          chan,
                                 short                  theLength,
                                 SCStatusPtr            theStatus)                          FOURWORDINLINE(0x203C, 0x0510, 0x0008, 0xA800);

EXTERN_API( OSErr )
SndManagerStatus                (short                  theLength,
                                 SMStatusPtr            theStatus)                          FOURWORDINLINE(0x203C, 0x0314, 0x0008, 0xA800);

EXTERN_API( void )
SndGetSysBeepState              (short *                sysBeepState)                       FOURWORDINLINE(0x203C, 0x0218, 0x0008, 0xA800);

EXTERN_API( OSErr )
SndSetSysBeepState              (short                  sysBeepState)                       FOURWORDINLINE(0x203C, 0x011C, 0x0008, 0xA800);

EXTERN_API( OSErr )
SndPlayDoubleBuffer             (SndChannelPtr          chan,
                                 SndDoubleBufferHeaderPtr  theParams)                       FOURWORDINLINE(0x203C, 0x0420, 0x0008, 0xA800);

/* MACE compression routines, uses _SoundDispatch */
EXTERN_API( NumVersion )
MACEVersion                     (void)                                                      FOURWORDINLINE(0x203C, 0x0000, 0x0010, 0xA800);

EXTERN_API( void )
Comp3to1                        (const void *           inBuffer,
                                 void *                 outBuffer,
                                 unsigned long          cnt,
                                 StateBlockPtr          inState,
                                 StateBlockPtr          outState,
                                 unsigned long          numChannels,
                                 unsigned long          whichChannel)                       FOURWORDINLINE(0x203C, 0x0004, 0x0010, 0xA800);

EXTERN_API( void )
Exp1to3                         (const void *           inBuffer,
                                 void *                 outBuffer,
                                 unsigned long          cnt,
                                 StateBlockPtr          inState,
                                 StateBlockPtr          outState,
                                 unsigned long          numChannels,
                                 unsigned long          whichChannel)                       FOURWORDINLINE(0x203C, 0x0008, 0x0010, 0xA800);

EXTERN_API( void )
Comp6to1                        (const void *           inBuffer,
                                 void *                 outBuffer,
                                 unsigned long          cnt,
                                 StateBlockPtr          inState,
                                 StateBlockPtr          outState,
                                 unsigned long          numChannels,
                                 unsigned long          whichChannel)                       FOURWORDINLINE(0x203C, 0x000C, 0x0010, 0xA800);

EXTERN_API( void )
Exp1to6                         (const void *           inBuffer,
                                 void *                 outBuffer,
                                 unsigned long          cnt,
                                 StateBlockPtr          inState,
                                 StateBlockPtr          outState,
                                 unsigned long          numChannels,
                                 unsigned long          whichChannel)                       FOURWORDINLINE(0x203C, 0x0010, 0x0010, 0xA800);

/* Sound Manager 3.0 and later calls, uses _SoundDispatch */
EXTERN_API( OSErr )
GetSysBeepVolume                (long *                 level)                              FOURWORDINLINE(0x203C, 0x0224, 0x0018, 0xA800);

EXTERN_API( OSErr )
SetSysBeepVolume                (long                   level)                              FOURWORDINLINE(0x203C, 0x0228, 0x0018, 0xA800);

EXTERN_API( OSErr )
GetDefaultOutputVolume          (long *                 level)                              FOURWORDINLINE(0x203C, 0x022C, 0x0018, 0xA800);

EXTERN_API( OSErr )
SetDefaultOutputVolume          (long                   level)                              FOURWORDINLINE(0x203C, 0x0230, 0x0018, 0xA800);

EXTERN_API( OSErr )
GetSoundHeaderOffset            (SndListHandle          sndHandle,
                                 long *                 offset)                             FOURWORDINLINE(0x203C, 0x0404, 0x0018, 0xA800);

EXTERN_API( UnsignedFixed )
UnsignedFixedMulDiv             (UnsignedFixed          value,
                                 UnsignedFixed          multiplier,
                                 UnsignedFixed          divisor)                            FOURWORDINLINE(0x203C, 0x060C, 0x0018, 0xA800);

EXTERN_API( OSErr )
GetCompressionInfo              (short                  compressionID,
                                 OSType                 format,
                                 short                  numChannels,
                                 short                  sampleSize,
                                 CompressionInfoPtr     cp)                                 FOURWORDINLINE(0x203C, 0x0710, 0x0018, 0xA800);

EXTERN_API( OSErr )
SetSoundPreference              (OSType                 theType,
                                 Str255                 name,
                                 Handle                 settings)                           FOURWORDINLINE(0x203C, 0x0634, 0x0018, 0xA800);

EXTERN_API( OSErr )
GetSoundPreference              (OSType                 theType,
                                 Str255                 name,
                                 Handle                 settings)                           FOURWORDINLINE(0x203C, 0x0638, 0x0018, 0xA800);

EXTERN_API( OSErr )
OpenMixerSoundComponent         (SoundComponentDataPtr  outputDescription,
                                 long                   outputFlags,
                                 ComponentInstance *    mixerComponent)                     FOURWORDINLINE(0x203C, 0x0614, 0x0018, 0xA800);

EXTERN_API( OSErr )
CloseMixerSoundComponent        (ComponentInstance      ci)                                 FOURWORDINLINE(0x203C, 0x0218, 0x0018, 0xA800);

/* Sound Manager 3.1 and later calls, uses _SoundDispatch */
EXTERN_API( OSErr )
SndGetInfo                      (SndChannelPtr          chan,
                                 OSType                 selector,
                                 void *                 infoPtr)                            FOURWORDINLINE(0x203C, 0x063C, 0x0018, 0xA800);

EXTERN_API( OSErr )
SndSetInfo                      (SndChannelPtr          chan,
                                 OSType                 selector,
                                 const void *           infoPtr)                            FOURWORDINLINE(0x203C, 0x0640, 0x0018, 0xA800);

EXTERN_API( OSErr )
GetSoundOutputInfo              (Component              outputDevice,
                                 OSType                 selector,
                                 void *                 infoPtr)                            FOURWORDINLINE(0x203C, 0x0644, 0x0018, 0xA800);

EXTERN_API( OSErr )
SetSoundOutputInfo              (Component              outputDevice,
                                 OSType                 selector,
                                 const void *           infoPtr)                            FOURWORDINLINE(0x203C, 0x0648, 0x0018, 0xA800);

/* Sound Manager 3.2 and later calls, uses _SoundDispatch */
EXTERN_API( OSErr )
GetCompressionName              (OSType                 compressionType,
                                 Str255                 compressionName)                    FOURWORDINLINE(0x203C, 0x044C, 0x0018, 0xA800);

EXTERN_API( OSErr )
SoundConverterOpen              (const SoundComponentData * inputFormat,
                                 const SoundComponentData * outputFormat,
                                 SoundConverter *       sc)                                 FOURWORDINLINE(0x203C, 0x0650, 0x0018, 0xA800);

EXTERN_API( OSErr )
SoundConverterClose             (SoundConverter         sc)                                 FOURWORDINLINE(0x203C, 0x0254, 0x0018, 0xA800);

EXTERN_API( OSErr )
SoundConverterGetBufferSizes    (SoundConverter         sc,
                                 unsigned long          inputBytesTarget,
                                 unsigned long *        inputFrames,
                                 unsigned long *        inputBytes,
                                 unsigned long *        outputBytes)                        FOURWORDINLINE(0x203C, 0x0A58, 0x0018, 0xA800);

EXTERN_API( OSErr )
SoundConverterBeginConversion   (SoundConverter         sc)                                 FOURWORDINLINE(0x203C, 0x025C, 0x0018, 0xA800);

EXTERN_API( OSErr )
SoundConverterConvertBuffer     (SoundConverter         sc,
                                 const void *           inputPtr,
                                 unsigned long          inputFrames,
                                 void *                 outputPtr,
                                 unsigned long *        outputFrames,
                                 unsigned long *        outputBytes)                        FOURWORDINLINE(0x203C, 0x0C60, 0x0018, 0xA800);

EXTERN_API( OSErr )
SoundConverterEndConversion     (SoundConverter         sc,
                                 void *                 outputPtr,
                                 unsigned long *        outputFrames,
                                 unsigned long *        outputBytes)                        FOURWORDINLINE(0x203C, 0x0864, 0x0018, 0xA800);

/* Sound Manager 3.3 and later calls, uses _SoundDispatch */
EXTERN_API( OSErr )
SoundConverterGetInfo           (SoundConverter         sc,
                                 OSType                 selector,
                                 void *                 infoPtr)                            FOURWORDINLINE(0x203C, 0x0668, 0x0018, 0xA800);

EXTERN_API( OSErr )
SoundConverterSetInfo           (SoundConverter         sc,
                                 OSType                 selector,
                                 void *                 infoPtr)                            FOURWORDINLINE(0x203C, 0x066C, 0x0018, 0xA800);

/* Sound Manager 3.6 and later calls, uses _SoundDispatch */
EXTERN_API( OSErr )
SoundConverterFillBuffer        (SoundConverter         sc,
                                 SoundConverterFillBufferDataUPP  fillBufferDataUPP,
                                 void *                 fillBufferDataRefCon,
                                 void *                 outputBuffer,
                                 unsigned long          outputBufferByteSize,
                                 unsigned long *        bytesWritten,
                                 unsigned long *        framesWritten,
                                 unsigned long *        outputFlags)                        FOURWORDINLINE(0x203C, 0x1078, 0x0018, 0xA800);

EXTERN_API( OSErr )
SoundManagerGetInfo             (OSType                 selector,
                                 void *                 infoPtr)                            FOURWORDINLINE(0x203C, 0x047C, 0x0018, 0xA800);

EXTERN_API( OSErr )
SoundManagerSetInfo             (OSType                 selector,
                                 const void *           infoPtr)                            FOURWORDINLINE(0x203C, 0x0480, 0x0018, 0xA800);

/*
  Sound Component Functions
   basic sound component functions
*/

EXTERN_API( ComponentResult )
SoundComponentInitOutputDevice  (ComponentInstance      ti,
                                 long                   actions)                            FIVEWORDINLINE(0x2F3C, 0x0004, 0x0001, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SoundComponentSetSource         (ComponentInstance      ti,
                                 SoundSource            sourceID,
                                 ComponentInstance      source)                             FIVEWORDINLINE(0x2F3C, 0x0008, 0x0002, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SoundComponentGetSource         (ComponentInstance      ti,
                                 SoundSource            sourceID,
                                 ComponentInstance *    source)                             FIVEWORDINLINE(0x2F3C, 0x0008, 0x0003, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SoundComponentGetSourceData     (ComponentInstance      ti,
                                 SoundComponentDataPtr * sourceData)                        FIVEWORDINLINE(0x2F3C, 0x0004, 0x0004, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SoundComponentSetOutput         (ComponentInstance      ti,
                                 SoundComponentDataPtr  requested,
                                 SoundComponentDataPtr * actual)                            FIVEWORDINLINE(0x2F3C, 0x0008, 0x0005, 0x7000, 0xA82A);

/* junction methods for the mixer, must be called at non-interrupt level*/
EXTERN_API( ComponentResult )
SoundComponentAddSource         (ComponentInstance      ti,
                                 SoundSource *          sourceID)                           FIVEWORDINLINE(0x2F3C, 0x0004, 0x0101, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SoundComponentRemoveSource      (ComponentInstance      ti,
                                 SoundSource            sourceID)                           FIVEWORDINLINE(0x2F3C, 0x0004, 0x0102, 0x7000, 0xA82A);

/* info methods*/
EXTERN_API( ComponentResult )
SoundComponentGetInfo           (ComponentInstance      ti,
                                 SoundSource            sourceID,
                                 OSType                 selector,
                                 void *                 infoPtr)                            FIVEWORDINLINE(0x2F3C, 0x000C, 0x0103, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SoundComponentSetInfo           (ComponentInstance      ti,
                                 SoundSource            sourceID,
                                 OSType                 selector,
                                 void *                 infoPtr)                            FIVEWORDINLINE(0x2F3C, 0x000C, 0x0104, 0x7000, 0xA82A);

/* control methods*/
EXTERN_API( ComponentResult )
SoundComponentStartSource       (ComponentInstance      ti,
                                 short                  count,
                                 SoundSource *          sources)                            FIVEWORDINLINE(0x2F3C, 0x0006, 0x0105, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SoundComponentStopSource        (ComponentInstance      ti,
                                 short                  count,
                                 SoundSource *          sources)                            FIVEWORDINLINE(0x2F3C, 0x0006, 0x0106, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SoundComponentPauseSource       (ComponentInstance      ti,
                                 short                  count,
                                 SoundSource *          sources)                            FIVEWORDINLINE(0x2F3C, 0x0006, 0x0107, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SoundComponentPlaySourceBuffer  (ComponentInstance      ti,
                                 SoundSource            sourceID,
                                 SoundParamBlockPtr     pb,
                                 long                   actions)                            FIVEWORDINLINE(0x2F3C, 0x000C, 0x0108, 0x7000, 0xA82A);


/* selectors for component calls */
enum {
    kSoundComponentInitOutputDeviceSelect      = 0x0001,
    kSoundComponentSetSourceSelect             = 0x0002,
    kSoundComponentGetSourceSelect             = 0x0003,
    kSoundComponentGetSourceDataSelect         = 0x0004,
    kSoundComponentSetOutputSelect             = 0x0005,
    kSoundComponentAddSourceSelect             = 0x0101,
    kSoundComponentRemoveSourceSelect          = 0x0102,
    kSoundComponentGetInfoSelect               = 0x0103,
    kSoundComponentSetInfoSelect               = 0x0104,
    kSoundComponentStartSourceSelect           = 0x0105,
    kSoundComponentStopSourceSelect            = 0x0106,
    kSoundComponentPauseSourceSelect           = 0x0107,
    kSoundComponentPlaySourceBufferSelect      = 0x0108
};
/*Audio Components*/
/*Volume is described as a value between 0 and 1, with 0 indicating minimum
  volume and 1 indicating maximum volume; if the device doesn't support
  software control of volume, then a value of unimpErr is returned, indicating
  that these functions are not supported by the device
*/
EXTERN_API( ComponentResult )
AudioGetVolume                  (ComponentInstance      ac,
                                 short                  whichChannel,
                                 ShortFixed *           volume)                             FIVEWORDINLINE(0x2F3C, 0x0006, 0x0000, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
AudioSetVolume                  (ComponentInstance      ac,
                                 short                  whichChannel,
                                 ShortFixed             volume)                             FIVEWORDINLINE(0x2F3C, 0x0004, 0x0001, 0x7000, 0xA82A);

/*If the device doesn't support software control of mute, then a value of unimpErr is
returned, indicating that these functions are not supported by the device.*/
EXTERN_API( ComponentResult )
AudioGetMute                    (ComponentInstance      ac,
                                 short                  whichChannel,
                                 short *                mute)                               FIVEWORDINLINE(0x2F3C, 0x0006, 0x0002, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
AudioSetMute                    (ComponentInstance      ac,
                                 short                  whichChannel,
                                 short                  mute)                               FIVEWORDINLINE(0x2F3C, 0x0004, 0x0003, 0x7000, 0xA82A);

/*AudioSetToDefaults causes the associated device to reset its volume and mute values
(and perhaps other characteristics, e.g. attenuation) to "factory default" settings*/
EXTERN_API( ComponentResult )
AudioSetToDefaults              (ComponentInstance      ac)                                 FIVEWORDINLINE(0x2F3C, 0x0000, 0x0004, 0x7000, 0xA82A);

/*This routine is required; it must be implemented by all audio components*/

EXTERN_API( ComponentResult )
AudioGetInfo                    (ComponentInstance      ac,
                                 AudioInfoPtr           info)                               FIVEWORDINLINE(0x2F3C, 0x0004, 0x0005, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
AudioGetBass                    (ComponentInstance      ac,
                                 short                  whichChannel,
                                 short *                bass)                               FIVEWORDINLINE(0x2F3C, 0x0006, 0x0006, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
AudioSetBass                    (ComponentInstance      ac,
                                 short                  whichChannel,
                                 short                  bass)                               FIVEWORDINLINE(0x2F3C, 0x0004, 0x0007, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
AudioGetTreble                  (ComponentInstance      ac,
                                 short                  whichChannel,
                                 short *                Treble)                             FIVEWORDINLINE(0x2F3C, 0x0006, 0x0008, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
AudioSetTreble                  (ComponentInstance      ac,
                                 short                  whichChannel,
                                 short                  Treble)                             FIVEWORDINLINE(0x2F3C, 0x0004, 0x0009, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
AudioGetOutputDevice            (ComponentInstance      ac,
                                 Component *            outputDevice)                       FIVEWORDINLINE(0x2F3C, 0x0004, 0x000A, 0x7000, 0xA82A);

/*This is routine is private to the AudioVision component.  It enables the watching of the mute key.*/
EXTERN_API( ComponentResult )
AudioMuteOnEvent                (ComponentInstance      ac,
                                 short                  muteOnEvent)                        FIVEWORDINLINE(0x2F3C, 0x0002, 0x0081, 0x7000, 0xA82A);


/* selectors for component calls */
enum {
    kAudioGetVolumeSelect                      = 0x0000,
    kAudioSetVolumeSelect                      = 0x0001,
    kAudioGetMuteSelect                        = 0x0002,
    kAudioSetMuteSelect                        = 0x0003,
    kAudioSetToDefaultsSelect                  = 0x0004,
    kAudioGetInfoSelect                        = 0x0005,
    kAudioGetBassSelect                        = 0x0006,
    kAudioSetBassSelect                        = 0x0007,
    kAudioGetTrebleSelect                      = 0x0008,
    kAudioSetTrebleSelect                      = 0x0009,
    kAudioGetOutputDeviceSelect                = 0x000A,
    kAudioMuteOnEventSelect                    = 0x0081
};

enum {
    kDelegatedSoundComponentSelectors = 0x0100
};



/* Sound Input Manager routines, uses _SoundDispatch */
EXTERN_API( NumVersion )
SPBVersion                      (void)                                                      FOURWORDINLINE(0x203C, 0x0000, 0x0014, 0xA800);

EXTERN_API( OSErr )
SndRecord                       (ModalFilterUPP         filterProc,
                                 Point                  corner,
                                 OSType                 quality,
                                 SndListHandle *        sndHandle)                          FOURWORDINLINE(0x203C, 0x0804, 0x0014, 0xA800);

EXTERN_API( OSErr )
SndRecordToFile                 (ModalFilterUPP         filterProc,
                                 Point                  corner,
                                 OSType                 quality,
                                 short                  fRefNum)                            FOURWORDINLINE(0x203C, 0x0708, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBSignInDevice                 (short                  deviceRefNum,
                                 ConstStr255Param       deviceName)                         FOURWORDINLINE(0x203C, 0x030C, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBSignOutDevice                (short                  deviceRefNum)                       FOURWORDINLINE(0x203C, 0x0110, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBGetIndexedDevice             (short                  count,
                                 Str255                 deviceName,
                                 Handle *               deviceIconHandle)                   FOURWORDINLINE(0x203C, 0x0514, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBOpenDevice                   (ConstStr255Param       deviceName,
                                 short                  permission,
                                 long *                 inRefNum)                           FOURWORDINLINE(0x203C, 0x0518, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBCloseDevice                  (long                   inRefNum)                           FOURWORDINLINE(0x203C, 0x021C, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBRecord                       (SPBPtr                 inParamPtr,
                                 Boolean                asynchFlag)                         FOURWORDINLINE(0x203C, 0x0320, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBRecordToFile                 (short                  fRefNum,
                                 SPBPtr                 inParamPtr,
                                 Boolean                asynchFlag)                         FOURWORDINLINE(0x203C, 0x0424, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBPauseRecording               (long                   inRefNum)                           FOURWORDINLINE(0x203C, 0x0228, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBResumeRecording              (long                   inRefNum)                           FOURWORDINLINE(0x203C, 0x022C, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBStopRecording                (long                   inRefNum)                           FOURWORDINLINE(0x203C, 0x0230, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBGetRecordingStatus           (long                   inRefNum,
                                 short *                recordingStatus,
                                 short *                meterLevel,
                                 unsigned long *        totalSamplesToRecord,
                                 unsigned long *        numberOfSamplesRecorded,
                                 unsigned long *        totalMsecsToRecord,
                                 unsigned long *        numberOfMsecsRecorded)              FOURWORDINLINE(0x203C, 0x0E34, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBGetDeviceInfo                (long                   inRefNum,
                                 OSType                 infoType,
                                 void *                 infoData)                           FOURWORDINLINE(0x203C, 0x0638, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBSetDeviceInfo                (long                   inRefNum,
                                 OSType                 infoType,
                                 void *                 infoData)                           FOURWORDINLINE(0x203C, 0x063C, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBMillisecondsToBytes          (long                   inRefNum,
                                 long *                 milliseconds)                       FOURWORDINLINE(0x203C, 0x0440, 0x0014, 0xA800);

EXTERN_API( OSErr )
SPBBytesToMilliseconds          (long                   inRefNum,
                                 long *                 byteCount)                          FOURWORDINLINE(0x203C, 0x0444, 0x0014, 0xA800);

EXTERN_API( OSErr )
SetupSndHeader                  (SndListHandle          sndHandle,
                                 short                  numChannels,
                                 UnsignedFixed          sampleRate,
                                 short                  sampleSize,
                                 OSType                 compressionType,
                                 short                  baseNote,
                                 unsigned long          numBytes,
                                 short *                headerLen)                          FOURWORDINLINE(0x203C, 0x0D48, 0x0014, 0xA800);

EXTERN_API( OSErr )
SetupAIFFHeader                 (short                  fRefNum,
                                 short                  numChannels,
                                 UnsignedFixed          sampleRate,
                                 short                  sampleSize,
                                 OSType                 compressionType,
                                 unsigned long          numBytes,
                                 unsigned long          numFrames)                          FOURWORDINLINE(0x203C, 0x0B4C, 0x0014, 0xA800);

/* Sound Input Manager 1.1 and later calls, uses _SoundDispatch */
EXTERN_API( OSErr )
ParseAIFFHeader                 (short                  fRefNum,
                                 SoundComponentData *   sndInfo,
                                 unsigned long *        numFrames,
                                 unsigned long *        dataOffset)                         FOURWORDINLINE(0x203C, 0x0758, 0x0014, 0xA800);

EXTERN_API( OSErr )
ParseSndHeader                  (SndListHandle          sndHandle,
                                 SoundComponentData *   sndInfo,
                                 unsigned long *        numFrames,
                                 unsigned long *        dataOffset)                         FOURWORDINLINE(0x203C, 0x085C, 0x0014, 0xA800);





#if !TARGET_OS_MAC || TARGET_API_MAC_CARBON
/*  Only to be used if you are writing a sound input component; this */
/*  is the param block for a read request from the SoundMgr to the   */
/*  sound input component.  Not to be confused with the SPB struct   */
/*  above, which is the param block for a read request from an app   */
/*  to the SoundMgr.                                                 */
typedef struct SndInputCmpParam         SndInputCmpParam;
typedef SndInputCmpParam *              SndInputCmpParamPtr;
typedef CALLBACK_API( void , SICCompletionProcPtr )(SndInputCmpParamPtr SICParmPtr);

struct SndInputCmpParam {
    SICCompletionProcPtr            ioCompletion;               /* completion routine [pointer]*/
    SIInterruptProcPtr              ioInterrupt;                /* interrupt routine [pointer]*/
    OSErr                           ioResult;                   /* I/O result code [word]*/
    short                           pad;
    unsigned long                   ioReqCount;
    unsigned long                   ioActCount;
    Ptr                             ioBuffer;
    Ptr                             ioMisc;
};

EXTERN_API( ComponentResult )
SndInputReadAsync               (ComponentInstance      self,
                                 SndInputCmpParamPtr    SICParmPtr)                         FIVEWORDINLINE(0x2F3C, 0x0004, 0x0001, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SndInputReadSync                (ComponentInstance      self,
                                 SndInputCmpParamPtr    SICParmPtr)                         FIVEWORDINLINE(0x2F3C, 0x0004, 0x0002, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SndInputPauseRecording          (ComponentInstance      self)                               FIVEWORDINLINE(0x2F3C, 0x0000, 0x0003, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SndInputResumeRecording         (ComponentInstance      self)                               FIVEWORDINLINE(0x2F3C, 0x0000, 0x0004, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SndInputStopRecording           (ComponentInstance      self)                               FIVEWORDINLINE(0x2F3C, 0x0000, 0x0005, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SndInputGetStatus               (ComponentInstance      self,
                                 short *                recordingStatus,
                                 unsigned long *        totalSamplesToRecord,
                                 unsigned long *        numberOfSamplesRecorded)            FIVEWORDINLINE(0x2F3C, 0x000C, 0x0006, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SndInputGetDeviceInfo           (ComponentInstance      self,
                                 OSType                 infoType,
                                 void *                 infoData)                           FIVEWORDINLINE(0x2F3C, 0x0008, 0x0007, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SndInputSetDeviceInfo           (ComponentInstance      self,
                                 OSType                 infoType,
                                 void *                 infoData)                           FIVEWORDINLINE(0x2F3C, 0x0008, 0x0008, 0x7000, 0xA82A);

EXTERN_API( ComponentResult )
SndInputInitHardware            (ComponentInstance      self)                               FIVEWORDINLINE(0x2F3C, 0x0000, 0x0009, 0x7000, 0xA82A);


/* selectors for component calls */
enum {
    kSndInputReadAsyncSelect                   = 0x0001,
    kSndInputReadSyncSelect                    = 0x0002,
    kSndInputPauseRecordingSelect              = 0x0003,
    kSndInputResumeRecordingSelect             = 0x0004,
    kSndInputStopRecordingSelect               = 0x0005,
    kSndInputGetStatusSelect                   = 0x0006,
    kSndInputGetDeviceInfoSelect               = 0x0007,
    kSndInputSetDeviceInfoSelect               = 0x0008,
    kSndInputInitHardwareSelect                = 0x0009
};
#endif  /* !TARGET_OS_MAC || TARGET_API_MAC_CARBON */



#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __SOUND__ */

