-
Notifications
You must be signed in to change notification settings - Fork 72
/
Copy pathStream.h
153 lines (128 loc) · 4 KB
/
Stream.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#pragma once
#include <stdlib.h>
#include <windows.h>
#ifndef INCLUDE_CSTREAM
#define INCLUDE_CSTREAM
#pragma warning(disable : 4006)
#pragma warning(disable : 4995)
/************************************************************************/
/* CStream */
/************************************************************************/
class CStream
{
public:
CStream(void) {}
~CStream(void) {}
public:
virtual DWORD Read(void* buf, DWORD size) = 0; //读取流
virtual DWORD Write(void* buf, DWORD size) = 0; //写入流
virtual DWORD Seek(int offset, WORD origin) = 0; //定位流
INT64 GetPosition(void); //获得位置
void SetPosition(INT64 position); //设置位置
virtual INT64 GetSize(void); //获得流大小
virtual void SetSize(const INT64 size); //设置流大小
virtual void SetSize(DWORD size); //设置流大小
};
/************************************************************************/
/* CHandleStream:处理流 */
/************************************************************************/
class CHandleStream : public CStream
{
public:
CHandleStream(void) : m_handle(0) {}
~CHandleStream(void) {}
public:
DWORD Read(void* buf, DWORD size);
DWORD Write(void* buf, DWORD size);
DWORD Seek(int offset, WORD origin);
HANDLE GetHandle() { return m_handle; }
protected:
HANDLE m_handle;
protected:
void SetSize(const INT64 size);
void SetSize(int size);
};
/************************************************************************/
/* CCustomMemoryStream:自定义内存流 */
/************************************************************************/
class CCustomMemoryStream : public CStream
{
public:
CCustomMemoryStream(void);
~CCustomMemoryStream(void);
public:
DWORD Read(void* buf, DWORD size);
DWORD Seek(int offset, WORD origin);
void SaveToStream(CStream* pStream);
void SaveToFile(TCHAR* pszFileName);
protected:
void* m_Memory;
DWORD m_Size;
DWORD m_Position;
protected:
void SetPointer(void* Ptr, DWORD Size);
};
/************************************************************************/
/* CMemoryStream:内存流 */
/************************************************************************/
class CMemoryStream : public CCustomMemoryStream
{
public:
CMemoryStream(void);
~CMemoryStream(void);
public:
void Clear();
void LoadFromStream(CStream* pStream);
void LoadFromFile(TCHAR* pszFileName);
void SetSize(DWORD NewSize);
DWORD Write(void* buf, DWORD size);
void SetCapacity(DWORD NewCapacity);
private:
DWORD m_Capacity;
protected:
void* Realloc(DWORD NewCapacity);
};
/************************************************************************/
/* CFileStream:文件流 */
/************************************************************************/
typedef enum _FILE_MODE
{
FILE_OPEN = 0,
FILE_CREATE = 1
} FILE_MODE;
class CFileStream : public CHandleStream
{
public:
CFileStream(TCHAR* pszFileName, FILE_MODE mode, DWORD rights = 0);
~CFileStream(void);
};
/************************************************************************/
/* CWaveConverter:波转换器 */
/************************************************************************/
typedef struct _RiffHeader
{
char ID[4];
DWORD BytesFollowing;
} RiffHeader, *LPRiffHeader;
typedef struct _ACMWaveFormat
{
union
{
WAVEFORMATEX format;
BYTE RawData[128];
};
} ACMWaveFormat, *LPACMWaveFormat;
class CWaveConverter : public CMemoryStream
{
private:
DWORD m_MaxFmtSize;
public:
CWaveConverter(void);
~CWaveConverter(void);
ACMWaveFormat CurrentFormat;
ACMWaveFormat NewFormat;
int LoadStream(CStream* pStream);
int Convert();
int SaveWavToStream(CStream* pStream);
};
#endif