//*********************************************************************************************** unsigned int CWin32DirectSound::AddPackets(const void* data, unsigned int len) { CSingleLock lock (m_critSection); DWORD total = len; unsigned char* pBuffer = (unsigned char*)data; DWORD bufferStatus = 0; m_pBuffer->GetStatus(&bufferStatus); if (bufferStatus & DSBSTATUS_BUFFERLOST) { CLog::Log(LOGDEBUG, __FUNCTION__ ": Buffer allocation was lost. Restoring buffer."); m_pBuffer->Restore(); } while (len >= m_dwDataChunkSize && GetSpace() >= m_dwDataChunkSize) // We want to write at least one chunk at a time { LPVOID start = NULL, startWrap = NULL; DWORD size = 0, sizeWrap = 0; if (m_BufferOffset >= m_dwBufferLen) // Wrap-around manually m_BufferOffset = 0; HRESULT res = m_pBuffer->Lock(m_BufferOffset, m_dwChunkSize, &start, &size, &startWrap, &sizeWrap, 0); if (DS_OK != res) { CLog::Log(LOGERROR, __FUNCTION__ ": Unable to lock buffer at offset %u. HRESULT: 0x%08x", m_BufferOffset, res); break; } // Remap the data to the correct channels into the buffer if (m_remap.CanRemap()) m_remap.Remap((void*)pBuffer, start, size / m_uiBytesPerFrame, m_drc); else memcpy(start, pBuffer, size); pBuffer += size * m_uiDataBytesPerFrame / m_uiBytesPerFrame; len -= size * m_uiDataBytesPerFrame / m_uiBytesPerFrame; m_BufferOffset += size; if (startWrap) // Write-region wraps to beginning of buffer { // Remap the data to the correct channels into the buffer if (m_remap.CanRemap()) m_remap.Remap((void*)pBuffer, startWrap, sizeWrap / m_uiBytesPerFrame, m_drc); else memcpy(startWrap, pBuffer, sizeWrap); m_BufferOffset = sizeWrap; pBuffer += sizeWrap * m_uiDataBytesPerFrame / m_uiBytesPerFrame; len -= sizeWrap * m_uiDataBytesPerFrame / m_uiBytesPerFrame; } m_CacheLen += size + sizeWrap; // This data is now in the cache m_pBuffer->Unlock(start, size, startWrap, sizeWrap); } CheckPlayStatus(); return total - len; // Bytes used }
unsigned int CAESinkDirectSound::AddPackets(uint8_t *data, unsigned int frames) { if (!m_initialized) return 0; DWORD total = m_dwFrameSize * frames; DWORD len = total; unsigned char* pBuffer = (unsigned char*)data; DWORD bufferStatus = 0; m_pBuffer->GetStatus(&bufferStatus); if (bufferStatus & DSBSTATUS_BUFFERLOST) { CLog::Log(LOGDEBUG, __FUNCTION__ ": Buffer allocation was lost. Restoring buffer."); m_pBuffer->Restore(); } while (GetSpace() < total) Sleep(total * 1000 / m_AvgBytesPerSec); while (len) { LPVOID start = NULL, startWrap = NULL; DWORD size = 0, sizeWrap = 0; if (m_BufferOffset >= m_dwBufferLen) // Wrap-around manually m_BufferOffset = 0; HRESULT res = m_pBuffer->Lock(m_BufferOffset, m_dwChunkSize, &start, &size, &startWrap, &sizeWrap, 0); if (DS_OK != res) { CLog::Log(LOGERROR, __FUNCTION__ ": Unable to lock buffer at offset %u. HRESULT: 0x%08x", m_BufferOffset, res); break; } memcpy(start, pBuffer, size); pBuffer += size; len -= size; m_BufferOffset += size; if (startWrap) // Write-region wraps to beginning of buffer { memcpy(startWrap, pBuffer, sizeWrap); m_BufferOffset = sizeWrap; pBuffer += sizeWrap; len -= sizeWrap; } m_CacheLen += size + sizeWrap; // This data is now in the cache m_pBuffer->Unlock(start, size, startWrap, sizeWrap); } CheckPlayStatus(); return (total - len) / m_dwFrameSize; // Frames used }