How To Use GSM Compression in Low-level Wave Recording

Last reviewed: July 24, 1996
Article ID: Q153866
The information in this article applies to:
  • Microsoft Win32 Software Development Kit (SDK), version 3.5

SUMMARY

Realtime GSM recording using the low-level waveXXX API can be accomplished by filling in an appropriated struct and then calling waveInOpen() with the WAVE_MAPPER option so that the GSM format specified in the struct will be used.

MORE INFORMATION

Along with the usual set of low-level waveXXX calls used in recording, and illustrated in such samples as DDREC, the code fragments shown below provide information on the steps needed to record audio compressed in the GSM format.

Either make the following definitions in one of the project's header files or make sure the project has a path to an existing header file, such as MMREG.H, with these definitions. The key points here are to define WAVE_FORMAT_GSM610 as a hexadecimal 31, and to set up a GSM structure that consists of a WAVEFORMATEX struct followed by a WORD:

   #define WAVE_FORMAT_GSM610 (0x0031)

   typedef struct gsm610waveformat_tag
   {
         WAVEFORMATEX    wfx;
         WORD            wSamplesPerBlock;
   } GSM610WAVEFORMAT;

   typedef GSM610WAVEFORMAT FAR *LPGSM610WAVEFORMAT;

Declare a handle for memory allocation and a pointer to a GSM610WAVEFORMAT struct similar to the following:

   HANDLE hgsmwavefmt;

   LPGSM610WAVEFORMAT pgsmwavefmt;

Allocate and lock memory for the GSM610WAVEFORMAT struct similar to the following:

   hgsmwavefmt = GlobalAlloc(GMEM_MOVEABLE,
      (UINT)(sizeof(GSM610WAVEFORMAT)));
   pgsmwavefmt =     (LPGSM610WAVEFORMAT)GlobalLock(hgsmwavefmt);

Fill in the GSM610WAVEFORMAT struct's members using the values shown in assigning data to the struct's members. The exception is that pgsmwavefmt- >wfx.nSamplesPerSec can be a rate other than 8000, in which case pgsmwavefmt->wfx.nAvgBytesPerSec is computed as (pgsmwavefmt- >wfx.nSamplesPerSec)/320*65. When using a value for pgsmwavefmt- >wfx.nSamplesPerSec other than 8000, be sure it is a multiple of the 320 block size, and falls within the limits supported by the sound card. For example, pgsmwavefmt->wfx.nSamplesPerSec = 9920 is valid because it is a multiple of 320 and does not fall below the minimum sampling rate of 8000 found on many sound cards:

   pgsmwavefmt->wfx.wFormatTag = WAVE_FORMAT_GSM610;
   pgsmwavefmt->wfx.nChannels = 1;
   pgsmwavefmt->wfx.nSamplesPerSec = 8000;
   pgsmwavefmt->wfx.nAvgBytesPerSec = 1625;
   pgsmwavefmt->wfx.nBlockAlign = 65;
   pgsmwavefmt->wfx.wBitsPerSample = 0;
   pgsmwavefmt->wfx.cbSize = 2;
   pgsmwavefmt->wSamplesPerBlock = 320;

Call waveInOpen() with the WAVE_MAPPER option, and be sure the third parameter is just the address of the GSM610WAVEFORMAT struct's WAVEFORMATEX struct:

   waveInOpen(&hwavein, (UINT)WAVE_MAPPER,
      (LPWAVEFORMATEX)&(pgsmwavefmt->wfx),
      (DWORD)(UINT)hwnd, (DWORD)NULL,     CALLBACK_WINDOW);


Additional reference words: 3.51 4.00
KBCategory: kbmm kbprg kbhowto
KBSubcategory: MMWave




THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 24, 1996
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.