home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OpenStep 4.2J (Developer)
/
os42jdev.iso
/
NextDeveloper
/
Headers
/
sound
/
soundstruct.h
< prev
next >
Wrap
C/C++ Source or Header
|
1994-03-15
|
6KB
|
143 lines
/*
* soundstruct.h
* Copyright 1988-94 NeXT, Inc.
*
* SNDSoundStruct - This data format for sound is used as the soundfile
* format, and also the "NeXT sound pasteboard type". It consists of a header
* and two variable length quantities: textual information (the info string)
* and raw data. The raw data starts past the info; the dataLocation is
* normally used to specify an offset from the beginning of the SNDSoundStruct
* structure to this data. The dataSize is the length of the raw data in bytes.
* The dataFormat, samplingRate, and channelCount further describe the data.
* The data itself may be anything; the format determines what the data
* actually means (i.e. sample data, dsp core structure).
* The magic number value may be used to determine the byte order of the data.
* The info string is any null-terminated data that the application may need
* (i.e. copyright information, textual description). The four bytes allocated
* are a minimum; the info string may extend any length beyond the structure.
*/
#ifndef __SOUNDSTRUCT__
#define __SOUNDSTRUCT__
typedef struct {
int magic; /* must be equal to SND_MAGIC */
int dataLocation; /* Offset or pointer to the raw data */
int dataSize; /* Number of bytes of data in the raw data */
int dataFormat; /* The data format code */
int samplingRate; /* The sampling rate */
int channelCount; /* The number of channels */
char info[4]; /* Textual information relating to the sound. */
} SNDSoundStruct;
/*
* The magic number must appear at the beginning of every SNDSoundStruct.
* It is used for type checking and byte ordering information.
*/
#define SND_MAGIC ((int)0x2e736e64)
/*
* NeXT data format codes. User-defined formats should be greater than 255.
* Negative format numbers are reserved.
*/
#define SND_FORMAT_UNSPECIFIED (0)
#define SND_FORMAT_MULAW_8 (1)
#define SND_FORMAT_LINEAR_8 (2)
#define SND_FORMAT_LINEAR_16 (3)
#define SND_FORMAT_LINEAR_24 (4)
#define SND_FORMAT_LINEAR_32 (5)
#define SND_FORMAT_FLOAT (6)
#define SND_FORMAT_DOUBLE (7)
#define SND_FORMAT_INDIRECT (8)
#define SND_FORMAT_NESTED (9)
#define SND_FORMAT_DSP_CORE (10)
#define SND_FORMAT_DSP_DATA_8 (11)
#define SND_FORMAT_DSP_DATA_16 (12)
#define SND_FORMAT_DSP_DATA_24 (13)
#define SND_FORMAT_DSP_DATA_32 (14)
#define SND_FORMAT_DISPLAY (16)
#define SND_FORMAT_MULAW_SQUELCH (17)
#define SND_FORMAT_EMPHASIZED (18)
#define SND_FORMAT_COMPRESSED (19)
#define SND_FORMAT_COMPRESSED_EMPHASIZED (20)
#define SND_FORMAT_DSP_COMMANDS (21)
#define SND_FORMAT_DSP_COMMANDS_SAMPLES (22)
#define SND_FORMAT_ADPCM_G721 (23)
#define SND_FORMAT_ADPCM_G722 (24)
#define SND_FORMAT_ADPCM_G723_3 (25)
#define SND_FORMAT_ADPCM_G723_5 (26)
#define SND_FORMAT_ALAW_8 (27)
#define SND_FORMAT_AES (28)
#define SND_FORMAT_DELTA_MULAW_8 (29)
/*
* Compression subheader which appears at the beginning of the data
* (after the SNDSoundStruct header) in a compressed sound.
*/
typedef struct {
int originalSize; /* in bytes */
int method; /* e.g. SND_CFORMAT_ATC (below) */
int numDropped; /* for SND_CFORMAT_BITS_DROPPED */
int encodeLength; /* uncompressed samples per encoded block */
int reserved;
} SNDCompressionSubheader;
/*
* Compression types
*/
#define SND_CFORMAT_BITS_DROPPED (0)
#define SND_CFORMAT_BIT_FAITHFUL (1)
#define SND_CFORMAT_ATC (2) /* Audio Transform Compression*/
/*
* After the compression subheader, each frame of an ATC-format soundfile
* begins with two bytes which characterize the frame as follows:
*
* Byte Contents
* ----- --------
* 0 Frame length in bytes, including these 2 leading bytes
* 1 Peak level for the frame, in log-base-2 relative to 0dB.
*
* With these two bytes, an amplitude envelope can be constructed as follows:
*
* SNDCompressionSubheader *subheader = ((unsigned char *)soundPtr)
* + soundPtr->dataLocation;
* unsigned char *fp = ((unsigned char *)subheader)
* + sizeof(SNDCompressionSubheader);
* for (sample=0; sample < subheader->originalSize/sizeof(short);) {
* frameSize = *fp;
* frameExponent = *(fp+1);
* frameAmplitude = (32767 >> frameExponent); // approx amplitude
* fp += frameSize;
* sample += ATC_FRAME_SIZE; // sample count represented by frame
* ...
* }
*
* where ATC_FRAME_SIZE is the number of samples of the original sound
* which were compressed to create each frame, defined below.
*
* For stereo sounds, left and right channels are frame-interleaved.
* The first frame is a left-channel frame, the second is right, and so on.
*
* For mono sounds, and for each channel of a stereo sound, the frames
* are best handled in successive pairs. For example, to modify the playback
* speed of a sound by repeating or deleting frames, adjacent pairs of frames
* should be repeated or deleted. Similarly, playing a sound from an interior
* point should begin on an "even" frame boundary, where frame 0 is the first.
* This restriction is because ATC alternates the discrete sine transform (DST)
* with the discrete cosine transform (DCT) on a frame by frame basis.
*
*/
#define ATC_FRAME_SIZE (256)
/*
* Sampling rates directly supported in hardware.
*/
#define SND_RATE_CODEC (8012.8210513)
#define SND_RATE_LOW (22050.0)
#define SND_RATE_HIGH (44100.0)
#define SND_RATE_LOW_PC (11025.0)
#endif __SOUNDSTRUCT__