mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-10-11 17:23:59 +00:00
121 lines
4.3 KiB
C
121 lines
4.3 KiB
C
|
#if defined(__MWERKS__)
|
||
|
#include <Resources.h>
|
||
|
#include <Sound.h>
|
||
|
#else
|
||
|
#include <Carbon/Carbon.h>
|
||
|
#endif
|
||
|
|
||
|
// enumerations
|
||
|
typedef enum
|
||
|
{
|
||
|
shpError = -1,
|
||
|
shpFinished = 0,
|
||
|
shpPaused = 1,
|
||
|
shpPlaying = 2
|
||
|
} SHPlayStat;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
shrError = -1,
|
||
|
shrFinished = 0,
|
||
|
shrPaused = 1,
|
||
|
shrRecording = 2
|
||
|
} SHRecordStat;
|
||
|
|
||
|
// Sound Helper error codes
|
||
|
enum
|
||
|
{
|
||
|
kSHErrOutaChannels = 1, // No more output records are available
|
||
|
kSHErrBadRefNum, // Invalid reference number
|
||
|
kSHErrNonAsychDevice, // Input device can't handle asynchronous input
|
||
|
kSHErrNoRecording, // There's no recording to return
|
||
|
kSHErrNotRecording, // Not allowed because we're not recording
|
||
|
kSHErrAlreadyPaused, // Already paused
|
||
|
kSHErrAlreadyContinued // Already continued
|
||
|
};
|
||
|
|
||
|
// Contants used by the Asynchronous Sound Helper
|
||
|
const SInt16 kSHDefChannels = 4; // Default number of channels to preallocate
|
||
|
const SInt16 kSHCompleteSig = 'SH'; // Flag we use to know a "true" completion callback
|
||
|
const SInt32 kSHComplete = 'SHcp'; // Flag that a given channel has completed playback
|
||
|
const SInt16 kSHHeaderSlop = 100; // Extra bytes for the sound header when recording
|
||
|
const SInt16 kSHBaseNote = 60; // Middle C base note for new recordings
|
||
|
const SInt16 kSHSyncWaitTimeout = 60; // Ticks to sync-wait when killing the Helper
|
||
|
|
||
|
// Constants that should be in Sound.h but aren't
|
||
|
const SInt16 kSHNoSynth = 0; // Don't associate any synth to this channel
|
||
|
const SInt16 kSHNoInit = 0; // No specific initialization
|
||
|
const SInt8 kSHQuietNow = true; // Stop playing this sound immediately
|
||
|
const SInt8 kSHAsync = true; // Play asynchronously
|
||
|
const SInt8 kSHWait = false; // Wait for there to be enough room in the queue
|
||
|
|
||
|
// structures
|
||
|
typedef struct
|
||
|
{
|
||
|
SHRecordStat recordStatus; // Current record status
|
||
|
unsigned long totalRecordTime; // Total (maximum) record time in ms
|
||
|
unsigned long currentRecordTime; // Current recorded time in ms
|
||
|
short meterLevel; // 0..255, the current input level
|
||
|
} SHRecordStatusRec;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
SndChannel channel; // Our sound channel
|
||
|
long refNum; // Our Helper ref num
|
||
|
Handle sound; // The sound we're playing
|
||
|
Fixed rate; // The rate at which a sampled sound is playing
|
||
|
char handleState; // The handle state to restore this handle to
|
||
|
Boolean inUse; // Tells whether this SHOutRec is in use
|
||
|
Boolean paused; // Tells whether this sound is currently paused
|
||
|
} SHOutRec, *SHOutPtr;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
short numOutRecs; // The number of output records in outArray
|
||
|
SHOutRec *outArray; // Our pre-allocated output records
|
||
|
long nextRef; // The next available output reference number
|
||
|
} SHOutputVars;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
long inRefNum; // Sound Input Manager's device refNum
|
||
|
SPB inPB; // The input parameter block
|
||
|
Handle inHandle; // The handle we're recording into
|
||
|
short headerLength; // The length of the sound's header
|
||
|
Boolean recording; // Tells whether we're actually recording
|
||
|
Boolean recordComplete; // Tells whether recording is complete
|
||
|
OSErr recordErr; // Error, if error terminated recording
|
||
|
short numChannels; // Number of channels for recording
|
||
|
short sampleSize; // Sample size for recording
|
||
|
Fixed sampleRate; // Sample rate for recording
|
||
|
OSType compType; // Compression type for recording
|
||
|
Boolean *appComplete; // Flag to caller that recording is done
|
||
|
Boolean paused; // Tells whether recording has been paused
|
||
|
} SHInputVars;
|
||
|
|
||
|
// Initialization, idle, and termination
|
||
|
pascal OSErr SHInitSoundHelper( Boolean *attnFlag, short numChannels );
|
||
|
pascal void SHIdle( void );
|
||
|
pascal void SHKillSoundHelper(void );
|
||
|
|
||
|
// Easy sound output
|
||
|
pascal OSErr SHPlayByID( short resID, long *refNum );
|
||
|
pascal OSErr SHPlayByHandle( Handle sound, long *refNum );
|
||
|
pascal OSErr SHPlayStop( long refNum );
|
||
|
pascal OSErr SHPlayStopAll( void );
|
||
|
|
||
|
// Advanced sound output
|
||
|
pascal OSErr SHPlayPause( long refNum );
|
||
|
pascal OSErr SHPlayContinue( long refNum );
|
||
|
pascal SHPlayStat SHPlayStatus( long refNum );
|
||
|
pascal OSErr SHGetChannel( long refNum, SndChannelPtr *channel );
|
||
|
|
||
|
// Easy sound input
|
||
|
pascal OSErr SHRecordStart( short maxK, OSType quality, Boolean *doneFlag );
|
||
|
pascal OSErr SHGetRecordedSound( Handle *theSound );
|
||
|
pascal OSErr SHRecordStop( void );
|
||
|
|
||
|
// Advanced sound input
|
||
|
pascal OSErr SHRecordPause( void );
|
||
|
pascal OSErr SHRecordContinue( void );
|
||
|
pascal OSErr SHRecordStatus( SHRecordStatusRec *recordStatus );
|