uLawCodec.h

// common header file shared by both the code and resource compilers
 
 
/*
    How this works:
 
    In uLaw, 14-bits of linear sampling is reduced to 8 bits of logarithmic data.
    It is used on North American and Japanese phone systems, and is coming into use
    for voice data interchange, for PBXs, voicemail, MIME (Internet standard for multimedia mail),
    and Internet Talk Radio. µLaw sounds are almost always encoded at 8000, 8012, or 8012.8210513
    samples/sec. 8000 because it is the specified standard for phones, and 8012.8210513
    (and rounded to 8012) because it is apparently the actual rate used in domestic digital phone switches.
 
    ---------------------------
    U-LAW and A-LAW definitions
    ---------------------------
 
    [Adapted from information provided by duggan@cc.gatech.edu (Rick
    Duggan) and davep@zenobia.phys.unsw.EDU.AU (David Perry)]
 
    u-LAW (really mu-LAW) is
 
              sgn(m)   (     |m |)       |m |
       y=    ------- ln( 1+ u|--|)       |--| =< 1
             ln(1+u)   (     |mp|)       |mp|
 
    A-LAW is
 
         |     A    (m )                 |m |    1
         |  ------- (--)                 |--| =< -
         |  1+ln A  (mp)                 |mp|    A
       y=|
         | sgn(m) (        |m |)    1    |m |
         | ------ ( 1+ ln A|--|)    - =< |--| =< 1
         | 1+ln A (        |mp|)    A    |mp|
 
    Values of u=100 and 255, A=87.6, mp is the Peak message value, m is the current quantised message value.
    (The formulae get simpler if you substitute x for m/mp and sgn(x) for sgn(m); then -1 <= x <= 1.)
 
    Converting from u-LAW to A-LAW is in a sense "lossy" since there are quantizing errors introduced in
    the conversion.
 
    "..the u-LAW used in North America and Japan, and the A-LAW used in Europe and the rest of the world
    and international routes.."
 
    References:
 
    Modern Digital and Analog Communication Systems, B.P.Lathi., 2nd ed. ISBN 0-03-027933-X
 
    Transmission Systems for Communications
    Fifth Edition
    by Members of the Technical Staff at Bell Telephone Laboratories
    Bell Telephone Laboratories, Incorporated
    Copyright 1959, 1964, 1970, 1982
*/
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// resource IDs
 
#define kSoundDecompressorResID         1000        // ID of decompressor 'thng', code resources, and table
#define kSoundCompressorResID           2000        // ID of compressor 'thng', code resources, and table
#define kSoundCodecNameStringResID      1000        // ID of codec name
#define kSoundCodecInfoStringResID      1001        // ID of codec info string
#define kSoundComponentIconResID        1000        // ID of codec icon
 
#define kSoundComponentManufacturer     '????'      // your company's OSType
#define kCodecFormat                    kULawCompression
 
 
#define kSoundDecompressorVersion       0x00050000  // Use a higher version to overide the default component
#define kSoundCompressorVersion         0x00050000  // Use a higher version to overide the default component
 
#define k16BitTableResType              'Wtab'      // resource type for a 16 bit array
#define k8BitTableResType               'Btab'      // resource type for a 8 bit array
 
 
// resource names will be created for debug versions
#ifdef _DEBUG
#define ULawDecompressorName            "µLaw Decompressor"
#define ULawCompressorName              "µLaw Compressor"
#else
#define ULawDecompressorName            ""
#define ULawCompressorName              ""
#endif
 
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// code constants
 
#define kMaxOutputSamples       1024        /* approximate no. samples in output buffer */
 
#define kULawBlockSamples       1           /* no. samples in a block */
#define kULawBlockBytes         1           /* no. bytes in a block */
#define kULawBytesPerSample     2           /* no. bytes in decompressed sample */
 
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// failure handling macros
/*
    Some macros used to check for errors and also to allow for
    handling them by using a goto statement.  This makes the source
    code easier to read.  It will break into the debugger with a
    message showing the condition that caused the failure.  In some
    of the macros the debug message is removed but goto remains.  In
    other macros all of it is removed when doing a non-debug build.
 
    Note that these macros use the "\p" construct for creating
    Pascal strings at compile time.  Most non-Mac compilers do
    not recognize this, give a warning, and put 'p' as the first
    character of the string.  You can ignore the warning because
    the non-Mac version of DebugStr deals with this just fine.
    For Microsoft's Visual C++, we suppress the warning below.
*/
#if defined(_MSC_VER) && !defined(__MWERKS__) 
    // Visual C++ from Microsoft
    #pragma warning(disable:4129) // unrecognized character escape sequence
#endif
 
// This checks for the exception, and if true then goto handler
 
#ifdef _DEBUG
#define FailIf(cond, handler)                               \
    if (cond) {                                             \
        DebugStr((ConstStr255Param)"\p"#cond " goto " #handler);    \
        goto handler;                                       \
    } else 0
#else
#define FailIf(cond, handler)                               \
    if (cond) {                                             \
        goto handler;                                       \
    } else 0
#endif
 
// This checks for the exception, and if true do the action and goto handler
 
#ifdef _DEBUG
#define FailWithAction(cond, action, handler)               \
    if (cond) {                                             \
        DebugStr((ConstStr255Param)"\p"#cond " goto " #handler);    \
        { action; }                                         \
        goto handler;                                       \
    } else 0
#else
#define FailWithAction(cond, action, handler)               \
    if (cond) {                                             \
        { action; }                                         \
        goto handler;                                       \
    } else 0
#endif
 
// This will insert debugging code in the application to check conditions
// and displays the condition in the debugger if true.  This code is
// completely removed in non-debug builds.
 
#ifdef _DEBUG
#define FailMessage(cond)                                   \
    if (cond)                                               \
        DebugStr((ConstStr255Param)"\p"#cond);              \
    else 0
#else
#define FailMessage(cond)
#endif
 
// This allows you to test for the result of a condition (i.e. CloseComponent)
// and break if it returns a non zero result, otherwise it ignores the result.
// When a non-debug build is done, the result is ignored.
 
#ifdef _DEBUG
#define ErrorMessage(cond)                                  \
    if (cond)                                               \
        DebugStr((ConstStr255Param)"\p"#cond);              \
    else 0
#else
#define ErrorMessage(cond)      cond
#endif
 
// This will display a given message in the debugger, this code is completely
// removed in non-debug builds.
 
#ifdef _DEBUG
#define DebugMessage(s)         DebugString((ConstStr255Param)s)
#else
#define DebugMessage(s)
#endif