Microsoft Audio Compression Manager API: Difference between revisions

From MultimediaWiki
Jump to navigation Jump to search
No edit summary
 
(import basic API elements)
Line 2: Line 2:


Microsoft's Audio Compress Manager (ACM) API is the audio analog of their [[Microsoft Video For Windows API|Video for Windows (VfW)]] API.
Microsoft's Audio Compress Manager (ACM) API is the audio analog of their [[Microsoft Video For Windows API|Video for Windows (VfW)]] API.
An ACM-compliant codec DLL exports a single function named DriverProc that takes a message and a few other parameters. The messages specify an action that the decoder is to perform.
The DriverProc usually consists of a switch statement. The main target in reverse engineering the decoding algorithm is the ACMDM_STREAM_CONVERT message, 0x604F.
The first parameter is the following structure:
  typedef struct _ACMDRVSTREAMINSTANCE
  {
      DWORD          cbStruct;    // 0x00
      PWAVEFORMATEX  pwfxSrc;    // 0x04
      PWAVEFORMATEX  pwfxDst;    // 0x08
      PWAVEFILTER    pwfltr;      // 0x0C
      DWORD          dwCallback;  // 0x10
      DWORD          dwInstance;  // 0x14
      DWORD          fdwOpen;    // 0x18
      DWORD          fdwDriver;  // 0x1C
      DWORD          dwDriver;    // 0x20
      HACMSTREAM      has;        // 0x24
  } ACMDRVSTREAMINSTANCE, *PACMDRVSTREAMINSTANCE;
The second parameter is the following structure:
  typedef struct _ACMDRVSTREAMHEADER
  {
      DWORD  cbStruct;        // 0x00
      DWORD  fdwStatus;        // 0x04
      DWORD  dwUser;          // 0x08
      LPBYTE pbSrc;            // 0x0C
      DWORD  cbSrcLength;      // 0x10
      DWORD  cbSrcLengthUsed;  // 0x14
      DWORD  dwSrcUser;        // 0x18
      LPBYTE pbDst;            // 0x1C
      DWORD  cbDstLength;      // 0x20
      DWORD  cbDstLengthUsed;  // 0x24
      DWORD  dwDstUser;        // 0x28
      DWORD fdwConvert;        // 0x2C
      PACMDRVSTREAMHEADER *padshNext;  // 0x30
      DWORD fdwDriver;        // 0x34
      DWORD dwDriver;          // 0x38
      /* Internal fields for ACM */
      DWORD  fdwPrepared;      // 0x3C
      DWORD  dwPrepared;      // 0x40
      LPBYTE pbPreparedSrc;    // 0x44
      DWORD  cbPreparedSrcLength;  // 0x48
      LPBYTE pbPreparedDst;    // 0x4C
      DWORD  cbPreparedDstLength;  // 0x50
  } ACMDRVSTREAMHEADER;


[[Category:Multimedia APIs]]
[[Category:Multimedia APIs]]

Revision as of 19:06, 19 May 2006

Microsoft's Audio Compress Manager (ACM) API is the audio analog of their Video for Windows (VfW) API.

An ACM-compliant codec DLL exports a single function named DriverProc that takes a message and a few other parameters. The messages specify an action that the decoder is to perform.

The DriverProc usually consists of a switch statement. The main target in reverse engineering the decoding algorithm is the ACMDM_STREAM_CONVERT message, 0x604F.

The first parameter is the following structure:

 typedef struct _ACMDRVSTREAMINSTANCE
 {
     DWORD           cbStruct;    // 0x00
     PWAVEFORMATEX   pwfxSrc;     // 0x04
     PWAVEFORMATEX   pwfxDst;     // 0x08
     PWAVEFILTER     pwfltr;      // 0x0C
     DWORD           dwCallback;  // 0x10
     DWORD           dwInstance;  // 0x14
     DWORD           fdwOpen;     // 0x18
     DWORD           fdwDriver;   // 0x1C
     DWORD           dwDriver;    // 0x20
     HACMSTREAM      has;         // 0x24
 } ACMDRVSTREAMINSTANCE, *PACMDRVSTREAMINSTANCE;

The second parameter is the following structure:

 typedef struct _ACMDRVSTREAMHEADER 
 {
     DWORD  cbStruct;         // 0x00
     DWORD  fdwStatus;        // 0x04
     DWORD  dwUser;           // 0x08
     LPBYTE pbSrc;            // 0x0C
     DWORD  cbSrcLength;      // 0x10
     DWORD  cbSrcLengthUsed;  // 0x14
     DWORD  dwSrcUser;        // 0x18
     LPBYTE pbDst;            // 0x1C
     DWORD  cbDstLength;      // 0x20
     DWORD  cbDstLengthUsed;  // 0x24
     DWORD  dwDstUser;        // 0x28
     DWORD fdwConvert;        // 0x2C
     PACMDRVSTREAMHEADER *padshNext;  // 0x30
     DWORD fdwDriver;         // 0x34
     DWORD dwDriver;          // 0x38

     /* Internal fields for ACM */
     DWORD  fdwPrepared;      // 0x3C
     DWORD  dwPrepared;       // 0x40
     LPBYTE pbPreparedSrc;    // 0x44
     DWORD  cbPreparedSrcLength;  // 0x48
     LPBYTE pbPreparedDst;    // 0x4C
     DWORD  cbPreparedDstLength;  // 0x50
 } ACMDRVSTREAMHEADER;