Mercurial > foo_out_sdl
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 1 #include "StdAfx.h" | |
| 2 | |
| 3 #include "stream_buffer_helper.h" | |
| 4 | |
| 5 stream_reader_buffered::stream_reader_buffered(stream_reader * p_base,t_size p_buffer) : m_base(p_base) | |
| 6 { | |
| 7 m_buffer.set_size_in_range(pfc::min_t<size_t>(1024, p_buffer), p_buffer); | |
| 8 m_bufferRemaining = 0; | |
| 9 } | |
| 10 | |
| 11 t_size stream_reader_buffered::read(void * p_buffer,t_size p_bytes,abort_callback & p_abort) { | |
| 12 if (p_bytes <= m_bufferRemaining) { | |
| 13 memcpy( p_buffer, m_bufferPtr, p_bytes ); | |
| 14 m_bufferRemaining -= p_bytes; | |
| 15 m_bufferPtr += p_bytes; | |
| 16 return p_bytes; | |
| 17 } | |
| 18 | |
| 19 p_abort.check(); | |
| 20 char * output = (char*) p_buffer; | |
| 21 t_size output_ptr = 0; | |
| 22 | |
| 23 while(output_ptr < p_bytes) { | |
| 24 { | |
| 25 t_size delta = pfc::min_t(p_bytes - output_ptr, m_bufferRemaining); | |
| 26 if (delta > 0) | |
| 27 { | |
| 28 memcpy(output + output_ptr, m_bufferPtr, delta); | |
| 29 output_ptr += delta; | |
| 30 m_bufferPtr += delta; | |
| 31 m_bufferRemaining -= delta; | |
| 32 } | |
| 33 } | |
| 34 | |
| 35 if (m_bufferRemaining == 0) | |
| 36 { | |
| 37 t_size bytes_read; | |
| 38 bytes_read = m_base->read(m_buffer.get_ptr(), m_buffer.get_size(), p_abort); | |
| 39 m_bufferPtr = m_buffer.get_ptr(); | |
| 40 m_bufferRemaining = bytes_read; | |
| 41 | |
| 42 if (m_bufferRemaining == 0) break; | |
| 43 } | |
| 44 | |
| 45 } | |
| 46 | |
| 47 return output_ptr; | |
| 48 } | |
| 49 | |
| 50 stream_writer_buffered::stream_writer_buffered(stream_writer * p_base,t_size p_buffer) | |
| 51 : m_base(p_base) | |
| 52 { | |
| 53 m_buffer.set_size_in_range(pfc::min_t<size_t>(1024, p_buffer), p_buffer); | |
| 54 m_buffer_ptr = 0; | |
| 55 } | |
| 56 | |
| 57 void stream_writer_buffered::write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) { | |
| 58 p_abort.check_e(); | |
| 59 const char * source = (const char*)p_buffer; | |
| 60 t_size source_remaining = p_bytes; | |
| 61 const t_size buffer_size = m_buffer.get_size(); | |
| 62 if (source_remaining >= buffer_size) | |
| 63 { | |
| 64 flush(p_abort); | |
| 65 m_base->write_object(source,source_remaining,p_abort); | |
| 66 return; | |
| 67 } | |
| 68 | |
| 69 if (m_buffer_ptr + source_remaining >= buffer_size) | |
| 70 { | |
| 71 t_size delta = buffer_size - m_buffer_ptr; | |
| 72 memcpy(m_buffer.get_ptr() + m_buffer_ptr, source,delta); | |
| 73 source += delta; | |
| 74 source_remaining -= delta; | |
| 75 m_buffer_ptr += delta; | |
| 76 flush(p_abort); | |
| 77 } | |
| 78 | |
| 79 memcpy(m_buffer.get_ptr() + m_buffer_ptr, source,source_remaining); | |
| 80 m_buffer_ptr += source_remaining; | |
| 81 } | |
| 82 | |
| 83 | |
| 84 void stream_writer_buffered::flush(abort_callback & p_abort) { | |
| 85 if (m_buffer_ptr > 0) { | |
| 86 m_base->write_object(m_buffer.get_ptr(),m_buffer_ptr,p_abort); | |
| 87 m_buffer_ptr = 0; | |
| 88 } | |
| 89 } |
