|
|

楼主 |
发表于 2006-4-14 19:49:00
|
显示全部楼层
Re:用DirectSound播放OGG格式的音乐
- void ljmMusicBuffer_DSound::FillBuffer(void)
- {
- HRESULT hr;
- VOID* pDSLockedBuffer = NULL; // Pointer to locked buffer memory
- DWORD dwDSLockedBufferSize = 0; // Size of the locked DirectSound buffer
- DWORD dwWavDataRead = 0; // Amount of data read from the wav file
- LPDIRECTSOUNDBUFFER pDSB = m_pBuffer;
- BOOL bRepeatWavIfBufferLarger = FALSE;
-
- if( pDSB == NULL )
- return ;
- // Make sure we have focus, and we didn't just switch in from
- // an app which had a DirectSound device
- //if( FAILED( hr = RestoreBuffer( pDSB, NULL ) ) )
- // return hr;
- // int buffer_size;
- long bytes_read;
-
- size_t length = m_wfx.nAvgBytesPerSec / 2;
- char* buffer = new char[length];
-
- long leave = (long)length;
- long cur_pos = 0;
- do
- {
- bytes_read = ov_read(m_pVorbisFile,
- buffer+cur_pos,
- (int)leave,0/*endian*/,
- 2/*16-bit*/,1/*signed*/,
- &current_section);
- leave -= bytes_read;
- cur_pos += bytes_read;
- if(bytes_read<=0)
- break;
- }while(leave>0);
- bytes_read = cur_pos;
-
- DWORD dwOffset = (DWORD)length * m_dwWritePos;
- // Lock the buffer down
- if( FAILED( hr = pDSB->Lock( dwOffset , (DWORD)length,
- &pDSLockedBuffer, &dwDSLockedBufferSize,
- NULL, NULL, 0L ) ) )
- {
- delete buffer;
- return ;
- }
- memcpy(pDSLockedBuffer,buffer,(size_t)bytes_read);
- if((size_t)bytes_read<length)
- {
- memset((char*)pDSLockedBuffer + bytes_read,0,
- length-(size_t)bytes_read);
- if(m_bLoop)
- {
- ov_pcm_seek(m_pVorbisFile,0);
- }
- else
- {
- m_bFinished = true;
- }
- }
- m_dwWritePos++;
- m_dwWritePos %= 4;
- // Unlock the buffer, we don't need it anymore.
- pDSB->Unlock( pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0 );
- delete buffer;
- }
复制代码 |
|