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 }