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
|
BOOL CDXPlaySound::InitDirectSound(HWND hWnd)
{
DSBUFFERDESC soundBuffDesc;
if(DirectSoundCreate(NULL, &m_lpSound, NULL) != DS_OK)
{
return FALSE;
}
if(m_lpSound->SetCooperativeLevel(hWnd, DSSCL_NORMAL) != DS_OK)
{
return FALSE;
}
GetWaveFormatFromResource();
ZeroMemory(&soundBuffDesc, sizeof(DSBUFFERDESC));
soundBuffDesc.dwSize = sizeof(soundBuffDesc);
soundBuffDesc.dwFlags = DSBCAPS_STATIC;
soundBuffDesc.dwBufferBytes = m_dwWaveSize;
soundBuffDesc.lpwfxFormat = m_wfx;
if(m_lpSound->CreateSoundBuffer(&soundBuffDesc, &m_lpPrim, NULL) != DS_OK)
{
return FALSE;
}
return TRUE;
}
//Organisieren aller Wave Informationen der Ressource
BOOL CDXPlaySound::GetWaveFormatFromResource()
{
DWORD* pRes = (DWORD*)m_lpRes;
DWORD dwRiff = *pRes++;
DWORD dwLength = *pRes++;
DWORD dwType = *pRes++;
if(dwRiff != mmioFOURCC('R', 'I', 'F', 'F'))
return false;
if(dwType != mmioFOURCC('W', 'A', 'V', 'E'))
return false;
DWORD * pResEnd = (DWORD *)((BYTE *)pRes + dwLength-4);
while( pRes < pResEnd )
{
dwType = *pRes++;
dwLength = *pRes++;
switch(dwType)
{
case mmioFOURCC('f', 'm', 't', ' '):
if( !m_wfx )
{
if( dwLength < sizeof(WAVEFORMAT) )
return false;
m_wfx = (WAVEFORMATEX *)pRes;
/*if( m_wfx )
return true;*/
}
break;
case mmioFOURCC('d', 'a', 't', 'a'):
m_lpvData = (LPVOID)pRes;
m_dwWaveSize = dwLength;
if(m_wfx)
return true;
break;
}
}
return 0;
}
bool CDXPlaySound::ReadWaveToBuffer()
{
DWORD dwSize1;
/*if(m_lpSound->CreateSoundBuffer(&dsbd,lpDsBuff, NULL) != DS_OK)
{
return false;
}*/
HRESULT hRes;
if(m_lpPrim->Lock(0, 0,
&lpvBuff1,
&dwSize1,
0,
0,
DSBLOCK_ENTIREBUFFER ) != DS_OK)
{
return false;
}
/*int nSize = ((dwSize1 + dwSize2)/2);
if(nSize > 0)*/
::CopyMemory(lpvBuff1, m_lpvData, dwSize1);
//if(lpvBuff2) // write second part if the ringbuffer is overlapped
// memcpy(lpvBuff2, (char*)m_lpvData+dwSize1, dwSize2);
if((hRes = m_lpPrim->Unlock(&lpvBuff1, dwSize1, 0,
0)) != DS_OK)
{
//hier dann hRes = E_INVALIDARG.
return false;
}
return true;
}
|