OSDN Git Service

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