-
Notifications
You must be signed in to change notification settings - Fork 72
/
Copy pathAudioStream.cpp
115 lines (94 loc) · 2.65 KB
/
AudioStream.cpp
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
#include "AudioStream.h"
#pragma warning(disable : 4100)
CAudioStream::CAudioStream()
{
m_cRef = 0;
}
CAudioStream::~CAudioStream(void)
{
}
HRESULT STDMETHODCALLTYPE CAudioStream::QueryInterface(const IID &riid, void **ppvObject)
{
if(IID_IStream == riid || IID_IUnknown == riid)
{
*ppvObject = static_cast<IStream*>(this);
AddRef();
return S_OK;
}
*ppvObject = NULL;
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE CAudioStream::AddRef()
{
return InterlockedIncrement(&m_cRef);
}
ULONG STDMETHODCALLTYPE CAudioStream::Release()
{
if(InterlockedDecrement(&m_cRef) == 0)
{
delete this;
return S_OK;
}
return m_cRef;
}
HRESULT STDMETHODCALLTYPE CAudioStream::Read(void *pv, ULONG cb, ULONG *pcbRead)
{
*pcbRead = m_Stream->Read(pv, cb);
if(*pcbRead != 0) return S_OK;
else return -1;
}
HRESULT STDMETHODCALLTYPE CAudioStream::Write(const void *pv, ULONG cb, ULONG *pcbWritten)
{
*pcbWritten = m_Stream->Write((void*)pv, cb);
if(*pcbWritten != 0) return S_OK;
else return -1;
}
HRESULT STDMETHODCALLTYPE CAudioStream::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
m_Stream->Seek(dlibMove.LowPart, (WORD)dwOrigin);
return S_OK;
}
HRESULT STDMETHODCALLTYPE CAudioStream::SetSize(ULARGE_INTEGER libNewSize)
{
m_Stream->Seek(libNewSize.LowPart, 0);
return S_OK;
}
HRESULT STDMETHODCALLTYPE CAudioStream::CopyTo(IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE CAudioStream::Commit(DWORD grfCommitFlags)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE CAudioStream::Revert(void)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE CAudioStream::LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE CAudioStream::UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE CAudioStream::Stat(STATSTG *pstatstg, DWORD grfStatFlag)
{
BY_HANDLE_FILE_INFORMATION fi;
memset(&fi, 0, sizeof(fi));
GetFileInformationByHandle(((CFileStream*)m_Stream)->GetHandle(), &fi);
pstatstg->cbSize.u.LowPart = fi.nFileSizeLow;
pstatstg->cbSize.u.HighPart = fi.nFileSizeHigh;
pstatstg->mtime = fi.ftLastWriteTime;
pstatstg->ctime = fi.ftCreationTime;
pstatstg->atime = fi.ftLastAccessTime;
pstatstg->grfLocksSupported = 0;
memcpy(&pstatstg->clsid, &IID_IStream, sizeof(CLSID));
pstatstg->reserved = 0;
return S_OK;
}
HRESULT STDMETHODCALLTYPE CAudioStream::Clone(IStream **ppstm)
{
return S_OK;
}