SBuffer.cpp
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:16k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // SBuffer.cpp: implementation of the CSBuffer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "StdAfx.h"
  5. //////////////////////////////////////////////////////////////////////
  6. // Construction/Destruction
  7. //////////////////////////////////////////////////////////////////////
  8. CSBuffer::CSBuffer()
  9. {
  10. m_pDS = NULL;
  11. m_lpDSB = NULL;
  12. m_Filename = NULL;
  13. m_Current = 0;
  14. m_dwLastUseTime = 0;
  15. m_nBuffers = 1;
  16. m_3d = FALSE;
  17. m_lp3dBuffer = NULL;
  18. m_Streamed = FALSE;
  19. m_sFile=NULL;
  20. // m_pbUsingBuffer = NULL;
  21. m_ID=0;
  22. }
  23. CSBuffer::~CSBuffer()
  24. {
  25. Stop();
  26. Release();
  27. }
  28. VOID CSBuffer::Release(VOID)
  29. {
  30. DWORD Status=0;
  31. if(m_ID!=0)
  32. {
  33. if( m_lpDSB )
  34. {
  35. for(int i = m_nBuffers-1; i >-1 ; i--)
  36. {
  37. if(SUCCEEDED(m_lpDSB[i]->GetStatus(&Status)))
  38. {
  39. if(Status&DSBSTATUS_PLAYING)
  40. m_lpDSB[i]->Stop();
  41. HRESULT hResult = m_lpDSB[i]->Release();
  42. // delete *m_lpDSB[i];
  43. m_lpDSB[i] = NULL;
  44. }
  45. }
  46. DELETEARRAY(m_lpDSB);
  47. m_lpDSB = NULL;
  48. }
  49. if( m_lp3dBuffer )
  50. {
  51. for(int i = 0; i < m_nBuffers; i++) SAFE_RELEASE(m_lp3dBuffer[i]);
  52. DELETEARRAY(m_lp3dBuffer);
  53. }
  54. if( m_Streamed && m_sStop )
  55. {
  56. if( m_sFile )
  57. {
  58. fclose(m_sFile);
  59. m_sFile=NULL;
  60. }
  61. }
  62. m_pDS = NULL;
  63. m_ID=0;
  64. }
  65. }
  66. HRESULT CSBuffer::Load(CSound *pDS, const char *Filename, int Num)
  67. {
  68. CHAR szFname[MAX_PATH];
  69. // Check the Parameters
  70. if( Filename == NULL ) return DSERR_INVALIDPARAM;
  71. HRESULT rval=DSERR_GENERIC;
  72. FILE *fptr;
  73. strcpy(szFname,"Sound\");
  74. strcat(szFname,Filename);
  75. fptr = fopen( szFname, "rb" );
  76. if( fptr )
  77. {
  78. if(m_Streamed)
  79. {
  80. m_sStop=FALSE;
  81. m_sFile=fptr;
  82. }
  83. rval = Load( pDS, 0, fptr, Num );
  84. if(!m_Streamed) fclose( fptr );
  85. m_Filename = Filename;
  86. }
  87. return rval;
  88. }
  89. HRESULT CSBuffer::Load(CSound* pDS, LONG lSize, CHAR* lpCache, int Num)
  90. {
  91.     HRESULT rval;
  92.     
  93.     rval = Extract(pDS, lSize, lpCache, Num);
  94.     return rval;
  95. }
  96. HRESULT CSBuffer::Load(CSound *pDS, LONG lSize, FILE *fptr, int Num)
  97. {
  98.     HRESULT rval;
  99.     CHAR* lpCache;
  100.     int length, save;
  101. // Release all allocated Memory, befor continue
  102. // m_nBuffers = Num;
  103. Release( );
  104.     length = lSize;
  105.     // If lSize equals zero get the size of the file.
  106.     if(length == 0)
  107.     {
  108.         // Save the pointer location
  109.         save = ftell(fptr);
  110.         if(ferror(fptr))
  111.             return NULL;
  112.         // Seek to end of file
  113.         fseek(fptr, 0, SEEK_END);
  114.         if(ferror(fptr))
  115.             return NULL;
  116.         // Get the size of the file
  117.         length = ftell(fptr);
  118.         if(ferror(fptr))
  119.             return NULL;
  120.         // Seek back to save position
  121.         fseek(fptr, save, SEEK_SET);
  122.         if(ferror(fptr))
  123.             return NULL;
  124.     }
  125.     // Cache the whole file in memory
  126.     // Allocate memory to hold the data
  127.     lpCache = new CHAR[length];
  128.     if(lpCache == NULL)
  129.         return NULL;
  130.     // Read in the data
  131.     fread(lpCache, 1, length, fptr);
  132.     if(ferror(fptr))
  133.     {
  134.         delete [] lpCache;
  135.         return NULL;
  136.     }
  137.     // Load it from memory.
  138.     rval = Extract(pDS, length, lpCache, Num);
  139.     // Delete the cache
  140.     delete [] lpCache;
  141. return rval;
  142. }
  143. HRESULT CSBuffer::Extract(CSound *pDS, LONG lSize, char *ptr, int Num)
  144. {
  145. HRESULT rval;
  146. // Release all memory, befor continue
  147. Release();
  148. // Check the Parameters
  149. if( ptr == NULL ) return DSERR_INVALIDPARAM;
  150. if( pDS == NULL ) return DSERR_INVALIDPARAM;
  151. if( pDS->GetDS() == NULL ) return DSERR_UNINITIALIZED;
  152. if( m_Streamed ) return DSERR_INVALIDPARAM;
  153. if( Num<1 ) Num = 1;
  154. m_pDS      = pDS;
  155. m_nBuffers = Num;
  156. m_Filename = NULL;
  157. if( strncmp( ptr, "RIFF", 4 ) || strncmp( ptr+8, "WAVE", 4 ) )
  158. return DSERR_BADFORMAT;
  159. DWORD hSize = *(DWORD*)(ptr+16);
  160. LPWAVEFORMATEX lpWav = (LPWAVEFORMATEX)(ptr+20);
  161. // skip all "fact" and search for the data
  162. // the fact stores the uncompressed filesize
  163. DWORD dSize = 0;
  164. ptr += 20 + hSize;
  165. do
  166. {
  167. if( dSize ) ptr += dSize + 8;
  168.     dSize = *(DWORD*)(ptr+4);
  169. } while( !strncmp( ptr, "fact", 4 ) );
  170. ptr += 8;
  171. // Is it compressed or a normal PCM Wave File
  172. if( lpWav->wFormatTag == WAVE_FORMAT_PCM )
  173. {
  174. // Create the sound buffer for the wave file
  175. rval = CreateSoundBuffer( dSize, (PCMWAVEFORMAT*)lpWav, Num );
  176. if(FAILED(rval)) return rval;
  177. // Read the data for the wave file into the sound buffer
  178. rval = ReadDataFromMemory( ptr, dSize );
  179. if(FAILED(rval)) return rval;
  180. }
  181. // Duplicate Buffers
  182. for( int i = 1; i < m_nBuffers; i++ )
  183. {
  184. rval = m_pDS->GetDS()->DuplicateSoundBuffer(m_lpDSB[0], &m_lpDSB[i]);
  185. if(FAILED(rval)) return rval;
  186. if( m_3d )
  187. {
  188. rval = m_lpDSB[0]->QueryInterface(IID_IDirectSound3DBuffer, (LPVOID *)&m_lp3dBuffer[i]);
  189. if(FAILED(rval)) return rval;
  190. }
  191. }
  192. return DS_OK;
  193. //return DSERR_UNSUPPORTED;
  194. }
  195. HRESULT CSBuffer::CreateSoundBuffer(DWORD dwBufSize, PCMWAVEFORMAT *pcmwf, int Num)
  196. {
  197. HRESULT rval;
  198. // Create Space for Soundbuffer Pointers
  199. m_lpDSB = new LPDIRECTSOUNDBUFFER[Num];
  200. if( m_lpDSB == NULL ) return DSERR_OUTOFMEMORY;
  201. ZeroMemory( m_lpDSB, sizeof( LPDIRECTSOUNDBUFFER )*Num );
  202. if( m_3d )
  203. {
  204. m_lp3dBuffer = new LPDIRECTSOUND3DBUFFER[Num];
  205. if( m_lp3dBuffer == NULL ) return DSERR_OUTOFMEMORY;
  206. ZeroMemory( m_lp3dBuffer, sizeof( LPDIRECTSOUNDBUFFER )*Num );
  207. }
  208. DSBUFFERDESC dsbdesc;
  209. // Set up DSBUFFERDESC structure.
  210. ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
  211. dsbdesc.dwSize        = sizeof(DSBUFFERDESC);
  212. dsbdesc.dwBufferBytes = dwBufSize; 
  213. dsbdesc.lpwfxFormat   = (LPWAVEFORMATEX)pcmwf;
  214. if( m_Streamed ) dsbdesc.dwFlags=DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY|DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_CTRLPOSITIONNOTIFY;
  215. else if( m_3d )  dsbdesc.dwFlags=DSBCAPS_CTRL3D|DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_MUTE3DATMAXDISTANCE|DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME;
  216. else dsbdesc.dwFlags=DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY|DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_STATIC;
  217. rval=m_pDS->GetDS()->CreateSoundBuffer(&dsbdesc, &m_lpDSB[0], NULL);
  218. if( FAILED(rval) ) return rval;
  219. if( m_3d )
  220. {
  221. rval=m_lpDSB[0]->QueryInterface(IID_IDirectSound3DBuffer, (LPVOID *)&m_lp3dBuffer[0]);
  222. if(FAILED(rval)) return rval;
  223. }
  224. return DS_OK;
  225. }
  226. HRESULT CSBuffer::ReadDataFromMemory(char *ptr, DWORD dwSize)
  227. {
  228. // Lock data in buffer for writing
  229. LPVOID pData1, pData2;
  230. DWORD  dwData1Size, dwData2Size;
  231. HRESULT rval;
  232. rval = m_lpDSB[0]->Lock(0, 0, &pData1, &dwData1Size, &pData2, &dwData2Size, DSBLOCK_ENTIREBUFFER);
  233. if(FAILED(rval)) return rval;
  234. // Read in data(on dx3 read in first chunk)
  235. if(dwData1Size>0) 
  236. {
  237. memcpy(pData1, ptr, dwData1Size);
  238. ptr+=dwData1Size;
  239. }
  240. // Read in second chunk if necessary
  241. if(dwData2Size>0) memcpy(pData2, ptr, dwData2Size);
  242. // Unlock data in buffer
  243. rval = m_lpDSB[0]->Unlock(pData1, dwData1Size, pData2, dwData2Size);
  244. if(FAILED(rval)) return rval;
  245. return DS_OK;
  246. }
  247. HRESULT CSBuffer::Play( DWORD dwFlags )
  248. {
  249. HRESULT rval;
  250. LPDIRECTSOUNDBUFFER Buffer = NULL;
  251. if( m_pDS==NULL ) return DSERR_UNINITIALIZED;
  252. if( m_pDS->GetSoundOn( ) ) return DS_OK;
  253. Buffer = GetFreeBuffer();
  254. if( Buffer==NULL ) return DSERR_ALLOCATED;
  255. if(m_Streamed)
  256. {
  257. m_sLoop=dwFlags;
  258. dwFlags=DSBPLAY_LOOPING;
  259. }
  260. m_dwLastUseTime = timeGetTime();
  261. rval=Buffer->Play(0, 0, dwFlags);
  262. if(FAILED(rval)) return rval;
  263. return DS_OK;
  264. }
  265. LPDIRECTSOUNDBUFFER CSBuffer::GetFreeBuffer(VOID)
  266. {
  267. DWORD Status;
  268. HRESULT rval;
  269. LPDIRECTSOUNDBUFFER Buffer;
  270. Status = 0;
  271. nBufferIdx = MAX_DUPLE_COUNT;
  272. if(m_lpDSB==NULL) return NULL;
  273. if(m_ID!=0)
  274. {
  275. Buffer=m_lpDSB[m_Current];
  276. rval = Buffer->GetStatus(&Status);
  277. nBufferIdx = m_Current;
  278. if(FAILED(rval)) Status = 0;
  279. if((Status & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING)
  280. {
  281. if(m_nBuffers > 1)
  282. {
  283. if (++m_Current >= m_nBuffers) 
  284. {
  285. m_Current = 0;
  286. }
  287. Buffer = m_lpDSB[m_Current];
  288. rval = Buffer->GetStatus(&Status);
  289. nBufferIdx = m_Current;
  290. if(SUCCEEDED(rval) && (Status & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING)
  291. {
  292. // Play吝捞搁 家府甫 肛眠绊 贸澜栏肺 倒赴促.
  293. /* Buffer->Stop();
  294. Buffer->SetCurrentPosition(0);
  295. */
  296. // Play吝捞搁 家府甫 促澜 家府绰 Play 窍瘤 富巴
  297. m_Current = m_Current==0 ? m_nBuffers-1 : m_Current-1;
  298. Buffer = NULL;
  299. nBufferIdx = MAX_DUPLE_COUNT;
  300. }
  301. }
  302. else 
  303. {
  304. Buffer=NULL;
  305. nBufferIdx = MAX_DUPLE_COUNT;
  306. }
  307. }
  308. if(Buffer && (Status & DSBSTATUS_BUFFERLOST))
  309. if(FAILED(Buffer->Restore()))
  310. {
  311. Buffer = NULL;
  312. nBufferIdx = MAX_DUPLE_COUNT;
  313. }
  314. }
  315. return Buffer;
  316. }
  317. HRESULT CSBuffer::EnableStreaming( int size, int blocks )
  318. {
  319. if( m_3d ) return DSERR_ACCESSDENIED;
  320. m_Streamed=TRUE;
  321. m_sSize=size;
  322. m_sBlocks=blocks;
  323. return DS_OK;
  324. }
  325. HRESULT CSBuffer::Enable3d( void )
  326. {
  327. if( m_Streamed ) return DSERR_ACCESSDENIED;
  328. m_3d=TRUE;
  329. return DS_OK;
  330. }
  331. HRESULT CSBuffer::LoadFromRes( CSound* pDS, const char *Filename, int Num )
  332. {
  333. if( Filename == NULL ) return DSERR_INVALIDPARAM;
  334. HRSRC hResInfo;
  335. HGLOBAL hResData;
  336. void *pvRes;
  337. if((( hResInfo = FindResource(NULL, Filename, "WAV")) == NULL ) ) return DSERR_GENERIC;
  338. if(( hResData = LoadResource(NULL, hResInfo)) == NULL) return DSERR_GENERIC;
  339. if(( pvRes = LockResource(hResData)) == NULL) return DSERR_GENERIC;
  340. return CSBuffer::Extract( pDS, 0, (char*)pvRes, Num);
  341. }
  342. HRESULT CSBuffer::PlayExtended( DWORD dwFlags, int Pan, int Volume, DWORD freq )
  343. {
  344. HRESULT rval;
  345. LPDIRECTSOUNDBUFFER Buffer = NULL;
  346. if( m_pDS==NULL ) return DSERR_UNINITIALIZED;
  347. if( m_pDS->GetSoundOn( ) ) return DS_OK;
  348. Buffer=GetFreeBuffer();
  349. if(Buffer==NULL) return DSERR_ALLOCATED;
  350. rval=Buffer->SetPan(Pan);
  351. if(FAILED(rval)) return rval;
  352. rval=Buffer->SetVolume(Volume);
  353. if(FAILED(rval)) return rval;
  354. rval=Buffer->SetFrequency(freq);
  355. if(FAILED(rval)) return rval;
  356. if(m_Streamed)
  357. {
  358. m_sLoop=dwFlags;
  359. dwFlags=DSBPLAY_LOOPING;
  360. }
  361. m_dwLastUseTime = timeGetTime();
  362. rval=Buffer->Play(0, 0, dwFlags);
  363. if(FAILED(rval)) return rval;
  364. return DS_OK;
  365. }
  366. HRESULT CSBuffer::PlayExtended( float x, float y, float z, DWORD dwFlags )
  367. {
  368. HRESULT rval;
  369. LPDIRECTSOUNDBUFFER Buffer = NULL;
  370. if(m_pDS==NULL) return DSERR_UNINITIALIZED;
  371. if(m_pDS->GetSoundOn()) return DS_OK;
  372. if(m_lp3dBuffer==NULL) return DSERR_UNINITIALIZED;
  373. Buffer=GetFreeBuffer();
  374. if(Buffer==NULL) return DSERR_ALLOCATED;
  375. if(m_lp3dBuffer[m_Current]==NULL) return DSERR_UNINITIALIZED;
  376. rval=m_lp3dBuffer[m_Current]->SetPosition( x, y, z, DS3D_IMMEDIATE );
  377. if(FAILED(rval)) return rval;
  378. m_dwLastUseTime = timeGetTime();
  379. rval = Buffer->Play(0, 0, dwFlags);
  380. if(FAILED(rval)) return rval;
  381. return DS_OK;
  382. }
  383. HRESULT CSBuffer::Stop(VOID)
  384. {
  385. HRESULT rval;
  386. if( m_pDS==NULL || m_lpDSB==NULL ) return DSERR_UNINITIALIZED;
  387. for(int i=0; i<m_nBuffers; i++)
  388. {
  389. if( m_lpDSB[i] )
  390. {
  391. rval=m_lpDSB[i]->Stop();
  392. if( rval!=DS_OK ) return rval;
  393. rval=m_lpDSB[i]->SetCurrentPosition(0);
  394. if( rval!=DS_OK ) return rval;
  395. }
  396. }
  397. return DS_OK;
  398. }
  399. HRESULT CSBuffer::Stop(INT nBufferIdx)
  400. {
  401. HRESULT rval;
  402. if( m_pDS==NULL || m_lpDSB==NULL ) return DSERR_UNINITIALIZED;
  403. if( m_lpDSB[nBufferIdx] )
  404. {
  405. rval=m_lpDSB[nBufferIdx]->Stop();
  406. if( rval!=DS_OK ) return rval;
  407. rval=m_lpDSB[nBufferIdx]->SetCurrentPosition(0);
  408. if( rval!=DS_OK ) return rval;
  409. }
  410. return DS_OK;
  411. }
  412. void CSBuffer::SetVolume(LONG Volume)
  413. {
  414. if(m_lpDSB!=NULL)
  415. {
  416. for(int i=0; i<m_nBuffers; i++)
  417. if( m_lpDSB[i] )
  418. m_lpDSB[i]->SetVolume(Volume);
  419. }
  420. }
  421. void CSBuffer::SetVolume(INT nBufferIdx,LONG Volume)
  422. {
  423. if(m_lpDSB!=NULL)
  424. {
  425. if( m_lpDSB[nBufferIdx] )
  426. m_lpDSB[nBufferIdx]->SetVolume(Volume);
  427. }
  428. }
  429. void CSBuffer::SetPan(LONG Pan)
  430. {
  431. if(m_lpDSB!=NULL)
  432. {
  433. for(int i=0; i<m_nBuffers; i++)
  434. if(m_lpDSB[i])
  435. m_lpDSB[i]->SetPan(Pan);
  436. }
  437. }
  438. void CSBuffer::SetPan(INT nBufferIdx,LONG Pan)
  439. {
  440. if(m_lpDSB!=NULL)
  441. {
  442. if(m_lpDSB[nBufferIdx])
  443. m_lpDSB[nBufferIdx]->SetPan(Pan);
  444. }
  445. }
  446. // Play 登绊 乐绰 百荐甫 备茄促.
  447. DWORD CSBuffer::Playing(VOID)
  448. {
  449. DWORD ctr=0, Status;
  450. if(m_lpDSB)
  451. for( int i=0; i<m_nBuffers; i++ )
  452. if(m_lpDSB[i])
  453. if( SUCCEEDED( m_lpDSB[i]->GetStatus(&Status) ) )
  454. if( Status & DSBSTATUS_PLAYING )
  455. ctr++;
  456. return ctr;
  457. }
  458. HRESULT CSBuffer::SetCone( float x, float y, float z, DWORD InsideAngle, DWORD OutsideAngle, long OutsideVolume )
  459. {
  460. HRESULT rval;
  461. if(m_pDS==NULL) return DSERR_UNINITIALIZED;
  462. if(m_lp3dBuffer==NULL) return DSERR_UNINITIALIZED;
  463. if(m_pDS->Get3dListener()==NULL) return DSERR_UNINITIALIZED;
  464. for( int i=0; i<m_nBuffers; i++ )
  465. {
  466. if(m_lp3dBuffer[i])
  467. {
  468. rval=m_lp3dBuffer[i]->SetConeOrientation( x, y, z, DS3D_DEFERRED );
  469. if(FAILED(rval)) return rval;
  470. rval=m_lp3dBuffer[i]->SetConeAngles( InsideAngle, OutsideAngle, DS3D_DEFERRED );
  471. if(FAILED(rval)) return rval;
  472. rval=m_lp3dBuffer[i]->SetConeOutsideVolume( OutsideVolume, DS3D_DEFERRED );
  473. if(FAILED(rval)) return rval;
  474. }
  475. }
  476. rval=m_pDS->Get3dListener()->CommitDeferredSettings();
  477. return rval;
  478. }
  479. HRESULT CSBuffer::Set3dProperties( DWORD Mode, float MinDistance, float MaxDistance, float VelX, float VelY, float VelZ )
  480. {
  481. HRESULT rval;
  482. if(m_pDS==NULL) return DSERR_UNINITIALIZED;
  483. if(m_lp3dBuffer==NULL) return DSERR_UNINITIALIZED;
  484. if(m_pDS->Get3dListener()==NULL) return DSERR_UNINITIALIZED;
  485. for( int i=0; i<m_nBuffers; i++ )
  486. {
  487. if(m_lp3dBuffer[i])
  488. {
  489. rval=m_lp3dBuffer[i]->SetMode( Mode, DS3D_DEFERRED );
  490. if(FAILED(rval)) return rval;
  491. rval=m_lp3dBuffer[i]->SetMinDistance( MinDistance, DS3D_DEFERRED );
  492. if(FAILED(rval)) return rval;
  493. rval=m_lp3dBuffer[i]->SetMaxDistance( MaxDistance, DS3D_DEFERRED );
  494. if(FAILED(rval)) return rval;
  495. rval=m_lp3dBuffer[i]->SetVelocity( VelX, VelY, VelZ, DS3D_DEFERRED );
  496. if(FAILED(rval)) return rval;
  497. }
  498. }
  499. rval=m_pDS->Get3dListener()->CommitDeferredSettings();
  500. return rval;
  501. }
  502. HRESULT CSBuffer::FillStreamBuffer(int nr)
  503. {
  504. LPVOID pData;
  505. DWORD  dwDataSize;
  506. HRESULT rval;
  507. DWORD numread;
  508. if(!m_Streamed) return DSERR_UNINITIALIZED;
  509. if(m_lpDSB==NULL) return DSERR_UNINITIALIZED;
  510. if(m_sFile==NULL) return DSERR_UNINITIALIZED;
  511. rval = m_lpDSB[0]->Lock(nr*m_sSize, m_sSize, &pData, &dwDataSize, 0, 0, 0);
  512. if(FAILED(rval)) return rval;
  513. numread=fread( pData, 1, dwDataSize, m_sFile );
  514. if( numread<dwDataSize )
  515. {
  516. if(m_sLoop)
  517. {
  518. fseek( m_sFile, -(long)m_sWaveLength, SEEK_CUR );
  519. fread( (char*)pData+numread, 1, dwDataSize-numread, m_sFile );
  520. }
  521. else
  522. {
  523. BYTE fill=128;
  524. if( numread>0 ) fill=*((BYTE*)pData+numread-1);
  525. FillMemory( (BYTE*)pData+numread, dwDataSize-numread, fill );
  526. if( m_sDone==255 )
  527. {
  528. m_sDone=nr;
  529. m_sStop=FALSE;
  530. }
  531. }
  532. }
  533. m_lpDSB[0]->Unlock(pData,dwDataSize,0,0);
  534. return DS_OK;
  535. }
  536. HRESULT CSBuffer::UpdateStream( BOOL FillAll )
  537. {
  538. HRESULT rval;
  539. if(!m_Streamed) return DSERR_UNINITIALIZED;
  540. if(m_lpDSB==NULL) return DSERR_UNINITIALIZED;
  541. DWORD pos;
  542. rval=m_lpDSB[0]->GetCurrentPosition( NULL, &pos );
  543. if(FAILED(rval)) return rval;
  544. pos/=m_sSize;
  545. if( m_sDone<255 )
  546. {
  547. if( m_sDone!=pos )
  548. {
  549. if( m_sStop )
  550. {
  551. Stop();
  552. return 1;
  553. }
  554. }
  555. else m_sStop=TRUE;
  556. }
  557. do
  558. {
  559. if(pos!=m_sCurrent)
  560. {
  561. rval=FillStreamBuffer(m_sCurrent);
  562. if(FAILED(rval)) return rval;
  563. char str[255];
  564. sprintf( str, "PlayPos:%itFillPos:%itEndPos:%in", pos, m_sCurrent, m_sDone );
  565. OutputDebugString( str );
  566. m_sCurrent++;
  567. if( m_sCurrent>=m_sBlocks ) m_sCurrent=0;
  568. }
  569. }
  570. while( FillAll && pos!=m_sCurrent );
  571. return DS_OK;
  572. }
  573. DWORD CSBuffer::GetLastUsedTime(VOID)
  574. {
  575. return  m_dwLastUseTime;
  576. }
  577. VOID CSBuffer::Pause(INT nBufferIdx)
  578. {
  579. if(m_lpDSB[nBufferIdx])
  580. m_lpDSB[nBufferIdx]->Stop();
  581. }
  582. VOID CSBuffer::Continue(INT nBufferIdx)
  583. {
  584. if(m_lpDSB[nBufferIdx])
  585. m_lpDSB[nBufferIdx]->Play(0, 0, 0);
  586. }