WAVEFILE.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /**************************************************************************
  2.  *
  3.  *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4.  *  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5.  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6.  *  PURPOSE.
  7.  *
  8.  *  Copyright (C) 1992 - 1997 Microsoft Corporation.  All Rights Reserved.
  9.  *
  10.  **************************************************************************/
  11. /****************************************************************************
  12.  *
  13.  *  WAVEFILE.H
  14.  *
  15.  *  header file for routines for reading WAVE files
  16.  *
  17.  ***************************************************************************/
  18. /* - - - - - - - - */
  19. #include "extra.h"
  20. #include "wavefile.rc"
  21. extern HMODULE ghModule; // = NULL; // global HMODULE/HINSTANCE for resource access
  22. /* - - - - - - - - */
  23. /*
  24. ** This class is used to implement a handler for a type of file with only
  25. ** one stream.  In this case, we don't have to worry about allocating more
  26. ** than one stream object for each file object, so we can combine the
  27. ** two together in a single class.
  28. **
  29. */
  30. HRESULT WaveFileCreate(
  31. IUnknown FAR* pUnknownOuter,
  32. REFIID riid,
  33. void FAR* FAR* ppv);
  34. typedef struct {
  35. /*
  36. ** This implementation of a file handler is done in C, not C++, so a few
  37. ** things work differently than in C++.  Our structure contains Vtbls
  38. ** (pointer to function tables) for three interfaces... Unknown, AVIStream,
  39. ** and AVIFile, as well as our private data we need to implement the
  40. ** handler.
  41. **
  42. */
  43. IAVIStreamVtbl FAR *AVIStream;
  44. IAVIFileVtbl FAR *AVIFile;
  45. IUnknownVtbl FAR *Unknown;
  46. IPersistFileVtbl FAR *Persist;
  47. // This is our controlling object.
  48. IUnknown FAR* pUnknownOuter;
  49. //
  50. // WaveFile instance data
  51. //
  52. HMMIO hmmio; // file I/O
  53. MMCKINFO ckData;
  54. LONG refs; // for UNKNOWN
  55. AVISTREAMINFOW avistream; // for STREAM
  56. LPWAVEFORMAT lpFormat; // stream format
  57. LONG cbFormat;
  58. BOOL fDirty;
  59. UINT mode;
  60. EXTRA extra;
  61. AVIFILEINFOW avihdr;
  62. } WAVESTUFF, FAR *LPWAVESTUFF;
  63. /*
  64. ** Whenever a function is called with a pointer to one of our Vtbls, we need
  65. ** to back up and get a pointer to the beginning of our structure.  Depending
  66. ** on which pointer we are passed, we need to back up a different number of
  67. ** bytes.  C++ would make this easier, by declaring backpointers.
  68. */
  69. WAVESTUFF ws;
  70. #define WAVESTUFF_FROM_UNKNOWN(pu) (LPWAVESTUFF)((LPBYTE)(pu) - ((LPBYTE)&ws.Unknown - (LPBYTE)&ws))
  71. #define WAVESTUFF_FROM_FILE(pf) (LPWAVESTUFF)((LPBYTE)(pf) - ((LPBYTE)&ws.AVIFile - (LPBYTE)&ws))
  72. #define WAVESTUFF_FROM_STREAM(ps) (LPWAVESTUFF)((LPBYTE)(ps) - ((LPBYTE)&ws.AVIStream - (LPBYTE)&ws))
  73. #define WAVESTUFF_FROM_PERSIST(ppf) (LPWAVESTUFF)((LPBYTE)(ppf) - ((LPBYTE)&ws.Persist - (LPBYTE)&ws))
  74. /* - - - - - - - - */
  75. /*
  76. ** This class is our version of the IClassFactory interface.
  77. **
  78. ** COMPOBJ.DLL expects our DllGetClassObject() function to return an
  79. ** IClassFactory object which it can then call to get the object that
  80. ** implements the IAVIFile interface to actually open the file.  Whew.
  81. */
  82. typedef struct {
  83. IClassFactoryVtbl FAR *lpVtbl;
  84. /*
  85. ** Data local to this object: reference counts for the object
  86. */
  87. ULONG ulRef;
  88. CLSID FAR * clsid;
  89. } WAVEFACTORY, FAR *LPWAVEFACTORY;
  90. /* - - - - - - - - */
  91. /*
  92. ** These variables help keep track of whether the DLL is still in use,
  93. ** so that when our DllCanUnloadNow() function is called, we know what
  94. ** to say.
  95. */
  96. extern UINT uUseCount;
  97. extern UINT uLockCount;
  98. /* - - - - - - - - */
  99. //
  100. // This is our unique identifier
  101. //
  102. //  NOTE: If you modify this sample code to do something else, you MUST
  103. //     CHANGE THIS!
  104. //
  105. //  Run uuidgen.exe from the tools directory and get your own GUID.
  106. //  DO NOT USE THIS ONE!
  107. //
  108. //
  109. //
  110. DEFINE_GUID(CLSID_AVIWaveFileReader, 0x00020003, 0, 0, 0xC0,0,0,0,0,0,0,0x46);