OSDN Git Service

3cf74f3e7e30a2647818ab9a8de9225511f6fab2
[moflib/moflib.git] / moflib-1.0 / moflib / moflib / mof / sound / StreamingSoundLoader.cpp
1 #include "mof/sound/StreamingSoundLoader.hpp"
2 #include "mof/ConsoleIO.hpp"
3
4
5 mof::StreamingSoundLoader::StreamingSoundLoader(LPDIRECTSOUNDBUFFER8 pBuffer , LPDIRECTSOUNDNOTIFY8 pNotify , SoundFile* pResource){
6         m_pBuffer = pBuffer;
7         DSBCAPS caps;
8         ZeroMemory(&caps, sizeof(DSBCAPS));
9         caps.dwSize = sizeof(DSBCAPS);
10         m_pBuffer->GetCaps(&caps);
11         m_bufferSize = caps.dwBufferBytes;
12         m_pNotify = pNotify;
13         m_hEvents = NULL;
14         m_pResource = pResource;
15 }
16
17 mof::StreamingSoundLoader::StreamingSoundLoader(const StreamingSoundLoader& obj){
18
19         m_pBuffer = obj.m_pBuffer;
20         m_bufferSize = obj.m_bufferSize;
21         m_hEvents = NULL;
22         m_pNotify = obj.m_pNotify;
23         initialize();
24         
25 }
26
27 mof::StreamingSoundLoader::~StreamingSoundLoader(void)
28 {
29         for(int i = 0 ; i < 3 ; i++)CloseHandle(m_hEvents[i]);
30         delete m_hEvents;
31 }
32
33 bool mof::StreamingSoundLoader::initialize(){
34
35         m_hEvents = new HANDLE[3];
36         for(int i = 0 ; i < 3 ; i++){
37                 m_hEvents[i] = CreateEvent(NULL , FALSE , FALSE , NULL);
38         }
39
40         DSBPOSITIONNOTIFY pn[3];
41         pn[0].dwOffset = 0;
42         pn[0].hEventNotify = m_hEvents[0];
43         pn[1].dwOffset = m_bufferSize / 2;
44         pn[1].hEventNotify = m_hEvents[1];
45         pn[2].dwOffset = DSBPN_OFFSETSTOP;
46         pn[2].hEventNotify = m_hEvents[2];
47
48
49         HRESULT hr = m_pNotify->SetNotificationPositions(3 , pn);
50         if(FAILED(hr)){
51                 if(hr == DSERR_INVALIDPARAM)*ConsoleOut::getInstance() << m_pNotify << std::endl;
52                 *ConsoleOut::getInstance() << "Failed --- SetNotificationPosition" << std::endl;
53                 return false;
54         }
55         //CopyBlock(1);
56         return true;
57
58 }
59
60
61
62
63 void mof::StreamingSoundLoader::operator()(){
64         copyBlock(0);
65         
66         while(true){
67                 DWORD i = WaitForMultipleObjects(3 , m_hEvents , FALSE , INFINITE);
68                 //m_pBuffer->GetCurrentPosition(
69                 switch(i){
70                         case WAIT_OBJECT_0:
71                                 copyBlock(1);
72                                 break;
73                         case WAIT_OBJECT_0 + 1:
74                                 copyBlock(0);
75                                 break;
76                         case WAIT_OBJECT_0 + 2:
77                                 return;
78                 }
79
80         }
81
82
83         return;
84
85 }
86
87
88 void mof::StreamingSoundLoader::copyBlock(int blockID){
89         boost::mutex::scoped_lock lock(m_mutex);
90         HRESULT hr;
91         long updateSize = m_bufferSize / 2;
92
93         LPVOID pMem1 , pMem2;
94         DWORD dwSize1 , dwSize2;
95         //*ConsoleOut::getInstance() << blockID << "\82ð\8dX\90V" << std::endl;
96         hr = m_pBuffer->Lock(blockID * updateSize , updateSize , &pMem1 , &dwSize1 , &pMem2 , &dwSize2 , 0);
97         if(FAILED(hr)){
98                 *ConsoleOut::getInstance() << _T("Failed --- LockSoundBuffer") << std::endl;
99                 return;
100         }
101         
102         m_pResource->read((BYTE*)pMem1 , dwSize1 , (BYTE*)pMem2 , dwSize2);
103         m_pBuffer->Unlock(pMem1 , dwSize1 , pMem2 , dwSize2);
104 }
105