Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/helpers/stream_buffer_helper.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/helpers/stream_buffer_helper.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,89 @@ +#include "StdAfx.h" + +#include "stream_buffer_helper.h" + +stream_reader_buffered::stream_reader_buffered(stream_reader * p_base,t_size p_buffer) : m_base(p_base) +{ + m_buffer.set_size_in_range(pfc::min_t<size_t>(1024, p_buffer), p_buffer); + m_bufferRemaining = 0; +} + +t_size stream_reader_buffered::read(void * p_buffer,t_size p_bytes,abort_callback & p_abort) { + if (p_bytes <= m_bufferRemaining) { + memcpy( p_buffer, m_bufferPtr, p_bytes ); + m_bufferRemaining -= p_bytes; + m_bufferPtr += p_bytes; + return p_bytes; + } + + p_abort.check(); + char * output = (char*) p_buffer; + t_size output_ptr = 0; + + while(output_ptr < p_bytes) { + { + t_size delta = pfc::min_t(p_bytes - output_ptr, m_bufferRemaining); + if (delta > 0) + { + memcpy(output + output_ptr, m_bufferPtr, delta); + output_ptr += delta; + m_bufferPtr += delta; + m_bufferRemaining -= delta; + } + } + + if (m_bufferRemaining == 0) + { + t_size bytes_read; + bytes_read = m_base->read(m_buffer.get_ptr(), m_buffer.get_size(), p_abort); + m_bufferPtr = m_buffer.get_ptr(); + m_bufferRemaining = bytes_read; + + if (m_bufferRemaining == 0) break; + } + + } + + return output_ptr; +} + +stream_writer_buffered::stream_writer_buffered(stream_writer * p_base,t_size p_buffer) + : m_base(p_base) +{ + m_buffer.set_size_in_range(pfc::min_t<size_t>(1024, p_buffer), p_buffer); + m_buffer_ptr = 0; +} + +void stream_writer_buffered::write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) { + p_abort.check_e(); + const char * source = (const char*)p_buffer; + t_size source_remaining = p_bytes; + const t_size buffer_size = m_buffer.get_size(); + if (source_remaining >= buffer_size) + { + flush(p_abort); + m_base->write_object(source,source_remaining,p_abort); + return; + } + + if (m_buffer_ptr + source_remaining >= buffer_size) + { + t_size delta = buffer_size - m_buffer_ptr; + memcpy(m_buffer.get_ptr() + m_buffer_ptr, source,delta); + source += delta; + source_remaining -= delta; + m_buffer_ptr += delta; + flush(p_abort); + } + + memcpy(m_buffer.get_ptr() + m_buffer_ptr, source,source_remaining); + m_buffer_ptr += source_remaining; +} + + +void stream_writer_buffered::flush(abort_callback & p_abort) { + if (m_buffer_ptr > 0) { + m_base->write_object(m_buffer.get_ptr(),m_buffer_ptr,p_abort); + m_buffer_ptr = 0; + } +}
